Comunicação Serial entre o ATMega328P e o ESP8266

Este artigo mostra, com um exemplo bem simples, como implementar a comunicação serial entre os microcontroladores presentes na placa MBZ Wifi.



A placa MBZ Wifi tem dois microcontroladores, o ATMega328P e o ESP8266, que podem trocar dados através de uma comunicação serial.

Os pinos RX/TX da ESP8266 estão ligados com os pinos D2/D3 do ATMega328P, desta forma, utilizando a biblioteca SoftwareSerial os dois microcontroladores podem estabelecer uma comunicação serial bilateral.

Se o seu projeto usar comunicação serial entre o ATMega328P e o ESP8266, os pinos D2 e D3 do ATMega328P não devem ser utilizados para outra finalidade.

A velocidade recomendada para esta comunicação é no máximo 19200 bps.

Siga as orientações abaixo:

obs: por default, a MBZ vem com o ESP8266 carregado com o firmware de comandos AT, se você programar o ESP8266 com seu próprio código, esse firmware será sobre-escrito.
Clique aqui para ver como restaurar o firmware de comandos AT do ESP-01

1) Instalar suporte para a ESP8266 na IDE do Arduino

Para poder programar a ESP8266, você precisa fazer a seguinte configuração na IDE do Arduino:

1.1) abra a opção "Preferências";
1.2) no item "URLs Adicionais para Gerenciadores de Placas" digite a URL:
       http://arduino.esp8266.com/stable/package_esp8266com_index.json
1.3) pressione o botão "Ok"


2) Limpar programa no ATMega328P

Para evitar erros de upload de programa para o ESP8266, é aconselhável limpar o programa no ATMega328P.

2.1) Mude os jumpers perto do conector FDTI para a posição "atmega":
    



2.2) Selecione no menu "Ferramentas" a placa "Arduino/Genuino Uno":

2.3) Crie um "programa em branco", selecionando "Novo" no menu "Arquivo", compile e faça o upload para o ATMega328P:



3) Carregar o programa de teste no ESP8266

O programa mbz_serial_esp.ino fica aguardando uma mensagem vindo da porta serial do ESP8266.
Assim que chega uma mensagem, ele verifica qual é solicitação e devolve a string correspondente.

3.1) Conecte uma fonte de alimentação externa

3.2) Selecione no menu "Ferramentas" a placa "Generic ESP8266 Module":

3.3) Mude os jumpers perto do conector FDTI para a posição "esp". Mude os jumpers perto do ESP8266 conforme a imagem abaixo:

3.4) Pressione o botão "ESP_reset"

3.5) Compile e faça o upload do programa abaixo para o ESP8266:

Programa mbz_serial_esp.ino
#include <ESP8266WiFi.h>

String strBuffer = "";

void setup() {
  Serial.begin(19200);
  Serial.setTimeout(3000);
}

void loop() {
  String command;
  
  if (Serial.available()) {
    command = Serial.readString(); // le dados da serial
  }

  if (!command.equals("")) {
    if (command == "pega_local") {
      Serial.print("Sao Paulo, BR"); // envia dados pela serial
    }
    if (command == "pega_clima") {
      Serial.print("Ensolarado, 27 graus"); // envia dados pela serial
    }
  }

  command = "";

  delay(100);
}

3.6) Mude os jumpers perto do ESP8266 conforme a imagem abaixo: 




3.7) Pressione o botão "ESP_reset"

4) Carregar o programa de teste no ATMega328P

O programa mbz_serial_atmega.ino envia mensagens de requisição para o ESP8266 e fica aguardando uma mensagem de resposta.

4.1) Selecione no menu "Ferramentas" a placa "Generic ESP8266 Module":


4.2) Mude os jumpers perto do conector FDTI para a posição "atmega":


4.3) Compile e faça o upload do programa abaixo para o ATMega328P:

Programa mbz_serial_atmega.ino
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
SoftwareSerial EspSerial(rxPin, txPin); // RX, TX

String strBuffer = "";

void setup() {
  Serial.begin(19200);
  EspSerial.begin(19200);
}

void loop() {
  Serial.println("> enviando comando para ESP-01: pega_local");
  // envia requisição para ESP-01 e espera por até 5 segs a resposta  
  sendData("pega_local", 5000);    

  // exibe a resposta que foi guardada na variável strBuffer
  Serial.print("> resposta da ESP-01: ");
  Serial.println(strBuffer);
  Serial.println();

  Serial.println("> enviando comando para ESP-01: pega_clima");
  // envia requisição para ESP-01 e espera por até 5 segs a resposta  
  sendData("pega_clima", 5000);

  // exibe a resposta que foi guardada na variável strBuffer
  Serial.print("> resposta da ESP-01: ");
  Serial.println(strBuffer);
  Serial.println();

  delay(2000);
}

void sendData(String command, const int timeout)
{
  strBuffer = "";
  
  EspSerial.print(command);
  long int time = millis();

  while ( (time + timeout) > millis())
  {
    if (EspSerial.available() > 0)
    {
      strBuffer = EspSerial.readString();
      break;
    }
    delay(1);
  }
}


5) Testar a comunicação

5.1) Selecione no menu "Ferramentas" a opção "Monitor Serial"

5.2) Selecione a velocidade "19200"


Se tudo deu certo você verá as mensagens de requisição (ATMega328P) e resposta (ESP8266).

Este exemplo é bem simples, feito apenas para ilustrar como a comunicação serial pode ser implementada entre os dois microcontroladores.

Você poderá melhorar essa comunicação acrescentando mais controles, checagem de dados (CRC), etc.

Um comentário :