Router WiFi GSM utilizând LinkIt Smart 7688 Duo

Chiar dacă implementarea funcționalității de router WiFi GSM utilizând familia de plăci LinkIt Smart 7688 nu este nouă în cadrul lecțiilor noastre, o să încercăm în materialul de față să propunem o versiune îmbunătățită a acestui tip de sistem. Placa de dezvoltare LinkIt Smart 7688 Duo, spre deosebire de placa LinkIt Smart 7688, deține un microcontroler ATmega32U4 ce poate fi utilizat în cadrul sistemului pentru diverse sarcini de timp real (comandă de motoare, interfață utilizator, achiziție de valori de la diverși senzori etc.). În cadrul sistemului nostru vom utiliza microcontrolerul prezent pe placa de dezvoltare pentru implementarea interfeței utilizator, mai exact vom adăuga sistemului un ecran ce va afișa în timp real date despre funcționarea routerului (număr de clienți WiFi, puterea semnalului GSM, traficul prin intermediul routerului).

Pentru configurarea de bază a routerului se vor efectua exact aceeași pași ca și în cazul plăcii LinkIt Smart 7688 (a se vedea și „Router WiFi GSM utilizând LinkIt Smart 7688”), mai exact (pe scurt):

  • Vom configura placa în mod client WiFi pentru a putea instala pachetele necesare funcționării modemului GSM;
  • Vom instala și configura modemul GSM prin definirea unei noi interfețe de rețea;
  • Noua interfață de rețea va fi introdusă în firewall în zoua wan și vom configura pornirea automată a interfeței la pornirea sistemului de operare;
  • Vom reconfigura placa în modul AP setând numele și parola de acces dorită.

Pentru afișare vom utiliza un ecran OLED monocrom ce va comunica cu placa de dezvoltare prin I2C:

  • Alimentarea se va face la 3.3V (3.3V conectat la 3.3V, GND la GND);
  • Pinul Data al afișajului la pinul D2 (SDA) al plăcii de dezvoltare;
  • Pinul Clk al afișajului la pinul D3 (SCL) al plăcii de dezvoltare;
  • Pinul Rst al afișajului la pinul D5 al plăcii de dezvoltare (opțional).

2

Programul (pentru microcontrolerul ATmega32U4) va utiliza bibliotecile Adafruit GFX și Adafruit SSD1306 pentru partea de comunicație cu ecranul OLED și biblioteca Process (Bridge) pentru a comunica cu sistemul de operare OpenWRT.

#include <SPI.h>

#include <Wire.h>

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

#define OLED_RESET 5

Adafruit_SSD1306 display(OLED_RESET);

#include <Process.h>

Secțiunea setup() va inițializa ecranul OLED și comunicația cu sistemul de operare OpenWRT. Ecranul va afișa mesajul Initializing… pâna la încărcarea și inițializarea sistemului de operare (funcția Bridge.begin() va bloca programul până la stabilirea comunicației cu sistemul de operare).

3

void setup() {

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  display.display();

  delay(2000);

  display.clearDisplay();

  display.setTextSize(1);

  display.setTextColor(WHITE);

  display.setCursor(0,0);

  display.println(“Initializing…”);

  display.display();

  delay(1);

  Bridge.begin();

  delay(1000);

}

Secțiunea loop() este responsabilă cu interogarea sistemului de operare și afișarea răspunsurilor pe ecranul OLED. Pe prima linie este afișată ora și data (utile pentru a verifica dacă sistemul funcționează corect, nu s-a blocat), a doua linie va afișa calitatea semnalului GSM (utilă pentru poziționarea unei antene externe), a treia linie va afișa numărul de clienți WiFi iar ultima linie cantitatea de informație (recepționată și transmisă) transferată prin intermediul conexiunii GSM (informații utile în cazul unui abonament de date cu limitări la datele transferate). Datele sunt împrospătate o dată la 30 de secunde.

4

void loop() {

  Process MyProc;

  display.clearDisplay();

  display.setTextSize(1);

  display.setTextColor(WHITE);

  display.setCursor(0,0);

  MyProc.runShellCommand(“date +%H:%M”);

  while (MyProc.available() > 0) {

    char c = MyProc.read();

  if (c!=’\n’) display.print((char)c);

  }

  display.print(” “);

  MyProc.runShellCommand(“date +%D”);

  while (MyProc.available() > 0) {

    char c = MyProc.read();

    if (c!=’\n’) display.print((char)c);

  }

  display.println();

  display.println();

  display.print(“RSSI:”);

  MyProc.runShellCommand(“/root/get_rssi”);

  while (MyProc.available() > 0) {

      char c = MyProc.read();

      if (c!=’\n’) display.print((char)c);

  }

  display.println();

  display.println();

  display.print(“Clients:”);

  MyProc.runShellCommand(“/root/clients”);

  while (MyProc.available() > 0) {

      char c = MyProc.read();

      if (c!=’\n’) display.print((char)c);

  }

  display.println();

  display.println();

  MyProc.runShellCommand(“ifconfig 3g-gsm | grep ‘RX bytes’ | awk ‘{ print $1 $3 $4 }'”);

  while (MyProc.available() > 0) {

    char c = MyProc.read();

    if (c!=’\n’) display.print((char)c);

  }

  display.println();

  MyProc.runShellCommand(“ifconfig 3g-gsm | grep ‘RX bytes’ | awk ‘{ print $5 $7 $8}'”);

  while (MyProc.available() > 0) {

    char c = MyProc.read();

    if (c!=’\n’) display.print((char)c);

  }

  display.display();

  delay(30000);

}

Este posibil ca legătura dintre microcontrolerul ATmega32U4 și sistemul de operare OpenWRT să fie oprită implicit (să fie oprit serviciul responsabil la nivel de sistem de operare). În acest caz este necesară rularea următoarelor comenzi în linia de comenzi a sistemului de operare:

# uci set yunbridge.config.disabled=’0’

# uci commit

# reboot

Pentru rularea scripturilor de interogare a puterii semnalului și a numărului de clienți este necesară instalarea pachetului bash sub sistemul de operare OpenWRT:

# opkg update

# opkh install bash

Scriptul de interogare a puterii semnalului se va salva în diretorul /root sub denumirea get_rssi (tebuie acordate permisiuni de execuție #chmod +x get_rssi). Scriptul va interpreta o valoare pentru calitatea semnalului mai mare de 25 ca fiind excelentă, între 19 și 25 bună, între 13 și 19 medie, între 7 și 13 slabă și sub 7 foarte slabă. Lipsa semnalului poate însemna atât aflarea într-o zonă fără semnal dar și o problemă cu modemul GSM (deconectat?) sau cu SIM-ul GSM (neintrodus, fără credit?).

#!/bin/bash

rssi=`printf “%s\n” $((/usr/sbin/chat -V -s ” ‘AT+CSQ’ ‘OK’ ” > /dev/ttyUSB2 < /dev/ttyUSB2) 2>&1 | /bin/grep CSQ: | /usr/bin/awk ‘{print $2}’)`

rssi=”${rssi//,/.}”

rssi=$(printf “%.0f” $rssi)

if [ $rssi -gt 25 ]; then

        echo “$rssi Excellent”

elif [ $rssi -gt 19 ] && [ $rssi -le 25 ]; then

        echo “$rssi Good”

elif [ $rssi -gt 13 ] && [ $rssi -le 19 ]; then

        echo “$rssi Average”

elif [ $rssi -gt 7 ] && [ $rssi -le 13 ]; then

        echo “$rssi Low”

elif [ $rssi -gt 0 ] && [ $rssi -le 7 ]; then

        echo “$rssi Very low”

else

        echo “No signal”

fi

Scriptul de interogare a numărului de clienți WiFi se va salva în diretorul /root sub denumirea clients (tebuie acordate permisiuni de execuție #chmod +x clients). Scriptul va verifica numărul de înregistrări ARP din rețeaua WiFi. Atenție!!! Conectarea unui nou client WiFi va conduce la incrementarea imediată a numărului de clienți dar deconectarea nu va conduce la o decrementare decât în momentul în care expiră cache-ul ARP.

nr=0

for ip in $(cat /proc/net/arp | grep -v IP | awk ‘{print

$1}’); do

    nr=$((nr+1))

done

echo $nr

 

Dacă doriți să explorați și alte variante de implementare puteți vedea și „Smart Router With WiFi Connection Visualization”.

IoT Power Monitor

Măsurarea consumului echipamentelor electronice este o preocupare continuă în domeniul monitorizării utilizării energiei electrice. Evoluția sistemelor IoT a făcut posibilă apariției unor echipamente de monitorizare a consumului ce raportează datele măsurate prin intermediul rețelei Internet direct către un serviciu cloud. În cadrul acestui proiect vom prezenta construcția unui astfel de sistem IoT de monitorizare a puterii electrice consumate.

Sistemul se va baza pe placa de dezvoltare LinkIt Smart 7688 Duo ce oferă o combinație extrem de puternică (asemănătoare și compatibilă software cu placa de dezvoltare Arduino Yun) între un microprocesor MediaTek MT7688 ce rulează sistemul de operare OpenWRT și un microcontroler ATmega32U4.

2

Pentru a utiliza conectivitatea de rețea oferită de componenta MT7688 este nevoie de configurarea conexiunii WiFi. Configurarea conexiunii WiFi necesită conectarea la AP-ul (Access Point) LinkIt_Smart_7688_XXXXXX (XXXXXX este un identificator specific fiecărei plăci în parte) cu ajutorul unui laptop sau un terminal inteligent WiFi (telefon inteligent, tabletă). După conectare se deschide cu ajutorul unui client web (browser) adresa http://192.168.100.1 sau http://mylinkit.local ce permite accesul la interfața de administrare a componentei MT7688 / a sistemului de operare OpenWRT. La prima conectare se va stabili și parola utilizatorului root (utilizator cu drepturi de administrator).

3

Modificările necesare conectării plăcii LinkIt Smart 7688 Duo la Internet presupun trecerea componentei WiFi din mod AP în mod client (Station mode) și configurarea conectării la un AP ce oferă conectivitate Internet. Ambele modificări se fac din secțiunea Network a interfeței de administrare.

4

5

Atenție!!! Nu introduceți placa de dezvoltare într-o subrețea 192.168.100.0/24 deoarece chiar și în modul client interfața AP cu adresa 192.168.100.1 este activă și o altă adresă IP din aceiași subrețea va deruta mecanismul de rutare TCP/IP.

După configurare accesului la Internet, placa se poate accesa prin intermediul interfeței web prezentată anterior sau prin intermediul protocolului SSH, utilizând IP-ul oferit de AP-ul configurat. Utilizatorul necesar conectării este root și parola stabilită anterior. Pentru mai mult informații legate de configurarea plăcii LinkIt Smart 7688 Duo se poate consulta și „Get Started with the LinkIt Smart 7688 Duo Development Board”.

A doua operație de configurare, necesară pentru a utiliza biblioteca Bridge (bibliotecă specifică plăcii Arduino Yun) sub mediul Arduino IDE, necesită conectarea la consola plăcii de dezvoltare LinkIt Smart 7688 Duo prin intermediul unui client SSH (putty (3), de exemplu) și executarea următoarelor comenzi:

uci set yunbridge.config.disabled=’0′ 

uci commit 

reboot

Pentru măsurarea consumului vom utiliza senzorul de curent INA219 – senzor digital I2C ce permite măsurarea de tensiuni de până la 26V și curenți de până la 3.2A cu o precizie de 1%. Interconectarea cu placa de dezvoltare se va face prin intermediul magistralei I2C:

6

Senzorul se va alimenta la 3.3V iar pinii SCL și SDA se vor conecta la pinii D3 respectiv D2 ai plăcii de dezvoltare. Pentru a putea măsura curentul și tensiunea este necesar să trecem linia de alimentare a dispozitivului electronic monitorizat prin senzor. Acest lucru se poate face prin secționarea firului de alimentare sau prin conectarea unei perechi de mufe jack mamă – tată care să permită conectarea mufei de alimentare la senzor și senzorul la dispozitivul electronic. ATENȚIE!!! Inserarea senzorului se face pe linia de tensiune nu pe cea de masă.

Având în vedere scopul de monitorizare IoT a sistemului realizat în cadrul lecției de față vom utiliza cloud Robofun IoT. Pentru utilizarea acestui serviciu este necesară înregistrarea gratuită.

4

După înregistrare și conectare este necesară definirea unui senzor (Adauga senzor) pentru a putea înregistra puterea măsurată.

5

După definirea senzorului este necesar să copiem cheia de autentificare (Token) pentru a o utiliza în program.

3

Programul a fost realizat și testat utilizând Arduino IDE 1.8.3 cu extensia LinkIt Smart 7688 Duo 0.1.8 instalată și biblioteca Adafruit INA219 1.0.0.

#include <Bridge.h>

#include <HttpClient.h>

#include <Wire.h>

#include <Adafruit_INA219.h>

Adafruit_INA219 ina219;

Decomentarea directivei #define debug va permite supravegherea mesajelor de funcționare în consola serială.

//#define debug

void setup(void) {

  #ifdef debug

    SerialUSB.begin(115200);

    while (!SerialUSB);

  #endif

  ina219.begin();

  Bridge.begin();

}

În cadrul secțiunii loop() este necesară completarea valorii TOKEN obținută în procesul de înregistrare a senzorului în platforma Robofun IoT.

void loop(void) {

  float shuntvoltage = 0;

  float busvoltage = 0;

  float current_mA = 0;

  float loadvoltage = 0;

  float power = 0;

  shuntvoltage = ina219.getShuntVoltage_mV();

  busvoltage = ina219.getBusVoltage_V();

  current_mA = ina219.getCurrent_mA();

  loadvoltage = busvoltage + (shuntvoltage / 1000);

  power = loadvoltage * current_mA;

  #ifdef debug

    SerialUSB.print(“Bus Voltage:   “);

   SerialUSB.print(busvoltage);

   SerialUSB.println(” V”);

    SerialUSB.print(“Shunt Voltage: “);

    SerialUSB.print(shuntvoltage);

   SerialUSB.println(” mV”);

    SerialUSB.print(“Load Voltage:  “);

   SerialUSB.print(loadvoltage);

   SerialUSB.println(” V”);

    SerialUSB.print(“Current:       “);

   SerialUSB.print(current_mA); 

   SerialUSB.println(” mA”);

    SerialUSB.print(“Power:       “);

   SerialUSB.print(power);

   SerialUSB.println(” mW”);

    SerialUSB.println(“”);

  #endif

  HttpClient client;

  String temp = “http: ” + “//iot.robofun.ro/api/v1/senzor/TOKEN/input?value=” + String(power,2);

  client.get(temp);

  while (client.available()) {

    char c = client.read();

    #ifdef debug

      SerialUSB.print(c);

    #endif

  }

  #ifdef debug

    SerialUSB.println();

    SerialUSB.flush(); 

  #endif

  delay(60000);

}

Programul va trimite la un interval de 1 minut (60 secunde = 60000 milisecunde) valoarea calculată (puterea instantanee) pe baza curentului și tensiunii măsurate.

Testele au fost realizate monitorizând un dispozitiv de tip router WiFi HUAWEI HG8247H alimentat la 12V DC (curent continuu).

Graficul de valori înregistrate pe ultima zi (toate datele) – se poate observa un consum constant de minim 6600mW (6.6W):

7

Graficul de valori înregistrate pe ultima săptămână (cu mediere) – se poate observa o variație a consumului între 6619mW și 6800mW:

8