Manual
do
Maker
.
com
Eu sei, estou escrevendo muitos artigos de gateway e nenhum da comunicação ainda, mas vamos ficar felizes? Um ESP8266 pode ser um gateway de uma rede mesh com NRF24L01 e o melhor, a configuração é mais simples e o custo, bem menor que usar um Raspberry Pi. Por isso acho válido investir um pouco de tempo nessa empreitada, de modo que você poderá escolher entre todas as opções a que melhor lhe convém.
Se você não acompanhou os artigos relacionados anteriores, vou fazer uma breve introdução; uma rede mesh é um conjunto de dispositivos que chegam ao seu destino saltando entre outros dispositivos configurados na mesma rede. E o melhor, ele se encarrega de achar a melhor rota. Quando discorro sobre hops, gateway e rotas, estou me referindo a características específicas de comunicação em rede e se você não tem esses conceitos, talvez seja melhor dar uma pesquisada para saber de que se trata, senão o artigo (ou até a configuração final) pode não fazer muito sentido para você.
Uma rota em rede é a mesma coisa que uma rota no seu GPS. Você sai de uma origem a um destino pretendido e no caso do GPS, ele se orienta por um programa que dá as coordenadas para chegar ao destino. As redes comuns, em sua grande (e quase absoluta) maioria utilizam 2 tipos de roteamento (existem diversos outros e muitos protocolos); o caminho padrão e o caminho estático (default gateway e static route, respectivamente). Então a regra é simples. Todos os endereços que seu computador não sabe como chegar, ele vai pelo default gateway, que por sua vez se comunica com seu respectivo default gateway e assim, o roteamento é feito até o destino. Porém, muitas redes tem caminhos diferentes para determinados destinos; por exemplo, para acessar uma segunda rede de uma empresa, como uma intranet. Nesse caso, não adianta ir pelo default gateway porque ele procurará o destino na Internet (exceto a rota estática esteja configurado nele). Nesse caso, seu computador pode ir para a rede pretendida através de um gateway para essa outra rede, através de uma rota estática configurada localmente ou distribuida através do servidor DHCP da sua rede local. Ficou um pouco complicado, hum? É ai que entra a mágica da rede mesh.
Em uma rede mesh, os dispositivos interligados à rede se comunicam entre sí de forma livre e um dispositivo próximo ao gateway pode ser levado para longe. Ele não estará mais se conectando diretamente ao gateway, mas através de saltos (hops) através dos outros dispositivos dessa rede mesh, ele poderá chegar ao gateway novamente, sem nenhuma configuração adicional e sem a necessidade de configuração de endereços!
Acredito que para evitar riscos, é melhor dar uma cartada logo; use alguma board que tenha o ESP12, pelos recursos que ele oferece. Além disso, precisaremos de pinos de GPIO para fazer o wiring do NRF24L01, que usa SPI. Eu ainda não testei com esse ESP32, mas depois farei alguns testes e atualizo esse artigo.
SPI é um protocolo de comunicação serial (Serial Peripheral interface), utilizado por alguns dispositivos e disponível em grande parte de MCUs e CPUs (como é o caso do ESP8266). Ele é mais rápido que I2C, mas em contrapartida utiliza-se de mais pinos para fazer a comunicação.
Agora, como configurá-lo para que seja um gateway? Acredite ou não, o processo é tão simples e transparente quanto o funcionamento da rede mesh.
O primeiro passo é ter o suporte a ESP8266 na IDE do Arduino. Se ainda não o fez, recomendo que leia esse artigo.
O próximo passo é adicionar um driver para a comunicação USB2UART. Baixe e instale a partir desse link.
Dentro do diretório tem as instruções para compilação conforme a plataforma. Eu só utilizo Linux, então nem vou discorrer quanto ao procedimentod a compilação para outras plataformas. Dentro tem também um código de exemplo para a comunicação, mas não funcionou, haviam erros que me levaram a crer que o código nem havia sido testado, então eu modifiquei ele. Renomei o arquivo cp210x_gpio_example.cpara cp210x_gpio_example.cppe deixe-o desse modo (aproveitei para receber a porta como parâmetro):
#include <fcntl.h>
#include <stropts.h>
#include <termios.h>
#include <string.h>
#include <iostream>
#include <unistd.h>
char selectedPort[20] = {0};
using namespace std;
int main(int argc,char **argv)
{
if (argc < 2){
printf("passe a porta como parametro. Saindo...");
return -1;
}
strncpy(selectedPort,argv[1],20);
int fd;
cout << "CP210x Serial Test\n";
fd = open(selectedPort, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
cout << "Error opening port " << selectedPort << endl;
return -1;
}
unsigned long gpio;
ioctl(fd, 0x8000, &gpio);
cout << "original gpio = ";
cout << hex << gpio << endl;
gpio = ~gpio;
gpio = gpio << 8;
gpio |= 0x00FF;
cout << "gpio = ";
cout << hex << gpio << endl;
ioctl(fd, 0x8001, &gpio);
ioctl(fd, 0x8000, &gpio);
cout << "new gpio = ";
cout << hex << gpio << endl;
close(fd);
return 0;
}
E para compilar:
g++ -o gpioTest cp210x_gpio_example.cpp
A primeira coisa que você precisa fazer é instalar a biblioteca MySensors. Siga o menu Sketch > Include Library > Library manager e digite MySensors na caixa de pesquisa. Instale.
Depois de instalado o MySensors, abra o sketch e apenas substitua os parâmetros de rede. O sketch a ser aberto é o File -> Sketchbook -> Libraries -> MySensors -> GatewayEsp8266. Salve e faça o upload para o ESP8266.
Depois de todos esses procedimentos, você poderá abrir o terminal serial e assistir o ESP8266 se conectando à sua rede WiFi. Daí você poderá posteriormente colocar um IP fixo no ESP8266 ou configurar seu servidor DHCP para lhe atribuir sempre o mesmo IP, baseado no MAC. Depois disso você poderá conectar qualquer aplicação capaz de se comunicar com o MySensors Ethernet Gateway. Só isso.
Dá pra fazer um teste também, conectando-se via telnet (coisa dos primórdios da comunicação IP, mas útil até a atualidade), conectando-se à porta 5003. Supondo o IP 192.168.0.7:
telnet 192.168.0.7 5003
E envie alguns comandos. Agora, espante-se com a simplicidade do sketch:
/**
* The MySensors Arduino library handles the wireless radio link and protocol
* between your home built sensors/actuators and HA controller of choice.
* The sensors forms a self healing radio network with optional repeaters. Each
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
* network topology allowing messages to be routed to nodes.
*
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2015 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
*
* Documentation: http://www.mysensors.org
* Support Forum: http://forum.mysensors.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
*******************************
*
* REVISION HISTORY
* Version 1.0 - Henrik EKblad
* Contribution by a-lurker and Anticimex,
* Contribution by Norbert Truchsess <norbert.truchsess@t-online.de>
* Contribution by Ivo Pullens (ESP8266 support)
*
* DESCRIPTION
* The EthernetGateway sends data received from sensors to the WiFi link.
* The gateway also accepts input on ethernet interface, which is then sent out to the radio network.
*
* VERA CONFIGURATION:
* Enter "ip-number:port" in the ip-field of the Arduino GW device. This will temporarily override any serial configuration for the Vera plugin.
* E.g. If you want to use the defualt values in this sketch enter: 192.168.178.66:5003
*
* LED purposes:
* - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs in your sketch, only the LEDs that is defined is used.
* - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved
* - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
* - ERR (red) - fast blink on error during transmission error or recieve crc error
*
* See http://www.mysensors.org/build/esp8266_gateway for wiring instructions.
* nRF24L01+ ESP8266
* VCC VCC
* CE GPIO4
* CSN/CS GPIO15
* SCK GPIO14
* MISO GPIO12
* MOSI GPIO13
* GND GND
*
* Not all ESP8266 modules have all pins available on their external interface.
* This code has been tested on an ESP-12 module.
* The ESP8266 requires a certain pin configuration to download code, and another one to run code:
* - Connect REST (reset) via 10K pullup resistor to VCC, and via switch to GND ('reset switch')
* - Connect GPIO15 via 10K pulldown resistor to GND
* - Connect CH_PD via 10K resistor to VCC
* - Connect GPIO2 via 10K resistor to VCC
* - Connect GPIO0 via 10K resistor to VCC, and via switch to GND ('bootload switch')
*
* Inclusion mode button:
* - Connect GPIO5 via switch to GND ('inclusion switch')
*
* Hardware SHA204 signing is currently not supported!
*
* Make sure to fill in your ssid and WiFi password below for ssid & pass.
*/
// Enable debug prints to serial monitor
#define MY_DEBUG
// Use a bit lower baudrate for serial prints on ESP8266 than default in MyConfig.h
#define MY_BAUD_RATE 9600
// Enables and select radio type (if attached)
#define MY_RADIO_NRF24
//#define MY_RADIO_RFM69
#define MY_GATEWAY_ESP8266
#define MY_ESP8266_SSID "COLOQUE_SUA_REDE_AQUI"
#define MY_ESP8266_PASSWORD "COLOQUE_A_SENHA_DE_SUA_REDE_AQUI"
// Enable UDP communication
//#define MY_USE_UDP
// Set the hostname for the WiFi Client. This is the hostname
// it will pass to the DHCP server if not static.
// #define MY_ESP8266_HOSTNAME "sensor-gateway"
// Enable MY_IP_ADDRESS here if you want a static ip address (no DHCP)
//#define MY_IP_ADDRESS 192,168,178,87
// If using static ip you need to define Gateway and Subnet address as well
#define MY_IP_GATEWAY_ADDRESS 192,168,178,1
#define MY_IP_SUBNET_ADDRESS 255,255,255,0
// The port to keep open on node server mode
#define MY_PORT 5003
// How many clients should be able to connect to this gateway (default 1)
#define MY_GATEWAY_MAX_CLIENTS 2
// Controller ip address. Enables client mode (default is "server" mode).
// Also enable this if MY_USE_UDP is used and you want sensor data sent somewhere.
//#define MY_CONTROLLER_IP_ADDRESS 192, 168, 178, 68
// Enable inclusion mode
#define MY_INCLUSION_MODE_FEATURE
// Enable Inclusion mode button on gateway
// #define MY_INCLUSION_BUTTON_FEATURE
// Set inclusion mode duration (in seconds)
#define MY_INCLUSION_MODE_DURATION 60
// Digital pin used for inclusion mode button
#define MY_INCLUSION_MODE_BUTTON_PIN 3
// Set blinking period
// #define MY_DEFAULT_LED_BLINK_PERIOD 300
// Flash leds on rx/tx/err
// Led pins used if blinking feature is enabled above
#define MY_DEFAULT_ERR_LED_PIN 16 // Error led pin
#define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin
#define MY_DEFAULT_TX_LED_PIN 16 // the PCB, on board LED
#if defined(MY_USE_UDP)
#include <WiFiUdp.h>
#endif
#include <ESP8266WiFi.h>
#include <MySensors.h>
void setup()
{
}
void presentation()
{
// Present locally attached sensors here
}
void loop()
{
// Send locally attached sensors data here
}
O wiring está descrito no próprio sketch, sugerindo resistores de pulldown. Eu achei melhor fazer, mas quando eu não estiver mais me divertindo com ele, vou experimentar sem os resistores pra ver se o ESP8266 aguenta o tranco. No próximo artigo relacionado vamos ver a intercomunicação de alguns dispositivos, prometo que não escrevo mais sobre gateways!
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.