{{ :suivant.png?nolink&30|}} {{ :retour.png?nolink&30|}} [[pepper:accueilpepper|{{ :iconemaison.jpg?nolink&30|Sommaire Pepper}}]]
======Chorégraphe et Python - Domotique avec Pepper et Raspberry Pi======
En cours de rédaction
[Mise à jour le 10/1/2019]
{{ :pepper:peppermin.png?nolink|}}
**Niveau** : avancé
===Objectif===
Contrôler les entrées, sorties logiques d'un Raspberry Pi "à la voix".
===Vidéo===
Lien vers Youtube
===Source===
Pepper peut faire de la Domotique (Site PwavRobot)
> **Remarques préalables**
> Pour tenir compte du matériel disponible, l'état logique des sorties de la carte Raspberry Pi est simplement visualisé avec des LED. Le flux Chorégraphe de la source du projet a été adapté au matériel listé ci-dessous.
===== A. Préparation du Raspberry Pi=====
{{ :pepper:raspberrypi.png?nolink&250|}}
====Liste du matériel====
* Une carte Raspberry PI ou Raspberry PI ZERO
* Une alimentation 5V - 2,5A
* Une Card SD pour le système RASPBIAN
* 4 Led
* Raspberry Pi to Arduino Shield (optionnel)
* Sensor shield v2 Tinkerkit ou Module Grove Base Shield (optionnel)
Photo du montage à ajouter
====Les connexions====
L'utilisation d'un //Raspberry Pi to Arduino Shield// et d'un Sensor shield v2 Tinkerkit simplifie la mise en oeuvre puisqu'il suffit de supperposer les cartes comme sur la photo ci-dessus.
**Tinkerkit** -> **Arduino Shield** -> **Raspberry Pi**\\
O0 -> 11 -> GPIO10\\
O1 -> 10 -> GPIO8\\
O2 -> 9 -> GPIO22\\
O3 -> 6 -> GPIO4\\
O4 -> 5 -> GPIO25\\
O5 -> 3 -> GPIO23\\
====Installation de Raspbian sur la carte µSD ====
Suivre la démarche proposé sur le site Raspberrypi.org.
====Installation du serveur Python====
* **Créer** un fichier **server.py** avec l'éditeur **Geany** et le sauvegarger dans **homme/pi/**.
* **Copier** le code ci-dessous dans le fichier server.py
#!/usr/bin/python
# coding: utf-8
import socket
import threading
import RPi.GPIO as GPIO
from time import sleep
def clear():
print(' \n' * 80)
class ClientThread(threading.Thread):
def __init__(self, ip, port, clientsocket):
threading.Thread.__init__(self)
self.ip = ip
self.port = port
self.clientsocket = clientsocket
print("[+] Nouveau thread pour %s %s" % (self.ip, self.port, ))
def run(self):
print("Connection de %s %s" % (self.ip, self.port, ))
r = self.clientsocket.recv(2048)
print("Instruction recue: " + r + "...")
port, etat = r.split(",")
print("GPIO:"+port + " / Etat:"+etat+" ")
# Envoi du signal HIGH sur la pate #4 GPIO pour coller le relai
# Le GPIO est sur ON
if etat == 'HIGH':
print "Off"
GPIO.output(int(port), GPIO.HIGH)
sleep(1)
exit()
if etat == "LOW":
print "On"
GPIO.output(int(port), GPIO.LOW)
sleep(1)
exit()
print("Client déconnecté...")
tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpsock.bind(("", 1111))
clear()
print "(c)2016 - Dr CADIC - Serveur de pilotage des GPIO sur Pi ou PiZero avec le robot Pepper"
# Mise en mode adequat BCM et definition du numéro de port
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
# Définit la sortie GPIO à activer
GPIO.setup(4, GPIO.OUT)
GPIO.setup(25, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)
GPIO.setup(23, GPIO.OUT)
while True:
tcpsock.listen(10)
print("En ecoute...")
(clientsocket, (ip, port)) = tcpsock.accept()
newthread = ClientThread(ip, port, clientsocket)
newthread.start()
* **Ouvrir** une console et entrer : pi@Raspi2:~ $ **python relay_server.py**. La console doit afficher le message ci-dessous.
{{ :pepper:consoleserveur.png?nolink |}}
Le serveur se met en écoute des messages envoyés par Pepper.
=====B. Préparation de Pepper=====
====Le flux Chorégraphe====
{{ :pepper:domotique.png?nolink |}}
====La boîte "Communication"====
* **Paramétrage**
Pour que la communication s'établisse, il faut entrer l'adresse IP du Raspberry Pi (serveur) et le port sur lequel il écoute.
Exemple
{{ :pepper:parametrescom.png?nolink&400 |}}
* **Code**
{{ :pepper:communication.png?nolink|}}
La code contenu dans la boîte communication est listé ci-dessous.
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self)
def onLoad(self):
#put initialization code here
pass
def onUnload(self):
#put clean-up code here
pass
def onInput_onStart(self, p):
#self.onStopped() #activate the output of the box
# p est l'instruction à envoyer au serveur
import socket
# Recup des parametres de la boite
ip_address=self.getParameter("ip_adress")
port_number=self.getParameter("port_number")
# Connexion au serveur avec IP et port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip_address, port_number))
s.send(p)
r = s.recv(9999999)
self.onStopped()
pass
def onInput_onStop(self):
self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
self.onStopped() #activate the output of the box
==== Télécharger ====
Le code source de l'exemple **Domotique** est téléchargeable [[|A venir]].