DojoI2C

De Garoa Hacker Clube
Revisão de 16h00min de 13 de dezembro de 2014 por DQ (discussão | contribs)
Ir para navegação Ir para pesquisar

O objetivo deste projeto é interligar em uma rede I2C vários Arduinos com o Garoa Dojo Shield para permitir a geração de animações coordenadas.

Responsáveis em ordem alfabética

I2C

I2C (também chamado de Two Wire) é um padrão de comunicação serial que permite interligar múltiplos dispositivos em uma arquitetura mestre/escravos, utilizando dois fios (mais o GND) em uma topologia de "varal".

Um dos fios é o clock (SCL), que é sempre gerado pelo mestre e indica onde estão os bits no outro fio. Este outro fio é o de dados (SDA), e é bidirecional. No repouso os dois sinais devem estar "livres" (isto é, nenhum dispositivo deve estar forçando um nível alto ou baixo). Um pullup (interno no caso do ATmega) faz com que os sinais fiquem em nível alto nesta condição. Quem estiver transmitindo forçará zero quando necessário.

O I2C estabelece um protocolo básico. Na variante mais comum, Toda operação começa com o mestre enviando um endereço de 7 bits mais um bit sinalizando se está sendo feita uma leitura ou escrita no escravo endereçado.

A wikipedia tem uma longa descrição do I2C[1].

O ATmega possui suporte de hardware para o I2C que cuida da geração do clock (no master), conversão serial/paralela e detecção de endereço (no escravo). O Arduino tem a biblioteca padrão Wire que encapsula estas funcionalidades. Documentação sucinta no site do Arduino [2].

Os pinos SDA e SCL estão posicionados em lugares diferentes nos vários modelos do Arduino. No UNO e anteriores estão nos pinos A4 e A5. No MEGA estão nos pinos 20 e 21. No LEONARDO estão nos pinos 2 e 3.

Prova de Conceito

O objetivo da prova de conceito (feita em 11/12/14) foi demonstrar a capacidade de comunicação via I2C entre Arduinos.

O hardware consistiu em três Arduinos (um UNO, um DUEMILINOVE e um MEGA), cada um deles com um Garoa Dojo Shield. Além da interligação de SDA, SCL e GND, foram interligados o +5V, para que a alimentação de todos viesse da USB do mestre (conectado a um PC). Este esquema de alimentação deve ser inapropriado no caso de uma quantidade maiores de Arduinos.

O software carregado nos três foi o mesmo. A definição do modo (Master ou Slave) e do endereço (se slave) são armazenadas na EEProm. A configuração é feita através da conexão serial a um PC, por simplificação o endereço é um dígito de 1 a 9.

O formato das mensagens foi restringido a um byte. Na escrita do mestre, o byte controle os oito LEDs do display do escravo (sete segmentos mais o ponto decimal). Na leitura do mestre, o escravo informa a leitura do potenciômetro (dividida por 4 para ficar de 0 a 255). A expansão destas mensagens para controlar mais sinais de saída e ler mais entrada (como o LDR no shield) é trivial e fica como exercício para os implementadores futuros.

Como teste, o mestre comanda o display dos escravos (e o seu próprio) com o valor lido do seu potenciômetro (também dividido por quatro) e envia pela serial a leitura dos potenciômetros dos escravos.

O código está no github do Garoa.