Preciso comunicar dois arduinos entre si, mas eles não podem compartilhar o GND. Vão usar fontes de alimentação separadas. Usando comunicação I2C ou serial precisa ter o GND conectado entre eles e não posso fazer isso no meu projeto. No momento só me vem a mente usar um chip RS485 em cada um e fazer a comunicado com dois fios. Nota que ambos os MCUs vai ficar juntos, na mesma PCB, cada um realizando algumas funções. A comunicação não precisa ser bidirecional, apenas um vai enviar e outro vai receber
Alguém tem alguma sugestão mais simples ?

Grato.

Obs: serão usados para monitorar e medir tensões distintas, por isso o GND não pode ser compartilhado entre eles, senão vou ter problemas nas medições

Exibições: 790

Responder esta

Respostas a este tópico

Bom dia André, 

Sabe ler em alemão? Não? Pode usar tradutor do Google. 

Informe o seu e-mail. 

Abraços, 

Gustavo 

Está dando certo. 

Apenas um opto-acoplador já serve pois a comunicação vai ser uni-direcional. Só preciso empacotar mais dados e ver como vai ficar a velocidade no final (vou transmitir a tensão, corrente, watts e temperatura).

Recomendo usar um opto mesmo,pode ser o PC817, ele é encontrado pra todo lado, fontes chaveadas de celular, microondas, tudo. Fácil de comprar, barato e simples. Embora nos circuitos antigos ele não apareça, aparece em "todos" os circuitos comerciais.


Mais simples de usar.

Ele tem só 4 pinos.

Ref:

https://forum.arduino.cc/index.php?topic=548866.0

Boa Edurado, obrigado.

Estou usando esse mesmo. Está funcionando, mas estou tendo algumas perdas nos dados na recepção. Estou usando o monitor serial para ver o TX e o RX. O TX está OK, mas no RX está chegando alguns dados inconsistentes. Estou usando 9600bps.

Estou lendo um inteiro até 1023 e mapeando de 0 a 26Volts usando a entrada do Arduino para simular por enquanto, e tenho que transformar em 2 bytes para poder transmitir. Testei com o delay e sem, e mesmo assim assim ainda não está legal.

De vez em quando aparece um " -1 " no receptor.

//TX

lepot1=map (analogRead(A0), 0,1023,0,2600);
lepot2=map (analogRead(A1), 0,1023,0,3000);


enviar[1] = lepot1 / 100;
enviar[2] = lepot1 % 100;
enviar[3] = lepot2 / 100;
enviar[4] = lepot2 % 100;


for (int i=1; i<=4; i++){
mySerial.write(enviar[i]);

//delay(1);
}

-------------------------------------

//RX

if(mySerial.available()){
for(int i=1; i<=4; i++){
recebido[i] = mySerial.read();

//delay(1);

}

voltage_CH2 = ((recebido[1]*100) + recebido[2]) / 100.0;
current_CH2 = ((recebido[3]*100) + recebido[4]) / 100.0;

Serial.print(recebido[1]);
Serial.print(" | ");
Serial.print(recebido[2]);
Serial.print(" | ");
Serial.print (recebido[3]);
Serial.print(" | ");
Serial.println(recebido[4]);

Bom dia,

Você percebeu que tem um circuito de inversor digital na saída do optoacoplador? 

Esse circuito é de um projeto de fonte comercial. Que funciona! 

Bom dia. 

Sim, eu percebi. Montei conforme o esquema e a comunicação está funcionando, mas estou tendo algum problema e ele de tempo em tempo recebe um dado errado. Ainda não sei o que pode ser, pois mesmo conectando ambos os MCUs sem o optoacoplador acontece o mesmo problema.

Anexo segue o print da tela do osciloscópio com o formato enviado (amarelo) e recebido (azul). Dá para perceber uma pequena deformação na recepção quando usado com opto-acoplador, mas como eu disse acima, mesmo sem o optoacoplador ainda estou tendo uma perda na comunicação.

Anexos

Boa tarde, 

Qual opto-acoplador esta usando?

Veja as característica do HCPL-0600. Compare com o seu. 

High CMR, High Speed TTL Compatible Optocouplers

https://docs.broadcom.com/doc/AV02-0940EN

Estou usando o P817, mas creio que o problema aqui não é mais a comunicação. 

Estou aprendendo agora sobre transmissão e recepção de dados e eu não estou sabendo formatar corretamente os dados para envio e decodificar na recepção.

Eu preciso enviar 4 grandezas medidas (tensão, corrente, potência e temperatura).

Em praticamente tudo o que pesquisei na internet, sempre ensinam a mesma coisa, como enviar um evento, ou uma String, apertar um botão, e coisas simples. Mas enviar essas variáveis em tempo real, preciso converter de float para byte, para enviar, e depois fazer o inverso no receptor.

Ainda não sei qual a melhor maneira de fazer isso.

Boa noite,

Tenho quase certeza de que está usando uma biblioteca do tipo SoftSerial.

O arduino não é capaz de trafegar dados de forma confiável a 9600 ou mais usando simulação de portas seriais.

Recomendo testar com velocidades de 4800, 2400 ou até 1200 bps.

Boa sorte,

  'Eiju

Sim, estou, pois estou usando a serial por hardware para ver os dados no monitor. Vou testar essas opções. Obrigado.

Boa noite André, 

Sugiro que faça testes exaustivos com ligação direta das interfaces seriais, até conseguir bons resultados.

E depois faça os testes com a interface isolada. 

https://robotic-controls.com/learn/arduino/arduino-arduino-serial-c...

https://iot-guider.com/arduino/serial-communication-between-two-ard...

https://www.mschoeffler.de/2020/01/12/arduino-to-arduino-communicat...

http://www.zonnepanelen.wouterlood.com/arduino-bare-basics/arduino-...

Esses links deram uma clareada. Vou verificar com calma e fazer os testes. 

Obrigado.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço