Vue normale

Contôler GPIO avec MySQL

Par : Kiwil
23 novembre 2015 à 20:01
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 ...





Raspberry pi sur un drone

Par : Kiwil
26 juillet 2015 à 18:19
Bonjour,

Depuis quelques mois je me suis découvert une nouvelle passion pour les drones, je possède donc un petit drone de type 250 acheté en kit. Et avant d'investir dans un caméra et module fpv qui peu couter assez chère, je voulais faire quelques prise de vue. 

J'ai donc monté un Raspberry Pi A+ sur le drone, le choix de la version A+ était évidente puisque plus petite qu'une version normale. Avec bien sur une pi caméra, et un petit transformateur car la tension de la batterie du drone est de 11.1V.

Pour la programmation je n'ai pas fait un programme très complexe, puisque c'est un programme en Python avec la librairie pycamera qui démarre une capture vidéo lors du démarrage du système avec une simple tache cron. 

Le montage :





Le programme : 

Pour commencer on lit dans un fichier un numéro d'incrémentation puis on l'incrémente et on l'écrit dans le fichier, j'ai fait puisque on ne peut pas utiliser un simple nommage de fichier avec date/heure puisque au démarrage du système sans wifi la date et heure renvoyer sera toujours la même. On démarre ensuite la prise de la vidéo avec pour nom le numéro d'incrémentation récupér précédemment pour une durée indéfinie.

programme :

import picamera
import time
import RPi.GPIO as GPIO

# Definition de l'objet camera
camera = picamera.PiCamera()

# Lecture de l'incrementation fichier
ficR = open('/home/pi/Programme/Python/Video_Drone/Videos/INCR.txt','r+')
sINCR = ficR.read(3)
print sINCR
iINCR = int(sINCR)
ficR.close()

iINCR +=1

# Ecriture du fichier d'incrementation
ficW = open('/home/pi/Programme/Python/Video_Drone/Videos/INCR.txt','wb')
ficW.write(str(iINCR))
ficW.close()

camera.rotation = 180
camera.start_recording('/home/pi/Programme/Python/Video_Drone/Videos/Flight' + str(iINCR) + '.h264')

while (1):
        time.sleep(1)


La tache cron :
@reboot sudo python /home/pi/Programme/Python/Video_Drone/Video_Reboot.py

L’intérêt de cette tache est quelle ne s’exécute seulement au démarrage du RPI.

Une fois le vole terminé il faut simplement convertir la vidéo vers un format mp4 en installant  le packet suivant :
sudo apt-get install gpac

Et pour finir on lance la commande de conversion par exemple :
MP4Box -add ./Flight9.h264  ./Flight9.mp4


Première vidéo :

Pour le moment c'est la seule vidéo que j'ai peu prendre car il faut que je change un moteur ...

Arietta G25 - Librairie C++

Par : Kiwil
11 avril 2015 à 17:08
Bonjour,

Aujourd'hui je vous présente ma librairie pour utiliser les GPIO facilement dans votre programme C++. Car  jusqu'à présent la seul librairie était proposé par le créateur de l'arietta G25 et pour Python.


Présentation

La librairie est composée d'une classe nommé GPIO, et d'autre fonction hors classe. La classe principale comme sont nom l'indique permet de piloter les GPIO, pour le moment les fonctions principale sont testés et fonctionne correctement :

- pinMode(INPUT ou OUTPUT), permet d'affecter le sens de la broche.
- digitalWrite(HIGH ou LOW), permet d'écrire la valeur de sortie.
- digitalRead(), permet de lire la valeur de la broche en mode entrée.

Autre fonction hors classe :

- Delay(Milliseconde), fonction d'attente en milliseconde.
- readButton(), permet de lire l'état du bouton de l'Arietta G25.

D'autres fonctions sont à venir, l'utilisation des broches PWM, analogRead(), mode event pour les broches en entrée.

Utilisation

Le dépôt GitHub contient deux exemples, un simple Blink et un autre programme qui allume ou éteint en fonction de l'état du bouton.

Pour commencer deux façon d'initialiser un GPIO soit en passant directement une chaine avec le nom de la broche tel que définit par AcmeSystems (Ici), soit en passant un entier qui sera le Kernel Id de la broche (Disponible également le site).

Quelle intérêt dans par exemple pour GPIO led("A23") qui sera égale à GPIO led(23) me direz-vous ?
Tout simplement si l'ont regard pour la broche par exemple nommer C4 sont Kernel Id est égale à 68, donc à vous de choisir.

Blink :


#include "../Lib/libGPIO.h"
#include <stdio.h>
#include <stdlib.h>

int main()
{
    GPIO led("A23"); // "A23" ou kernel id = 23

    led.pinMode(OUTPUT);
    while(1)
    {
       Delay(250);
       led.digitalWrite(HIGH);
       Delay(250);
       led.digitalWrite(LOW);
    }

}

buttonRead() :


#include "../Lib/libGPIO.h"
#include <stdio.h>
#include <stdlib.h>

int main()
{
    GPIO led("A23"); // "A23" ou kernel id = 23

    led.pinMode(OUTPUT);
    while(1)
    { 
       led.digitalWrite(readButton());
    }

}


Compilation

Pour la compilation en attendant un makefile et une installation plus propre de la librairie dans votre systéme voici comment compiler, mais avant assurer vous que vous avez installé le compilateur c++.

Pour commencer télécharger la librairie :

git clone https://github.com/kkiwill/Arietta_G25_GPIO_Library.git

Ensuite on ce place dans le dossier Example pour compiler un des example :

cd ./Arietta_G25_GPIO_Library/Example

On compile ensuite le programme voulu avec :

g++ ./Blink.cpp ../Lib/libGPIO.cpp -o Blink -lrt

Si des personnes sont intéresser par le projet et souhaite y participer n’hésiter pas à me contacter.

❌