Proiect Physical Web

uribeaconCe se înțelege prin Physical Web? Este o încercare de a crea o legătură între lumea reală (lumea fizică) și spațiul web prin intermediul unor jaloane (beacons) radio care transmit informații web relevante pentru locația fizică în care ne aflăm. Conceptul este prezent în mai multe tehnologii recente precum tehnologia iBeacon lansată de Apple în 2013 sau tehnologia URI Beacon lansată de Google în 2014. Chiar dacă aflat într-o etapă timpurie de standardizare conceptul de Physical Web pune bazele unei direcții inedite de interacțiune fizică cu mediul on-line. În cadrul lecției de față vom construi un jalon radio bazat pe tehnologia deschisă Eddystone, lansată de Google în 2015 – tehnologie succesoare tehnologiei URI Beacon. Mai multe informații despre Physical Web puteți găsi la adresele:

The physical web: A hidden world that will change things forever

http://www.techradar.com/news/world-of-tech/future-tech/the-physical-web-a-hidden-world-that-will-change-things-forever-1302664

The Physical Web

https://google.github.io/physical-web/

Eddystone Protocol Specification

https://github.com/google/eddystone/blob/master/protocol-specification.md

Tehnologiile actuale de jalonare radio folosesc protocolul Bluetooth – mai exact Bluetooth 4.0 (BLE sau Bluetooth Smart). Pentru a crea un jalon este necesară utilizarea unui modul radio BLE sau a unei plăci de dezvoltare ce integrează un astfel de modul. Din acest motiv pentru implementare vom utiliza placa de dezvoltare Adafruit Feather 32U4 BLE. Această placă de dezvoltare combină microcontrolerul Atmel ATmega32U4 (prezent și pe  Arduino Leonardo) cu modulul BLE Nordic nRF51822.

adafruit-feather-32u4-bluefruit-le-big-1093-690https://www.robofun.ro/adafruit-feather-32u4-bluefruit-le

Pentru mai multe informații despre capabilitățile și modul de utilizare a plăcii de dezvoltare Adafruit Feather 32U4 BLE se poate consulta materialul:

Adafruit Feather 32u4 Bluefruit LE

https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le

Placa de dezvoltare aleasă nu este singura variantă de implementare dar este o soluție simplă și compactă, compatibilă 100% cu mediul de dezvoltare Arduino IDE și, datorită posibilității de alimentare de la un acumulator LiPo, portabilă. Se pot dezvolta soluții similare utilizând și alte plăci de dezvoltare precum:

RedBearLab BLE Nano – nRF51822

https://www.robofun.ro/wireless/wireless-bluetooth/redbearlab-ble-nano-nrf51822

Arduino Uno + Bluefruit LE Shield

https://www.robofun.ro/wireless/wireless-bluetooth/Bluefruit-LE-Shield-pentru-Arduino

Simblee BLE Breakout – RFD77101

https://www.robofun.ro/wireless/wireless-bluetooth/sparkfun-simblee-ble-breakout-rfd77101

Exemple de proiecte similare realizate cu alte plăci de dezvoltare:

Eddy and his stones: a DIY beacon and some mobile apps

https://www.simplicity.be/article/eddy-and-his-stones-diy-arduino-beacon-mobile-apps/

DIY Arduino Beacons as an alternative to iBeacon

https://evothings.com/diy-arduino-beacons/

Cheap Bluetooth 4.0 LE beacons, with your Arduino and a NRF24L01+ radio module

http://makernews.info/featured/2015/09/BLE-nrf24l01-arduino.html

Totuși. un aspect foarte important al plăcii de dezvoltare Feather 32U4 BLE este posibilitatea implementării unei varietăți foarte mare de proiecte diverse:

Tastură fără fir prin Bluetooth

https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/hidkeyboard

Monitor cardiac fără fir

https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/heartratemonitor

Sistem de preluare informații de la dispozitive inteligente mobile

https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/controller

 

Pentru a crea jalonul Eddystone cu ajutorul plăcii de dezvoltare Feather 32U4 BLE este suficient să încărcăm următorul program, în prealabil este necesar să instalăm sub mediul Arduino IDE biblioteca Adafruit BluefruitLE nRF51:

https://github.com/adafruit/Adafruit_BluefruitLE_nRF51

 

#include <SPI.h>

#include “Adafruit_BLE.h”

#include “Adafruit_BluefruitLE_SPI.h”

 #define BLUEFRUIT_SPI_CS               8

#define BLUEFRUIT_SPI_IRQ              7

#define BLUEFRUIT_SPI_RST              4

 #define BUFSIZE                                   160

#define VERBOSE_MODE                   true

Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS,

                     BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);

 void error(const __FlashStringHelper*err) {

  Serial.println(err);

  while (1);

}

 

Esența programului se află în cadrul secțiunii setup() unde vom realiza inițializările necesare funcționării jalonului radio:

void setup() {

  while (!Serial);

  delay(500);

  Serial.begin(115200);

  Serial.println(F(“Physical Web Beacon”));

  Serial.println(F(“————————————-“));

  Serial.print(F(“Initialising the Bluefruit LE module: “));

  if ( !ble.begin(VERBOSE_MODE) )

  {

    error(F(“Couldn’t find Bluefruit, make sure it’s in CoMmanD mode &

check wiring?”));

  }

  Serial.println( F(“OK!”) );

  Serial.println(F(“Performing a factory reset: “));

  if ( ! ble.factoryReset() ){

      error(F(“Couldn’t factory reset”));

    }

  Serial.println(“Requesting Bluefruit info:”);

  ble.info();

 

După inițializarea modulului BLE vom transmite comenzile de configurare a jalonului radio (denumire, înscriere serviciu în tabela de funcționare, activare emitere informații, URL de transmis):

ble.println(“AT+GAPDEVNAME=PhysWebBeac”);

  ble.waitForOK();

  ble.println(“AT+EDDYSTONESERVICEEN=1”);

  ble.waitForOK();

  ble.println(“AT+EDDYSTONEBROADCAST=1”);

  ble.waitForOK();

  ble.println(“ATZ”);

  ble.waitForOK(); 

  delay(1000);

  ble.println(“AT+EDDYSTONEURL=http://robofun.ro/”);

  ble.waitForOK();

  ble.println(“ATZ”);

  ble.waitForOK(); 

  delay(1000);

}

 

În cadrul secțiunii loop() nu se execută nimic:

void loop() {

  delay(1000);

}

Programul a fost realizat și testat cu Arduino IDE 1.6.9, extensia Adafruit AVR Boards 1.4.7 și biblioteca Adafruit BluefruitLE nRF51 1.9.0. Versiune firmware-ului modulului nRF51822: 0.7.0.

Rularea programului va avea următoarea manifestare în consola serială Arduino IDE:

screenshot

 

Pentru a verifica funcționarea jalonului este necesar un terminal mobil inteligent (mobil, tabletă) ce rulează sistemul de operare Android și posedă conectivitate Bluetooth 4.0. Există mai multe aplicații ce pot fi descărcate din Google Play și pot identifica și interacționa cu jalonul radio creat de noi, două exemple:

Beacon Toy

https://play.google.com/store/apps/details?id=com.uriio

screenshot_2016-06-30-21-09-04

 

iBeacon & Eddystone Scanner

https://play.google.com/store/apps/details?id=de.flurp.beaconscanner.app

screenshot_2016-06-30-21-09-20

Proiect WiFi TV Remote

Proiectul își propune realizarea unei telecomenzi de televizor prin WiFi – un dispozitiv de conversie a comenzilor WiFi în comenzi prin infraroșu specifice unei telecomenzi obișnuite.

Proiectul utilizează un Led Brick Telecomandă Infraroșu:

led-infrarosu

https://www.robofun.ro/electronice/led/led-telecomanda-infrarosu

Această componentă ne va permite să transmitem comenzile către dispozitivul comandat – televizor sau alt dispozitiv care utilizează o telecomandă prin infraroșu.

Pentru implementarea conectivității WiFi proiectul va utiliza o placă de dezvoltare bazată pe controlerul WiFi ESP8266 și anume placa NodeMCU. Chiar dacă nu este o placă din familia Arduino această placă poate fi programată cu ajutorul mediului de dezvoltare Arduino IDE Placa funcționează la 3.3V și se poate alimenta prin intermediul conexiunii USB.

nodemcu

https://www.robofun.ro/wireless/wireless-wifi/NodeMCUv2-ESP8266

Pentru configurarea mediului Arduino IDE se pot urma pașii descriși în materialul ”Quick Start to Nodemcu (ESP8266) on Arduino IDE”:

http://www.instructables.com/id/Quick-Start-to-Nodemcu-ESP8266-on-Arduino-IDE/

Pentru a putea comanda componenta LED Brick vom utiliza o bibliotecă specifică plăcii de dezvoltare NodeMCU – biblioteca IRremoteESP8266 (o adaptare a bibliotecii IRremote pentru ESP8266). Această bibliotecă trebuie instalată separat de componentele specifice plăcii de dezvoltare, adresa de la care poate fi descărcată este:

https://github.com/markszabo/IRremoteESP8266

Schema de interconectare între placa de dezvoltare și modulul LED Brick este simplă:

wifiremotetv_bb

 

Schema de interconectare utilizează un tranzistor NPN 2N3904 pentru a amplifica comanda dată de pinul plăcii de dezvoltare. Astfel pinul IN al LED Brick-ului se va conecta la pinul Vin al plăcii de dezvoltare (este pinul de 5V al alimentării USB) și pinul GND la colectorul tranzistorului. Emitorul tranzistorului se va conecta la masă (GND) și baza va prelua, prin intermediul unui rezistor, comenzile provenite de la pinul D5 (GPIO14) al plăcii de dezvoltare.

O variantă electronică a schemei de interconectare arată în felul următor – rezistorul R2 (180ohm) este integrat în modulul LED Brick:

wifiremotetv_schem

Sistemul va permite trimiterea de comenzi prin infraroșu prin intermediul unei interfețe web simple accesibilă de pe orice sistem (PC sau telefon mobil inteligent) aflat în aceiași rețea ca și sistemul WiFi TV Remote:

screenshot

 

Accesarea interfeței web se poate face cu ajutorul unui client web (browser) accesând adresa IP a sistemului NodeMCU – adresa se preia dinamic (prin DHCP) de către sistem și este afișată în Serial Monitor la pornirea sistemului.

screenshot2

Programul sistemului va utiliza bibliotecile software IRremoteESP8266 (trebuie instalată) și ESP8266WiFi (parte componentă a instalării extensiei ESP8266 pentru mediul Arduino IDE):

#include <IRremoteESP8266.h>

#include <ESP8266WiFi.h>

În program trebuie personalizate datele de conectare la rețeaua WiFi:

const char* ssid = “…..”;

const char* password = “….”;

Comanda către LED Brick se va transmite prin intermediul pinului D5 (GPIO14):

 IRsend irsend(14);

WiFiServer server(80);

În cadrul secțiunii setup() se va inițializa comunicația serială, comunicația cu LED Brick, se va realiza conexiunea WiFi și se va porni componenta web server:

 void setup()

{   Serial.begin(9600);

irsend.begin();

Serial.print(“Connecting to “);

Serial.println(ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {

 delay(500);

Serial.print(“.”);

}

Serial.println(“”);

Serial.println(“WiFi connected”);

server.begin();

Serial.println(“Server started”);

Serial.println(WiFi.localIP());

}

În cadrul secțiunii loop() se vor prelua și trata solicitările web (http) provenite de la clienți:

void loop()

{ WiFiClient client = server.available();

if (!client) return;

Serial.println(“new client”);

while(!client.available()){ delay(1); }

String request = client.readStringUntil(‘\r’);

Serial.println(request);

client.flush();

 

Programul implementează trei comenzi specifice unei telecomenzi SONY (Power, P+ și P-). Pentru aflarea altor coduri (pentru alte butoane / pentru alte tipuri de televizoare) se poate consulta materialul ”Telecomanda Universala IR cu Arduino”:

https://www.robofun.ro/forum/viewtopic.php?f=16&t=454

 

if (request.indexOf(“/COMMAND=POWER”) != -1) {

for (int i = 0; i < 3; i++) {

irsend.sendSony(0xa90, 12); // Sony TV power code

delay(40);

}

}

if (request.indexOf(“/COMMAND=PP”) != -1) {

for (int i = 0; i < 3; i++) {

irsend.sendSony(0x90, 12); // Sony P+

delay(40);

}

}

if (request.indexOf(“/COMMAND=PM”) != -1) {

for (int i = 0; i < 3; i++) {

irsend.sendSony(0x890, 12); // Sony P-

delay(40);

}

}

client.println(“HTTP/1.1 200 OK”);

client.println(“Content-Type: text/html”);

client.println(“”);

client.println(“<!DOCTYPE HTML>”);

client.println(“<html>”);

 client.println(“<h1>WiFi TV Remote</h1>”);

 client.println(“<br>”);

client.println(“Click <a href=\”/COMMAND=POWER\”>here</a> to turn ON/OFF the TV<br>”);

client.println(“Click <a href=\”/COMMAND=PP\”>here</a> to change the program [+]<br>”);

client.println(“Click <a href=\”/COMMAND=PM\”>here</a> to change the program [-]<br>”);

client.println(“</html>”);

delay(1);

Serial.println(“Client disonnected”);

Serial.println(“”);

}

Programul a fost realizat și testat cu Arduino IDE 1.6.9, extensia ESP8266 Community 2.3.0 și biblioteca IRremoteESP8266 1.0.0.

 

Sistemul prezentat poate fi folosit și pentru a pune în practică astfel de momente:

https://youtu.be/RWxMqgkW90g

 

Proiectul poate fi completat creând o interfață web mai atrăgătoare, implementând un număr mai mare de comenzi și chiar realizând o telecomandă multi-dispozitiv (comanda mai multor dispozitive utilizând o interfață unică). Mai jos puteți găsi câteva idei de proiecte ce pot fi folosite ca sursă de inspirație:

 

ESP8266 powered Web Controlled Sony Camera Remote

https://youtu.be/D40ZpVjZ744

 

ESP8266 WiFi controlled aircon remote

http://www.instructables.com/id/ESP8266-WiFi-Controlled-Aircon-Remote/

 

Wifi Remote Control using ESP8266

http://www.instructables.com/id/Wifi-Remote-Control-using-ESP8266/