Você deseja usar o USB para comunicação com o computador. Se você possui vários microcontroladores, provavelmente conectará apenas um dos microcontroladores diretamente ao computador. Os outros microcontroladores precisarão obter seus comandos do microcontrolador principal.
A comunicação que você escolher dependerá de vários fatores:
- largura de banda necessária (assumiremos que você as esteja executando a 16 MHz)
- complexidade (fiação e codificação)
- bidirecional ou escravo mestre
Quase todas as opções têm suporte embutido no microcontrolador AVR. Não há opção que você possa razoavelmente preferir às opções internas que exigiriam hardware adicional. Como eles têm suporte embutido, a complexidade do software é semelhante, basta configurar a porta (usando registros), colocar os dados para transmitir em outro registro e acionar a transmissão, definindo um pouco em outro registro. Todos os dados recebidos são encontrados em outro registro e uma interrupção é acionada para que você possa lidar com isso. Qualquer que seja a opção escolhida, a única diferença é a alteração nos locais dos registros e algumas alterações nos registros de configuração.
Um loop USART possui os seguintes recursos:
- Taxa de transmissão máxima de CLK / 16 = 1MHz (no relógio de 16MHz), que é uma taxa de transferência de cerca de 90KB / s
- comunicações totalmente bidirecionais (sem designação de mestre ou escravo)
- requer fios separados entre cada par de microcontroladores - o Atmega32u4 suporta duas portas USART de forma nativa, limitando o número de microcontroladores que você pode conectar em uma rede na prática (ou você acaba com uma longa série de microcontroladores - ou seja, conectado em uma lista vinculada maneira)
Nota: isto também é o que você usaria para obter a comunicação RS232, exceto que, como o RS232 requer 10V, é necessário um driver para obter esses níveis de tensão. Para comunicação entre microcontroladores, isso não é útil (apenas os níveis de tensão são alterados).
RS485:
- Essencialmente, você usa a porta USART em um modo diferente - não há vantagem na largura de banda, e isso pode simplificar apenas ligeiramente a fiação, mas também a complica. Isto não é recomendado.
Interface de dois fios:
Isso também é conhecido como I2C. Isso significa que todos os dispositivos compartilham os mesmos dois fios.
Você precisa de um resistor pull-up nos dois fios
É lento (porque os resistores de pull-up são limitados em valor, e há capacitância crescente à medida que o número de dispositivos aumenta e o comprimento do fio aumenta). Para este microcontrolador AVR, a velocidade é de até 400 kHz - mais lenta que o USART (mas essa velocidade depende da limitação de sua capacitância). O motivo é que, embora um dispositivo reduza o fio de dados, a transição oposta é realizada deixando o fio flutuar alto novamente (o resistor de pull-up).
É ainda mais lento quando você considera que TODA a comunicação compartilha a mesma largura de banda limitada. Como toda comunicação compartilha a mesma largura de banda limitada, pode haver atrasos na comunicação em que os dados devem esperar até que a rede esteja ociosa antes de poder ser enviada. Se outros dados estiverem sendo enviados constantemente, também poderá impedir que eles sejam enviados.
Ele depende de um protocolo mestre-escravo, em que um mestre endereça um escravo, envia um comando / solicitação e o escravo responde posteriormente. Somente um dispositivo pode se comunicar por vez, portanto, o escravo deve aguardar a conclusão do mestre.
Qualquer dispositivo pode atuar como mestre e / ou escravo, tornando-o bastante flexível.
SPI
É isso que eu recomendaria / utilizaria para a comunicação geral entre microcontroladores.
É alta velocidade - até CLK / 2 = 8MHz (para CLK a 16MHz), tornando-o o método mais rápido. Isso é possível devido ao seu fio separado exclusivamente para o relógio.
Os fios MOSI, MISO, dados e SCK clock são compartilhados em toda a rede, o que significa que possui uma fiação mais simples.
É um formato mestre-escravo, mas qualquer dispositivo pode ser um mestre e / ou escravo. No entanto, devido às complicações de seleção do escravo, para a fiação compartilhada (dentro da rede), você deve usá-lo apenas de maneira hierárquica (ao contrário da interface de dois fios). IE. se você organizar todos os dispositivos em uma árvore, um dispositivo deve ser mestre apenas para seus filhos e apenas um escravo para seus pais. Isso significa que, no modo escravo, um dispositivo sempre terá o mesmo mestre. Além disso, para fazer isso corretamente, você precisa adicionar resistores ao MISO / MOSI / SCK ao mestre upstream, para que, se o dispositivo estiver se comunicando a jusante (quando não selecionado como escravo), as comunicações não afetarão as comunicações em outras partes do a rede (observe que o número de níveis que você pode fazer isso usando resistores é limitado; veja abaixo a melhor solução usando as duas portas SPI).
O microcontrolador AVR pode tri-state automaticamente o sinal MOSI quando é selecionado como escravo e alternar para o modo escravo (se estiver no mestre).
Embora possa exigir uma rede hierárquica, a maioria das redes pode ser organizada de maneira semelhante a uma árvore, portanto, geralmente não é uma limitação importante
O item acima pode ser relaxado um pouco, porque cada microcontrolador AVR suporta duas portas SPI separadas, para que cada dispositivo possa ter posições diferentes em duas redes diferentes.
Dito isto, se você precisar de muitos níveis em sua árvore / hierarquia (mais de 2), a solução acima usando resistores fica muito complicada para funcionar. Nesse caso, você deve alterar a rede SPI entre cada camada da árvore. Isso significa que cada dispositivo se conectará a seus filhos em uma rede SPI e a seus pais na outra rede SPI. Embora isso signifique que você tenha apenas uma única árvore de conexões, a vantagem é que um dispositivo pode se comunicar com um de seus filhos e seu pai ao mesmo tempo e você não possui resistores complicados (sempre é difícil escolher os valores certos) .
Por possuir fios MOSI e MISO separados, o mestre e o escravo podem se comunicar ao mesmo tempo, proporcionando um fator potencial de dois aumentos na velocidade. Um pino extra é necessário para a seleção de escravos para cada escravo adicional, mas isso não é um fardo pesado, mesmo 10 escravos diferentes requerem apenas 10 pinos extras, que podem ser facilmente acomodados em um microcontrolador AVR típico.
O CAN não é suportado pelo microcontrolador AVR que você especificou. Como existem outras boas opções, provavelmente não é importante neste caso.
A recomendação é SPI , porque é rápida, a fiação não é muito complexa e não requer resistores de pull-up complicados. No raro caso em que o SPI não atende totalmente às suas necessidades (provavelmente em redes mais complicadas), você pode usar várias opções (por exemplo, usar as duas portas SPI, juntamente com a interface de dois fios, além de emparelhar alguns dos microcontroladores usando um loop USART!)
No seu caso, usar SPI significa que, naturalmente, o microcontrolador com a conexão USB ao computador pode ser o mestre e pode apenas encaminhar os comandos relevantes do computador para cada dispositivo escravo. Ele também pode ler as atualizações / medidas de cada escravo e enviá-las ao computador.
Com 8MHz e 0,5m de comprimento de fio, não acho que isso se tornará um problema. Mas, se for, tente ter mais cuidado com a capacitância (mantenha os fios de aterramento e de sinal muito próximos e também com as conexões entre os diferentes condutores) e também a terminação do sinal. No caso improvável de continuar sendo um problema, você pode reduzir a taxa de clock, mas não acho que seja necessário.