Norul udă ghivecele cu flori

Chiar dacă un sistem automat de menținere a umidității pentru ghivecelor cu flori rezolvă problema ”am uitat să ud florile” nu rezolvă și problema monitorizării exacte a umidității (necesare pentru diverse tipuri de plante mai pretențioase). Adăugarea unui sistem de jurnalizare a umidității permite vizualizarea și determinarea punctului de umiditate optimă pentru diverse astfel de tipuri de plante. În cadrul proiectului de față ne propunem să completăm sistemul prezentat în proiectul precedent (Arduino udă ghivecele cu flori) cu un sistem de monitorizare și comandă online. Pentru acest lucru vom utiliza serviciul online (de tip ”nor”) Adafruit IO. Serviciul Adafruit IO este un serviciu specializat IoT, gratuit, ce pune la dispoziția utilizatorilor atât posibilitatea jurnalizării valorilor preluate de la diverși senzori dar și transmiterea de comenzi către dispozitivele IoT și chiar legătura automată între partea de achiziție și comandă (reguli de conducere automată).

Pentru implementarea sistemului prezentat în această lecție este necesară crearea unui cont pe platforma Adafruit IO. După conectare trebuie să navigăm în meniul Settings și să ne notăm AIO Keys (cheia de autentificare) care va fi folosită, împreună cu denumirea contului creat, în programul sistemului.

Din punct de vedere hardware sistemul va avea în plus un modul Adafruit HUZZAH ESP8266 ce va asigura conectivitatea de rețea necesară accesării serviciului cloud.

2Astfel componentele necesare implementării sistemului sunt: Arduino Uno, shield drivere de motoare L298, senzor umiditate sol, pompă de apă micro, ecran LCD grafic Nokia (opțional) și modul Adafruit HUZZAH ESP8266. Alimentarea sistemului se va face de la un alimentator de rețea de 9V conectat la placa de dezvoltare Arduino Uno. Alimentatorul va alimenta atât componentele de comandă (placă de dezvoltare, modul WiFi, ecran LCD, senzor de umiditate sol) cât și pompa de apă (prin intermediul shield-ului L298 ce trebuie să aibă jumperul de alimentare comună conectat).

Conexiunile între componentele sistemului sunt următoarele:

  • Pompa de apă se conectează la shield-ul L298 pe canalul MOTOR2:

3

  • Senzorul de umiditate sol va utiliza pinul A0 pentru a transmite valoarea achiziționată către placa de dezvoltare, pinul A2 pentru alimentare și un pin de GND.

4

  • Ecranul LCD va utiliza următorii pini pentru conectare: LED – 5V (prin intermediul unei rezistențe de 220ohm), SCLK – D13, D/C – D8, RST – D7, SCE – A3 (nu mai putem folosi pinul D4 ca în cazul lecției precedente deoarece acest pin va fi utilizat de modul WiFi), GND – GND, Vcc – 3.3V.
  • Modulul WiFi Adafruit HUZZAH ESP8266 se va monta în soclul shield-ului L298 (soclu gândit pentru modul bluetooth dar compatibil și cu modulul WiFi utilizat de noi) – ATENȚIE la polaritate – conectați pinul de GND al modului la pinul de GND al soclului.

5

Înainte de asamblarea sistemului modulul WiFi trebuie programat separat de programarea plăcii Arduino Uno. Pentru programare este necesară utilizarea unui cablu USB to TTL sau a unui conector FTDI. Pentru programarea și utilizarea modulului Adafruit HUZZAH este recomandată parcurgerea materialului următor: Adafruit HUZZAH ESP8266 breakout .

Programul pentru modulul WiFi are rolul de a transforma comunicația serială (de la placa Arduino Uno) în mesaje MQTT pentru platforma Adafruit IO. Programul a fost dezvoltat și testat cu Arduino IDE 1.8.1 având instalată extensia ESP8266 Community 2.3.0 și utilizează biblioteca Adafruit MQTT 0.17.0. În program trebuie personalizate datele de conectare la rețeaua WiFi locală (WLAN_SSID și WLAN_PASS) precum și datele de conectare la serviciul cloud Adafruit IO (AIO_USERNAME și AIO_KEY).

#include <ESP8266WiFi.h>

#include “Adafruit_MQTT.h”

#include “Adafruit_MQTT_Client.h”

#define WLAN_SSID       “

#define WLAN_PASS       “

#define AIO_SERVER      “io.adafruit.com”

#define AIO_SERVERPORT  1883

#define AIO_USERNAME    “

#define AIO_KEY         “

WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_USERNAME, AIO_KEY);

Adafruit_MQTT_Publish soilhumidity = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME “/feeds/soilhumidity”);

Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME “/feeds/onoff”);

void onoffcallback(char *data, uint16_t len) {

  String onoff_state = String(data);

  if (onoff_state==”ON”) Serial.println(“1”);

  else if (onoff_state==”OFF”) Serial.println(“0”);

}

void setup() {

  Serial.begin(115200);

  delay(10);

  Serial.println(F(“Adafruit MQTT NOR”));

  WiFi.begin(WLAN_SSID, WLAN_PASS);

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

    delay(500);  }

  onoffbutton.setCallback(onoffcallback);

  mqtt.subscribe(&onoffbutton);

}

uint32_t x;

void loop() {

  MQTT_connect();

  mqtt.processPackets(100);

  if(Serial.available()){

    x=Serial.parseInt();

    soilhumidity.publish(x);

    }

  if(! mqtt.ping()) {

    mqtt.disconnect();

  }

}

void MQTT_connect() {

  int8_t ret;

  if (mqtt.connected()) {

    return;

  }

  uint8_t retries = 3;

  while ((ret = mqtt.connect()) != 0) {

        mqtt.disconnect();

       delay(10000);

       retries–;

       if (retries == 0) { while (1); }

  }

}

Programul pentru placa de dezvoltare Arduino Uno nu diferă foarte mult de varianta prezentată în proiectul precedent. Este necesară modificarea declarării obiectului LCD:

Adafruit_PCD8544 display = Adafruit_PCD8544(8, A3, 7);

declararea și configurarea comunicației seriale cu modulul WiFi:

#include “SoftwareSerial.h”

SoftwareSerial mySerial(2,4);

void setup()

{

  mySerial.begin(115200);

și de câteva completări în secțiunea loop():

void loop()

  int command = 0;

  int soilhumidity;

  digitalWrite(SOIL_VCC,LOW);

  mySerial.println(soilhumidity);

  display.println(millis()/1000);

  if(mySerial.available()){

    command = mySerial.parseInt();

  }

  if ((soilhumidity<500)||(command==1)) {

Programul ce rulează pe placa Arduino raportează serial către modulul WiFi valoarea umidității solului iar acesta raportează mai departe către serviciul cloud prin intermediul canalului soilhumidity. După prima execuție acest canal va apărea automat în interfața Adafruit IO.

6

În plus, sistemul va permite și comanda de la distanță a procesului de udare. Pentru acest lucru este nevoie să creăm manul în interfața Adafruit IO un canal denumit onoff. Acest canal va transmite către modulul WiFi comenzi de tipul ON / OFF, acestea vor fi retransmise către placa Arduino Uno ca și comenzi seriale de tip 1 / 0 și vor permite pornirea procesului de udare independent de valoarea umidității solului.

Pentru a putea transmite comenzile din interfața Adafruit IO putem crea o nouă consolă de comandă în secțiunea Dashboards. În această consolă de comandă putem plasa graficul de evoluție (Line Chart) a parametrului măsurat (umiditate sol) și un buton (Toggle) pentru comanda de udare.

7

În acest moment avem un sistem complet de urmărire și control la distanță a sistemului de udare – interfața web a serviciului Adafruit IO se poate accesa de oriunde de pe Internet.

Bineînțeles, sistemul propus poate fi îmbunătățit prin adăugarea mai multor parametrii de supravegheat (putem adăuga senzori de temperatură și umiditate a aerului, senzori de intensitate a luminii solare) completând astfel procesul de urmărire și control. Mai mult decât atât, serviciul Adafruit IO permite definirea de alarme de urmărire (avertizarea prin email când un parametru urmărit atinge un anume prag) sau chiar definirea de acțiuni asupra elementelor de comandă (putem implementa pragul de declanșare a procesului de udare la nivel de serviciu cloud).

Pentru mai multe detalii legate de funcționarea serviciului Adafruit IO puteți vedea și următoarele proiecte:

Monitor temperature & humidity from anywhere!

ESP8266 Power Meter Measure the DC power consumption of your devices!

Remote Control with the Huzzah + Adafruit.io

Log Light Levels to Adafruit IO

Track Your Treats: Halloween Candy GPS Tracker

Arduino udă ghivecele cu flori

Se dau: o problemă cotidiană foarte des întâlnită și o mulțime de soluții parțiale ce nu rezolvă niciodată problema propriu-zisă. Cam așa se poate rezuma problema implementării unui sistem bazat pe placa de dezvoltare Arduino Uno ce permite automatizarea procesului de udare a ghivecelor cu flori. Majoritatea exemplelor existente permit măsurarea umidității din sol dar nu implementează și partea de acționare propriu-zisă mulțumindu-se să ”te tragă de mânecă” când trebuie să uzi florile sau să-ți trimită un email de atenționare. Proiectul de față își propune să implementeze o soluție completă (achiziție plus acționare) ajutând astfel pe oricine să-și permită să uite să ude florile fără a le pune în pericol.

Componentele utilizate de sistem sunt foarte comune facilitând astfel implementarea la un cost rezonabil: placă de dezvoltare Arduino Uno, shield drivere de motoare L298, senzor umiditate sol, pompă de apă micro și ecran LCD Nokia (opțional).

23

Shield-ul de motoare L298 este utilizat deobicei în construcția platformelor robotice telecomandate (a se vedea seria de roboți FlexyBot) dar se poate utiliza și în cazul nostru – pompa de apă nu este altceva decât un motor de curent continuu. Se poate utiliza și un releu pentru comanda pompei dar se pierde capabilitatea de control al turației (debitului). Shield-ul este capabil să comande două motoare, sistemul propus folosește o singură ieșire de comandă dar permite o extindere simplă ulterioară.

Conectarea pompei de apă la shield se va face pe canalul Motor2 având grijă la pinul marcat cu bulină roșie al pompei. Shield-ul va fi utilizat cu jumper-ul de alimentare comună pus, astfel vom putea alimenta și placa de dezvoltare și pompa de la un singur alimentator de 9V conectat la placa de dezvoltare (mufa de alimentare a plăcii de dezvoltare).

4

Dacă se respectă conectarea indicată sensul de udare al pompei va fi următorul:5

Pentru conectarea pompei de apă la un recipient cu apă (pompa nu este proiectată să fie conectată la o sursă de apă cu presiune proprie!!!) și la ghivecele cu flori ce urmează a fi udate se poate folosi tub de silicon cu diametrul interior de 3mm (sunt utilizate de obicei la acvarii). În plus se pot utiliza diverși conectori specifici pentru a realiza o instalație care să permită udarea mai multor ghivece simultan:

6

7

Este recomandat ca recipientul (rezervorul) de apă să nu fie mai jos ca sistemul de udare pentru a nu forța pompa să ridice apa.

Senzorul de umiditate sol (pinul SIG) se va conecta la placa de dezvoltare (prin intermediul shield-ului) la pinul analogic A0. Pinul de alimentare al senzorului se va conecta la pinul A2, senzorul va fi alimentat doar când se va efectua citirea. Alimentarea continuă a senzorului poate duce la deterioarea rapidă a acestuia din cauza efectului de electroliză. Ieșirea senzorului nu este calibrată, nu putem calcula precis cantitatea de apă din sol pe baza acestui senzor. Citirile sunt afectate destul de mult și de tipul de sol din ghiveciul cu flori. Având în vedere că citirile analogice se alfă în plaja 0 – 1023 vom stabili un prag sub care vom considera că ghiveciul are nevoie de apă (pragul stabilit în program va fi 500).

8

Este recomandată parcurgerea următorului material pentru a înțelege mai bine funcționarea senzorului de umiditate a solului: Soil Moisture Sensor Hookup Guide.

Ecranul LCD va permite urmărirea funcționării sistemului dar sistemul poate îndeplini sarcina stabilită și fără conectarea acestuia. Ecranul grafic LCD Nokia funcționează la 3.3V, conectarea linilor la pinii Arduino de 5V scade durata de viață a afișajului. Este recomandată adăugarea unui circuit de translatare a nivelurilor logice, a se vedea și materialul: Graphic LCD Hookup Guide.

Conexiunile necesare afișajului LCD sunt următoarele:

9

  • Pinul LED al LCD-ului, prin intermediul unei rezistențe de 220ohm, se va conecta la 5V (sau un un pin PWM dacă se dorește variația intensității luminii de fundal);
  • Pinul SCLK al LCD-ului se va conecta la pinul 13 al plăcii de dezvoltare;
  • Pinu DIN (MOSI) al LCD-ului se va conecta la pinul 11 al plăcii de dezvoltare;
  • Pinul D/C la pinul 8;
  • Pinul RST la pinul 7;
  • Pinul SCE la pinul 4;
  • Pinul GND la GND;
  • Pinul Vcc la 3.3V.

Pentru a putea lucra cu LCD-ul programul va utiliza biblioteciile Adafruit GFX și Adafruit PCD8544.

#include <SPI.h>

#include <Adafruit_GFX.h>

#include <Adafruit_PCD8544.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(8, 4, 7);

#define MOTOR2_PIN1 3

#define MOTOR2_PIN2 5

#define SOIL_PIN    A0

#define SOIL_VCC    A2

void setup() {

  display.begin();

  display.setContrast(50);

  delay(1000);

  display.clearDisplay();

  display.display();

  pinMode(MOTOR2_PIN1, OUTPUT);

  pinMode(MOTOR2_PIN2, OUTPUT);

  digitalWrite(MOTOR2_PIN2, LOW);

  pinMode(SOIL_VCC, OUTPUT);

  digitalWrite(SOIL_VCC, LOW); 

  delay(1000);

}

În cadrul secțiunii loop() a programului se va efectua citirea senzorului de umiditate a solului (cu activarea prealabilă a pinul A2 pentru a alimenta senzorul) și în funcție de valoarea citită (dacă valoarea citită este mai mică de 500) se pornește un ciclu de udare format din trei perioade de 1 secundă alternate cu trei perioadă de pauză de 1 secundă. Pompa este comandată la jumătatea puterii maxime (125 din 255). În funcție de dimensiunea ghiveciului sau / și de numărul de ghivece udate ciclul de udare poate fi ajustat ca durată și putere comandată pompei de apă.

unsigned long lasttime = 0;

void loop()

  int soilhumidity;

  digitalWrite(SOIL_VCC,HIGH);

  delay(1000);

  soilhumidity = analogRead(SOIL_PIN);

  digitalWrite(SOIL_VCC,LOW);

  display.clearDisplay();

  display.display();

  display.setTextSize(1);

  display.setTextColor(BLACK);

  display.setCursor(0,0);

  display.print(“Soil hum:”);

  display.println(soilhumidity);

  display.print(“Time:”);

  display.println(millis()/1000);

  if (soilhumidity<500) {

        display.println(“Status: ON”);

        display.display();

        delay(100);

        analogWrite(MOTOR2_PIN1, 125);

        delay(1000);

        analogWrite(MOTOR2_PIN1, 0);

        delay(1000);

        analogWrite(MOTOR2_PIN1, 125);

        delay(1000);

        analogWrite(MOTOR2_PIN1, 0);

        delay(1000);

        analogWrite(MOTOR2_PIN1, 125);

        delay(1000);

        analogWrite(MOTOR2_PIN1, 0);

        lasttime = millis()/1000;

  }

  else {

        display.println(“Status: OFF”);

  }

  display.print(“LastTime:”);

  display.println(lasttime);

  display.display();

  delay(100);

}

Afișajul LCD va afișa în permanență valoarea citită de la senzorul de umiditate sol, timpul în secunde de la pornirea sistemului: Time, starea sistemului de comandă (ON/OFF – udă/nu udă) și timpul la care s-a efectuat ultimul ciclu de udare: LastTime (estimat în secunde de la pornirea sistemului). Afișarea timpului poate fi rafinată prin transformarea valorii afișate în HH:MM:SS nu doar în secunde.

10

Programul a fost dezvoltat și testat utilizând Arduino IDE 1.8.1 și bibliotecile Adafruit GFX 1.1.8 și Adafruit PCD8544 1.0.0.

Sistemul prezentat poate fi îmbunătățit prin adăugarea unor elemente suplimentare de achiziție (temperatură, umiditate aer, putere lumină solară) pentru a realiza un sistem de automatizare care să țină seama de mai mulți factori în alegerea momentului optim de udare. Pentru inspirație se pot studia și următoarele proiecte:

 

Proiect WiFi Car Revolutions (partea a II-a)

Recunoașterea limbajului natural a devenit încet, încet o funcție obișnuită prin care putem comanda diverse dispozitive inteligente precum telefonul mobil sau calculatorul de bord al automobilul personal. Este posibil să implementăm o funcționalitate asemănătoare pentru WiFi Car? Este posibil să revoluționăm telecomenzile RC uzuale și să adăugăm comandă prin limbaj natural? Da!

2

Pentru a face acest lucru vom exploata conexiunea de rețea, prezentată în prima parte, pentru a conecta WiFi Car la un serviciu cloud de recunoaștere vocală. Puterea de calcul a plăcii de dezvoltare nu permite implementarea algoritmului de recunoaștere vocală local, pe placa de dezvoltare a WiFi Car, din această cauză vom apela la resursele de calcul a unui sistem de cloud. Sistemul de cloud utilizat este IBM BlueMixTM, serviciu cloud comercial dar cu posibilitatea de evaluare gratuită de 30 de zile fără a fi nevoie să introducem informații legate de un card bancar. Mai mult decât atât, în anumite centre universitare din țară accesul studenților și profesorilor este gratuit nelimitat. Pentru familiarizarea cu serviciul de cloud IBM BlueMixTM se poate revedea și lecția How sunny is the Blue? (I, II). Înregistrarea pe platformă se face la adresa:

Sign up for IBM Bluemix

https://console.ng.bluemix.net/registration/

După înregistrare și conectare la platformă se va naviga în zona de aplicații și se va crea o aplicație nouă (Create Application) de tipul Boilerplates / Internet of Things Platform Starter:

3

Se va alege un nume pentru aplicație (în cadrul lecției se va utiliza numele WCR dar puteți alege orice alt nume) și se va da comanda (Create) de alocare de resurse cloud pentru această aplicație nouă. Alocarea de resurse poate dura câteva minute sau zeci de minute. Finalizarea operației este marcată de schimbarea stării aplicației în Running.

4

În plus, trebuie să adăugm aplicației noastre un serviciu de tip Speech to Text (serviciul de recunoaștere vocală): Services /  Watson / Speech to Text. Noul serviciu trebuie asociat cu aplicația creată anterior (Conections / Create connection):

5

După definirea conexiunii aplicația WCR se va restarta. Pentru a putea conecta WiFi Car la aplicația nou creată trebuie să mergem în Dashboard-ul de administrare a serviciului WCR-iotf-service (Connect your devices / Launch dashboard). Comanda ne va direcționa către portalul IBM Watson IoT Platform unde vom crea un nou dispozitiv (Devices / Add Device). Nu trebuie să completăm decât tipul dipozitivului (în exemplul nostru Adafruit_HUZZAH) și numele dispozitivului (în exemplul nostru WCR). La finalizarea adăugării noului dispozitiv trebuie să notăm informațiile de autentificare furnizate de platformă pentru a putea să le folosim în programul dispozitivului (Organization ID, Device Type, Device ID, Authentication Method și Authentication Token).

6

Următorul pas este scrierea aplicație Node-RED care va face conversia între comenzile vocale date de utilizator și comenzile WiFi Car. Vom naviga la adresa https://wcr.mybluemix.net/ (adresa diferă în funcție de numele ales al aplicației) și vom accesa Node-RED flow editor (editorul vizual ce ne va permite scrierea aplicației). Aplicația are diagrama următoarea:

7

Pentru a putea utiliza elementul de intrare de tip microfon trebuie să instalăm următoarele două extensii Node-RED: node-red-contrib-browser-utils și node-red-contrib-media-utils (extensiile se instalează accesând din meniul principal opțiunea Manage palette). Elementul de intrare de tip microphone va permite înregistrea comenzilor vocale direct din browser și le va transmite automat către serviciul de recunoaștere vocală Speach to Text. Ieșirea serviciului de recunoaștere vocală se va conecta la un bloc decizional cu următoarea configurație:

8

Rolul blocului decizional este de a identifica comenzile vocale transcrise de serviciul de recunoaștere vocală (forward, backward, stop, left, right). Din păcate serviciul de recunoaștere vocală nu este disponibil în limba română. Ieșirile blocului decizional conduc la blocuri distincte de construire a comenzii în format JSON către serviciul IoT:

9

Serviciul IoT care va trimite, prin intermediul serviciului IBM Watson, comenzile către WiFi Car va avea următoarea configurație:

10

Pentru siguranță am adăugat un bloc de intrare pentru comanda de STOP care permite comanda manuală pentru cazuri de urgență. Restul componentelor din aplicație sunt utile doar pentru depanare: blocul msg.transcription va afișa textul de ieșire al serviciului de recunoaștere vocală iar blocurile WCR + msg.payload ne arată mesajele ce ajung efectiv la serviciul IoT.

Ultimul pas al implementării este reprogramarea modulului Adafruit HUZZAH pentru a prelua comenzile de la serviciul IBM Watson (pentru reprogramare modulul trebuie deconectat de la placa Arduino Uno). Programul a fost dezvoltat și testat utilizând Arduino IDE 1.8.1 și extensia esp8266 2.3.0 precum și bibliotecile MQTT 1.11.0 și ArduinoJson 5.8.3.

#include <ESP8266WiFi.h>

#include <MQTTClient.h>

#include <ArduinoJson.h>

 

Programul trebuie particularizat cu datele de conectare la rețeaua WiFi locală (ssid și password) precum și cu datele de autentificare la serviciul de cloud (OrgID, DeviceT, DeviceID, AuthenticationToken și OrgID):

const char* ssid     =  ““;

const char* password =  ““;

WiFiClient net;

MQTTClient client;

void connect_mqtt() {

while (!client.connect(“d:OrgID:DeviceT:DeviceID“, “use-token-auth”,”AuthenticationToken“)) {

delay(1000);

}

client.subscribe(“iot-2/cmd/+/fmt/json”);

}

void setup() {

Serial.begin(9600);

delay(10);

WiFi.begin(ssid, password);

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

delay(500); }

client.begin(“OrgID.messaging.internetofthings. ibmcloud.com”, 1883, net);

connect_mqtt();

}

void loop() {

client.loop();

delay(10);

if (!client.connected()) { connect_mqtt(); }

}

void messageReceived(String topic, String payload, char * bytes, unsigned int length) {

StaticJsonBuffer jsonBuffer;

JsonObject& root = jsonBuffer.parseObject(payload);

if (!root.success()) {

return;

}

String command = root[“command”];

Serial.println(command);

}

Programul de pe placa Arduino Uno rămâne neschimbat. După reconectarea modulului Adafruit HUZZAH la WiFi Car putem să testăm comanda vocală. Din aplicația Node-RED se apasă butonul blocului microphone și se dă comanda (se înregistrează o comandă vocală care să conțină unul dintre cuvintele cheie forward, backward, stop, left sau right). Atenție, trebuie să permitem la nivel de browser ca aplicația Node-RED să acceseze dispozitivul hardware microfon al sistemului de calcul. După rostirea comenzii se apasă din nou butonul blocului microphone pentru a opri înregistrarea și a trimite comanda vocală către serviciul de recunoaștere vocală.

11

În captura de ecran anterioară se pot vedea mesajele din consola debug pentru o comandă vocală (right) și o comandă manuală (stop). Pentru comanda vocală se poate vedea atât recunoașterea vocală a comenzii cât și mesajul obținut ca feedback de la serviciul IoT. Pentru comanda manuală avem doar feedback-ul afișat.

Bineînțeles, ca alternativă la comanda vocală din browser există posibilitatea construirii unui sistem portabil de înregistrare vocală (telecomandă vocală). Proiectul de mai jos explorează această posibilitate utilizând o placă de dezvoltare Raspberry Pi:

Control your Robosapien Humanoid Robot using IBM Watson IoT Platform, Raspberry Pi and Node-RED (Part 1)

https://developer.ibm.com/recipes/tutorials/control-your-robosapien-humanoid-robot-using-ibm-watson-iot-platform-raspberry-pi-and-nodered/

Control the Humanoid Robot with voice commands using IBM Watson Speech to Text service (Part 2)

https://developer.ibm.com/recipes/tutorials/control-the-humanoid-robot-with-voice-commands-using-ibm-watson-speech-to-text-service-part-2/