Calendário DIY
ServoControl24 - Placa Controladora para 24 Servos
andre
Pontos:  477
Desde:  05/03/2009
Finalizado
Nível intermediário
x 2
Favoritado
Em:  16/08/2009   ( 17/12/2013 )
Atribuição. Não permite o uso comercial. Permite projetos derivados sob a mesma licença deste.
Estrela cheiaEstrela cheiaEstrela cheiaEstrela cheiaEstrela cheia
0
1
2
3
4
5
O 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.
1
Introdução
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.

 
2
Características da placa
A 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.
 
3
Construção
O primeiro passo é confeccionar a placa de circuito impresso. Há alguns anos tenho estado obcecado por componentes SMD, nesta placa você terá pela frente um SOIC (MAX232) uma led (0603 ou 0805) e um TQFP de 44 pinos (o PIC). Você não precisa sofrer com isso, o esquema é simples e é razoavelmente fácil desenhar um layout com componentes DIP (não esqueça de enviar para cá!).

Porque os resistores não são SMD? Bem, porque eu tenho muitos PTH em estoque e precisava gastá-los...

O esquema e o layout foram feitos com o gEDA, mas infelizmente eu acho que perdi os arquivos.
Felizmente eu salvei também em PDF e estes estão em anexo no final.

A placa é 100x100mm, poderia ser menor, mas na verdade, como tinha que fazer várias, não quis ter o trabalho de ficar cortando pois já adquiri as placas virgens (dupla-face/fibra de vidro) com esta medida. Como sempre, utilizei o método de transferência de toner para fazê-las.

Para soldar os componentes SMD é recomendado uma estação de solda e fluxo. Uma lupa e boa visão também são desejáveis.

Repare nos furos de fixação dos conectores RJ45. Eles são necessários, acredite em mim.

O restante dos componentes não oferece nenhuma dificuldade. Só não esqueça de soldar dos dois lados estes componentes, afinal, fazer furos metalizados em casa não é tão fácil (apesar de possível).

 
4
Programação da placa
Utilize 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
 
5
Utilização
Com 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...

 
6
Lista de Material
Integrados
=========================================
PIC18F4520   (TQFP)
MAX232       (SOIC)

Resistores
=========================================
R1       - 10K
R2 a R25 - 1K
R26      - 470R
R27, R28 - 4K7

Capacitores
=========================================
C1 a C4  - 10uF
C5, C6   - 10pF
C7       - 100uF
C8       - 100nF

Diversos
=========================================
3 conectores RJ45 fêmea 90 graus para pci
3 bornes KRE de 2 pólos
Conector serial DB9 (macho) 90 graus
Header de 6 pinos para ICSP
LED SMD azul 0603 ou 0805
Cristal de 20MHz  HC49/US
Placa de fibra de vidro dupla face 100x100
 
A
Anexos
Você precisa estar logado para ver os anexos.
Comentários: