0
Bonjour,

Aujourd'hui je vous propose un petit article sur l'utilisation facile des GPIO via MySQL, facile car une fois la base de donnée et le programme Python en marche il ne reste plus qu'à faire des petites requête SQL pour piloter ces GPIO. L’intérêt est qu'elle permet ensuite via n'importe quelle langage externe de faire ces requêtes sur votre Raspberry Pi pour contrôler les GPIO.

Le principe est simple un table avec trois colonnes suffisent, une pour le numéro de GPIO, une autre pour le mode IN/OUT, et la dernière pour l'état. L'autre avantage d'un système comme celui-ci c'est la possibilité d'adapter le système à n'importe quel plateforme (Arietta G25, BeagleBone, Raspberry Pi ...).

Le seule inconvénient dans ce type de  système c'est peu être le temps de réponse selon le langage et surtout le type de base de données, ici j'utilise du Python avec du MySQL mais du C avec du SQLite aurait surement été plus rapide. Mais personnellement ce type de système peut être utilisé pour par exemple des site web, ou le temps de réponse des GPIO n'est pas forcement la priorité.






Besoins

Pour l'utilisation de ce projet il nous faut tout d'abord deux choses, Python pour le programme et MySQL pour la base de données, je vous laisse ci cela n'est pas encore fait vous tourner vers votre moteur de recherche pour installer tout sa.

Il va nous falloir ensuite pour Python quelques librairie pour notamment ce connecter à la base de données MySQL. Pour ce faire il faut installer le paquet suivant :


sudo apt-get install python-mysqldb
 
Pour la partie MySQL, il faut créer dans un premier temps une base de donnée ci cela n'est déjà fait, avec la commande CREATE DATABASE GPIO dans MySQL. Nous créerons ensuite dans la suite la table.



Structure MySQL



Ci-dessous la structure de la table utilisé pour mon système :
CREATE TABLE IF NOT EXISTS `gpio` (
  `id_gpio` int(2) NOT NULL,
  `state` int(2) NOT NULL,
  `mode` int(2) NOT NULL,
  PRIMARY KEY (`id_gpio`)
)


Programme Python
 
Le programme est une boucle permanente sur tous les éléments de la table selon le mode, si ce mode est a 1 c'est à dire en entrée alors une lecture du GPIO est faite puis mis à jour dans la table, si ce mode est  à 0 alors l'écriture est fait dans l'état souhaiter si cette état à changé.


#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Import des modules
import RPi.GPIO as GPIO
import time
import MySQLdb

# Initialisation de la numerotation et des E/S
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

db   = MySQLdb.connect("localhost", "root", "raspberry", "GPIO_CONTROLE")
curs = db.cursor()

def Update_State_GPIO(iGPIO, iState):
   curs.execute("""UPDATE gpio SET state=%s WHERE id_gpio=%s""",(iState,iGPIO))

while True:
   time.sleep(0.15)
   # Pour toutes les GPIO de la base
   curs.execute("SELECT * FROM gpio")
   rows = curs.fetchall()
   for row in rows:
      if (row[3]==1):
         GPIO.setup(int(row[0]), GPIO.OUT)
         if (GPIO.input(row[0])!=int(row[2])):
            GPIO.output(int(row[0]), int(row[2]))

      else:
         GPIO.setup(int(row[0]), GPIO.IN)
         Update_State_GPIO(int(row[0]), GPIO.input(int(row[0])))
   db.commit()


Conclusion


Ci vous chercher un moyen simple de d’interagir avec les GPIO depuis n'importe quelle langage sans rechercher la rapidité de la microseconde de réponse, ce type de système est fait pour vous :D. Après, on peut imaginer des fonctions beaucoup plus complexe dans notre code Python, ainsi qu'une base de données plus structuré pour faire des lectures de température par exemple en paramétrant par exemple un mode 3 sur les GPIO, ou une table I2C en paramétrant les adresses dans celle-ci etc ...





Enregistrer un commentaire

 
Top