Labs Pibrella
- 1. Carte Pibrella
- 1.1. Description
- 1.2. Montage
- 1.3. Installation des librairies Pibrella
- 1.4. Un second exemple : Alarme
- 1.5. Un troisième exemple : une intrusion
- 1.6. Premières étapes
- 1.7. LEDs clignotantes et à pulsation
- 1.8. Entrées et sorties
- 1.9. Le bouton
- 1.10. Le buzzer
- 1.11. Manipulation d'événements
- 1.12. Référence rapide
- 1.13. Projets programme Disco
- 1.14. Exemple de feu de signalisation
- 1.15. Lumières aléatoires
- 1.16. Jeux de réaction
- 1.17. Sources à consulter
- 2. Node-Red
1. Carte Pibrella
https://www.diigo.com/outliner/fd6yst/pibrella?key=ck20nxkxx4
1.1. Description
PiBrella est une carte d'extension pour Raspberry Pi à usage multiple avec son, lumière, entrées et sorties. Elle prend un nombre élevé de broches GPIO tout en laissant les bus série, SPI et i2c libres.
PiBrella est conçu pour pouvoir fournir plus de courant que ne peut le faire le GPIO du Raspberry-Pi et la carte dispose même d'un connecteur d'alimentation USB pour fournir plus de puissance aux moteurs, relais et solénoïdes connectés sur les sorties (26 broches (pins) et 13 broches GPIO actifs)
Source : https://fr.pinout.xyz/pinout/pibrella
1.2. Montage
- Arrêtez le Raspberry Pi et déconnectez l'alimentation. Veuillez toujours arrêter proprement votre Pi avant de connecter des modules complémentaires.
- Fixez votre carte Pibrella. Elle s'insère bien sur l'en-tête GPIO pour le couvrir complètement.
- Connectez l'alimentation à la carte Pibrella. La prise ressemble à celle de votre Pi.
1.3. Installation des librairies Pibrella
sudo apt-get update && sudo apt-get -y upgrade
sudo apt-get -y install python-pip git
sudo pip install pibrella
git clone http://github.com/pimoroni/pibrella
cd pibrella/examples
ls -l
total 16
-rwxr-xr-x 1 pi pi 258 May 7 20:22 random-blink.py
-rwxr-xr-x 1 pi pi 2903 May 7 20:22 react.py
-rwxr-xr-x 1 pi pi 1120 May 7 20:22 siren.py
-rwxr-xr-x 1 pi pi 1123 May 7 20:22 test.py
cat siren.py
#!/usr/bin/env python
import os
import signal
import sys
import time
import pibrella
sys.path.insert(1, os.path.join(sys.path[0], '..'))
# Pulse all of the lights
TIME_ON = 0.2
TIME_OFF = 0.2
FADE_ON = 0.2
FADE_OFF = 0.2
# Play a siren
siren_stopped = True
def siren():
if siren_stopped == True:
pibrella.buzzer.stop()
return True
for x in xrange(-30,30,2):
pibrella.buzzer.note(x)
time.sleep(0.01)
for x in reversed(xrange(-30,30,2)):
pibrella.buzzer.note(x)
time.sleep(0.01)
pibrella.async_start('siren',siren)
def start_siren():
global siren_stopped
siren_stopped = False
pibrella.light.pulse(TIME_ON, TIME_OFF, FADE_ON, FADE_OFF)
def stop_siren():
global siren_stopped
siren_stopped = True
pibrella.light.stop()
def handle_button(button):
global siren_stopped
if siren_stopped == True:
start_siren()
print("Starting Siren")
else:
stop_siren()
print("Stopping Siren")
pibrella.button.released(handle_button)
# Sleep for 20 seconds
#time.sleep(20)
signal.pause()
# Exit!
sudo python siren.py
1.4. Un second exemple : Alarme
Source : http://pibrella.com/#projects
Entrer dans le shell Python.
sudo python -i
Ecrire un bout de code.
import pibrella
pibrella.buzzer.fail()
pibrella.light.pulse(0.2)
En terminer.
quit()
1.5. Un troisième exemple : une intrusion
Entrer dans le shell Python.
sudo python -i
Ecrire un bout de code.
# burglar alarm! (catches grinches and gruffalos)
import pibrella, signal
def alarm(pin):
pibrella.buzzer.fail() # make some noise
pibrella.light.pulse() # flash lights
def reset(pin):
pibrella.light.stop() # reset alarm
pibrella.input.a.changed(alarm) # listen for intruder
pibrella.button.pressed(reset) # in case of stupid cat
signal.pause() # waiting for intruder
Maintenant, activez l'entrée A ! Connectez les 2 broches de l'entrée A avec un fil ou une résistance. (Appuyez sur le gros bouton rouge pour réinitialiser)
1.6. Premières étapes
Source : https://github.com/pimoroni/pibrella/blob/master/README.md
Lancer le shell Python.
sudo python -i
Charger la librairie Pibrella qui va configurer les GPIO et collecter toutes les entrées et sorties en objets manipulables.
import pibrella
Allumer la LED rouge.
pibrella.light.red.on()
Eteindre la LED rouge.
pibrella.light.red.off()
Les collections ( lights, inputs, outputs ) permettent de contrôler un groupe de choses en même temps. Pour éteindre toutes les LEDs.
pibrella.light.off()
Pour allumer toutes les LEDs
pibrella.light.on()
1.7. LEDs clignotantes et à pulsation
Les LEDs peuvent être pulsée, décolorée, clignotantes et stroboscopiques.
pibrella.light.red.blink(ON_TIME, OFF_TIME)
Par pulsation.
pibrella.light.red.pulse(FADE_IN_TIME, FADE_OUT_TIME, ON_TIME, OFF_TIME)
Voici des équivalents.
pibrella.light.red.pulse(0, 0, 1, 1)
pibrella.light.red.blink(1, 1)
Un fondu d'une luminosité à l'autre.
pibrella.light.red.fade(0, 100, 2) # From 0 to 100% in 2 seconds
1.8. Entrées et sorties
Les collections d'entrée et de sortie correspondent aux quatre pins d'entrée et quatre pins de sortie de la carte Pibrella. Ceux-ci sont nommés a, b, c, d pour les entrées et e, f, g, h pour les sorties - vous verrez ces étiquettes sur la carte elle-même.
Pour activer la sortie "e".
pibrella.output.e.on()
On peut aussi écrire une valeur explicite :
- 1 correspond à "on/high"
0 correspond à "off/low"
pibrella.output.e.write(1)
C'est utile si on souhaite activer et désactiver un pin par programmation ou écrire une valeur d'entrée directement sur une sortie.
Et on peut écrire simultanément sur l'ensemble de la collection de sortie si on le souhaite.
pibrella.output.write(1)
Les entrées fonctionnent de manière semblable sauf qu'on les lit au lieu de les écrire en "on" ou en "off".
Pour lire une seule entrée.
my_value = pibrella.input.a.read()
Ou pour lire toutes les entrées dans un dictionnaire.
inputs = pibrella.input.read()
input_a = inputs['a']
1.9. Le bouton
Le bouton de la carte Pibrella est juste une autre entrée. Il dispose toutefois d'une résistance pull-down qui l'empêche de lire les fluctuations électriques aléatoires comme des pressions de bouton.
Comme toute autre entrée, vous pouvez lire l'état du bouton à tout moment:
pibrella.button.read()
1.10. Le buzzer
Le buzzer est juste une autre sortie. Cependant, le fait de l'allumer et de l'éteindre ne vous rapportera pas beaucoup plus qu'un simple pop, il faut le basculer rapidement pour obtenir un son continu. Nous avons fourni des fonctions pour cela.
D'abord, on peut buzzer sur une fréquence spécifique.
pibrella.buzzer.buzz( frequency )
Ou jouer une note (on peut utiliser des valeurs positives et négatives ici, avec 0 à A à 440Hz).
pibrella.buzzer.note( 1 )
Ou jouer une tonalité incluse.
pibrella.buzzer.fail()
pibrella.buzzer.success()
1.11. Manipulation d'événements
"changed", "pressed", "released".
Si on veut capturer un état de changement d'entrée et exécuter une fonction spécifique, on peut utiliser "changed" (changé), "pressed" (pressé) et "released" (relâché) sur l'une des entrées ou sur le bouton. "changed" (changé) se déclenchera quand une broche passera de 1 (high / on) à 0 (low / off) ou vice versa. "pressed" (pressé) se déclenche quand il passe de 0 à 1, et "released" (relâché) quand il passe de 1 à 0.
Par exemple.
def button_pressed(pin):
print("You pressed the button!")
pibrella.button.pressed(button_pressed)
pibrella.pause()
La commande pibrella.pause ()
est ici pour empêcher la sortie immédiate du programme et permet de maintenir votre programme occupé.
Le paramètre "pin" de la fonction bouton pressé est le pin de la carte Pibrella qui a déclenché l'évènement, dans ce cas "pin" sera égal à "pibrella.button".
def button_changed(pin):
if pin.read() == 1:
print("You pressed the button!")
else:
print("You released the button!")
pibrella.button.changed(button_changed)
pibrella.pause()
Pour allumer une LED lorsque vous appuyez sur le bouton, votre code devrait ressembler à ceci:
import pibrella
def button_changed(pin):
pibrella.light.red.write(pin.read())
pibrella.button.changed(button_changed)
pibrella.pause()
1.12. Référence rapide
Toutes les entrées, sorties et LEDs de la carte Pibrella sont stockées dans des collections. On peut référencer une broche par son nom ou son index de l'une des trois manières suivantes.
pibrella.light[0] # By index
pibrella.light['red'] # By name, for use with a variable
pibrella.light.red # By name
On peut également se référer à une collection entière en une seule fois, simplement en omettant l'index ou le nom:
pibrella.light
Aides
Pibrella a une petite aide intégrée. Pour connaître les noms des LEDs, des entrées ou des entrées.
pibrella.lights
pibrella.inputs
pibrella.outputs
LEDs
Les méthodes suivantes sont disponibles pour les LEDs de la carte pibrella.
.on() # Allume le LED
.off() # Etient le LED
.high() # Allume le LED
.low() # Etient le LED
.toggle() # Bascule l'état des lumières de allumé à éteint et éteint à allumé
# Si les LEDs clignotent / pulsent, la bascule les éteint toujours
.pulse( transition_on, transition_off, time_on, time_off ) # pulsations légères, valeurs en secondes
.blink( time_on, time_off ) # clignotement léger, valeurs en secondes
.write( value ) # Allume si la valeur = 1, ou éteint si la valeur = 0
Sorties
Une sortie peut faire tout ce qu'un LED peut faire, ils sont identiques dans tout sauf le nom!
Entrées
Les méthodes suivantes sont disponibles pour chaque entrée Pibrella.
Général
pibrella.pause () # Wrapper signal.pause(), idéal pour mettre votre application en pause après avoir appelé un clignotement, une impulsion ou une boucle
pibrella.loop (nom_fonction) # Passez une fonction de pibrella à exécuter encore et encore, de manière asynchrone
# Vous devez appeler pibrella.pause() après lui avoir donné une fonction pour faire une boucle, sinon le code échouera
1.13. Projets programme Disco
Source : https://github.com/raspberrypilearning/pibrella-intro/blob/master/worksheet.md
Projet 1 : Créer un programme de lumières aléatoires
En plus d'utiliser la bibliothèque pibrella dans un programme simple, vous pouvez également utiliser les fonctionnalités d'autres bibliothèques comme random
ettime
.
- Créez un nouveau fichier Python en tapant
nano disco.py
dans une fenêtre LXTerminal ou sur la ligne de commande. Un nouveau fichier de texte vide s'ouvre. Sur la première ligne, importez les bibliothèques que vous devrez utiliser:
import pibrella, random, time
Puis étiquetez chacune des LEDs comme ceci:
red = pibrella.light.red amber = pibrella.light.amber green = pibrella.light.green
Chaque étiquette est appelée une variable. Les variables sont utilisées ici pour stocker une longue commande comme raccourci pour l'étape suivante.
En dessous, ajoutez les noms de couleurs à une liste comme celle-ci :
colour = [red, amber, green]
Des éléments, comme les couleurs, peuvent être stockés dans une liste et recevoir un nom en Python. Vous pouvez aussi écrire la liste comme ceci
color = [pibrella.light.red, pibrella.light.amber, pibrella.light.green]
au lieu d'utiliser des noms de variables pour stocker la commande.Maintenant que vous avez configuré le programme, créez une boucle en utilisant
while True:
qui sélectionne une couleur aléatoire dans la liste des couleurs, puis allume et éteint la lumière correspondante pendant 0,2 seconde. Attention à l'identation :while True: result = random.choice(colour) time.sleep(1) result.pulse(0.2)
Au sein de cette boucle, qui se répète indéfiniment, vous avez utilisé la fonction
random.choice
pour sélectionner une couleur de la liste que vous avez créée aléatoirement, puis la stocker dans la variable appeléeresult
. Après 1 seconde, le LED de couleur qui a été sélectionnée au hasard et puis est ensuite stocké dans la variable de résultatresult
qui va pulser pendant 0,2 seconde.Enregistrez et quittez en appuyant sur CTRL et X sur le clavier, puis sur Y ou O pour oui.
- Pour exécuter votre programme, tapez
sudo python disco.py
. - Comme vous avez utilisé une boucle continue, ce programme ne se termine pas tant que vous n'appuyez pas sur les touches CTRL et C du clavier pour l'interrompre.
Projet 2 : Boucler 5 fois
Maintenant que vous avez un "disco light" en boucle, ajoutons du code pour qu'il ne se répète qu'un certain nombre de fois, plutôt que pour toujours.
- Ouvrez votre programme disco en tapant
nano disco.py
dans une fenêtre LXTerminal ou depuis la ligne de commande. - A l'aide des flèches de votre clavier, naviguez vers le bas juste en dessous de la liste des couleurs et avant la boucle
while
. Tapezn = 0
pour stocker la valeur numérique 0 en tant que variable. Puis modifier la boucle
while
:n = 0 while n < 5: result = random.choice(colour) time.sleep(1) result.pulse(0.2) n = n + 1
Au lieu de donner la commande
while True:
pour boucler pour toujours, vous avez utiliséwhile n <5:
alors quen
est inférieur ou égal à la valeur 5. Cela signifie que cette boucle ne se répète que sin
contient une valeur inférieure à 5 ou 5. Vous avez déjà défini la valeur den
sur 0 avant le démarrage de la boucle. Ensuite, en bas de la boucle, vous avez ajouté la lignen = n + 1
qui ajoutera 1 à la valeur à chaque tour de la boucle. Par exemple, 0 + 1, puis 1 + 1, puis 2 + 1, etc., chaque fois que vous stockez la nouvelle valeur dans la variablen
.Enregistrez et quittez en appuyant sur CTRL et X sur le clavier, puis sur Y ou O pour oui.
- Pour exécuter votre programme, tapez
sudo python disco.py
.
Projet 3 : Utiliser une fonction pour stocker votre boucle de lumière disco
Les fonctions vous permettent de stocker des parties de code pour pouvoir les réutiliser plus tard. Mettons votre nouvelle boucle dans une fonction.
Avec votre programme
disco.py
ouvert, naviguez jusqu'à la lignen = 0
et enveloppez votre code dans une fonction comme celle-ci:def disco(): n = 0 while n < 5: result = random.choice(colour) time.sleep(1) result.pulse(0.2) n = n + 1
Si vous lancez votre programme maintenant, rien ne se passera. Comme les variables, vous avez donné un nom à ce morceau de code mais ous ne l'avez pas encore appelé pour fonctionner !
Sous la boucle, tapez
disco()
.- Maintenant, sauvegardez et exécutez le code pour voir ce qui se passe!
Projet 4: Utiliser un bouton pour démarrer votre programme Disco
Maintenant que vous avez un programme disco Pibrella fonctionnel, vous pouvez commencer à utiliser certains des autres éléments sur la carte Pibrella, par exemple un bouton d'entrée pour déclencher le programme. Placer le code de bouclage dans une fonction rend les choses plus aisées.
Sous la fonction disco, créez une boucle répétitive infinie :
while True: if pibrella.button.read(): disco()
L'intérieur de la boucle est une condition, ce qui signifie que la fonction disco ne sera déclenchée que si la condition est remplie. Dans ce cas, la condition est remplie lorsque le bouton est enfoncé.
Enregistrez votre code et exécutez-le pour voir ce qui se passe.
Vous avez peut-être remarqué que les lumières clignotent maintenant. Vous pouvez sortir de la boucle continue après 5 secondes en tapant
break
à l'intérieur de la bouclewhile True:
:while True: if pibrella.button.read(): disco() time.sleep(5) break
1.14. Exemple de feu de signalisation
Cet exemple pourrait trouver des adaptations.
Source : https://github.com/johnblackmore/pibrella-adventures
## Basic (UK) Traffic Light Example
#
# When the Pibrella button is pressed, loop through the traffic light sequence.
# In the UK this is Red and Amber, Green, Amber, Red.
import pibrella, time
# Traffic light sequence, each light represents the red, amber and green light values and a time delay
sequence = [
[1, 1, 0, 1],
[0, 0, 1, 5],
[0, 1, 0, 2],
[1, 0, 0, 1]
]
# Callback function to process button presses
def button_changed(pin):
if pin.read() == 1:
traffic_light()
# Simple function to loop the traffic light sequence
def traffic_light():
for i in sequence:
pibrella.light.red.write(i[0])
pibrella.light.yellow.write(i[1])
pibrella.light.green.write(i[2])
time.sleep(i[3])
# Set initial state (red light)
pibrella.light.red.on()
# Register the button press callback
pibrella.button.changed(button_changed)
# Wait for input
pibrella.pause()
1.15. Lumières aléatoires
cd ~/pibrella/examples
cat random-blink.py
#!/usr/bin/env python
import random
import time
import pibrella
"""
This example will blink an LED at random
"""
while True:
with random.choice(pibrella.light) as l: # Pick a random light
l.on()
time.sleep(0.5)
l.off()
time.sleep(0.5)
sudo python random-blink.py
1.16. Jeux de réaction
Appuyer le plus vite possible sur le bouton quand le LED rouge s'allume.
cd ~/pibrella/examples
sudo python react.py
1.17. Sources à consulter
- https://github.com/nate-drake/pibrella-doomsdaydevice
- https://github.com/tommybobbins/PiBrella-lesson
- https://github.com/daniel-thompson/pibrella-examples
- https://github.com/raymondlesley/pibrella-play
- https://github.com/josejuansanchez/pibrella_playground
- https://github.com/lesp/LinuxVoice_Pibrella
- https://github.com/ForToffee/Pibrella
- https://github.com/jdmoore0883/Annoy-Pi
- https://github.com/e2jk/pibrella-scripts
- https://github.com/hansamann/pibrella-minecraft
- https://github.com/AdhikariSaurabh/Pibrella_WiringPi_traffic_light
- https://github.com/raspberrypilearning/sorting-hat-lesson
- https://github.com/zebra-tech-savanna/mbed-client-rpi-executables
2. Node-Red
- https://projects.raspberrypi.org/en/projects/getting-started-with-node-red
- https://diyprojects.io/node-red-module-dashboard-gui/#.Wu9jKtOWTq4
2.1. JavaScript
JavaScript est un langage de programmation de scripts principalement employé dans les pages web interactives mais aussi pour les serveurs avec l'utilisation (par exemple) de Node.js. A ne pas confondre avec Java.
2.2. Node.js
Node.js est une plateforme logicielle libre et événementielle en JavaScript orientée vers les applications réseau qui doivent pouvoir monter en charge.
Elle utilise la machine virtuelle V8 et implémente sous licence MIT les spécifications CommonJS.
Parmi les modules natifs de Node.js, on retrouve http qui permet le développement de serveur HTTP. Il est donc possible de se passer de serveurs web tels que Nginx ou Apache lors du déploiement de sites et d'applications web développés avec Node.js.
2.3. Node-RED
Node-RED est un outil de programmation basé sur les flux, original développé par l'équipe Emerging Technology Services d'IBM et maintenant membre de la JS Fondation.
Inventée par J. Paul Morrison dans les années 1970, la programmation basée sur les flux est une façon de décrire le comportement d'une application sous la forme d'un réseau de boîtes noires, ou "noeuds" comme on les appelle dans Node-RED. Chaque "noeud" a un but bien défini ; on lui donne des données, il en fait quelque chose et ensuite il les transmet. Le réseau est responsable du flux de données entre les noeuds.
C'est un modèle qui se prête très bien à une représentation visuelle et le rend plus accessible à un plus grand nombre d'utilisateurs. Si quelqu'un peut décomposer un problème en étapes discrètes, il peut regarder un flux et avoir une idée de ce qu'il fait; sans avoir à comprendre les différentes lignes de code dans chaque noeud.
Node-RED consiste en une exécution basée sur Node.js que vous appelez dans un navigateur Web pour accéder à l'éditeur de flux. Dans le navigateur, vous créez votre application en faisant glisser les noeuds de votre palette dans un espace de travail et vous pouvez commencer à les relier entre eux. En un seul clic, l'application est redéployée (deploy) dans l'environnement d'exécution où elle est exécutée.
La palette de nœuds peut être facilement étendue en installant de nouveaux noeuds créés par la communauté et les flux que vous créez peuvent être facilement partagés en tant que fichiers JSON.
En bref, pour l'histoire, Node-RED a vu le jour début 2013 sous la forme d'un projet parallèle de Nick O'Leary et Dave Conway-Jones du groupe IBM Emerging Technology Services. Démarré comme une preuve de concept pour visualiser et manipuler les correspondances entre les sujets MQTT, Node-RED est rapidement devenu un outil beaucoup plus général qui pourrait facilement être étendu dans n'importe quelle direction. Il a été ouvert en septembre 2013 et a été développé à l'extérieur depuis, ce qui en a fait l'un des projets fondateurs de la JS Fondation en octobre 2016.
2.4. Installation de Node-RED sur Rpi
Pour installer ou mettre à jour en utilisant la commande de script de mise à niveau Node-RED.
bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)
sudo systemctl enable nodered.service
2.5. Ajout d'un noeud
Procédure d'ajout d'un noeud (https://flows.nodered.org/?num_pages=1)
cd ~/.node-red
npm install node-red-{example node name}
Installation du noeud pibrella.
cd ~/.node-red
npm install node-red-node-pibrella
sudo reboot
2.6. Traffic Light Simulator
Input and Output controls for Pibrella on Raspberry Pi
[
{
"id": "79097754.9d1008",
"type": "rpi-gpio in",
"z": "18cae352.8e61fd",
"name": "red button",
"pin": "23",
"intype": "tri",
"x": 220.31746673583984,
"y": 948.7460508346558,
"wires": [
[
"c67ca9d5.dee8c8"
]
]
},
{
"id": "caa28bcf.fa1ec8",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "red",
"pin": "13",
"x": 741.3174667358398,
"y": 1062.7460508346558,
"wires": []
},
{
"id": "93fb6475.cc9ec8",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "green",
"pin": "7",
"x": 1076.3174667358398,
"y": 1172.7460508346558,
"wires": []
},
{
"id": "a5be988a.307c48",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "amber",
"pin": "11",
"x": 565.3174667358398,
"y": 1013.7460508346558,
"wires": []
},
{
"id": "d170d63.0c5e528",
"type": "delay",
"z": "18cae352.8e61fd",
"name": "",
"pauseType": "delay",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"x": 562.3174667358398,
"y": 1061.7460508346558,
"wires": [
[
"caa28bcf.fa1ec8",
"b4d9ee9b.b9122",
"ae7203e7.f294"
]
]
},
{
"id": "b4d9ee9b.b9122",
"type": "delay",
"z": "18cae352.8e61fd",
"name": "",
"pauseType": "delay",
"timeout": "10",
"timeoutUnits": "seconds",
"rate": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"x": 743.3174667358398,
"y": 1108.7460508346558,
"wires": [
[
"b12d97db.ebf498",
"9e8fbbbc.daaa38"
]
]
},
{
"id": "b12d97db.ebf498",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "amber",
"pin": "11",
"x": 917.3174667358398,
"y": 1108.7460508346558,
"wires": []
},
{
"id": "9e8fbbbc.daaa38",
"type": "delay",
"z": "18cae352.8e61fd",
"name": "",
"pauseType": "delay",
"timeout": "5",
"timeoutUnits": "seconds",
"rate": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"x": 932.3174667358398,
"y": 1171.7460508346558,
"wires": [
[
"93fb6475.cc9ec8",
"d4a1805d.081f1"
]
]
},
{
"id": "ae7203e7.f294",
"type": "function",
"z": "18cae352.8e61fd",
"name": "0",
"func": "msg.payload = 0;\n\n\nreturn msg;",
"outputs": 1,
"x": 745.3174667358398,
"y": 1019.7460508346558,
"wires": [
[
"4e806e7a.9f6ed"
]
]
},
{
"id": "4e806e7a.9f6ed",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "amber",
"pin": "11",
"x": 892.3174667358398,
"y": 1019.7460508346558,
"wires": []
},
{
"id": "d4a1805d.081f1",
"type": "function",
"z": "18cae352.8e61fd",
"name": "0",
"func": "msg.payload = 0;\n\n\nreturn msg;",
"outputs": 1,
"x": 1074.3174667358398,
"y": 1131.7460508346558,
"wires": [
[
"8e502ad3.72f6c8",
"b7290695.3cb028"
]
]
},
{
"id": "b7290695.3cb028",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "red",
"pin": "13",
"x": 1230.3174667358398,
"y": 1143.7460508346558,
"wires": []
},
{
"id": "8e502ad3.72f6c8",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "amber",
"pin": "11",
"x": 1228.3174667358398,
"y": 1099.7460508346558,
"wires": []
},
{
"id": "c67ca9d5.dee8c8",
"type": "function",
"z": "18cae352.8e61fd",
"name": "rising edge",
"func": "if (msg.payload == 1)\n{\n return msg;\n}\nelse\n{\n return null;\n}\n",
"outputs": 1,
"x": 355.31746673583984,
"y": 949.7460508346558,
"wires": [
[
"a5be988a.307c48",
"d170d63.0c5e528",
"7b7a0e4d.15e3"
]
]
},
{
"id": "7b7a0e4d.15e3",
"type": "function",
"z": "18cae352.8e61fd",
"name": "0",
"func": "msg.payload = 0;\n\n\nreturn msg;",
"outputs": 1,
"x": 566.3174667358398,
"y": 964.7460508346558,
"wires": [
[
"9f95082e.8a4708"
]
]
},
{
"id": "9f95082e.8a4708",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "green",
"pin": "7",
"x": 723.3174667358398,
"y": 963.7460508346558,
"wires": []
},
{
"id": "67545769.bfc408",
"type": "inject",
"z": "18cae352.8e61fd",
"name": "initialise to green",
"topic": "",
"payload": "1",
"repeat": "",
"crontab": "",
"once": false,
"x": 229.31746673583984,
"y": 865.746036529541,
"wires": [
[
"6c3ffc3a.1bba34"
]
]
},
{
"id": "b37bb59f.47e5d8",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "green",
"pin": "7",
"x": 554.3174667358398,
"y": 879.7460508346558,
"wires": []
},
{
"id": "1fadc29c.6a01dd",
"type": "function",
"z": "18cae352.8e61fd",
"name": "0",
"func": "msg.payload = 0;\n\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 560.3174667358398,
"y": 826.7460508346558,
"wires": [
[
"97949c1c.841bd",
"e447c19a.3922b"
]
]
},
{
"id": "97949c1c.841bd",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "amber",
"pin": "11",
"x": 698.3174667358398,
"y": 803.7460508346558,
"wires": []
},
{
"id": "e447c19a.3922b",
"type": "rpi-gpio out",
"z": "18cae352.8e61fd",
"name": "red",
"pin": "13",
"x": 696.3174667358398,
"y": 848.7460508346558,
"wires": []
},
{
"id": "6c3ffc3a.1bba34",
"type": "delay",
"z": "18cae352.8e61fd",
"name": "",
"pauseType": "delay",
"timeout": "1",
"timeoutUnits": "seconds",
"rate": "1",
"rateUnits": "second",
"randomFirst": "1",
"randomLast": "5",
"randomUnits": "seconds",
"x": 388.31746673583984,
"y": 866.7460508346558,
"wires": [
[
"1fadc29c.6a01dd",
"b37bb59f.47e5d8"
]
]
},
{
"id": "105d33b8.58904c",
"type": "comment",
"z": "18cae352.8e61fd",
"name": "traffic light simulator - push the red button!",
"info": "",
"x": 305.3174819946289,
"y": 771.412769317627,
"wires": []
}
]
2.7. Lab Twitter
[
{
"id": "4f4c115b.b9b8c",
"type": "tab",
"label": "pibrella twitter",
"disabled": false,
"info": ""
},
{
"id": "c8047d70.90478",
"type": "rpi-pibrella in",
"z": "4f4c115b.b9b8c",
"name": "Red button #redled",
"pin": "Red Button",
"read": false,
"x": 285.5,
"y": 248,
"wires": [
[
"bc404312.ede54"
]
]
},
{
"id": "c13b8e4a.b1af1",
"type": "debug",
"z": "4f4c115b.b9b8c",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"x": 925.5,
"y": 133,
"wires": []
},
{
"id": "bc404312.ede54",
"type": "switch",
"z": "4f4c115b.b9b8c",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "1",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 481.5,
"y": 248,
"wires": [
[
"8c019734.aa9f68"
]
]
},
{
"id": "8c019734.aa9f68",
"type": "function",
"z": "4f4c115b.b9b8c",
"name": "tag + timestamp",
"func": "msg.payload = \"#redled \" + new Date().toString();\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 688.5,
"y": 247,
"wires": [
[
"c13b8e4a.b1af1",
"b48e4f16.304e9",
"8bca00da.05563"
]
]
},
{
"id": "5ba72bf0.e5f144",
"type": "trigger",
"z": "4f4c115b.b9b8c",
"op1": "1",
"op2": "0",
"op1type": "str",
"op2type": "str",
"duration": "5",
"extend": false,
"units": "s",
"reset": "",
"bytopic": "all",
"name": "",
"x": 501.5,
"y": 412,
"wires": [
[
"8f465102.d37f9",
"2116a5f7.66d95a"
]
]
},
{
"id": "8f465102.d37f9",
"type": "rpi-pibrella out",
"z": "4f4c115b.b9b8c",
"name": "",
"pin": "Red LED",
"set": false,
"level": "0",
"out": "out",
"x": 741.5,
"y": 411,
"wires": []
},
{
"id": "b48e4f16.304e9",
"type": "twitter out",
"z": "4f4c115b.b9b8c",
"twitter": "",
"name": "Tweet @feglab",
"x": 932.5,
"y": 196,
"wires": []
},
{
"id": "8078dfcf.be61",
"type": "twitter in",
"z": "4f4c115b.b9b8c",
"twitter": "",
"tags": "#redled",
"user": "false",
"name": "#redled tag catch",
"topic": "tweets",
"inputs": 0,
"x": 273.5,
"y": 412,
"wires": [
[
"5ba72bf0.e5f144"
]
]
},
{
"id": "2116a5f7.66d95a",
"type": "rpi-pibrella out",
"z": "4f4c115b.b9b8c",
"name": "",
"pin": "Buzzer ",
"set": false,
"level": "0",
"out": "out",
"x": 736.5,
"y": 497,
"wires": []
},
{
"id": "b2a7b089.d2dca",
"type": "rpi-pibrella out",
"z": "4f4c115b.b9b8c",
"name": "",
"pin": "Green LED",
"set": true,
"level": "0",
"out": "out",
"x": 1108.5,
"y": 246,
"wires": []
},
{
"id": "8bca00da.05563",
"type": "trigger",
"z": "4f4c115b.b9b8c",
"op1": "1",
"op2": "0",
"op1type": "str",
"op2type": "str",
"duration": "3",
"extend": false,
"units": "s",
"reset": "",
"bytopic": "all",
"name": "",
"x": 911.5,
"y": 246,
"wires": [
[
"b2a7b089.d2dca"
]
]
},
{
"id": "1f08f815.f2d758",
"type": "comment",
"z": "4f4c115b.b9b8c",
"name": "Envoi d'un tweet",
"info": "Le bouton envoit un tweet avec le hastag #redled et un timestamp",
"x": 277.5,
"y": 174,
"wires": []
},
{
"id": "3ad4c9d0.ae9486",
"type": "comment",
"z": "4f4c115b.b9b8c",
"name": "Réception d'un tweet",
"info": "A la réception d'un tweet avec le hashtag #redled la LED rouge s'allume et le buzzer s'enclenche",
"x": 287.5,
"y": 338,
"wires": []
}
]
2.8. Lab Picam Photobooth
2.9. Lab Appel SIP
Ce Lab s'intègre au déploiement de raspbx et relève juste de la preuve de concept.
Sur le raspberry pi avec la carte pibrella, installer linphone :
sudo apt-get update
sudo apt-get install linphone-nogtk
Créer un script dans /home/pi/sipcall.sh
#!/bin/bash
proc=$(ps aux | egrep "linphonec --pipe" | awk '{print $2}') ; kill -9 ${proc}
/usr/bin/linphonecsh init
sleep 3
/usr/bin/linphonecsh register --host raspbx00 --username 3303 --password test1234
sleep 3
/usr/bin/linphonecsh dial "sip:2202@raspbx00"
sleep 3
proc=$(ps aux | egrep "linphonec" | awk '{print $2}') ; kill -9 ${proc}
Dans Node-Red, le flux suivant exécute le script et allume la LED rouge pendant 9 secondes.
[{"id":"28c50c57.cc9684","type":"exec","z":"7cf14d54.8b0744","command":"sudo bash -x /home/pi/sipcall.sh","addpay":true,"append":"","useSpawn":"true","timer":"","oldrc":false,"name":"","x":580.5,"y":273.5,"wires":[["12af2c1a.dfde14"],[],[]]},{"id":"f574d105.ad4be","type":"rpi-pibrella in","z":"7cf14d54.8b0744","name":"","pin":"Red Button","read":false,"x":135.5,"y":243,"wires":[["8b712ca5.fc59f","f2adcc8.a55a33"]]},{"id":"12af2c1a.dfde14","type":"debug","z":"7cf14d54.8b0744","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":815.5,"y":260,"wires":[]},{"id":"8b712ca5.fc59f","type":"trigger","z":"7cf14d54.8b0744","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"1","extend":false,"units":"s","reset":"","bytopic":"all","name":"","x":332.5,"y":274,"wires":[["28c50c57.cc9684"]]},{"id":"66aca6b.a723458","type":"rpi-pibrella out","z":"7cf14d54.8b0744","name":"","pin":"Red LED","set":false,"level":"0","out":"out","x":507.5,"y":199,"wires":[]},{"id":"f2adcc8.a55a33","type":"trigger","z":"7cf14d54.8b0744","op1":"1","op2":"0","op1type":"str","op2type":"str","duration":"9","extend":false,"units":"s","reset":"","bytopic":"all","name":"","x":331.5,"y":200,"wires":[["66aca6b.a723458"]]}]
Le destinataire sonne ...
Pour des scripts de communication SIP, il est préférable d'utiliser la librairie PJSIP.
...
2.10. Lab Node-RED HTTP
...