Comunicação entre dois Arduino com Serial monitor e portas A4 e A5 ocupadas?

Olá pessoal, eu e minha equipe estamos desenvolvendo um projeto para a FEBRACE :smiley: e encontramos um probleminha.

Queremos que um microcontrolador do Arduino Uno que está fixado na protoboard se comunique com as portas de outro microcontrolador que está na placa Arduino e queremos ainda que ele escreva as informações no Serial Monitor.

Encontramos duas possíveis soluções, a primeira seria utilizar as portas RX e TX dos controladores, mas, descobrimos que não poderíamos escrever as informações na tela, porque o cabo USB usa essas portas.

Pensamos então, em usar as portas A4 e A5 que possuem um protocolo de comunicação que usa a biblioteca Wire, mas, elas estão sendo usadas por um sensor de cor chamado TCS34725. Essa solução seria tão perfeita :sob:

Então, o que poderíamos fazer para contornar a situação? Quem conseguir ajudar a gente vai ter seu nome escrito nos agradecimentos :grin:

Aprender como a biblioteca Wire (e comunicação I2C) funciona e usá-la para o que pretendem...

Ou olhar para a comunicação SPI, mas desligar tudo desse porto sempre que for para fazer download do programa.

Use a biblioteca SoftwareSerial. Você pode fazer 2 arduinos se comunicarem usandos quaisquer 2 pinos. Além disto sua implementação é muito mais simples que i2c (= Wire) ou SPI.

Usar a SoftwareSerial é idêntico a usar a Serial, mas sem a restrição dos pinos 0 e 1.

Nota 1: TX e RX não são portas, mas pinos. Um Atmega328 possui apenas 3 portas (PORTB, PORTC, PORTD), cada uma composta de 6-8 pinos dependendo da porta (D0..D7, D8..D13, A0.. A5)

Nota 2: Tecnicamente existe também as portas A6 e A7, mas normalmente não ocupadas pelo cristal. Apenas nas implementações sem cristal, usando o oscilador interno do chip (portanto 8Mhz) elas podem ser usadas.

Com I2C você pode se comunicar com vários dispositivos desde que eles tenham endereços diferentes.

A software serial é a pior solução... Principalmente tendo I2C e SPI disponiveis.

bubulindo: A software serial é a pior solução... Principalmente tendo I2C e SPI disponiveis.

Pior é uma opinião subjetiva.

A SoftwareSerial tem a implementação mais rápida e mais simples do ponto de vista do programador, sobretudo se for um novato, mesmo não sendo a mais moderna. Eu concordo que i2c pode ser uma solução mais avançada do ponto de vista tecnológico, mas para quem está começando, ela é mais chata de ser implementada.

Não vejo onde está a chatice de implementar mais um nó com a Wire... afinal de contas já estão a usar esse protocolo para outro chip, logo não vão ter de partir pedra...

Em termos da Software Serial ser pior, não é subjectivo, é um facto. A Software serial vai ocupar o processador a contar carneirinhos enquanto envia/recebe caracteres... e, como é já comum, o utilizador da mesma vai depois perguntar porque é que o programa bloqueia ou não funciona muito bem ou tem um comportamento esquisito quando usa interrupções como o millis(), etc...

Logo, havendo outra opção (e neste caso existem bibliotecas já feitas para isso), que não seja uma emulação por software, essa deve ser a escolha.

E já sei que a próxima resposta vai ser o facto da biblioteca Wire não implementar o método Print ao invés da Serial, ao que tenho a responder que a comunicação vai ser executada entre dois microcontroladores que falam em binário um com o outro. Converter seja o que for para ASCII entre dois microcontroladores é desperdício... como tal, a inexistência do Print é irrelevante para a discussão.