Montei um circuito de testes (anexo) com ESP8266 12E e um chip SN75176 para comunicação RS485. Liguei duas placas dessas via RS485. Em meus testes observei dois problemas:

1) Quando conecto as duas placas diretamente via RX/TX dos ESPs das duas placas, tudo funciona OK. Quando faço a comunicação passar pelo chip SN75176 para RS485 ocorre um atraso no envio dos dados, de forma que as informações só são transmitidas por inteiro se for acrescentado um delay de 1ms conforme mostrado no código de teste (abaixo).

2) O pino RX do ESP8266 está sempre em nível ALTO quando não está ocorrendo comunicação (já testei com várias placas NodeMCU ESP8266 12E). Este nível lógico interrompe a operação do SN75176, então adicionei o diodo D6 como mostrado no diagrama anexo (funcionou). Porém já usei esse chip SN75176 com Atmega e PIC em lugar do ESP8266 e nunca tive esse problema.

 

Alguém sabe o que pode estar gerando o problema “1” ou o “2”?

//------------------------------------------------------------------

#define PIN_RS485    15
#define BUILTIN_LED  2

void setup() {
  pinMode(PIN_RS485, OUTPUT);
  pinMode(BUILTIN_LED, OUTPUT);
  
  Serial.begin(115200);
  
  digitalWrite(PIN_RS485, LOW);
}

void loop() {
   digitalWrite(PIN_RS485, HIGH);
   Serial.printf("0123456789");
   delay(1);
   digitalWrite(PIN_RS485, LOW);
   
   delay(50);
   digitalWrite(BUILTIN_LED, !digitalRead(BUILTIN_LED));
}

//------------------------------------------------------------------

Exibições: 2621

Responder esta

Respostas a este tópico

Não alterou o comportamento. A necessidade do delay ainda persiste. Valeu!

bom dia, eu poderia colocar um esp32 nos pinos RX e TX
Tenho essa duvida porque o esp32 é 3,3V e o ci que vc usou e de 5V entao provavel emnte ele ira jogar 5V no esp32, entao acredito que nao de... oque vc me sugere para fazer uma comunicação com esp32 que  e 3,3V?

Por que esta mudando o estado do pino TXD2 ( GPIO 15) para HIGH ? Para ativar o chip RS-485. 

Sugiro que use um outro pino, para efeito de teste. 

#define PIN_RS485    15

 digitalWrite(PIN_RS485, HIGH);

 e depois 

digitalWrite(PIN_RS485, LOW);

http://blog.eletrogate.com/nodemcu-esp12-introducao-1/

Vou testar e posto aqui o resultado. Obrigado.

Boa tarde WB,

ok, entendi a necessidade do seu projeto.

Já testou assim:

voce envia  " (unsigned int)MB_msg_length) " bytes ;

 int bytesSent = 0;        // bytesSent   recebe o valor de bytes enviados pelo Serial.write.

 

 while(bytesSent  <  (unsigned int)MB_msg_length))

     {

             bytesSent = Serial.write((const uint8_t *)MBBufferArray, (unsigned int)MB_msg_length);

     }

RV

Não funcionou também...

Tentei isso também sem sucesso:

    digitalWrite(PIN_RS485, HIGH);
    for (int i = 0; i < 9; i++)
        Serial.write((unsigned char)i);
    digitalWrite(PIN_RS485, LOW);

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço