Introduction

Bienvenue dans ce deuxième Tuto du Lab’oo, le sujet d’aujourd’hui est l’utilisation des entrées/sorties du Raspberry Pi directement depuis XComponent grâce à un composant générique. Ce Tutoriel se base sur le résultat du premier Tuto : Tuto #1.

Matériel nécessaire :

  • Un Raspberry Pi (Ce tutoriel est réalisé sur la version 3)
  • Une alimentation 5V
  • La Carte Micro SD avec Raspbian + XComponent installé grâce au premier Tuto
  • Un câble réseau RJ45
  • Une plaque de test avec un bouton, une led, une résistance et quelques fils

Attention : Dans le cadre de ce tuto nous allons manipuler des éléments électroniques, afin de ne pas endommager votre Raspberry Pi, je vous conseille de vérifier attentivement vos circuits et de les modifier uniquement hors tension.

Les GPIO sur le Raspberry

Raspberry Pi 3 GPIO Header

Les GPIO ( General Purpose Input/Output) sur un Raspberry Pi sont un ensemble de pins qui permettent d’interagir avec le monde extérieur. Par exemple dans ce tuto, nous allons voir quelques-unes des fonctions les plus  basiques comme la commande d’une LED ou la réception d’une commande venant d’un bouton poussoir.

Le schéma sur la gauche permet de savoir ce qu’il est possible de commander ou de recevoir avec les différentes pins. Pour les avoir dans le bon sens par rapport au schéma, il faut tenir le Raspberry Pi avec les ports USB vers le bas. Les pins importantes à repérer pour ce tuto sont les pins 3,3V (#01 par exemple), Ground (#06 par exemple) et les GPIOxx, nous utiliserons les GPIO17 (#11) et GPIO18 (#12) pour aujourd’hui.

Le composant Raspberry Pi

Avant toute chose si vous n’avez jamais manipulé des composants XComponent ou que les descriptions suivantes ne sont pas claires, je vous conseille de lire le User Guide et les Use Cases sur le Github de XComponent : XComponent Resource Center.

Voici le composant XComponent que j’ai réalisé pour interagir avec les entrées/sorties du Raspberry Pi. J’ai indiqué en bleu les transitions que les autres composants vont pouvoir déclencher pour agir sur les entrées/sorties. Quand le Raspberry Pi est initialisé, il est en attente des demandes des autres composants qui utilisent la transition TryConnectGpio. Quand cette transition est déclenchée, le composant vérifie que l’I/O demandée n’est pas déjà utilisée puis si elle est disponible il créé un instance de la machine à états Gpio grâce aux transitions ConnectOutput ou ConnectInput.

Dans le cas d’une sortie, l’instance de Gpio est dans l’état Output et les composants peuvent faire varier la valeur de la sortie en déclenchant les transitons High et Low. Dans le cas d’une entrée l’instance de Gpio est dans l’état Input puis après la première vérification de la valeur de l’entrée passe à l’état High ou Low, ensuite une vérification est faite régulièrement et l’état change dès qu’un changement de la valeur est détecté. Il n’est pas possible d’agir sur une entrée, les autres composants pourront seulement être notifié des changement d’état de ce Gpio.

raspberry pi

Test des sorties

Nous allons donc commencer par tester les sorties avec le GPIO18, il faut donc brancher une LED avec une résistance entre la pin GPIO18 et une pin Ground. Voici le schéma de l’installation :

raspberry pi 3 model bv1.2

Pour tester votre circuit, vous pouvez utiliser ce script python qui doit normalement faire clignoter la LED en sortie si votre circuit est bon. Dans le cas ou votre circuit ne fonctionne pas et qu’il vous semble bon, rappelez-vous qu’une LED ne laisse passer le courant que dans un sens. Pour lancer le programme utilisez la commande : python testOutput.py 

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT, initial = GPIO.HIGH)

while True:
    GPIO.output(18, GPIO.LOW)
    time.sleep(0.5)
    GPIO.output(18, GPIO.HIGH)
    time.sleep(0.5)

GPIO.cleanup()

Maintenant vous pouvez utiliser le microservice Flasher qui doit aussi faire clignoter la LED : Flasher MicroService

Voici le composant Flasher qui est utilisé dans ce microservice (en plus du composant RaspberryPi), il commence par initialiser le Gpio 18 en envoyant un TryConnectGpio au composant Raspberry Pi, puis une fois que le Gpio est connecté, il va envoyer alternativement un changement de valeur High ou Low (Toujours grâce au composant RaspberryPi).

flasher

Pour que les deux composants puissent réellement communiquer, il faut les relier dans la composition, voici ce que cela donne pour le microservice Flasher :

flasher & raspberry pi

Pour le lancer une fois que vous l’aurez déposé sur le Raspberry Pi, il faut exécuter les commandes suivantes :

cd XCRuntime
sudo mono xcruntime.exe /home/pi/RaspberryPi-flasher.xcr

Vous devriez obtenir ce résultat :

test output

Impressionnant non ?

Test des entrées

Nous allons maintenant ajouter une entrée dans notre circuit qui nous permettra de contrôler la LED. Nous allons donc connecter le bouton entre la pin GPIO17 et une pin Ground. Voici le schéma de l’installation :

switchled

Pour tester votre circuit vous pouvez utiliser ce script python qui doit normalement afficher “Button Pressed” quand vous appuyez sur le bouton si votre circuit est bon. Pour lancer le programme utilisez la commande : python testInput.py 

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP)

while True:
    input_state = GPIO.input(17)
    if input_state == False:
        print('Button Pressed')
        time.sleep(0.2)

GPIO.cleanup()

Maintenant vous pouvez utiliser le microservice LedSwitch qui doit allumer la LED quand le bouton est enfoncé : LedSwitch MicroService

Voici le composant LedSwitch qui est utilisé dans ce microservice, il commence par initialiser les Gpio 17 et 18, puis dès que l’instance de Switch passe dans l’état SwitchPressed elle déclenche la transition du même nom sur l’instance de Led ce qui la fait passer en état LedOn et Tada la LED s’allume. Je ne vais pas expliquer l’extinction de la LED, ça fonctionne de la même façon mais dans l’autre sens 🙂

ledswitch

Voici la composition qui représente les liens entre les composants pour le microservice LedSwitch :

ledswitch raspberry pi

Pour le lancer une fois que vous l’aurez déposé sur le RaspberryPi, il faut exécuter les commandes suivantes :

cd XCRuntime
sudo mono xcruntime.exe /home/pi/RaspberryPi-ledSwitch.xcr

Si tout se passe normalement la LED devrait s’allumer lorsque vous appuyez sur le bouton et s’éteindre dès que vous le relâchez.

PullUp et PullDown

Par défaut une entrée du Raspberry Pi est laissé flottante mais il est possible de configurer des résistances de PullUp ou de PullDown afin de définir le comportement par défaut de cette entrée. Dans notre exemple précédent nous avons configuré une résistance de PullUp, cela signifie que (en interne dans le Raspberry) la pin était reliée au 3,3V grâce à une résistance. C’est pourquoi le bouton était de son coté relié à la masse (Ground). Dans un montage configuré avec une résistance de PullDown, une résistance aurait été reliée à la masse et dans ce cas notre bouton aurait dû être relié au 3,3V. Il est possible de configurer le résistance avec la composant RaspberryPi grâce à la transition TryConnectGPIO. Voici deux petits schémas pour expliquer le fonctionnement dans les deux cas (la partie en bleu représente le Raspberry Pi) :

Il n’y à pas de règle magique pour savoir quand choisir l’un ou l’autre, cela dépend des usages.

gpio_pulldowngpio_pullup

Conclusion

Comme dans le tutoriel précédent rien d’impressionnant ici mais les possibilités sont énormes. En couplant les microservice de XComponent avec les Gpio nous pourrons réaliser simplement des systèmes embarqués. Avant ça il nous manque quelques fonctionnalités des GPIO comme par exemple l’I2C ou le PWM, c’est pourquoi dans les prochains tutos nous allons améliorer le composant Raspberry Pi afin de lui ajouter toutes ces fonctionnalités 🙂 … cool non ?

Voici quelques liens et logiciels que j’ai utilisé pour réaliser ce tutoriel :

https://www.raspberrypi.org/documentation/usage/gpio/

https://projects.drogon.net/raspberry-pi/gpio-examples/tux-crossing/gpio-examples-1-a-single-led/

http://razzpisampler.oreilly.com/ch07.html

https://www.element14.com/community/docs/DOC-73950/l/raspberry-pi-3-model-b-gpio-40-pin-block-pinout#

https://github.com/raspberry-sharp/raspberry-sharp-io

http://fritzing.org/home/

@Bientôt pour un nouveau Tuto