terça-feira, 18 de janeiro de 2011

SegBot (Saguim)

SegwayBot (Saguim)


Á uns tempos vi uma segway e durante uns dias aquilo não me saiu da cabeça, tanto não saiu que depois vi este vídeo e passei-me e quis fazer um também.



Bem, comecei a fazer um mas ainda só se mantém equilibrado porque está encostado e também porque ainda não está acabado mas deixo algumas fotos e vou actualizando sempre que possa. O objectivo é criar uma base de robótica para diversos usos futuros onde o robot é só sustentando por duas rodas.

 

Protótipo em AutoCAD e o original com algumas diferenças
 


Pormenor dos encoders


Já com algum material ligado

Depois de algum tempo parado e com teias de aranha o SegBot volta com a sua nova placa de hardware melhorada. 






Em construção...

RFM12B Module

Devido à elevada taxa de banditismo decidi criar um alarme para casa. Vai consistir em mini módulos de rádio frequência cada um na sua posição criando uma rede sem fios entre si e trocando informações com o coordenador dessa rede. Inicialmente a topologia de rede vai ser em estrela mas futuramente será modificada para árvore ou talvez mesh.



Muito resumidamente, quando for detectada alguma intrusão os mini módulos comunicam com o coordenador, e este através de um modem GSM, envia uma SMS para o usuário que ocorreu uma intrusão e indica qual o sitio dessa intrusão. Para já criei três placas para testar os módulos e criar vários parâmetros que depois servirão para construir a rede, com os módulos que serão muito mais pequenos que as placas que estão na seguinte imagem. As placas seguinte são só para desenvolvimento. O transceiver usado foi o RFM12B da HopeRF devido a sua simplicidade de implementação e tamanho. Estes módulos comunicam através do interface SPI tornando-se assim fáceis de usar.

Download do .pdf com documentação relativa ao RFM12B da HopeRF.

Placas de demonstração e desenvolvimento dos módulos


Possíveis NÓS SLAVE feitos em EagleCAD 3D ( RFM12B - Controlador - DC/DC )


Possível NÓ MASTER feito em EagleCAD 3D

Para começar decidi fazer um programa demonstração que consiste apenas em um módulo master enviar um pacote para um módulo slave. Se for um determinado pacote o slave envia uma resposta ao master a confirmar o pacote correcto e o master toma uma acção (Neste caso acender um LED). O Programa foi desenvolvido usando o MPLAB C18 e pode ser descarregado aqui. O .zip contem os três ficheiros essenciais. A biblioteca rfm12b.h tem que ser sempre incluída no projecto do C18.
slave.c/master.c -> Código do slave/master que usa a biblioteca rfm12b.h
rfm12b.h -> Biblioteca que contem as funções que inicializam e comunicam com o RFM12B
void EnviaCMD( unsigned int );     //Envia comando para o RFM12B
void EnviaBYTE( unsigned int );    //Envia byte a ser transmitido
unsigned char RecebeBYTE( void );  //Recebe byte transmitido
void Delay1KTCYx( unsigned char );
void Delay10KTCYx( unsigned char );


Em construção...

LED Display

Este projecto surge porque não tinha mais nada que fazer e então como gosto de LED's decidi fazer este display de LED's. É um display feito para 50 colunas por 7 linhas podendo criar os caracteres típicos dos displays LCD HD44780 da Hitachi que são de 5x7 pixels. O objectivo principal é criar um display para passar mensagens e talvez mais à frente de alguma maneira tentar liga-lo por RS232 e faze-lo interagir com o messenger pois nunca gostei muito das janelas do messenger pois ocupam muito espaço do monitor. Então este display iria substituir essa janela irritante e sempre que alguém entra-se no messenger não abria uma janela, mas no display aparecia o que antes aparecia na janela do messenger. Sete transístores PNP fazem o drive das linhas. Ao fazer um varrimento por linhas obtemos assim uma melhor luminosidade nos LED's pois se o varrimento fosse feito por colunas seria:

TempoVarrimentoColunas = Ciclo/50 (varrimento maior)

TempoVarrimentoLinhas = Ciclo/7 (varrimento menor)
 



Já em funcionamento




Download dos ficheiros em EAGLE.

RARM & Controller

Nas minhas viagens pelo YouTube encontrei um pequeno braço robot LYNX5 da lynxmotion[1] e pensei logo em mil e uma coisas e decidi então fazer um e passados algumas semanas de medições a olhómetro e maquinação na minha CNC a mãos e serrote está finalmente acabado. Em conjunto com o servo controller espero conseguir por o braço a funcionar e a fazer qualquer coisa interessante. O colega Mauro (http://msm.no.sapo.pt/damas/index.html) já está a fazer um programa em C# para um braço poder jogar damas contra um PC. Talvez um dia os nossos rarm possam disputar uma partida de damas ou braço de ferro.

Braço LYNX5 da lynxmotion. A versão LYNX6 tem mais um eixo que é a rotação do pulso.






Para o controlo dos servos do braço foi escolhida uma PIC18F2431 que tem um módulo de controlo de motor por PWM (POWER CONTROL PWM MODULE) que simplifica a geração de múltiplos e sincronizados sinais PWM para uso em controlo de motores, mas neste caso servos. Em conjunto com um programa feito em VisualBasic vão ser transmitidos dados através de RS232 podendo controlar a posição do braço.


O programa em Basic é simples e divide-se em 4 partes.

● Na primeira parte é feita a configuração da porta COM a usar, baudrate, paridade, stop bits e HOME.
● Na segunda parte é o modo básico que consiste em por no programa um ponto no espaço e um algoritmo de cinemática inversa calcula o movimento necessário a fornecer no braço robótico que vai pegar no objecto e colocá-lo em HOME.
● Na terceira parte é o modo completo e consiste em fazer sequências de movimentos diferentes o que não acontecia na segunda parte que só fazia um único movimento. Neste modo é possível por o braço a fazer inúmeras sequencias todas distintas. Permite também indicar o modo como se vai agarrar o objecto se na vertical ou na horizontal e controlar a velocidade do braço.
● Na quarta parte é o modo escrita, em que escrevemos uma frase com limite de 4 linhas e 8 caracteres por linha no programa e o braço escreve-o numa folha de papel e com uma caneta adaptada ao braço.

Protótipo de programa em VisualBasic. Ainda está em desenvolvimento logo o final poderá ser muito diferente dos screens que ponho a seguir.
Download dos ficheiros em EAGLE.

quinta-feira, 6 de janeiro de 2011

I²C Expander

O I²C Expander permite com um interface I²C controlar até 9 servos, 3 entradas analógias e 2 entradas/saidas digitais. Este IC é útil para sistemas em que o uso de muitos pinos do microcontrolador não está disponível. Como usa o protocolo I²C apenas usa 2 pinos de dados do microcontrolador (SDA e SCL). O I²C Expander é um dispositivo slave logo terão que existir 2 resistências de pull-up no bus I²C.


Pin Name
Description
Analog0,1,2
Analog Input, Vref-> VDD,GND
Digital0,1
Digital0 only Input | Digital1 I/0
PWM0,1,2,3,4,5,6,7
PWM servo Output
SDA
I2C Data Input/Output
SCL
I2C Clock Input
VDD
Positive Supply (1.8V to 5V)
GND
Ground




COMANDOS

Comando
Descrição
0x41 –‘A’
Muda o endereço actual do slave I2C
0x42 –‘B’
Comando para devolver ADC
0x43 –‘C’
Actualiza valores do PWM de TODOS servos
0x44 –‘D’
Actualiza valor do PWM de UM servo
0x45 –‘E’
Activa ou desactiva o PWM dos servos
0x46 –‘F’
Comando para devolver pinos digitais
0x47 –‘G’
Faz SET dos valores em portas digitais
0x48 –‘H’
Modifica input/output nos 2 pinos digitais
0x56 –‘V’
Devolve versão do firmware e data   


Exemplos

Funções:
writeI2C(slave_adress, numero_bytes, dataOUT[]);
readI2C(slave_adress, numero_bytes, dataIN[]);

Muda o endereço actual do slave I2C (0x41)
writeI2C(0xA0, 2, 0x41A2 );    
//troca o endereço actual 0xA0 pelo endereço 0xA2

Comando para devolver ADC (0x42)
writeI2C(0xA0, 1, 0x42 );          //envia comando para devolver ADC
readI2C(0xA0, 3, ADCvalues);       //guarda em ADCvalues os valores dos 3 adc

Actualiza valores do PWM de TODOS servos (0x43)
writeI2C(0xA0, 9, 0x435566FF7F7F7F7F7F);    
//carrega valores de PWM, pwm0 = 0x55, pwm1 = 0x66, etc…

Actualiza valor do PWM de UM servo (0x44)
writeI2C(0xA0, 3, 0x4405FF);     //carrega o pwm5 com 0xFF

Activa ou desactiva o PWM dos servos (0x45)
writeI2C(0xA0, 2, 0x45FF);   //activa todos os pwm (0xFF), 0x00 desactiva todos
 //0x01 activa o pwm0

Comando para devolver pinos digitais (0x46)
writeI2C(0xA0, 1, 0x46 );          //envia comando para devolver DIGITAIS
readI2C(0xA0, 1, digitaisVALUE);   //cada bit de digitaisVALUE corresponde e um pino digital

Faz SET dos valores em portas digitais (0x47)
writeI2C(0xA0, 2, 0x47FF);        
//activa todos os pinos digitais (0xFF), 0x00 desactiva todos

Modifica input/output nos 2 pinos digitais digitais (0x48)
writeI2C(0xA0, 2, 0x48FF);        // (0xFF) tudo input, 0x00 tudo output
                                  //0x01 põe o pino0 como input e o resto out

Devolve versão do firmware e data (0x56)
writeI2C(0xA0, 1, 0x56 );         //envia comando para devolver versão
readI2C(0xA0, 21, stringVERSAO);  //guarda em stringVERSAO a versão
                                  //tem sempre 21chars de tamanho

Funcionamento
6 servos a correr em simultâneo. Refrescados a 20ms. 5 na posição central (1.5ms) e um na posição final (2.1ms)


Especificações
Resolução ADC  -  8bits
Resolução Servos  -  8bits, aprox 0.71º
Alimentação  -  1.8V a 5V

Download Indisponível

terça-feira, 4 de janeiro de 2011

USB PIC DevBoard

As placas de desenvolvimento por porta série já são tecnologia do passado. Apesar de ainda serem muito usadas o USB veio para ficar e só trás vantagens. Na maioria dos novos portáteis a porta série não existe o que torna as coisas mais difíceis pois tem que se ter um cabo USB-RS232 para usarmos uma placa de desenvolvimento com porta série. Ao ter-se uma placa de desenvolvimento por USB eliminamos a necessidade de uma fonte externa como acontecia na porta série pois o USB já possui alimentação. As placas de desenvolvimento podem ser feitas de duas maneiras, a primeira é usar um chip que converta USB para a porta série do micro tal como o FT232R da FTDI, ou usando um micro que já possua um módulo USB que é o caso. Usando um PIC18F4550 criei uma placa de desenvolvimento por USB em que os periféricos podem ser alimentados da placa e por sua vez a placa da porta USB.
Desenvolvi então uma placa que é um clone numa versão mais simples da PICDEM FS-USB DM163025 da microchip.

Placa desenhada em eagleCAD + bootloader PIC18F4550 + HEX Loader (Download)
O PIC usado nesta placa possui 40 pinos porém usando um adaptador de 40 para 28 pinos (usado na PIC DevBoard) podem ser usados PIC's com módulos USB mas com menos pinagem tal como o PIC18F2550. O PIC não funcionará se for só ligado à porta USB, tal como na porta série é necessário um bootloader USB e das duas uma, ou se arranja um bootloader já feito para o PIC a usar ou compila-se a biblioteca USB (MCHPFSUSB Framework) fornecida no site da microchip.
O projecto do bootloader é encontrado na pasta \Microchip Solutions\USB Device - Bootloaders\Vendor Class - MCHPUSB Bootloader\Bootloader - Firmware for PIC18F4550 Family Devices e no qual terão que ser feitas modificações para se adaptar ao PIC em questão. No caso do PIC ser o PIC18F4550 não serão necessárias modificações.
Depois do bootloader carregado através de um programador e ligada a placa ao PC o Windows vai pedir para instalar um driver que se encontra na pasta \Microchip Solutions\USB Tools\MCHPUSB Custom Driver\MCHPUSB Driver\Release.
Depois de executados os passos em cima a placa está pronta para receber os ficheiros .hex que podem ser carregados através do programa PDFSUSB.exe que se encontra na pasta \Microchip Solutions\USB Tools\Pdfsusb.
No fim fica-se com uma placa de desenvolvimento que usa a tecnologia USB em vez da tecnologia RS232 e com uma construção fácil e com todos os pinos acessíveis, ideal para pequenos protótipos.

PIC DevBoard

Na necessidade de uma placa de testes foi feita esta placa similar à Explorer HPC da microchip mas num tamanho mais pequeno e numa diferente disposição da pinagem podendo posteriormente adicionar módulos como nas EasyPIC da mikroelectronica.


O PIC usado nesta placa pode ser uma grande variedade de PIC16 e PIC18 de 40 pinos. O que eu uso é um 18F4620/4510/4431. Estou a criar um socket para passar de 40 pinos para 28 e 20 pinos para ser mais fácil programar outros PIC com menos pinagem sem requerer a uma placa nova.


Versão 2
Difere pouco na versão 1 sendo as principais diferenças na disposição dos pinos I/O para facilitar o uso dos módulos e também o uso de componentes SMD tornando assim a placa com um interface mais "amigo" e parecendo menos carregado de componentes. Tem também dois tipos de socket para uso de PIC com 40 e 28 pinos.

Download dos ficheiros em EAGLE.