Control des del NodeRED i MQTT fent servir una Raspberry Pi Zero W

De binefa.com
Salta a la navegació Salta a la cerca

Imatge descarregable

Imatge d'un Raspbian preparat per a funcionar a una Raspberry Pi Zero W. Un cop cremeu la imatge a la targeta SD li heu de fer una expansió.

El primer cop que la poseu en marxa podeu fer servir el vostre mòbil com a punt d'accés [SSID: iotcat Contrasenya: 1234567890a]. Al cap d'una estona us sortirà una IP per la pantalla OLED. El primer cop que hi accediu mitjançant SSH podeu personalitzar la connexió a la xarxa sense fils de casa vostra.

NodeRED

Interacció del maquinari amb el NodeRED

Aquest flux del NodeRED

Python

Codis d'interacció en Python

Per a visualitzar per terminal l'estat dels sensors infrarojos i la lectura de distància del sensor d'ultrasons:

pi@robot01:~/code/robot $ ./irUs_03.py 
Prova IR i ultrasons

Per a moure els motors fem servir la funció vMotion(nEsq,nDre) present a l'arxiu importable edcoRobot.py:

vMotion(-127, +127)
pi@robot01:~/code/robot $ ./motor_01.py

Interacció amb el maquinari

Inici i aturada del procés al rerefons

Per a fer la comunicació entre el maquinari i el NodeRED cal executar:

/home/pi/code/robot/robot_01.py

Altrament, també es pot executar des dels nodes del NodeRED:

Interacció del maquinari amb el NodeRED

Anomenem l'execució del codi com a procesUnic:

bash -c "exec -a procesUnic /usr/bin/python3 /home/pi/code/robot/robot_01.py"

I per a matar el procés pel nom procesUnic:

pkill -f procesUnic

robot_01.py és l'encarregat de comunicar el maquinari i el NodeRED. Per tant, quan no està en marxa no hi ha comunicació entre el maquinari i el NodeRED.

Recepció de les dades dels sensors

Objecte JSON amb les dades del sensor:

JsonSensors01.png

us: distància en centímetres del sensor d'ultrasons.

bL i bR: Sensors infrarojos (IR) darrere esquerre (back left) i darrere dret (back right). L'estat W és la detecció d'un color blanc (white) quan rebota el llum i l'estat B és la detecció d'una absorció de llum, normalment la detecció del color negre (black).

bFL, bCL, bCC, bCR i bFR: Sensors infarojos (IR) frontals (far left, center left, center, center right i far right). L'estat W és la detecció d'un color blanc (white) quan rebota el llum i l'estat B és la detecció d'una absorció de llum, normalment la detecció del color negre (black).

button: El botó entre els sensors ultarsònics i la Raspberry Pi. L'estat N és de no premut (not pressed) i P és premut (pressed).


Objecte JSON en format de cadena de caràcters:

JsonSensors02.png

Transmissió de dades als actuadors

Es fa mitjançant un JSON amb els camps left i right que controlen les rodes de la dreta i les de l'esquerra. Els valors corresponen al cicle de treball (duty cicle) del sistema de modulació per amplada de pols (PWM: Pulse Width Modulation). Els valors entre -255 i 0 corresponen al 100% i 0% del cicle de treball amb els motors en marxa enrere, i els valors entre 0 i 255 corresponen al 0% i 100% del cicle de treball amb els motors en marxa endavant.

ActuadorsRobot.png

En aquest exemple els motors de l'esquerra del robot van enrere amb un cicle de treball del 50% (el 100% és 255) i els motors de la dreta van endavant amb un cicle de treball del 50%:

{"left":-127,"right":127}

Activació dels actuadors en funció dels sensors

Exemple

Aquesta és la implementació d'un exemple amb aquest comportament:

- Quan es detecta B a bCC s'aturen els motors i quan es detecta W els dos motors van cap a endavant amb un cicle de treball del 50%.

ExRobot_v6_01.png

Codi de NodeRED de l'exemple

La funció Robot Brain:

flow.set("bCC",msg.payload.ir.bCC);
if(msg.payload.ir.bCC == "B"){
    flow.set("left",0);
    flow.set("right",0);    
    msg.payload = {"left":0,"right":0};
}else{
    flow.set("left",127);
    flow.set("right",127);    
    msg.payload = {"left":127,"right":127};
}
return msg;