PLCLink est une application pour iPhone ou iPad de supervision et de télécommande d'automatismes utilisant des protocoles standards du net (HTTP, XML, JSON, Modbus).
Le Raspberry PI est une carte complète micro-ordinateur avec Linux comme système d'exploitation. Après installation il est utilisable
pour le pilotage de divers capteurs avec le bus GPIO 26 pins disponible. On utilisera dans une première phase
une sortie bit pour allumer une simple LED via Internet. On utilisera Apache et des scripts Python pour cette tâche.
Le Raspberry PI est le serveur, l'iPhone avec l'application PLCLink la télécommande distante.
Dans cette application le Raspberry PI n'est pas connecté sur un écran ou un clavier, il vous faudra connaitre
l'adresse IP du Raspberry PI dans la suite.
Vous avez avantage à fixer rapidement l'adresse IP du RaspberryPI en associant l'adresse MAC de celui-ci avec une IP fixe dans l'interface
du routeur, il sera plus simple de réaliser ensuite les routages de port pour un accès en réseau extérieur.
La commande n'utilisera que le port 80 standard.
On utilisera par la suite PLCLink dans un iPhone pour la commande, voir les détails sur le site de PLCLink.
Le câblage de la LED à été modifié dans la suite.
Vous trouvez sur les sites consacrés à ce produit les détails pour le montage de base, réaliser une carte mémoire
de boot 1Go est largement suffisant pour cette démonstration.
Il vous faut installer Apache2 et PHP5, vérifiez le fonctionnement des scripts Python dans le dossier cgi-script.
Un script Python est capable d'agir sur les
entrées, et les sorties du GPIO directement, ils seront utilisés par la suite pour les commandes dans un url spécifique.
On utilise aussi quick2wire-gpio et quick2wire-python-api qu'il vous faudra installer. Ces modules permettent
la commande du port GPIO sans devoir être 'root'. Les autres méthodes ne sont pas applicables.
Consultez les site descriptifs des installations de ces modules pour les détails d'installation.
Quick2wire est ici
Sans installation complémentaire vous pouvez utiliser les sorties du GPIO avec un programme python ou C mais vous devez le lancer sous root (avec sudo), la commande par un navigateur ne marche donc pas sans que le serveur Apache ne soit lui-même utilisé avec root.
La lib utilisé (quick2wire-python-api) permet de piloter le bus GPIO sans avoir besoin du mode 'root' donc avec Apache2 sur le Raspberry PI et un script Python dans le dossier cgi-bin, Apache sera aussi placé dans le même groupe d'utilisateur que le groupe défini par quick2wire, le groupe "gpio".
# usermod -a -G gpio www-data
Suites des opérations d'installations de la carte RaspberryPI
Les lib Phyton-api pour GPIO-admin ne semblent pas définitives, il est proposé de monter le dossier et d'utiliser les sources sans installation. Le script Python plus bas utilise la référence "sys.path.append(r'/home/pi/git/quick2wire-python-api/src/')" pour la commande.
On utilisera deux scripts Python pour cet exemple dans le dossier /usr/lib/cgi-bin/ ces scripts sont
utilisables directement dans une url avec les boutons de PLCLink. Vous devez vérifier avec un navigateur
que les scripts réalisent les opérations demandées.
Une LED est placée entre la masse et la sortie PIN 15 = GPIO22. Pour la relecture les PIN 15 et 16 sont connectées ensemble.
Voir plus bas la table de correspondance des PINS physiques et logiques.
#!/usr/bin/python import sys # appends to PYTHONPATH the location of the example codes sys.path.append(r'/home/pi/git/quick2wire-python-api/src/') from time import sleep from quick2wire.gpio import Pin, exported with exported(Pin(15, Pin.Out)) as LED : LED.value = 1 print "Content-type: text/html" print print "<html>" print "Allumer la lampe" print "</html>"
Script à éditer dans /usr/lib/cgi-bin/allume22.py et lui donner les droits exécution :
$ sudo nano /usr/lib/cgi-bin/allume22.py
Editer le texte, enregistrez et ajuster les droits sur ce fichier :
$ sudo chmod 0775 /usr/lib/cgi-bin/allume22.py
La lampe est connectée entre la broche de masse (pin 6) et GPIO22 (pin 15), une résistance
de 330Ω est en série, la mise à 1 allume la lampe.
La numérotation avec quick2wire-python-api est celle du connecteur physique (pin 15).
Un flou certain avec les divers lib de contrôle de la numérotation, vérifiez avant les branchements.
#!/usr/bin/python import sys # appends to PYTHONPATH the location of the example codes sys.path.append(r'/home/pi/git/quick2wire-python-api/src/') from time import sleep from quick2wire.gpio import Pin, exported with exported(Pin(15, Pin.Out)) as LED : LED.value = 0 print "Content-type: text/html" print print "<html>" print "Eteindre la lampe" print "</html>"
Script à éditer dans /usr/lib/cgi-bin/eteindre22.py et lui donner les droits exécution :
$ sudo nano /usr/lib/cgi-bin/eteindre22.py
Editer, sauvez et changer les droits sur ce fichier.
$ sudo chmod 0775 /usr/lib/cgi-bin/eteindre22.py
Cette première phase ne donne pas lecture de la valeur d'une sortie donc on utilise ici deux boutons simples
capable de lancer uniquement un url.
On retrouve l'url dans la balise <link> du fichier wagoML de configuration ci-dessous.
Vous devez ajuster l'IP du lien avec l'IP de votre Raspberry PI.
Une petite LED de contrôle est placée entre la masse (pin 6) et la sortie PIN 15 (GPIO22).
On réalise un fichier WagoML comme ci dessous pour obtenir deux boutons ON et OFF
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE wagoml PUBLIC "-//wagoml org//DTD WAGOML 1.0//EN" "http://pautex.fr/wago/DTD/WagoML-1.0.dtd"> <wagoml version="1.0" xmlns="http://pautex.fr/wago/"> <title>RaspBerryPI</title> <items> <item id="0"> <title>Intern</title> <name>RaspBerryPI</name> <url/> <user/> <password/> </item> </items> <rooms> <setting> <title>Intern</title> <name>RaspBerryPI</name> </setting> <room id="0"> <title>RaspberryPI</title> <items> <item id="0"> <title>Titre</title> <name>Allume GPIO22</name> <description>Header pin 15</description> <type>direct</type> <affichage>button</affichage> <link>http://192.168.0.26/cgi-bin/allume22.py</link> <IW>ON</IW> </item> <item id="1"> <title>Titre</title> <name>Eteindre GPIO22</name> <description>Header pin 15</description> <type>direct</type> <affichage>button</affichage> <link>http://192.168.0.26/cgi-bin/eteindre22.py</link> <IW>OFF</IW> </item> </items> </room> </rooms> </wagoml>>
La relecture de la valeur de sortie est importante en automatisme, plusieurs dispositifs peuvent placer
une variable et les divers affichages doivent pouvoir refléter l'état réel de la sortie.
Pour le moment le moyen utilisé pour une lecture est de connecter la sortie sur une autre PIN qui servira d'entrée de relecture. Il faudra ajouter deux nouveaux
scripts python.
#!/usr/bin/python import sys # appends to PYTHONPATH the location of the example codes sys.path.append(r'/home/pi/git/quick2wire-python-api/src/') pin_num = int(sys.argv[1]) if len(sys.argv) > 1 else 16 from quick2wire.gpio import Pin inPin = Pin(pin_num, Pin.In) print "Content-type: text/html" print print inPin.value
Script à éditer dans /usr/lib/cgi-bin/readPin.py et lui donner les droits exécution :
Une sortie à la fin du script retourne la valeur.
$ sudo nano /usr/lib/cgi-bin/readPin.py
Editer, sauvez et changer les droits sur ce fichier.
$ sudo chmod 0775 /usr/lib/cgi-bin/readPin.py
L'url de commande sur le navigateur est la suivante :
http://≤raspberrypi_IP≥/cgi-bin/readPin.py?PIN
PIN est le numéro physique de la patte du connecteur P1, l'url retourne l'état de la pin 1 ou 0 en texte seulement.
Ce script accepte un paramètre en entrée pour le numéro de la PIN physique comme entrée du connecteur P1. Il retourne un texte simple
de la valeur 0 ou 1 de l'état de la PIN sous forme de texte seul, ici la PIN 16 connectée sur la PIN 15 donne sont état.
On ajoute ensuite dans le fichier wagoML de configuration l'item pour le switch voir plus bas.
#!/usr/bin/python import sys # appends to PYTHONPATH the location of the example codes sys.path.append(r'/home/pi/git/quick2wire-python-api/src/') from time import sleep pin_num = int(sys.argv[1]) if len(sys.argv) > 1 else 15 val_num = int(sys.argv[2]) if len(sys.argv) > 2 else 0 from quick2wire.gpio import Pin, exported with exported(Pin(pin_num, Pin.Out)) as LED : LED.value = val_num print "Content-type: text/html" print print pin_num
Editer comme les autres scripts. Ce script accepte deux paramètres, le numéro de la PIN et la valeur 0 ou 1.
On formera un url de commande comme ci-dessous :
http://raspberrypi_IP/cgi-bin/setPin.py?PIN+value
value sera %d pour le remplacement par PLCLink de la valeur du commutateur.
Une sortie quelconque à la fin évite le message d'erreur sur un navigateur.
On rajoutera l'item suivant pour afficher un switch, les scripts python précédents seront utilisés.
<item id="2"> <title>Titre</title> <name>Commute GPIO22</name> <description>set pin 15, read pin 16</description> <type>direct</type> <affichage>switch</affichage> <link>http://192.168.0.26/cgi-bin/setPin.py?15+%d</link> <url>http://192.168.0.26/cgi-bin/readPin.py?16</url> </item>
<link> est le lien exécuté lors de la commande avec les paramètres de numéro de la broche et la valeur.
<url> est le lien de lecture régulière pour le placement du commutateur. La valeur est le contenu
texte retourné par l'url indiqué. Cette méthode introduit un léger retard d'affichage.
Globalement cette méthode SSI de lecture est assez performante car le fichier reçu comporte toutes les informations sans avoir besoin de lecture complémentaire.
Pas forcement clair la dénomination des pins voici un tableau de correspondance :
Aussi puissant qu'une lampe halogène de 300W ! mais plus économique.
Lampe d'ambiance à LED mais il faudra sortir le fer à souder !
Description complète :Lampe WiFi RGB
Nancy 2012-23 - contact : Pautex JF