Decolando seu projeto no IoT: conversor socket/serial para microcontroladores usando esp8266-01
Você já percebeu como a área tecnológica está mudando de forma surpreendente nas últimas décadas? É comum usarmos uma série de dispositivos eletrônicos que servem para adaptar uma tecnologia em uma versão mais eficiente. Procure aí pela sua casa ou trabalho um adaptador de tomada, um conversor digital para televisão ou mesmo um conversor HDMI/VGA.
Na área de automação não é diferente. Um profissional de automação às vezes precisa converter um padrão tradicional e consagrado em outros padrões que estão na linha de frente da Indústria 4.0. Pensando nisso, a seguir será detalhado uma forma simples e de baixo custo de transformar um padrão de comunicação sem fio em um padrão serial com fio usado em diversos tipos de microcontroladores como PIC, ATMEL, ARM etc. Afinal, microcontrolador que não se comunica, se trumbica também!
Ideia principal
Quem trabalha na área sabe que não é apenas uma coincidência que automação rima com comunicação. Quando fazemos um curso de microcontroladores, a primeira forma de “conversar” com o mundo externo é através de cabos que usam a comunicação serial conhecida como UART (Universal Asynchronous Receiver/Transmitter).
Até aqui a mágica parece bem interessante. Mas, e se você desejar acionar uma carga sem usar cabos? Se desejar usar o computador para abrir a porta da sua casa, porém não está com vontade de passar o cabo serial pela sua sala?
O esp8266-01 é nossa solução! A ideia principal é criar um conversor serial para microcontrolador com wifi. Isto é, levando em conta que o nosso amigo esp8266-01 pode criar uma rede sem fio usando a pilha de protocolos TCP/IP, vamos utilizar uma interface conhecida como socket para criar uma porta de comunicação entre o servidor , que nesse caso é o próprio esp8266-01 e um cliente que pode ser um computador ou um celular. A figura 1 e a figura 2 representam esta ideia do antes e do depois:
Concluindo, o esp8266 serve como uma ponte entre os dados do wifi e a porta serial e funcionando de forma que não altere os dados. Vale destacar que esta aplicação pode ser usada tanto para aplicações mais simples como o uso de relés, como para aplicações utilizando protocolos de comunicação mais avançados como o protocolo Modbus-RTU ou outras aplicações em IoT.
Material
- Módulo adaptador gravador ESP8266-01 ou qualquer conversor para o padrão RS232 TTL (como 0 PL2303 ou CH340 )
- Adaptador módulo wifi esp8266-01 3,3V/5V
- Módulo ESP8266-01
Programa do conversor serial/socket para microcontrolador com wifi
Primeiramente, vamos apresentar o programa 1 que representa a utilização do conversor serial/socket utilizando uma rede própria criada pelo ESP8266-01. Em resumo, a mensagem que chega via socket do client TCP/IP sai pela serial e de forma análoga, a mensagem que chega via serial vai para o cliente TCP/IP via socket.
#include <ESP8266WiFi.h> const char *ssid = "rede_AP"; //o esp8266 cria esta rede wifi, não é a rede do roteador local const char *password = "abcd1234"; //senha passa acessar a rede WiFiServer server(502); //define a porta 502 para comunicação (padrão modbus, mas poderia ser qualquer outra porta livre) char data[250], dcr[250]; //variáveis para armazenar o caracteres da transmissão/recepção int ind = 0, icd = 0; WiFiClient client; void setup() { Serial.begin(9600); //taxa de transmissão IPAddress staticIP(192, 168, 4, 2); // IP estático do dispositivo IPAddress gateway(192, 168, 4, 1); // Endereço gateway IP IPAddress subnet(255, 255, 255, 0); // Máscara de subrede WiFi.mode(WIFI_AP); // Trabalhando como Access Point WiFi.softAP(ssid, password, 2, 0); WiFi.config(staticIP, gateway, subnet); server.begin(); delay(5000); Serial.println("Server started"); Serial.println(WiFi.softAPIP()); //mostra o IP pela serial - opcional } void loop() { if (!client.connected()) { //verifica a conexão com um client client = server.available(); } else { //********INICIO DA ROTINA SERIAL - WIFI*********** if (Serial.available() > 0) { while (Serial.available()) { //aguarda dados da serial dcr[icd] = Serial.read(); //armazena em um vetor icd++; } for (int j = 0; j < icd; j++) { //laço for para transmitir os dados para o client client.print(dcr[j]); //transmite dados do vetor para o cliente } } //********INICIO DA ROTINA WIFI - SERIAL*********** if (client.available() > 0) { while (client.available()) { //aguarda dados do cliente data[ind] = client.read(); //armazena em um vetor ind++; } client.flush(); for (int j = 0; j < ind; j++) { //laço for para transmitir os dados pela serial Serial.print(data[j]); //transmite dados do vetor para a serial } } icd = 0; ind = 0; } }
Gravando o Esp8266-01
Entre as opções mais tradicionais podemos gravar o esp8266-01 utilizando um gravador ou conversor FTDI de 3,3V conforme os links a seguir:
Mas não tenho gravador, e agora?
Como o esp8266-01 não aceita tensões maiores que 3.3V, podemos utilizar o próprio adaptador para reduzir a tensão de 5V do padrão TTL para 3,3V. Basta fazer a ligação mostrada na figura 3, utilizando um pedaço de fio BEM FINO e qualquer conversor que trabalha com saída em RS232 TTL (como 0 PL2303 ou CH340):
Para gravar utilize os mesmos procedimentos dos exemplos dos links anteriores, mas não esqueça de retirar o jumper (destaque em amarelo da figura 3) para que o ESP8266-01 volte a funcionar normalmente após a gravação.
Agora os fios estão por um fio…
Estamos quase lá. Precisamos só definir quem vai enviar os dados para o microcontrolador utilizando uma conexão socket. Lembre que o esp8266-01 é transparente, ou seja, só entrega e recebe mensagem sem ninguém saber que ele existe.
A seguir são descritas duas opções de configuração do cliente TCP/IP utilizando um celular e um computador para testar o conversor serial para microcontrolador com wifi.
Enviando e recebendo dados por um celular
Como forma de testar a nossa comunicação via celular, vamos utilizar o aplicativo TCP client, desenvolvido pela Solae Systems. Este aplicativo cria um cliente TCP/IP no celular que é capaz de enviar e receber informações através do ESP8266-01. Não esqueça de entrar na rede wifi do ESP8266-01 antes de tentar fazer qualquer comunicação. As figuras 4 ilustra a rede com o nome “rede_AP” criada pelo ESP8266-01.
Deve-se executar o programa recém instalado TCP Client e então criar o servidor clicando no símbolo “+” conforme a figura 5.
Figura 5 – Atualizando a lista de servidores
Conforme você viu anteriormente no programa do esp8266-01 consideramos o IP do programa fixo e sendo assim configuramos o IP definido no programa do esp8266-01 (192.168.4.1) e a porta 502 da interface socket no celular, conforme ilustrado na figura 6.
Figura 6 – Configurando a porta da interface socket
Enviando e recebendo dados por um computador
Similar ao exemplo anterior, agora vamos utilizar um computador para entrar na rede wifi do esp8266-01 utilizando as opções de conexão de rede. Vários programas podem ser utilizados para fazer essa comunicação, mas para simplificar vamos utilizar um programa de supervisão básica onde precisamos apenas digitar o IP e a porta, conforme ilustrado na figura 7.
A seguir o vídeo de teste com o programa para ligar e desligar o led utilizando a placa FABPIC versão 1.2 e placa de potência. Mais detalhes desta plataforma de hardware podem ser vistos aqui.
Video 1 – Teste do conversor socket serial
Teste final
Agora que você já aprendeu a configurar o lado do cliente e a gravar o programa no conversor no esp8266-01 precisamos testar a comunicação serial que sai e entra do esp8266-01. Por fim, para testar a aplicação de nosso conversor precisamos ter outro microcontrolador que execute alguma ação ao receber os dados enviados pela serial. Porém, neste ponto que chegamos torna-se necessário que você tenha alguma experiência em programação e gravação de microcontroladores para podermos utilizar o nosso conversor.
POr exemplo, vamos elaborar um programa que ao receber um caractere “L” ele irá ligar um led e irá desligar este mesmo led ao receber um caractere “D” pela serial . Lembrando que o caractere é enviado pela interface socket através do esp8266-01 e convertido para o padrão serial TTL para comunicar com o microcontrolador definido pelo usuário.
A receita final
Cada pessoa tem um gosto que é refletido em uma preferência pessoal de microcontrolador e compilador. Por isso, nossos ingredientes da receita para finalizar o teste de nosso conversor são três programas: um programa para arduino uno e dois programas com o microcontrolador PIC18F4550; um compilado pelo compilador CCS e o outro programa utilizando o compilador MikroC. Ou seja, todos sendo escolhidos ao melhor gosto de quem for utilizar o nosso conversor.
const int ledPin = 13; // Led nativo do arduino void setup() { Serial.begin(9600);//taxa de transmissão 9600bps pinMode(ledPin, OUTPUT); // Pino 13 será de saída digital } void loop() { int vel;//tirar () if (Serial.available()) { // Verificar se há caracteres disponíveis pela serial char caractere = Serial.read(); // Armazena caractere lido switch (caractere) { case 'L': digitalWrite(ledPin, 1);// se o valor enviado for igual a "L" liga o led no pino 13 break; case 'D': digitalWrite(ledPin, 0);// se o valor enviado for igual a "D" desliga o led no pino 13 break; }}}
Na figura 8 são mostradas as ligações do esp8266-01 e seu conversor com a placa arduino uno.
#define led pin_d0 #include <18F4550.h> #fuses HS,CPUDIV1,PLL5,USBDIV #use delay(clock=20000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) void main() { while(true) { char selection; printf("\r\nSelecione:\r\n");//Pequeno menu com as opções printf(" 1) L - ligar led \r\n"); printf(" 2) D - desligar led \r\n"); do { selection=getc(); } while (!((selection=='L')||(selection=='D')));//Espera que o caractere enviado seja "L" ou "D". if (selection=='L')// se o valor enviado for igual a "L" liga o led no pino D0 {output_high(led);} else {output_low(led);}// se o valor enviado for igual a "D" liga o led no pino D0 } }
char byte_read; void main(){ UART1_Init(9600); TRISD = 0x00; // Configura porta D como saída while(1) // Loop infinito { byte_read = UART1_Read(); // Lê o byte enviado pela serial if (byte_read=='L') // se o valor enviado for igual a L liga o led no pino D0 {PORTD.F0 = 1;} if (byte_read=='D') // se o valor enviado for igual a D desliga o led no pino D0 {PORTD.F0 = 0;} } }
A seguir são mostradas as ligações do esp8266-01 e seu conversor com o microcontrolador pic18F4550. Vale destacar que a figura representa apenas a comunicação do microcontrolador, sendo necessário incluir a alimentação elétrica e os elementos extras para seu funcionamento como o cristal oscilador, capacitores e o botão de reset.
Conclusão
Chegamos ao final de nosso projeto e espero que você tenha aprendido bastante. Concluindo, ao longo da nossa prática foi apresentada uma forma bem simples de converter um padrão consagrado de comunicação serial em uma rede sem fio, representando diversas vantagens no que tange principalmente a economia de cabos e a facilidade de utilização de equipamentos em uma rede wifi.
Adicionalmente, o conversor serial para microcontrolador com wifi apresenta um custo razoavelmente baixo e conseguimos implementar uma solução em três plataformas diferentes, capazes de potencializar novos projetos na Industria 4.0 e em aplicações IoT.
Todos os programas desta prática estão disponíveis para baixar no seguinte endereço.
Referência
BRITO, Fábio Timbó; BRITO, Felipe Timbó. Protocolos de comunicação. Curitiba: LT, 2015
Crédito das imagens não autorais:
www.pixabay.com (159115,2168193,47581)
muito bom ,, gostei da forma como colocou as ideias parabéns parabéns
Olá Alexandre, agradecemos seu feedback!