Managementul conexiunii WiFi la ESP8266

Circuitul WiFi Espressif ESP8266 a reprezentat o evoluție importantă în universul plăcilor de dezvoltare în general dar și a comunității Arduino. Permițând conectivitate WiFi la un preț derizoriu și ușurință de programare și utilizare în cadrul sistemelor DIY, ESP8266 are o popularitate și o răspândire din ce în ce mai mare echipând plăci de dezvoltare diverse.

Facilitățile oferite de extensia ESP8266 pentru Arduino IDE includ conectarea la Internet prin intermediul unui AP, activarea ca un AP, funcționarea duală client WiFi și AP, utilizarea protocoalelor http și https, funcționarea ca server web sau server DNS ș.a.m.d. Toate aceste facilități oferite de circuitul ESP8266 fac din acesta un instrument extrem de util în cadrul proiectelor proprii. Una dintre problemele care apare totuși la construirea unui dispozitiv bazat pe circuitul ESP8266 este managementul datelor de conectarea la rețea. Dacă se dorește schimbarea datelor de acces la rețeaua WiFi (mutăm dispozitivul în altă locație sau modificăm infrastructura de acces la Internet) dispozitivul trebuie reprogramat. Chiar dacă luăm în calcul programarea OTA tot este necesară utilizarea unui sistem de calcul (PC sau laptop cu Arduino IDE instalat) pentru a modifica datele de acces (SSID și parolă).

Bineînțeles, este posibilă programarea unei interfețe web care să permită modificarea variabilelor corespunzătoare datelor de acces dar acest lucru este destul de consumator de timp și adaptarea codului pentru proiecte diverse este o sarcină repetitivă destul de anevoioasă. Din fericire există o bibliotecă software ce permite automatizarea acestui proces și ușurează foarte mult dezvoltarea noilor proiecte în care avem nevoie de modificarea parametrilor de funcționare fără a reprograma dispozitivul.

Această bibliotecă se numește WiFiManager și permite configurarea, prin intermediul unei interfețe web, a conexiunii WiFi în cazul în care configurarea implicită nu funcționează (interfața web de configurare se activează doar în cazul în care conectarea la rețea nu este posibilă cu datele de autentificare curente). Instalarea bibliotecii se face din Library Manager a mediului Arduino IDE. Testele au fost realizate pe o placă NodeMCU utilizând Arduino IDE 1.8.5 și extensia ESP8266 Community 2.4.1.

2

După instalarea bibliotecii facilitățile de configurare se includ în program inserând în cod secvențele următoare. La începutul programului se include biblioteca WiFiManager și dependințele acesteia:

#include <ESP8266WiFi.h>

#include <DNSServer.h>   

#include <ESP8266WebServer.h> 

#include <WiFiManager.h>

WiFiManager wifiManager;

În cadrul secțiunii setup() se înlocuiește codul obișnuit de conectare cu instrucțiunea:

wifiManager.autoConnect();

Execuția acesteia va conduce la conectarea la rețea dacă procesul de configurare a fost deja parcurs sau la blocarea programului și la pornirea interfeței de configurare web. Aceasta va fi accesibilă prin intermediul unui AP propriu sistemului, AP denumit ESPXXXXXX, la adresa IP 192.168.4.1 .

3

Interfața web permite configurarea și salvarea rețelei în care va funcționa dispozitivul, vizualizarea informațiilor hardware specifice plăcii de dezvoltare și resetarea acesteia.

4

5

Dacă conectivitatea de rețea nu este esențială în funcționarea dispozitivului – dispozitivul trebuie să funcționeze și fără conexiunea de rețea – putem adăuga următoarea instrucțiune pentru a defini un timp în care se așteaptă configurarea după care se trece mai departe la execuția normală a programului.

wifiManager.setConfigPortalTimeout(180);

În cazul în care dorim totuși să reluăm periodic tentativa de conectare la rețea, utilă de exemplu în cazul în care repornirea sistemului coincide cu indisponibilitatea AP-ului – datele de conectare sunt corecte dar în momentul în care se încearcă conectarea nu este disponibilă infrastructura, se poate insera o secvență de instrucțiuni, ca în exemplul de mai jos, în secțiunea loop():

if (WiFi.status() != WL_CONNECTED) wifiManager.autoConnect();

Pagina web de configurare poate fi pornită și în mod voit (la apăsarea unui buton de exemplu) prin intermediul instrucțiunii:

wifiManager.startConfigPortal();

O altă facilitate interesantă oferită de bibliotecă este posibilitatea de a adăuga în cadrul paginii de configurare a unor parametrii proprii ce vor fi salvați în memoria nevolatilă a circuitului ESP8266. Instrucțiunile de mai jos definesc o variabilă server ce permite memorarea adresei de rețea a unui server MQTT. Datele de configurat vor apărea în interfața web alături de configurația de acces în rețeaua WiFi.

WiFiManagerParameter custom_mqtt_server(“server”, “mqtt server”, mqtt_server, 40);

wifiManager.addParameter(&custom_mqtt_server);

mqtt_server = custom_mqtt_server.getValue();

6

Arduino Zombification

În ciuda simplității modului de programare oferit de mediul Arduino IDE și de familia de plăci Arduino există implementată o soluție ce permite utilizarea plăcilor de dezvoltare Arduino ca simple periferice USB fără a fi nevoie a înțelege modul de funcționare și programare a acestora. Prin încărcarea unui program gata scris placa Arduino se transformă într-un echipament „zombie” ce execută instrucțiunile primite prin conexiunea USB conform unui protocol standard.

Protocolul de zombificare a unei plăci Arduino se numește Firmata și este integrat ca suport software (bibliotecă + exemple) în Arduino IDE. Pentru instalare și utilizare puteți consulta materialul „Arduino: Installing Standard Firmata”. După încărcarea exemplului StandardFirmata.ino pe orice placă de dezvoltare Arduino, aceasta se va comporta ca un periferic USB pe care îl putem accesa de pe un sistem de calcul (PC sau chiar Raspberry Pi). Accesul intermediat de protocolul Firmata face disponibile toate perifericele hardware ale plăcii de dezvoltare (pini I/O, convertor analog/numeric, magistrale I2C, SPI, pini de comandă PWM) programelor ce rulează pe sistemul de calcul la care este conectată placa. Biblioteca Firmata oferă exemple pentru majoritatea limbajelor de programare: .NET, Java, Perl, Python, PHP, Processing, Flash etc. Firmata reprezintă o soluție extrem de simplă pentru extinderea funcționalităților unei plăci Raspberry Pi prin conectarea la o placă Arduino (a se vedea și proiectul „Access GPIO of Arduino from Raspberry Pi”).

2

Versiunile recente ale bibliotecii Firmata extind posibilitatea de zombificare și a altor plăci precum ChipKIT (exemplul din bibliotecă: StandardFirmataChipKIT.ino) dar și utilizând alte modalități de interconectare între placa de dezvoltare și sistemul de calcul:

  • Utilizând exemplul ino putem utiliza de la distanță o placă Arduino prin intermediul unei conexiuni bluetooth. Exemplul funcționează pe plăci ce integrează modul de comunicație BLE (de exemplu Arduino 101) sau pe orice placă Arduino cu un modul BLE atașat (de exemplu Adafruit Bluefruit nRF8001).
  • Exemplul ino permite, bineînțeles, controlul de la distanță prin intermediul unei conexiuni WiFi. Este posibilă utilizarea mai multor tipuri de plăci precum Arduino MKR1000 sau plăci de dezvoltare bazate pe circuitul ESP8266 (de exemplu Adafruit Feather HUZZAH). Această variantă de zombificare este utilizată de multe limbaje de control la distanță precum Gobot [13] sau Johny-Five.

3

O altă formă de zombificare prin intermediul unei conexiuni WiFi este oferită de placa de dezvoltare Arduino Yun. Există două variante de control la distanță a perifericelor integrate în microcontrolerul ATmega32U4 aflat pe placa de dezvoltare:

  • Prin intermediul serviciilor web de tip API REST adică prin intermediul unor URL-uri ce pot accesa diverse resurse hardware ale microcontrolerului. Acestea pot fi configurate astfel încât accesul să fie protejat de o parolă. Accesând IP-ul plăcii și calea /arduino putem configura, de exemplu, pinii I/O (pe Arduino Yun vom avea încărcat exemplul ino al bibliotecii Bridge):

4

http://myArduinoYun.local/arduino/digital/13 : calls digitalRead(13);

http://myArduinoYun.local/arduino/digital/13/1 : calls digitalWrite(13,1);

http://myArduinoYun.local/arduino/analog/9/123 : analogWrite(9,123);

http://myArduinoYun.local/arduino/analog/2 : analogRead(2);

http://myArduinoYun.local/arduino/mode/13/input : pinMode(13, INPUT);

http://myArduinoYun.local/arduino/mode/13/output : pinMode(13, OUTPUT);

  • Ultimele versiuni de plăci Arduino Yun ce rulează LininoOS permit programarea automată a microcontrolerului ATmega32U4 si utilizarea acestuia ca un periferic sub sistemul de operare. Programarea se face cu ajutorul comenzii:

/usr/bin/lininoio start

5

Utilizarea perifericelor se poate face direct din script bash:

echo 1 > /sys/class/gpio/TXLD/value

sau din alte limbaje de programare, de exemplu Node.JS:

var board = new require(‘ideino-linino-lib’).Board();

var led = 1;

board.connect( function(){

    board.pinMode(“D13”, “OUTPUT”);

    setInterval(function(){

        board.digitalWrite(“D13”, led);

        led = 1 – led;

    },500);

});

O soluție de zombificare pentru plăcile de dezvoltare echipate cu circuitul ESP8266 este ESPEasy. Prin încărcare acestui software pe o placă bazată pe ESP8266 vom putea configura foarte simplu atât partea de conectivitate WiFi (credențialele de acces la Internet) cât și perifericele conectate precum și rolul îndeplinit de sistem (configurare conexiune servicii IoT sau Home Automation) – totul prin intermediul unei interfețe web foarte simple.

6

7

Cum sa realizăm localizarea obiectelor utilizând balize Bluetooth

Problema localizării unui obiect sau a unei persoane are soluții variate adaptate în funcție de domeniul de utilizare și de infrastructura tehnică pe care se bazează. Localizarea prin GPS este utilizată la ora actuală pe scară largă pentru localizare pe întreg cuprinsul globului. Această metodă este îmbunătățită prin implementarea unor mecanisme complementare precum aGPS ce îmbunătățesc precizia de localizare. Totuși, există cazuri în care localizarea prin GPS este dificilă dacă nu imposibilă, cel mai bun exemplu fiind localizarea în interiorul unei clădiri. În aceste cazuri se utilizează, cel mai adesea, metode de localizare bazate pe triangularizarea unui semnal radio. Semnalul radio poate fi bazat pe frecvențe și modulații speciale sau larg răspândite (precum semnalul WiFi). Ne propunem să explorăm această metodă utilizând cea mai simplă și ieftină soluție: localizarea bazată pe balize radio Bluetooth. În cadrul procesului de localizare vor fi implicate două tipuri de sisteme: balize radio Bluetooth și receptor radio bluetooth. Baliza radio Bluetooth are rolul de a emite un semnal radio la un interval de timp fix. Acest semnal radio va reprezenta elementul pe care se va realiza localizarea. Receptorul radio are rolul de a recepționa semnalul radio și, pe baza puterii acestuia, de a determina distanța aproximativă față de emițător (baliza radio). Având în vedere distanța maximă pe care poate să o acopere semnalul radio Bluetooth o astfel de metodă poate fi folosită pentru localizarea în incinte sau zone cu raza de câteva zeci de metri sau, în spații deschise, pâna la o sută de metri. Există două scenarii posibile de localizare: mai multe balize ce permit localizarea receptorului radio pe baza distanței față de fiecare baliză în parte sau mai multe sisteme de recepție ce permit localizarea unei balize pe baza distanței față de fiecare de fiecare sistem de recepție radio (în acest caz trebuie să existe o formă de comunicație între sistemele receptor pentru a realiza triangularizarea semnalului radio).

Algoritmul de triangularizare a poziției în funcție de distanțele dintre sisteme este în afara ariei de acoperire a acestui material. Soluția propusă acoperă doar partea de măsurare a puterii semnalului radio de către receptorul radio Bluetooth. Pentru mai multe informații puteți să consultați articolul: „DIY localization using radio frequency beacons”.

Pentru implementarea unei balize radio bluetooth se poate apela la orice sistem ce include un modul radio Bluetooth (de exemplu Bettle BLE sau Feather BLE) sau, o variantă mult mai ieftină și mai simplă, se poate utiliza un dispozitiv de urmărire de tip iTag.

2

Acest tip de dispozitiv este disponibil comercial cu prețuri pornind de la 2$ și este gândit pentru a fi folosit împreună cu telefonul mobil pentru a localiza diverse lucruri în imediata apropiere (chei sau chiar animale de companie). Telefonul mobil are rolul de receptor radio Bluetooth și va măsura distanța până la dispozitivul iTag (localizarea este bazată doar pe distanță și pe mișcarea telefonului mobil – ne depărtăm de obiectul căutat crește distanța, ne apropiem scade distanța). Dispozitivul iTag nu este altceva decât un dispozitiv Bluetooth programabil ce este produs în serie – are un preț foarte mic. Pentru a vedea ce conține un astfel de dispozitiv se poate parcurge articolul: „Cheap Ebay BLE Tag Teardown (iTag via iTracing app)”.

Pentru implementarea receptorului radio (în cazul în care dorim o soluție de localizare bazată pe un sistem personalizat sau nu dorim să fim dependenți de aplicația mobilă oferită de producătorii dispozitivului iTag) se poate utiliza orice placă de dezvoltare cu modul radio bluetooth încorporat și, foarte important, care permite măsurarea puterii semnalului recepționat. Una dintre variante este placa Raspberry Pi 3, se poate vedea și articolul „Beacon tracking with Node.js and Raspberry Pi”. O altă variantă, mai ieftină și care permite realizarea unor sisteme de recepție compacte, este utilizarea plăcilor de dezvoltare bazate pe microprocesorul ESP32 ce integrează un modul radio Bluetooth.

3

Grație bibliotecii ESP32 BLE Arduino se poate implementa orice tip de comunicație bluetooth cu ajutorul circuitului ESP32 și a mediului de dezvoltare Arduino IDE (toate celelalte bibloteci bluetooth sunt proprietar sau implică medii de dezvoltare scumpe).

Implementarea propusă pentru receptorul radio a fost testată pe o placă de dezvoltare Sparkfun ESP32 Thing utillizând Arduino IDE 1.8.5, Arduino core for ESP32 WiFi chip 0.0.1 și biblioteca ESP32 BLE 0.4.7.

#include <BLEDevice.h>

static BLEAddress *pServerAddress;

BLEScan* pBLEScan;

BLEClient*  pClient;

bool deviceFound = false;

Sistemul va scana timp de 30 de secunde după dispozitive Bluetooth ce se găsesc în vecinătate. Pentru fiecare dispozitiv găsit se va afișa, în consola serială, textul emis ca identificator și puterea semnalului recepționat (RSSI).

4

int scanTime = 30;

class MyAdvertisedDeviceCallbacks: public

BLEAdvertisedDeviceCallbacks {

      void onResult(BLEAdvertisedDevice advertisedDevice)

{

  Serial.print(“BLE Advertised Device found: “);

     Serial.println(advertisedDevice.toString().c_str());

      pServerAddress = new

 BLEAddress(advertisedDevice.getAddress());

      Serial.print(“RSSI: “);

      Serial.println(advertisedDevice.getRSSI());

}

};

void setup() {

  Serial.begin(115200);

  Serial.println(“Scanning…”);

  BLEDevice::init(“”);

  pClient  = BLEDevice::createClient();

  pBLEScan = BLEDevice::getScan();

  pBLEScan->setAdvertisedDeviceCallbacks(new

MyAdvertisedDeviceCallbacks());

  pBLEScan->setActiveScan(true);

}

Scanarea se va relua la fiecare 60 de secunde.

void loop() {

  Serial.println();

  Serial.println(“BLE Scan restarted…..”);

  deviceFound = false;

  BLEScanResults scanResults = pBLEScan->start(30);

  delay(6000);

}

Programul dat ca exemplu poate fi un bun punct de plecare pentru triangularizarea poziției pe baza puterii semnalului emis de baliza radio Bluetooth.

LoRa meets ESP32

Intrarea pe piață a microprocesorului SoC ESP32 a marcat o nouă și interesantă etapă în cadrul familiei de circuite produse de compania Espressif. Două nuclee LX6 ce lucrează la frecvențe de până la 240MHz, conectivitate WiFi b/g/n și bluetooth 4.2, convertor analog-numeric pe 12 biți / 18 canale, două convertoare numeric-analogice pe 8 biți, patru interfețe SPI, două I2C, două I2S și trei UART, interfață CAN bus 2.0 sunt doar câteva dintre facilitățile puse la dispoziția dezvoltatorilor de către ESP32 făcând din acesta o alternativă atrăgătoare pentru noi proiecte. Mai mult decât atâta, pe lângă plăci de dezvoltare bazate pe ESP32 precum Adafruit HUZZAH32, Sparkfun ESP32 Thing sau Olimex ESP32-Gateway, asistăm la apariția unei generații noi de plăci de dezvoltare ce combină conectivitatea circuitului ESP32 cu conectivitatea modulelor radio LoRa.

LoPy este o astfel de placă de dezvoltare dar putem aminti și alte variante precum HELTEC WiFi LoRa 32 sau TTGO ESP32 SX1276 LoRa. Chiar dacă placa de dezvoltare LoPy este gândită pentru a fi programată în mediul MicroPython există și posibilitatea de a utiliza mediul Arduino IDE.

Avantajele unei plăci de dezvoltare ce îmbină conectivitatea circuitului ESP32 (WiFi + bluetooth) cu conectivitatea unui modul radio LoRa (comunicații radio pe distanțe mari) sunt evidente: posibilitatea de implementarea de dispozitive IoT multiprotocol, posibilitatea de implementarea de sisteme gateway LoRa sau bluetooth – implementări ce nu necesită nici un fel de montaj electronic pentru partea de comunicație, placa de dezvoltare integrează toate componentele necesare.

Realizarea unui nod LoRaWAN TTN, de exemplu, este extrem de simplă fără a fi nevoie să interconectăm o placă de dezvoltare cu un modul radio LoRa. Plecând de la exemplul ttn-abp al bibliotecii LMIC trebuie să personalizăm datele de autentificare în rețeaua TTN (obținute în urma înregistrării gratuite):

static const PROGMEM u1_t NWKSKEY[16] = { … };

static const u1_t PROGMEM APPSKEY[16] = { … };

static const u4_t DEVADDR = … ;

să modificăm pinii utilizați de modulul LoRa:

const lmic_pinmap lmic_pins = {

    .nss = 18,

    .rxtx = LMIC_UNUSED_PIN,

    .rst = 14,

    .dio = {26, 33, 32},

};

și să inserăm comanda de inițializare personalizată a portului SPI în cadrul secțiunii setup():

SPI.begin(5,19,27,18);

Pentru mai multe informații puteți consulta și materialele: „The ESP32 Oled Lora TTGO LoRa32 board and connecting it to TTN” și „Easy LoRaWAN and more with LoPy”.

Pentru a crea un gateway LoRaWAN TTN putem să apelăm la pachetul software Single Channel LoRaWAN Gateway în care vom avea de făcut câteva personalizări minore. În fișierul ESP-sc-gway.h vom modifica următoarele secțiuni:

  • Datele de identificare ale sistemului gateway (coordonate GPS, altitudine, platformă, descriere și email de contact)

#define _DESCRIPTION “ESP32 Single Channel Gateway”

#define _EMAIL “…”

#define _PLATFORM “ESP32”

#define _LAT …

#define _LON …

#define _ALT …

  • Datele serverului NTP cu care vom realiza sincroniza ceasul și fusul orar

#define NTP_TIMESERVER    “ro.pool.ntp.org”

#define NTP_TIMEZONES     2

#define SECS_PER_HOUR     3600

#define NTP_INTR      0

  • Datele de conectare la rețeaua WiFi ce asigură conectivitatea Internet

wpas wpa[] = {

{ “” , “” },

{ “…”, “…” }

};

După încărcarea programului pe placa de dezvoltare, deschizând consola serială a mediului Arduino IDE, obținem ID-ul gateway-ului ce trebuie înregistrat pe platforma TTN:

2

Sistemul gateway dispune de o interfață web (accesibilă din rețeaua locală din care face parte sistemul) ce permite supravegherea funcționării și modificarea unor parametrii (precum canalul radio pe care ascultă gateway-ul):

3

Pentru mai multe detalii despre implementarea unui sistem gateway LoRaWAN TTN puteți consulta și materialele: „LoPy to Single Channel Gateway to The Things Network” și „BIG ESP32 / SX127x”.

Carte „10(zece) proiecte Internet of Things” în format electronic

Carte „10(zece) proiecte Internet of Things” în format electronic.

240 de pagini cu proiecte despre Internetul obiectelor utilizând plăci de dezvoltare Arduino, Raspberry Pi și ESP8266.

Cartea poate fi cumpărată din magazinul 10proiecte iar plata se va face utilizând portalul PayPal. Formatul electronic permite accesul complet la formatul PDF al cărții cu posibilitate de tipărire și extragere de conținut.

banner

10ProiecteIoT_Cuprins

10ProiecteIoT_PrezentareProiecte

Puteți comanda cartea în format tipărit de pe site-ul Robofun la prețul de 39RON.