{{ :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]].