Cum verificăm acoperirea LoRaWAN TTN

Rețelele radio Long Range (LoRaWAN) permit dezvoltarea de rețele de senzori și de dispozitive IoT pe distanțe de ordinul kilometrilor cu un consum extrem de redus din puntul de vedere al dispozitivelor IoT. Rețelele publice LoRaWAN precum TTN permit utilizarea acestei tehnologii fără a avea grija infrastructurii (a sistemelor gateway ce fac legătura între rețeaua radio și Internet). Totuși, o problemă supărătoarea este dată de încercarea de a răspunde la întrebarea dacă locația unde dorim să poziționăm dispozitivul IoT propriu se află sau nu în acorperirea rețelei TTN (se află sau nu în aria de acoperire a unui gateway public TTN).

La prima vedere răspunsul la această întrebare se poate baza pe harta sistemelor gateway înregistrate pe platforma TTN de către utilizatori. În secțiunea COMMUNITIES a platformei selectăm zona sau orașul unde ne aflăm și putem vedea sistemele gateway din apropierea locului în care ne aflăm și aria aproximativă de acoperire (mai jos putem vedea acest lucru pentru municipiul București, jaloanele roșii indică sisteme gateway inactive):

2

Această metodă de evaluare a zonelor de acoperire nu oferă nici un fel de garanție. Aria de acoperire este estimată iar faptul că un gateway este activ nu semnifică altceva decât faptul că există legătură între acesta și platforma TTN (conexiune Internet) – un gateway activ poate foarte bine să aibă componenta LoRa inactivă. Un alt aspect ce poate conduce la o evaluare greșită este faptul că nu toți utilizatorii își fac publică locația dispozitivelor gateway sau, și mai problematic, introduc coordonate greșite.

O altă variantă de verificare este platforma TTN Mapper ce conține o hartă de acoperire a sistemelor gateway TTN bazată pe măsurători realizate de utilizatori. Această hartă este un mult mai bun punct de plecare în evaluarea unei locații în care puteți poziționa un sistem IoT LoRaWAN dar nici această metodă nu poate indica o acoperire provenită de la un gateway a căror coordonate au fost indicate greșit.

3

Cea mai bună soluție este să realizăm chiar noi măsurătoarea pentru locația dorită. Acest lucru se poate face utilizând un sistem emițător LoRa echipat cu un dispozitiv GPS (de exemplu o placă Seeeduino LoRaWAN with GPS, a se vedea și materialul „Using Seeeduino LoRaWAN with GPS and Loriot.io”) sau, și mai simplu, orice emițător LoRa și un telefon mobil Android.

Nu contează tipul emițătorului LoRa utilizat și nici natura mesajelor trimise către platforma TTN, contează doar ca emițătorul să fie înregistrat în cadrul platformei TTN. Se poate utiliza o placă Arduino Uno și un shield Dragino LoRa (a se vedea materialul „Cum să realizăm un sistem IoT LoRaWAN”) sau putem utiliza o placă LoPy LoRa (a se vedea materialul „LoRa meets ESP32”). Următorul pas, după punerea în funcțiune a nodului emițător TTN, este instalarea aplicației TTN Mapper pe telefonul mobil. La prima pornire a aplicației se va solicita asocierea cu nodul TTN utilizat. Această metodă pleacă de la premisa că nodul TTN și telefonul mobil pe care avem instalată aplicația TTN Mapper se află în aceiași locație. În cazul în care nodul TTN este mobil se poate evalua o zonă mai largă nu doar o locație anume. În momentul în care un pachet LoRa este primit de platforma TTN și provine de la nodul asociat aplicației, aplicația utilizează GPS-ul telefonului mobil pentru a indica platfomei TTN Mapper sistemele gateway ce au recepționat respectivul pachet, puterea semnalului pentru fiecare sistem gateway în parte și coordonatele punctului de unde a fost emis pachetul. Făcând un experiment bazat pe această metodă am obținut următoarele informații din aplicația TTN Mapper într-o locație din București (hartă de mai jos).

4

Experimentul a indicat că locația se află în acoperirea a două sisteme gateway TTN. Unul dintre ele se afla în imediata apropiere și era cunoscut dar cel de al doilea a reprezentat o surpriză fiind poziționat în Ciad.

5

Bineînțeles, este vorba de o eroare de introducere a coordonatelor de către proprietar (cel mai probabil o inversare a latitudinii și longitudinii). Chiar dacă distanța de comunicație în cazul LoRaWAN poate atinge zeci de kilometri nu ne putem aștepta la comunicații la mii de kilometri (e greu de crezut că LRX-BUX-76E5 Palatul telefoanelor se află în Ciad).

6

Astfel, putem vedea că un test de acoperire poate indica prezența unui sistem gateway în aria de acoperire a căruia ne aflăm și pe care nu aveam altfel cum să-l „descoperim”.

Let’s PI: Zero to IoT

Apariția Raspberry Pi Zero a făcut disponibile funcționalitățile familiei Raspberry Pi la o dimensiune și un cost mult mai mici. La jumătatea dimensiunii unei plăci obișnuite Raspberry Pi, varianta Zero oferă un microprocesor BCM2835 la 1GHz frecvență de funcționare, 512MB memorie RAM, ieșire video mini HDMI, port micro USB OTG, conector cameră și toate facilitățile oferite de sistemul de operare Raspbian.

Singura problemă pentru a utiliza această variantă a plăcii Raspberry Pi este conectivitatea de rețea. Fără a apela la versiunea Zero W, ce oferă conectivitate WiFi, putem utiliza placa Raspberry Pi Zero în proiecte IoT fără nici un fel de problemă. Este recomandată achiziționarea unui kit ce include adaptoarele HDMI – mini HDMI și micro USB OTG – USB precum și bareta de pini deoarece ele sunt absolut necesare în utilizarea plăcii Raspberry Pi Zero. Pentru punerea în funcțiune mai sunt necesare și un card microSD pentru sistemul de operare, se recomandă un card de calitate, și un alimentator de 5V.

După copierea imaginii sistemului de operare pe cardul de memorie avem următoarele opțiuni pentru interacțiunea cu placa Raspberry Pi Zero:

  • Conectăm placa la un monitor cu intrare HDMI (prin intermediul adaptorului mini HDMI – HDMI) și la o tastatură USB (prin intermediul adaptorului micro USB – USB). Această variantă de utilizare ne permite utilizarea plăcii de dezvoltare dar nu oferă nici o facilitate de conectare la Internet.
  • Conectăm, prin intermediul adaptorului micro USB – USB, o placă de rețea USB. Interacțiunea cu placa Raspberry Pi Zero se va face în linie de comandă prin intermediul protocolului SSH (utilizând programul PUTTY de exemplu). Majoritatea plăcilor de rețea, mai ales cea indicată, vor fi văzute în mod automat de sistemul de operare Raspbian și nu vor necesita nici o operație de instalare / configurare suplimentară. Pentru a activa serviciul SSH încă de la prima pornire a plăcii este necesară creare unui fișier gol cu numele ssh pe cardul pe care copiem sistemul de operare (a se vedea și „Enable SSH when creating SD card”). Bineînțeles, se poate utiliza un adaptor de rețea WiFi în locul celui Internet dar probabilitatea ca acest tip de adaptoare să necesite operații suplimentare de instalare / configurare este mai mare, cu alte cuvinte nu ne vom putea conecta din prima la placă fără tastatură și monitor.
  • Este posibilă combinarea celor două soluții anterioare dar este necesară utilizarea unui hub USB – placa de dezvoltare are un singur port USB OTG și este necesară conectarea tastaturii și a adaptorului de rețea. Este o soluție ce complică destul de mult utilizarea plăcii, este de preferat achiziționarea unei plăci Raspberry Pi 3.

Vom exemplifica realizarea sistemului IoT utilizând cea de a doua opțiune: placa Raspberry Pi Zero, adaptor micro USB – USB și placă de rețea USB. Ca serviciu IoT vom utiliza serviciul gratuit Robofun IoT iar datele raportate vor proveni de la un senzor digital de temperatură și umiditate SHT11. Conectarea dintre senzorul digital și placa de dezvoltare se face în felul următor:

3

Senzorul se va alimenta la 3.3V, pinul SCK se va conecta la pinul 23 iar pinul DAT la pinul 18. Pentru configurarea și scrierea programului IoT ne vom conecta la placa Raspberry Pi Zero prin SSH utilizând Putty. Este recomandată aducerea la zi a pachetelor software:

# sudo apt-get update

# sudo apt-get upgrade

Programul va fi scris în limbajul Python și va utiliza biblioteca pi-sht1x, pentru instalarea acesteia vom executa:

# sudo apt-get install python3-pip

# pip3 install pi-sht1x

Testele au fost realizate sub Raspbian 9, kernel 4.14.34+, Python 3.5.3 și pi-sht1x 1.0.9. Programul utilizat este următorul (PiZeroIoT.py):

import RPi.GPIO as GPIO

from pi_sht1x import SHT1x

import urllib.request

DATA_PIN = 18

SCK_PIN = 23

with SHT1x(DATA_PIN, SCK_PIN, gpio_mode=GPIO.BCM) as sensor:

temp = sensor.read_temperature()

humidity = sensor.read_humidity(temp)

SENSOR1_TOKEN="…"

SENSOR2_TOKEN="…"

urllib.request.urlopen("http://iot.robofun.ro/api/v1/senzor/"+SENSOR1_TOKEN+"/input?value="+str(temp)).read()

urllib.request.urlopen("http://iot.robofun.ro/api/v1/senzor/"+SENSOR2_TOKEN+"/input?value="+str(humidity)).read()

Variabilele SENSOR1_TOKEN și SENSOR2_TOKEN trebuie completate cu datele obținute în urma definirii a doi senzori în cadrul platformei Robofun IoT. Pentru a executa programul în mod automat la anumite intervale de timp vom crea o intrare în fișierul de configurare a serviciului cron (/etc/crontab) de forma (execuție la 10 minute):

*/10 *  * * *   pi      python3 /home/pi/PiZeroIoT.py

După repornirea sistemului, fără a ne conecta la placă, programul se va executa în mod automat și vom putea vedea graficele pentru temperatură și umiditate în interfața serviciului IoT:

4

5

Senzor IoT temperatura cu transmisie GSM

Construieste-ti sezorul tau de temperatura IoT cu stocare de date in CLOUD. In acest proiect folosim senzorul 1 Wire 18B20 de la Dallas/Maxim si shieldul GSM dual SIM  a-gsmII sau shieldul GSM GNSS dual SIM b-gsmgnss  de la itbrainpower.net. Serviciul CLOUD este oferit gratuit de Robofun.

Necesar timp: 30-45 minute – pregatire hardware si aproximativ 30-60 minutes partea de software si setarile contului cloud.

Nivel de dificultate: intermediar.

Materiale necesare hardware IOT

Despre shieldurile GSM folosite
In acest proiect am folosit, pentru exemplificare, shieldul a-gsmII v2.105, dar exact aceleasi setari hardware se aplica pentru b-gsmgnss v2.105 (interfetele si jumperii sunt plasati in aceleasi pozitii). Mai multe informatii:
documentatie a-gsmII
documentatie b-gsmgnss

Detaliere senzor 18DS20
Lipiti rezistorul de 8.2Kb intre terminalele Vdd (pin3) si DQ (pin2) ale 18B20 ca in imaginea de mai jos. Vezi referinta DALLAS/MAXIM 18B20.

Conectare hardware (toate componentele conectate in poza de mai jos)
Pasi de urmat:

  • lipiti headere (pini) ARDUINO la shieldul GSM a-gsmII
  • plug-in (conectati) sieldul a-gsmII in Arduino UNO
  • plasati jumperul a-gsmII “Power selector” in pozitia “Vin” (referinta)
  • inserati the SIM cardul in SIM socketul primar (slotul SIM aflat in proximitatea PCB). SIM-ul trebuie sa aiba dezactivata procedura de verificare a codului PIN (vezi cum se dezactiveaza verificarea PIN, aici).
  • Lipiti rezistorul de 8.2Kb intre terminalele Vdd (pin3) si DQ (pin2) ale 18B20. Lipiti firele la terminalele senzorului 18B20.
  • Conectati firele 18B20 dupa cum urmeaza: 18B20 Vdd (pin3) la Arduino 5V, 18B20 DQ (pin2) la Arduino D8  si 18B20 GND (pin1) la Arduino GND.
  • conecteaza portul USB al Arduino UNO  la PCul tau

Alimentarea senzorului IOT va fi efectuata centralizat, prin intermediul conectorului de alimentare Arduino UNO.

SOFTWARE
a. Downloadeaza itbpGSMclass library [beta]: “a-gsmII series software IoT REST support for ARDUINO” de la a-gsmII download section, sau “b-gsmgnss series software IoT REST support for ARDUINO” de la b-gsmgnss download section. Pentru a efectua download-ul clasei va trebui sa introduci IMEI-ul (se afla marcat pe modem, sau poate fi citit folosind comanda “AT+CGSN”) si adresa ta de email.

b. Expandati archiva si instalati clasa. Pe scurt, copiati folderul “itbpGSMclass” in “Arduino local user folder” [la mine se afla in: “C:\Users\dragos\Documents\Arduino\libraries”], dupa care restartati mediul Arduino. Mai multe detalii despre intalarea manala de librarii Arduino: Arduino library manual installation.

c. Creaza un folder numit “agsmII_temperature_Robofun_cloud_logger”.

d. Salveaza codul din linkul de mai jos sub denumirea de “agsmII_temperature_Robofun_cloud_logger.ino” in folderul creat mai devreme: Temperature GSM IOT main Arduino code

e. Setari variabile in “agsmII_temperature_Robofun_cloud_logger.ino”:
– tempToken [linia 19] – inlocuieste cu tokenul senzorului tau generat in cloud Robofun
– samplingPeriod [line 29]

f. Setari variabile in “itbpGSMclass library”:
– seteaza SERVER_ADDRESS si SERVER_PORT in itbpGPRSIPdefinition.h pentru ROBOFUN CLOUD, ca mai jos
#define SERVER_ADDRESS “iot.robofun.ro”
#define SERVER_PORT “80”
– seteaza APN, USERNAME si PASSWORD, corespunzator SIM-ului tau, in itbpGPRSIPdefinition.h (pentru ORANGE RO, de exemplu, APN este “INTERNET” sau “NET”, USERNAME este “” si PASSWORD este “”)
– alege modemul itbrainpower folosit in itbpGSMdefinition.h, in acest caz:
#define __itbpModem__ agsmII
– nu uita sa salvezi setarile! 😉

g. alte setari utile >> itbpGSMClassDebug, atDebug on / off si MAX_BUFFER_SIZE… in itbpGSMdefinition.h

CLOUD ROBOFUN. CONT NOU, SENZORI si SETARI
CLOUDul Robofun este un serviciu extrem de simplu de utilizat si este disponibil in mod gratuit. Acesta este disponibil la adresa: https://iot.robofun.ro. Nu intru in detalii – creaza un cont nou si defineste un senzor nou. In interfata senzor, fa scroll down pana la paragraful “TOKEN”.

Copiaza acest cod si  foloseste-l pentru tempToken [linia 19 din “agsmII_…._logger.ino”]. Salveaza. Compileaza.

GATA!

Acest tutorial se bazeaza pe articolul “IoT temperature CLOUD logger with GSM and 1wire sensor howto” care a fost publicat original pe site-ul https://itbrainpower.net

 

Cum să realizăm un repetor WiFi utilizând ESP8266

Dispozitivele de tip repetor sau amplificator WiFi (WiFi Repeater sau WiFi Extender) sunt utilizate pentru a crește aria de acoperire a rețelelor WiFi. În case sau clădiri de dimensiuni mai mari un singur dispozitiv de acces WiFi, oricât de performant ar fi, este greu să asigure semnal radio WiFi pe toată aria. Utilizarea mai multor dispozitive de acces WiFi independente ridică probleme destul de mari de administrare de rețea și de management a datelor de acces. Soluția mult mai simplă și mai ieftină este utilizarea dispozitivelor de tip repetor WiFi. Aceste dispozitive sunt diponibile comercial la prețuri variate și cu funcționalități și perfomanțe diverse. Totuși, dorim să vă propunem realizarea unui astfel de dispozitiv într-o manieră personală (și extrem de ieftină) utilizând o placă de dezvoltare bazată pe circuitul WiFi ESP8266. Acest circuit are marele avantaj de a putea funcționa simultan atât ca AP cât și ca client WiFi permițând implementarea funcționalității de repetor într-o manieră foarte simplă. Testele au fost realizate utilizând o placă de dezvoltare Adafruit Feather HUZZAH dar la fel de bine pot fi utilizate plăci precum NodeMCU, Sparkfun ESP8266 Thing sau chiar ESP-01.

Pentru a implementa funcționalitatea de repetor WiFi vom utiliza pachetul software esp_wifi_repeater. Pachetul poate fi modificat și recompilat după propriile dorințe înainte de încărcarea pe placa de dezvoltare dar pentru început se pot utiliza fișierele binare oferite de dezvoltatori pachetului (fișierele 0x00000.bin, 0x10000.bin și esp_init_data_default_v08_vdd33.bin din directorul firmware). Pentru încărcarea fișierelor binare se va utiliza utilitarul ESP8266 DOWNLOAD TOOL. După copierea utilitarului și a fișierelor binare pe calculatorul local se poate trece la încărcarea acestora în memoria plăcii. Înainte de apăsarea butonului START aveți grijă să completați adresele de încărcare a fișierelor binare, să selectați portul serial pe care este conectată placa de dezvoltare și, specific plăcii Adafruit Feather HUZZAH, să selectați dimensiunea memoriei flash 32Mbit.

3

După încărcarea în memorie a software-ului putem verifica inițializarea corectă a dispozitivului repetor WiFi cu ajutorul unui utilitar de conectare pe serială (de exemplu Putty). Viteza de conectare serială este 115200 baud.

4

Cea mai simplă modalitate de configurare a acestuia este prin intermediul interfeței web. Dispozitivul se poate configura și prin consola serială sau printr-o conexiune telnet pe portul 7777 dar aceste modalități sunt puțin mai dificile. Pentru a accesa interfața web este necesar să ne conectăm la AP-ul creat de dispozitiv (MyAP) și să accesăm adresa 192.168.4.1.

5

Conectarea la AP-ul dispozitivului se poate observa imediat în consola serială:

6

Interfața web de configurare permite introducerea datelor de acces a rețelei WiFi a cărui semnal dorim să-l extindem ca arie de acoperire (STA Settings) și datele de acces ale noului punct de acces (AP Settings). La finalizarea configurării dispozitivului vom putea face diferența între AP-ul inițial și noul AP (AP-ul repetor) deoarece vor avea denumiri și date de acces diferite. Performanțele oferite de AP-ul bazat pe circuitul ESP8266 nu sunt spectaculoase (maxim 8 clienți și rată de transfer de maxim 5Mbps) dar oferă o modalitate de extindere a ariei de acoperire WiFi extrem de simplă și ieftină. Aceaste dispozitive repetoare WiFi pot fi utilizate pentru rețele IoT sau pentru extinderea semnalului WiFi în spații deschise (parcele mari de teren de exemplu).

7

Dacă dorim ca repetorul WiFi să fie transparent (să nu definim un nou AP cu nume și date de acces proprii) se poate bifa opțiunea Automesh. În acest caz nu mai este necesar să completăm informațiile din secțiunea AP Settings – dispozitivul repetor va propaga semnalul WiFi sub numele rețelei WiFi originale (și datele de conectare vor fi identice). Facilitatea de Automesh permite crearea unei rețele de repetoare WiFi cu până la 5 niveluri permițând extinderea ariei de acoperire într-o manieră impresionantă.

8

Dacă apelăm la configurarea în consolă a dispozitivului repetor WiFi putem accesa funcții avansate implementate în pachetul software utilizat (a se vedea documentația oficială). Printre aceste funcții putem enumera:

  • Configurarea statică a setărilor pentru interfețele de rețea;
  • Definirea de rute (routes) personalizare – facilități de rutare avansată;
  • Definirea de reguli de dirijare a traficului (ACLs) – facilități de firewall;
  • Redirecționarea unor porturi – port mapping;
  • Facilități de raportare prin intermediul protocolului MQTT;

Controlul consumului – dacă tensiunea de alimentare scade sub un anume prag putem configura dispozitivul să intre într-o stare de consum redus.

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.