Publié le 5 mars 2016 - par

Une interface web simple pour piloter des LED avec HTML5 et Python sur le Raspberry Pi

image_01_250pxUn bel article que nous devons à Bruno Il a pris comme base deux articles publiés sur le blog et s’en est inspiré pour créer un système « simple » qui met quand même en œuvre des fonctionnalités avancées… Je lui laisse la parole :
C’est sur framboise314 que j’ai trouvé ces deux descriptions. La première signée TheFreeElectron concerne l’interface web qui permet de piloter facilement 8 sorties GPIO du Raspberry Pi.
La seconde est une application de cette interface, réalisée par rleddington. Elle permet de piloter facilement 8 prises secteur à partir de votre smartphone. Je vous propose de la modifier et d’utiliser uniquement la librairie python GPIO.

Ce tutoriel se limitera au langage Python et plus précisément à la librairie RPi.GPIO.

L’électronique

La partie électronique n’a rien de spécial, elle ne comporte que 8 LED avec leur résistance de protection… La seule partie délicate est de bien relier chaque LED à la bonne broche sur le GPIO du Raspberry Pi.

Le GPIO (General Purpose Input/Output = Entrée/Sortie pour un Usage Général) sont des broches d’entrée/sortie permettant au Raspberry PI de communiquer avec des périphériques extérieurs. Ces broches peuvent assurer différentes fonctions mais sont uniquement de type numérique :

image_02

  • Entrée/Sortie Numérique (Tout ou Rien).
  • Bus SPI.
  • Bus I2C.
  • Bus Série (UART).
  • PWM.
  • et les broches d’alimentation : GND, 3,3V et 5V
image_03_600px

Cliquez pour agrandir

Pour ce qui est des résistances, elles devraient valoir 1,5kΩ pour une diode LED rouge HLMP-K150

Calcul UR=Vs-VLED=3,3-1,6= 1,7 V avec IF=1mA -> R=UR/IF= 1700Ω

Utilisation de la bibliothèque GPIO

Le choix se porte sur du Python car ce langage de programmation est celui retenu à l’origine pour le développement sur le Raspberry PI et il est proche des langages de programmation comme le C mais avec sa propre syntaxe, ceci facilitera malgré tout son apprentissage et le 2eme avantage est que la librairie RPi.GPIO est déjà installée sur le Raspbery PI si ce dernier est à jour où si vous utilisez une version de la distribution Raspbian de 2016.

Pour vérifier et connaitre la version installée tapez la commande à l’invite de commande:

pi@raspberry - $ find /usr | grep -i gpio

Toutefois si vous souhaitez utiliser la dernière version, tapez au niveau de l’invite de commande la commande suivante pour installer la librairie :

pi@raspberry - $ sudo apt-get install raspi-gpio

 

La librairie RPi.GPIO

 

La librairie Python RPi.GPIO nécessite d’être en ROOT (super utilisateur) ou d’en posséder les droits (SUDO) pour utiliser le GPIO. Avec la nouvelle distribution « Jessie » de Raspbian le problème ne se pose plus puisqu’un simple utilisateur peut accéder au GPIO (PI par exemple) mais actuellement travaillant avec un Rasberry PI2 sur « Wheezy » (ancienne distribution) il me sera nécessaire de faire précéder les commandes Python par sudo.

Plusieurs possibilités existent, vous pouvez exécuter vos commandes Python soit:

  • En ligne de commande Python.
  • Avec un script Python.
  • A partir d’une page WEB en PHP qui appel un script Python.

Accès au GPIO par ligne de commande

Cette manière est surtout utilisée lorsque l’on est en cours de développement pour tester une partie des commandes ou pour l’apprentissage de façon à comprendre la réaction d’une commande particulière.

Interpréteur Python avec les droits du Super Utilisateur

Tapez la commande sur l’invite de commande :

pi@raspberry - $sudo python3

Apparait la version de Python et l’invite de commande Python représentée par 3 chevrons : >>>

Si vous souhaitez sortir de l’interpréteur de commandes Python tapez sur l’association des touches CTRL+D

Importer la librairie RPi.GPIO

Pour utiliser les commandes de la librairie RPi.GPIO il faut dans un premier temps importer la librairie avec la commande :

>>> Import RPi.GPIO as GPIO

Choix de la désignation des broches BCM (N° de broche du microcontrôleur) ou Connecteur GPIO :

GPIO.setmode(GPIO.BCM) ou GPIO.setmode(GPIO.BOARD)

Il est plus simple de choisir le connecteur, exemple pour le GPIO 0 le numéro broche du connecteur est 11

 

Commandes des broches d’entrée/sortie TOR (Tout ou Rien):

Les commandes suivantes permettent de gérer des entrées/sorties TOR (Tout Ou Rien).

Définir le sens d’une broche

Il est nécessaire avant d’utiliser une broche de définir le type d’utilisation c’est-à-dire soit une entrée soit une sortie avec la commande suivante :

Sortie : GPIO.setup(11, GPIO.OUT)
ou
Entrée : GPIO.setup(11, GPIO.IN)

 

Réinitialiser la configuration d’une broche ou de l’ensemble du GPIO

Il est conseillé de réinitialiser la configuration des broches ou de l’ensemble du GPIO à la fin d’un script pour finir proprement Pour réinitialiser une broche, il faut mettre entre les parenthèses le N° de la broche concernée.

GPIO.cleanup(11)

Pour réinitialiser l’ensemble du GPIO, il ne faut rien mettre en les parenthèses.

GPIO.cleanup()

Imposer un état logique sur une sortie

Une des commandes les plus utilisées est celle permettant de fixer un état logique Haut ou Bas sur une sortie de façon à commander un périphérique. La syntaxe générale de la commande imposant un niveau logique sur une sortie est :

Sortie à « 1 » : GPIO.output (11, GPIO.HIGH) ou GPIO.output (11, 1)

Sortie à « 0 » : GPIO.output (11, GPIO.LOW) ou GPIO.output (11, 0)

Lire l’état logique d’une entrée

Les systèmes doivent tenir compte de stimuli extérieurs, il est donc nécessaire de pouvoir lire les broches en entrée. La syntaxe générale permettant de lire l’état d’une broche qu’elle soit en entrée ou en sortie est :

GPIO.input (11) -> Variable = GPIO.input (11)

Python Shell

La fenêtre python Shell s’ouvre permettant de tester les lignes de commande une après l’autre et de vérifier le résultat mais il est possible de regrouper ces lignes dans un fichier. Dans le fichier fifi.py ajoutez la ligne suivante en entête pour qu’il puisse être interprété comme du python3 : #!/usr/bin/env python3

image_04_600px

Cliquez sur l’image pour l’agrandir

Vous allez tester vos lignes avec le Shell (fenêtre de droite) puis les copier dans fichier (fenêtre de gauche) si elles fonctionnent correctement.

Puis sauvegarder votre fichier :

image_05Donner les droits à votre fichier

pi@raspberry - $ sudo chmod 777 /home/pi/titi/fifi.py 

Droits 777 : correspond à rwxrwxrwx (soit tous les droits) :

La commande ls –l exécutée dans le répertoire où se situe le fichier permet de lister les fichiers et leurs droits.

image_06Testez votre programme ainsi si vous êtes dans son répertoire :

image_07Sinon il faut taper son chemin absolu : /home/pi/titi/fifi.py

Pour exécuter de n’importe où votre programme, on va le copier dans un répertoire particulier, pour connaitre l’ensemble des répertoires ou votre programme peut-être stocké et exécuté sans avoir à préciser son chemin taper :

image_08_600px

Cliquez sur l’image pour l’agrandir

Chaque chemin proposé est séparé par « : », on va choisir /usr/local/bin, on copie le fichier dans ce répertoire

image_09On peut simplifier l’écriture du fichier en supprimant son extension .py. Pour cela effectuez la commande suivante, ainsi le fichier devient exécutable sans extension :

image_10Taper le nom du fichier sous n’importe quel dossier :

image_11Exécution du script python au démarrage :

image_12Puis placer le nom du programme avec son chemin : /home/pi/titi/fifi.py & (entre fi et exit 0)

image_13Sauvegardez le fichier avec « Ctrl+o » puis valider en tapant sur « ENTREE » et fermez l’éditeur avec « Ctrl+x ».

Installation du SERVEUR apache voir ce lien

Accès au GPIO à partir d’un site WEB en PHP

Introduction

Vous allez découvrir comme gérer le GPIO et exécuter des commandes Pythons à partir d’une page WEB qui est écrite en langage PHP. Dans le PHP il existe des commandes permettant d’exécuter des programmes externes et de récupérer des données renvoyées par ces derniers.

image_01

Droits super utilisateur au Serveur APACHE

Cette bibliothèque ne peut être utilisée qu’en super utilisateur (root) ou avec la commande « sudo ».
Il faut paramétrer le Raspberry pi pour que le serveur apache2 (www-data) puisse exécuter des commandes système linux.
Ouvrir le fichier suivant :

pi@raspberry - $ sudo nano /etc/sudoers

Limiter les privilèges de www-data uniquement à certains fichiers, ici ecriture.py, lecture.py pour la suite de notre application.

image_14_600px

Cliquer pour agrandir

Les programmes en python pourront être exécuté à partir d’un site WEB avec les commandes PHP EXEC() et SYSTEM().
Du côté de Python il existe une librairie système permettant de gérer entre autre le passage d’arguments. Il faut donc l’importer au début du programme Python au niveau des autres librairies importées (RPi.GPIO et tempo).

Import sys

Ensuite il ne reste qu’à récupérer les arguments, ces derniers sont stockés dans une variable système argv de type tableau. Ce tableau contiendra une case de plus que le nombre d’arguments passés en PHP. En effet la 1ere case contient le nom du programme (ici le fichier Python) à qui sont passés les arguments.

Syntaxe

sys.argv[0] contient le nom du programme Python destinataire des arguments.
sys.argv[1] contient le 1er argument passé en PHP et ainsi de suite.

Droits des fichiers Python

Copier : sur /usr/local/bin les deux fichiers python « lecture.py » et « ecriture.py » puis donner les droits suivants

pi@raspberry - $ sudo chmod 777 /usr/local/bin/lecture.py
pi@raspberry - $ sudo chmod 777 /usr/local/bin/ecriture.py

Tester les deux fichiers avec la broche 11 en passant les arguments.

image_15Placer vos fichier web

Utiliser WinSCP en SSH

image_16
Copier sur /var/ www l’ensemble des fichiers (sans oublier les droits) du zip
Le langage client (exécuté sur votre machine) HTML5 et langage serveur PHP

Conclusion

Nous gérons les entrées sorties avec des scripts Python.

Remarque importante : pour des processus complexes, la méthode préconisée est la suivante :
Ecrire un programme Python indépendant (exécuté par exemple au démarrage du Raspberry Pi) qui gère le processus comme sur un microcontrôleur de façon autonome. Avec la méthode suivante nous allons procéder de la sorte.

GESTION DE MULTIPLES PROCESSUS:

Nous voulons pouvoir partager des données entre plusieurs programmes Python qui tournent au même moment car nous aurons un processus principal qui gère le GPIO et une application web qui va lancer grâce aux instructions PHP SYSTEM() et EXEC() des scripts Python, afin qu’il n’y ai qu’un unique programme qui effectue la gestion du GPIO, nous définirons une zone mémoire commune afin de transmettre des données entre différents processus. Nous ne sommes plus obligés de donner des droits au serveur Apache.

Méthodologie

Création d’un fichier texte (led.txt) qui sera lancé par les différents scripts Python et placé dans une zone mémoire RAM dont l’accès en écriture/lecture par ces différents scripts Python sera extrêmement rapide.

Copier ce fichier dans le répertoire: /usr/local/bin/led.txt (3 octets).

Lui donner les droits complets :

pi@raspberry - $ sudo chmod 777 /usr/local/bin/led.txt

On remplira au préalable ce fichier par un nombre de caractères qui définira la taille de la zone mémoire réservée :
Exemple : fichier led.txt

image_23La taille du fichier est de 3 octets.
On va donc réserver une zone mémoire de 3 octets, un tableau de 0 à 2 (tableau de 3 cases).
Attention chaque case à une valeur numérique entre 0 et 255 (1 octet)

Copier dans le répertoire /usr/local/bin les deux fichiers python « lececri.py » et « g_gpio.py » puis donner les droits

pi@raspberry - $ sudo chmod 777 /usr/local/bin/lececri.py
pi@raspberry - $ sudo chmod 777 /usr/local/bin/g_gpio.py

Mettre en tache de fond le script principal au démarrage ou lancer en local avec sudo g_gpio.py

image_17image_18Vous pouvez tester vos fichiers python : broche 11 ici j’ai choisi comme argument 0->broche 11, 1->broche 12,….
Je lance deux fenêtres et je mets en tâche de fond g_gpio.py puis je teste avec lececri.py

image_19_600px

Cliquez sur l’image pour agrandir

Explication sur les deux fichiers, ils partagent une zone mémoire identique si l’un modifie cette zone, le processus de l’autre fichier est modifié :

Ici dans le processus principal, j’effectue une boucle infinie et je teste la broche sélectionnée par lececri.py et lui renvoie l’état de cette sortie sélectionnée.

Mes deux fichiers sont correctement installés je peux mettre en route mon application web avec mes nouveau fichiers index.php et gpio.php

Taper la commande ps -aux | more dans une autre fenêtre console qui va lister tous les processus lancés sur le système (appuyer sur la touche entrée pour faire défiler la liste).

image_20

image_21_600px

Cliquez sur l’image pour agrandir

Nous pouvons observer dans la deuxième colonne le numéro représentatif du PID de chacun des processus. Pour arrêter le processus vous pouvez utiliser la commande kill. Ainsi la commande suivante demandera au processus 3294 de s’arrêter :

image_22

 

Conclusion

Vous pouvez gérer des processus complexes, des robots en wifi avec motion et pwm, i2c …
A titre personnel je gère un capteur i2c de température ds1621 en Python et un robot deux roues avec interface WEB sans aucune difficulté.

Deux versions sont disponibles sous forme d’archive, une version de base et une version utilisant mmap, une librairie qui va allouer une zone fixe de mémoire RAM à un fichier «mapage».

L’auteur

lycee_langevin_la_seyne_sur_merBruno enseigne au Lycée Langevin de La Seyne sur Mer. Il nous promet avec ses élèves la description d’un projet de fin d’année : un robot avec motion (c’est très cool) équipé d’un radar de recul ultra son, avec son interface de pilotage par appli web et python ! On attend ça avec impatience 🙂 . Bravo à tous les participants.

Merci Bruno pour cette description très détaillé et la mise à disposition des fichiers qui permettront à ceux qui sont intéressés de démarrer en douceur 🙂
framboise314

Sources

Share Button

7 réflexions au sujet de « Une interface web simple pour piloter des LED avec HTML5 et Python sur le Raspberry Pi »

  1. Ping : Une interface web simple pour piloter des LED avec HTML5 et Python sur le Raspberry Pi – Radioamateur France

  2. bruno83

    bonjour,
    Je viens d’installer jessie, l’installation ultra simple :
    J’ai mis l’ensemble de mes serveurs apache2,mysql,motion tous fonctionnent très bien
    http://www.billyinfo.be/showthread.php?64-Installation-serveur-web-sous-Debian-8-Jessie
    le tuto de framboise314 pour le paramétrage j’ai mis 30 minutes pour tous réinstaller
    Effectivement fini le sudo pour le GPIO
    Placer le site en var/www/html/
    Ne pas oublier de donner les droits au fichier python,javascript,php
    Autre chose en ssh fini le root sauf en faisant cette manip qui marche super
    http://blog.tfrichet.fr/debian-8-jessie-connexion-root-en-ssh-impossible/

    Répondre
  3. gean95

    bonjour,
    Merci pour ce tuto. Mais il faut savoir qu’il ne fonctionne pas avec internet Explorer 11,
    avec Chrome c’est OK.

    Répondre
    1. bruno83

      Bonjour,
      Je viens de tester sur windows 7
      Internet explorer 11.0.9600.18314 ça marche bien en principe quand on change de navigateur c’est le css qui peut poser problème là aucun souci, si non as-tu activé l’autorisation javascript (en principe par défaut) si non ça marche pas.
      A+bruno

      Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP *
Time limit is exhausted. Please reload CAPTCHA.