IntroduçãoO ServoControl24 é uma placa baseada no PIC18F4520 para controlar até 24 servos através da serial ou via I2C. Ela foi desenvolvida especialmente para uma tese de doutorado mas tem uma gama de aplicações muito grande, alguns exemplos: robôs hexapod, robôs bípedes, aeromodelos sofisticados e projetos que precisem de muitos servos controlados por uma única porta serial ou USB.
Este projeto seria um produto comercial, mas devido a minha falta de tempo para melhorar o código (você verá que ele não está muito bom, faltam muitas coisas para serem otimizadas/melhoradas) resolvi torná-lo disponível de forma gratuita à comunidade: open source e open hardware! Acredito que muitos possam se beneficiar do projeto pois é difícil encontrar algo similar gratuito. Acredito também que tanto o esquema quanto o código possam ser bastante melhorados. Novas versões podem ser enviadas e serão postadas aqui.
No anexo no final do projeto (somente para usuários registrados) você encontará todos os arquivos necessários para montar, programar e testar a placa:
- Esquema e Layout da placa
- Código completo desenvolvido em assembly no MPLAB
- Simulação no Proteus (utilizando inclusive o I2C e duas placas), assim você pode, antes de montar o projeto, conferir seu funcionamento.

PASSO 1 - Características da placaA placa possui 8 conectores:
- Serial para conexão ao computador via porta serial ou USB (através
de um conversor Serial-USB)
- Borne KRE (2 pólos) - Para alimentação (+5V)
- Borne KRE (2 pólos) - Para comunicação I2C
- Borne KRE (2 pólos) - 2 IN/OUT para auxiliares que sobraram do PIC
(RE0 e RE1)
- Header 6 pinos para programação ICSP
- 3 conectores RJ45 fêmea para ligação aos 24 servos (você pode estar
pensando porquê isso foi usado aqui, bem, pense em mais de 100 servos e
verá que talvez tenha sido uma boa idéia...
Ela pode ser utilizada de várias formas:
- Controlada via I2C por módulos de controles principais (robôs ou
aeromodelos)
- Controlada via serial ou USB (utilzando um
conversor serial USB,
facilmente encontrado em lojas)
- Em uma arquitetura master-slave.
Com os firmwares descritos é
possível controlar os servos através da serial ou USB (placa master) e
encaminhar comandos da serial, via I2C, para outras placas slave, isto
permite controlar mais de 100 servos através de uma única porta serial.
Uma placa master (à esquerda) e duas slaves controladas via I2C pela
master.
Um servo foi colocado em cada placa para testes.

PASSO 3 - Programação da placaUtilize seu gravador preferido. Se você resolver montar conforme o layout mostrado vai ter que fazer a gravação via ICSP, logo, confira a seqüência dos sinais do conector do seu gravador com a pinagem no esquema (Padrão PICKIT2).
O programa está no anexo (no final do projeto) sob a forma de um projeto no MPLAB. Ele foi feito em assembly, e como foi dito, não está otimizado (considere que foi feito às pressas). Apesar disso funciona muito bem. Não há divergência perceptível na posição dos 24 servos se o mesmo valor for atribuído à todos eles. Além disso, não há flutuações na posição de um servo, mesmo quando outros mudarem suas posições.
Atenção:
Caso você vá utilizar somente uma placa não precisa se preocupar com a observação a seguir.
Caso você pretenda utilizar mais de uma placa (master-slave) leia:
O projeto deveria constar somente de um arquivo asm, tanto para o master quanto para o slave e a escolha ser feita por um valor lido da EEPROM durante a inicialização. Isto não foi implementado!
Há atualmente dois arquivos:
* main.asm
* main_slave.asm
Que deve ser colocado (somente um de cada vez, claro) no projeto do MPLAB para ser compilado.
Os arquivos HEX já foram gerados mas lembre-se disso se você fizer modificações.
Atenção 2:
Válido para todos os casos
A posição central do servo (quando o pulso dura 1,5ms) equivale a 0x7F (127 em decimal) sendo que os extremos são 0x00 (0 em decimal) e 0xFF (255 em decimal). Este valor central (default) é lido da EEPROM na inicialização e deve ser programado juntamente com o código do programa. Observe o software que você usa para gravar.
Os seguintes endereços da EEPROM são lidos na inicialização:
0x00 - Endereço da definição de master(0) or slave(1) (não implementado, não se preocupe)
0x01 - Endereço do valor de reset dos servos (necessário - coloque 0x7F para posição central)
0x02 - Endereço de I2C deste módulo (daqui para abaixo só é importante se utilizar master-slave)
0x03 - Reservado para uso futuro...
0x04 - Endereço de I2C do Slave 1
0x05 - Endereço de I2C do Slave 2
0x06 - Endereço de I2C do Slave 3
0x07 - Endereço de I2C do Slave 4
0x08 - Endereço de I2C do Slave 5
PASSO 4 - UtilizaçãoCom a placa ligada através da serial (ou via Serial-USB), os
seguintes comandos foram previstos:
(Estes comandos podem ser
enviados pelo hyperterminal, putty, ou por um software feito em uma boa
linguagem de programação para isso, tal como o C.)
- S - Move servo
Sintaxe: S[servo][valor]
onde servo e valor são números
hexadecimais com dois dígitos (sempre).
Exemplos:
S01A5 - gira o
servo 1 em um sentido)
S1020 - gira o servo 16 (lembre-se que
está em hexadecimal) em outro sentido
S057F - centraliza o servo 5
- R - Reseta servos
Sintaxe: R[placa]
onde placa é o master (00) ou
os slaves (01, 02, 03, etc.)
Exemplos:
R00 - reinicia todos os
servos para o valor de reset default da placa (única ou master)
R01 -
reinicia todos os servos para o valor de reset default da primeira
placa slave.
- Z - Configura valor de reset default de todos os servos
Sintaxe: Z[valor]
onde valor
é o novo valor de reset com dois dígitos hexadecimais
Exemplo:
Z75
- O novo valor de reset é agora 0x75
- A - Configura o endereço I2C deste módulo
(Obs. não
testado, utilizei a programação da EEPROM na fase de gravação do PIC)
Sintaxe: A[endereço]
onde endereço
é o valor do endereço I2C com dois dígitos hexadecimais
Exemplo:
A22
- O endereço I2C da placa agora é 22
- E - Configura o endereço I2C de um slave conectado ao master
(Obs.
não testado, utilizei a programação da EEPROM na fase de gravação do
PIC)
Sintaxe: E[slave][endereço]
onde
endereço é o valor do endereço I2C com dois dígitos hexadecimais
Exemplo:
A22
- O endereço I2C da placa agora é 22
- M - Configura se a placa é master ou slave (NÃO IMPLEMENTADO)
Sintaxe:
M[modo]
onde modo é 00 (master) ou 01 (slave)
Exemplo:
M01
- Configura a placa como slave
Obs1 .: Você pode também, antes de montar o projeto, conferir seu
funcionamento através do esquema para o simulador Proteus, também em
anexo.
Obs 2: Percebi, na época, que o Proteus (7.2 SP6), apesar de simular o
I2C, não levava em consideração o endereçamento (não sei se era um bug
ou se vacilei em algo), ele simplesmente enviava os comandos pela I2C
sem se importar com o endereçamento estar correto ou não. Nem precisa
dizer que isso me tirou algumas noites de sono e só foi possível
comprovar o funcionamento (do endereçamento) com o circuito montado, que
afinal sempre esteve funcionando corretamente...
AnexosVocê deve estar logado para ver os anexos.