Académie Nancy-Metz 2012-2013

ISN

Utilisation de Raspberry dans le cadre des mini-projets

Mr PECOUL Serge Table des matières I. Présentation du ...... 3 1. Raspberry Pi : côté matériel...... 3 2. Raspberry Pi : côté logiciel...... 4 3. Alternative à Raspberry Pi ...... 4 II. Codage binaire : Réseau de 8 L.E.D...... 5 1. Visualisation d'un nombre binaire à 8 bits à l'aide d'un réseau de LED...... 5 2. Comptage en binaire...... 5 3. Chenillard...... 6 4. Codage des caractères du clavier...... 7 III. Codage binaire: Afficheur 7 segments...... 8 1. Présentation d'un afficheur « 7 segments »...... 8 2. Etablissement de la table de décodage...... 8 3. Activité de programmation...... 9 IV. Tests et boucles :moteur pas-à-pas...... 10 V. Transmissions de données ...... 10 1. Communication avec un Capteur de température 1-Wire (DS18S20)...... 11 2. Communication i2C avec un module RTC (DS1307)...... 11 3. Communication USB entre Raspberry Pi et Arduino (connection série)...... 11 4. Communication entre Raspberry Pi et Arduino ...... 11 5. Emission FM:103.3MHz...... 12 VI. Transmissions de données et Wii...... 13 1. Communication I2C entre un Raspberry Pi et un Nunchuk...... 13 2. Communication Bluetooth avec une Wiimote...... 14 VII. Les capteurs analogiques...... 15 1. Mesure à l'aide de capteurs analogiques sur une entrée digital de Raspberry...... 15 2. CTN...... 15 3. Photorésistance...... 15 4. Réalisation matérielle...... 15 VIII. Modulation de largeur d'impulsions...... 16 1. PMW, Principe et mise en place...... 16 2. Gestion de la luminosité d'une L.E.D...... 16 3. La fonction PWM interne de Raspberry...... 16 4. Utilisation de la fonction PWM : luminosité d'une L.E.D...... 16 5. Utilisation pour la gestion de la vitesse de rotation d'un moteur...... 17 6. Utilisation d'un Nunchuk pour la gestion de la vitesse de rotation ...... 17 IX. Raspberry : serveur Web/hébergement...... 18 X. Raspberry: serveur domotique...... 19 1. Présentation...... 19 2. Contrôle d'un réseau de L.E.D...... 19 3. Gestion de l'afficheur 7 segments...... 19 4. Gestion de télécommandes connecté sur le GPIO...... 20 5. Gestion d'un Arduino connecté en USB à Raspberry...... 20 6. Gestion d'un Arduino via internet par Raspberry...... 21 7. Gestion de sonde I2C ...... 21 8. Un Arduino, seul, en serveur web...... 21 9. Gestion de l'ensemble...... 22 XI. D'autres applications pour Raspberry...... 23 1. D'autres périphériques à faible coût...... 23 2. Robotique...... 23 3. Box-TV...... 23 ANNEXE 1 : Installation de la distribution « Raspian modifiée »...... 24 ANNEXE 2 : Contrôler les entrées/sorties...... 24 1 ANNEXE 3 : Schémas et rôles des entrées/sorties...... 25 ANNEXE 4 : Communication I2C...... 26 ANNEXE 5 : Communication Bluetooth...... 27 ANNEXE 6 : Configurer les droits USB/1-wire/LCD...... 27 Références: ...... 29

2 I. Présentation du Raspberry Pi

1. Raspberry Pi : côté matériel Raspberry Pi est un mini-ordinateur à faible prix et à faible consommation électrique. Ce mini-ordinateur de la taille d'une carte de crédit, est équipé de connecteurs audio-video numériques (HDMI ) et analogiques (composite), permettant de le relier à un écran de télévision ou d’ordinateur. Raspberry pi possède, en plus deux connecteurs GPIO ( General Purpose Input Output ).Ces connecteurs correspondent à des entrées/sorties numériques. Ces entrées/sorties permettent à Raspberry pi d'avoir la possibilité de contrôler des composants électroniques ou d'acquérir des mesures de capteurs. Par exemple, Raspberry pi permet le contrôle de l'allumage de L.E.D, d'afficheurs à diodes, d'afficheurs LCD, ou de lire l’état d’un interrupteur, d’un capteur de température, d’un capteur de luminosité, etc... Ce connecteur GPIO dispose de différent types de connexion : • des broches utilisables en entrée ou sortie numérique (commandées en tout ou rien). • deux ports I2C (permettant de se connecter sur du matériel en utilisant uniquement 2 broches/pins de contrôle). • un port 1-wire (n'utilise qu'une broche/pin). • un port série (broches Rx et Tx) pour la communication avec les périphériques séries. • des broches pouvant être utilisées en PWM ("Pulse Width Modulation") permettant le contrôle, par exemple de moteurs ou de servo moteurs pwm. • une interface SPI pour les périphériques SPI (Serial Peripheral Interface) comme le convertisseur analogique/numérique MCP3008 ou le nRF24L01 (transmission sans fil à 2.4G ).

3 Sur le GPIO j'ai branché des connecteurs DB25 récupérés sur de très vieux ordinateurs, ce qui me permet de connecter du matériel qui était utilisé pour l'ancienne option de seconde IESP. L'ensemble est relié avec un câble « LPT modifié » :

2. Raspberry Pi : côté logiciel

De nombreux systèmes d'exploitation sont compatibles avec Raspberry Pi : Debian ( Raspbian), OpenELEC, Fedora, Firefox OS, ArchLinux, Gentoo, Slackware , RISC OS, NetBSD, Android. J'utilise une distribution Debian (Raspbian) avec quelques logiciels préinstallés : - Le kit de développement python: python-dev - Les "outils Raspberry Pi GPIO": RPi.GPIO-0.5.2a.tar.gz - Serveur LAMP (Linux Apache MySQL PHP) Apache: le serveur HTTP qui gère la communication avec le client. MySQL: le système de gestion de base de données. PHP: le langage de script utilisé pour générer les pages dynamiques. - … Mon fichier "SD_16juin2013.iso.zip" est accessible à l'adresse suivante:http://dl.free.fr/tpA1xkXQo L'image iso est directement utilisable et inclus toutes les modifications et installations nécessaires pour utiliser l'ensemble des programmes (le « password » des « users » « root » et « pi » est par défaut : « serge »). 3. Alternative à Raspberry Pi Une grande variété de « petits ordinateurs» sont apparus ces dernières années sur le marché : Raspberry Pi Cotton Candy Gooseberry Rascal Micro ODROID-X CuBox Via APC AllWinner MK802 Allwinner MK808 Ben Nanote Norhtec Gecko Surfboard Cappuccino PC Zipit Z2 Trimslice OLinuXino Certain sont construits autour de processeur plus puissant que l'ARM11 du Raspberry Pi. Mais les atouts de Raspberry Pi sont son coût, ses connecteurs d'entrées/sorties, l'utilisation de logiciel libre ainsi qu'une grande communauté de développement qui est apparue autour (plus d'un million d'exemplaire vendus ).

4 Les parties II , III et VI sont présentées sous l'approche d'activités proposables à des élèves. Dans les autres parties, je m'attache juste à montrer des utilisations réalisables, à très faible coût, avec Raspberry Pi. II. Codage binaire : Réseau de 8 L.E.D.

« Objectifs exploitables » : Savoirs Représentation binaire. Un ordinateur est une machine qui manipule des valeurs numériques représentées sous forme binaire. Numérisation : L'ordinateur manipule uniquement des valeurs numériques - Une étape de numérisation des objets du monde physique est donc indispensable. Algorithmes simples : ajouter deux entiers exprimés en binaire Fonctions : notion de fonction- portée des variables et passage d'arguments Capacités Manipuler à l'aide d'opérations élémentaires les trois unités de base : bit, octet, mot. Coder un nombre, un caractère au travers d'un code standard, un texte sous forme d'une liste de valeurs numériques. Comprendre un algorithme et expliquer ce qu'il fait. Modifier un algorithme existant pour obtenir un résultat différent. Concevoir un algorithme. Programmer un algorithme. Concevoir l'entête (ou l'interface) d'une fonction, puis la fonction elle-même.

1. Visualisation d'un nombre binaire à 8 bits à l'aide d'un réseau de LED Les L.E.D. ,avec leurs résistances de protections, sont connéctées aux GPIO (7,8,25,24,23,18,15,14). Copier le fichier « parallele.py» Créer le fichier « maFonction_version1.py » qui contiendra le programme suivant :

# -*- coding: utf-8 -*- from parallele import * parallele(255)

Changer l'argument de la fonction « parallele(255) » par un nombre entier compris entre 0 et 255, le nombre binaire correspondant s'affiche par allumage des L.E.D. 2. Comptage en binaire - Ecrire l'algorithme pour afficher successivement sur les L.E.D. les nombres binaires. (1 ; 10 ; 11 ; 100 ; 101 ...) - Faire une copie « maFonction_version2.py » de votre programme « maFonction_version1.py » Modifier votre programme « maFonction_version2.py » pour qu'il affiche successivement sur les L.E.D. les nombres binaires. (1 ; 10 ; 11 ; 100 ; 101 …)

5 Proposition de correction :« maFonction_version2.py »

# -*- coding: utf-8 -*- from parallele import * def maFonction(): for j in range(0,8): parallele(2**j) maFonction()

Proposition de correction avec interface graphique : Exécuter le programme « 8led_version1.py »

3. Chenillard - Principe : Les L.E.D. s'allument successivement pour visualiser les nombres binaires : 1 ; 10 ; 100 ; 1000 ; 10000 ; …;10000000 - Ecrire l'algorithme pour obtenir un chenillard sur les L.E.D. - Faire une copie « maFonction_version3.py » de votre programme « maFonction_version2.py » Modifier votre programme « maFonction_version3.py » pour obtenir un chenillard.

Proposition de correction :« maFonction_version3.py » # -*- coding: utf-8 -*- from parallele import * import time def maFonction(): while 1: for j in range(7,-1,-1): parallele(2**j) time.sleep(0.2) maFonction() 6 - Afin d'utiliser l'interface graphique, copier votre fonction : def maFonction(): parallele(255) Dans le fichier « 8led_version3.py» afin d'obtenir (le début du fichier obtenu est de la forme) : # -*- coding: utf-8 -*- from Tkinter import * import ImageTk import Pmw import os import commands import time def maFonction(): parallele(255) def parallele(ii):

-Vérifier le fonctionnement à l'aide du bouton « maFonction ».

Proposition de correction avec interface graphique : « 8led_version3.py»

4. Codage des caractères du clavier - Ecrire l'algorithme pour obtenir le code ASCII d'un caractère en binaire sur les L.E.D.

- Ecrire votre programme « maFonction_version4.py » pour obtenir cet affichage.

-Quel bit faut-il changer pour obtenir le code ASCII en binaire de la même lettre en majuscule ?

Proposition de correction avec interface graphique :« 8led_version4.py » Le caractère entré au clavier est représenté par les L.E.D. sous forme ASCII en binaire.

7 III. Codage binaire: Afficheur 7 segments

1. Présentation d'un afficheur « 7 segments » Un afficheur est constitué de 7 L.E.D. disposées selon le shéma ci-contre. Il permet l'affichage des chiffres de 0 à 9 et de certaines lettres. Chaques L.E.D. (ou segments) sont généralement désignés par les lettres A, B, C, D, E, F, G . Dans le cas où l'afficheur comporte un point, servant de séparateur décimal, celui-ci est désigné DP (de l'anglais decimal point) . 2. Etablissement de la table de décodage La table de décodage indique le nombre binaire à transmettre à l'ordinateur qui correspond au chiffre que l'on veut afficher. Les segments A, B, C, D, E, F, G et DP sont respectivement reliés aux GPIO (7,8,25,24,23,18,15,14)

L'affichage d'un chiffre correspond à un nombre binaire dont on peut calculer la valeur décimale associée. Utiliser le programme « 7_segments_version1.py » pour compléter la table suivante. Programmation Affichage Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Décimale Héxadecimal 0 0 0 1 1 1 1 1 1 63 0x3F 1 0 0 0 0 0 1 1 0 6 0x06 2 0 1 0 1 1 0 1 1 91 0x5B 3 0 1 0 0 1 1 1 1 79 0x4F 4 0 1 1 0 0 1 1 0 102 0x66 5 0 1 1 0 1 1 0 1 109 0x6D 6 0 1 1 1 1 1 0 1 125 0x7D 7 0 0 0 0 0 1 1 1 7 0x07 8 0 1 1 1 1 1 1 1 127 0x7F 9 0 1 1 0 1 1 1 1 103 0x6F A 0 1 1 1 0 1 1 1 0x77 B 0 1 1 1 1 1 0 0 0x7C C 0 0 1 1 1 0 0 1 0x39 D 0 1 0 1 1 1 1 0 0x5E E 0 1 1 1 1 0 0 1 0x79 F 0 1 1 1 0 0 0 1 0x71

8 3. Activité de programmation A l'aide de « l'import parallele » et de la fonction « parallele() », réaliser un programme permettant : – de tester les 7 segments de l'afficheur. – D'afficher un chiffre entré au clavier Réaliser un programme qui affiche successivement les lettre du mot « SOLEIL » avec effet de clignotement.

Proposition de correction avec interface graphique :« 7_segments_version2.py »

9 IV. Tests et boucles :moteur pas-à-pas

En utilisant la fonction parallele.py et un moteur pas à pas de nombreuses activités sont possibles autour de l'algorithmie, des boucles et des tests. Par exemple : - Ecrire un algorithme puis un programme qui commande la rotation du moteur pas à pas en mode pas entier avec arrêt du moteur lorsque l'on appuie sur la barre espace. - Modifier le programme en vue d'inverser le sens de rotation du moteur. - Modifier le programme pour un fonctionnement en mode demi-pas.

Vous trouverez mon programme avec interface graphique dans le fichier : « Moteur_pas_a_pas_version1.py »

L'interface graphique de ce programme peut servir de simulation et permettre de faire comprendre le principe de fonctionnement d’un moteur pas à pas. La version « Moteur_pas_a_pas_version2.py » utilise les bibliothèques RPI-GPIO qui permettent un contrôle plus rapide des entrées/sorties, mais le programme doit s'exécuter en « root ». V. Transmissions de données

Le GPIO d'un Raspberry permet d'utiliser des protocoles de communication du type : I2C, UART, 1-wire et SPi

Une grande variété de périphériques I2C , à faible coût, sont disponibles ( capteur digital de température, capteur digital de pression, capteur digital de champs magnétique, accéléromètre, caméra, écran LCD, module GPS, Arduino, Raspberry ... ).

10 1. Communication avec un Capteur de température 1-Wire (DS18S20) Après avoir activé le port 1-Wire, dans le dossier /sys/bus/w1/devices/ ce trouve l'ensemble des périphériques 1-Wire détecté (voir annexe 6).

Le capteur de température DS18B20 communique via un bus 1-Wire. Sa précision est de 0.5°C sur une plage allant de -55°C à +125°C. Il programmable en mode de 9bits (rapide) à 12 bits (lent). Vous trouverez un exemple de programme python permettant d'interroger les sondes de température du type DS18S20 dans le fichier: py/1_wire/ds18b20.py

Pour utiliser ce programme, il faudra renseigner le numéro unique de votre DS18S20.

2. Communication i2C avec un module RTC (DS1307) Le module DS1307 est une horloge temps réel (Real Time Clock) utilisant le protocole I2C.

Ce petit circuit fourni les heures, minutes et secondes, le jour, la date, le mois, l'année...

3. Communication USB entre Raspberry Pi et Arduino (connection série) Arduino est un micro-controleur. Son utilisation de pair avec un Raspberry permet de multiplier les entrées/sorties disponible (54 pour la version Arduino Méga dont 16 analogiques). De plus l'ensemble permet la gestion entrées/sorties en temps réel.

Mon programme Arduino pour le commandé via USB : « WWW-arduino/raspberry_usb_arduino99_ino_ino »

4. Communication Ethernet entre Raspberry Pi et Arduino Arduino est un micro-controleur qui peut être programmé en serveur Web et contrôlé en python : Mon programme pour Arduino utilisé en serveur web : «WWW-arduino/arduino_web_essai110 » Mes programmes python avec interface graphique pour communiquer avec Arduino : /py/arduino_over_internet/arduini_over_internet.py et /py/arduino_over_internet/arduini_over_internet_led.py

11 La version « arduini_over_internet.py » s'assure des états des entrées/sorties par retour de données. La couleur des boutons est lié à l' état effectif des entrées/sorties, après l'exécution de la requête http.

5. Emission FM:103.3MHz Le programme de Base pour la diffusion d'un fichier wav mono 22kHz (disponible sur internet): - brancher un fil droit d'environ 20cm sur la patte 7 du GPIO (GPIO4) - dans le dossier /py/Pifm/ exécuter la commande: sudo python PiFm.py - prendre son poste de radio - écouter sur 103.3MHz

Ma version adaptée pour diffuser au démarrage l'adresse IP de Raspberry sur 103.3MHz (Pour une utilisation de Raspbarry sans écran) : /py/IP_FM_22mai/iP_FM_ip.py

Ma version adaptée avec interface graphique (choix de fichier diffusé, de la langue pour la diffusion de l'adresse IP et de la fréquence d'émission) : /IP_FM_22mai/iP_FM_ip_all_IG.py

12 VI. Transmissions de données et Wii

1. Communication I2C entre un Raspberry Pi et un Nunchuk Un Nunchuk est conçu d'origine pour communiquer en I2C avec une Wiimote. Un Raspberry dispose d'une sortie I2C sur laquelle il est possible de brancher un Nunchuk. Un Nunchuk est identifié par l'adresse "0x52". Il fournit des données d'accélération sur trois axes, l'état de deux boutons numériques et la position (x,y) du joystick analogique. Le Nunchuk transmet ces informations sous forme d'une donnée de 6 octets : [X], [Y], [AX(8bits)], [AY(8bits)], [AZ(8bits)] , [AX(2bits), AY(2bits), AZ (2bits),BC,BZ] X et Y sont les positions du joystick analogique (0 → 256) , AX, AY, at AZ sont les donnée de l'accéléromètre sur 10 bits (0 → 1024) et BC et BZ donne l'état des deux boutons (0 = appuyé) .

Pour initialiser la communication avec le Nunchuk, Raspberry doit d'abord envoyer à l'adresse "0x52", deux octets "0xF0,0x55". Envoyer ensuite à l'adresse "0x52", un octet "0x00" chaque fois que l'on demande des données au Nunchuk. Les données du Nunchuk reviendront par paquet de 6 octets.

1.a. Relever les informations d'un Nunchuck La syntaxe de la commande d'initialisation est de la forme : smbus.SMBus(1).write_byte_data(0x52,0xF0,0x55) La syntaxe de la commande de lecture est de la forme : smbus.SMBus(1).write_byte_data(0x52,0x00) octet1=smbus.SMBus(1).read_byte(0x52) octet2=smbus.SMBus(1).read_byte(0x52) octet3=…. Ecrire l'algorithme puis un programme qui affiche les données triées obtenu d'un Nunchuk : X et Y : positions du joystick analogique (0 → 256) , AX, AY, at AZ : donnée de l'accéléromètre sur 10 bits (0 → 1024) et BC et BZ : état des deux boutons

1.b. Utiliser un Nunchuck en périphérique d'entrée Copier le fichier «/py/Nunchuk/nunchuk.py» Créer le fichier «maFonction_version1.py» qui contiendra le programme suivant : # -*- coding: utf-8 -*- from nunchuk import * def maFonction(): initialise() while True: print('Jx: Jy: Ax: Ay: Az: bC: bZ: ') print(readNunchuk()) maFonction() Déplacer ou agiter le joystick, appuyer sur les boutons et observer le retour de la fonction « readNunchuk()».

13 1.c. Utiliser un Nunchuck pour déplacer un «objet» dans une fenêtre Tkinter - Utiliser les informations d'un Nunchuck pour déplacer un «objet» dans une fenêtre Tkinter. Vous trouverez mon programme dans le fichier : «/py/Nunchuk/maFonction_version2.py».

1.d. Utiliser un Nunchuck pour contrôler la vitesse de rotation d'un moteur pwm Vous trouverez mon programme dans le fichier : «/py/PWM/PWM_8led_nunchuk.py».

1.e. « Classic Controlleur »:un autre périphérique I2C Vous trouverez un exemple dans le fichier «/py/Nunchuk/maFonction_Classic.py».

2. Communication Bluetooth avec une Wiimote

2.a. Présentation d'une «Wiimote » Wiimote est le nom commercial de la manette de jeu de la console de salon WII de Nintendo. Une wiimote inclue de nombreuses fonctions :

- Un module bluetooth BroadCom BCM2042 pour communiquer avec Raspberry Pi. - 11 boutons pour envoyer des ordres. - 4 L.E.D. contrôlable par l'ordinateur. - A l'avant une caméra infra-rouge qui détecte la position de 4 sources infra-rouge . - Un accéléromètre « ADXL 330 », 3 axes de type capacitif qui capte les accélérations sur 3 axes. - Un vibreur - Un haut-parleur primitif.

2.b. Utilisation d'une «Wiimote » sous Raspbian. Activer une version Bluetooth «non-recommended» : sudo apt-get install --no-install-recommends bluetooth Installer la librairie Cwiid : sudo apt-get install python-cwiid Vous trouverez mon programme dans le fichier : «/py/wiimote/wiimote_serge_version99_acc.py».

14 VII. Les capteurs analogiques

1. Mesure à l'aide de capteurs analogiques sur une entrée digital de Raspberry -Raspberry ne possède pas d'entrée analogique.

Le schéma suivant permet de mesurer la résistance d'une CTN ou d'une LDR. Le principe consiste à mesurer un temps de charge d'un circuit RC.

2. CTN Lecture d'une température : Vous trouverez mon programme dans le fichier : «/py/CTN/CTN_7_segments_version2.py»

3. Photorésistance Lecture d'une « luminosité »:Vous trouverez mon programme dans le fichier : «/py/CTN/photoresistance_7_segments_version2.py»

4. Réalisation matérielle Le circuit RC est inclus dans une fiche DB25

15 VIII. Modulation de largeur d'impulsions

1. PMW, Principe et mise en place La gestion par « modulation de largeur d'impulsions » ( PWM : Pulse Width Modulation) consiste à générer un signal à rapport cyclique variable du type :

2. Gestion de la luminosité d'une L.E.D. En allumant et éteignant rapidement la L.E.D. , il est possible de donner l'impression visuelle d'une luminosité intermédiaire.

Vous trouverez mon programme dans le fichier :« /PWM/PWM_8led_version0.py » 3. La fonction PWM interne de Raspberry Raspberry possède une sortie PWM qui permet de générer un signal carré à rapports cyclique réglable. La valeur moyenne de ce signal permet d'obtenir des tensions comprises entre 0V et 3,3V par pas de (3,3/1024)V Cette sortie PWM est accessible sur le GPIO18 (Pin 7) . D'autres sorties PWM sont utilisées par le connecteur audio (jack 3.5mm).

Les commandes qui permettent de gérer cette fonction PWM sont du type : Pour déclarer le pin GPIO18 en sortie PWM : gpio -g mode 18 pwm Ensuite pour écrire sur le pin GPIO18 (entier compris entre 1 et 1023): gpio -g pwm 18 500 4. Utilisation de la fonction PWM : luminosité d'une L.E.D. Objectif :Régler la luminosité d'une L.E.D. , associée à une résistance sur le GPIO18 Vous trouverez mon programme dans le fichier :« /PWM/PWM_8led_version2.py »

16 5. Utilisation pour la gestion de la vitesse de rotation d'un moteur Objectif :Régler la vitesse de rotation d'un moteur PWM. Vous trouverez mon programme dans le fichier :«/PWM/PWM_ventilateur_version1.py »

6. Utilisation d'un Nunchuk pour la gestion de la vitesse de rotation Objectif :Commander la vitesse de rotation d'un moteur PWM à l'aide d'un Nunchuck. Vous trouverez mon programme dans le fichier :«/PWM/PWM_8led_nunchuk.py »

17 IX. Raspberry : serveur Web/hébergement Raspberry consomme peu d'énergie, ce qui permet de l'utiliser comme serveur web économe, jusqu'à une trentaine de connexions simultanées. L'installation des programmes Apache (LAMP), ftppro et gftppro permet d'obtenir une solution simple « d'hébergement portable » utilisable au lycée.

Afin de rendre la solution minimaliste, l'affichage de l'adresse IP est assurée par un écran LCD. Raspberry est alors utilisable, une fois les comptes FTP crées, sans écran, sans clavier, sans souris...

Le programme point de départ : py/LCD/lcd.py Le programme modifié pour afficher l'adresse IP : py/LCD/lcdserge.py Ajouter la ligne : « sudo python /home/pi/lcdserge.py » au fichier « arduino_ttyACM0 » (voir annexe 6 pour les droits).

18 X. Raspberry: serveur domotique

1. Présentation Les entrées/sorties de ce mini-ordinateur sont exploitables en language HTML et PHP via un serveur web (apache2). La commande « system() » permet d'exécuter à distance sur Raspberry des commandes habituellement exécutées dans le terminal. Ce qui permet d'agir sur le GPIO : system("gpio -g write 4 on"); La commande « exec() » permet de lire l'état d'une entrée sur le GPIO : function lireEntree(){ exec("gpio -g read 4",$commands,$return); return (trim($commands[0])=="1"?'on':'off');

Le dossier /MesProgrammes/www contient l'ensemble de mes programmes web présentés dans la suite.

2. Contrôle d'un réseau de L.E.D. Depuis un autre poste la requête : http://IPRASBERRY/8leds/ permet d'accéder au GPIO avec l'interface graphique « 8 L.E.D. ». Depuis Raspberry la requête est : http://127.0.0.1/8leds/

Sous Firefox Sous Firefox OS simulator Vous trouverez les fichiers de la page web permettant de contrôler 16 L.E.D., branchées en série avec une résistance de protection, sur les GPIO (7,8,25,24,23,18,15,14,11,9,10,22,27,17,30 et 31) dans le dossier : /MesProgrammes/www/8leds

3. Gestion de l'afficheur 7 segments Depuis un autre poste la requête : http://IPRASBERRY/7segments permet d'accéder au GPIO avec l'interface graphique « 8 L.E.D. ». Depuis Raspberry la requête est : http://127.0.0.1/ 7segments

Sous Firefox Sous Firefox OS simulator 19 Vous trouverez les fichiers de la page web permettant de contrôler 2 afficheurs « 7 segments », branchées en série avec une résistance de protection, sur les GPIO (7,8,25,24,23,18,15,14) pour le premier et (11,9,10,22,27,17,30,31) pour le second dans le dossier : /MesProgrammes/www/7segments

4. Gestion de télécommandes connecté sur le GPIO Télécommande Somfy et Extel interfacer par Ethernet :

Sous Firefox Sous Firefox OS simulator Vous trouverez les fichiers de la page web permettant de contrôler 2 télécommandes, branchées sur les « pins » (7,11,12,13) pour la télécommande de marque « Somfy » et (15,16,18,22) pour la télécommande de marque« Extel » dans le dossier : /MesProgrammes/www/somfy

5. Gestion d'un Arduino connecté en USB à Raspberry Arduino branché sur un port USB de Raspberry:

Sous Firefox Sous Firefox OS simulator

Mon programme pour Arduino commandé via USB : « WWW-arduino/raspberry_usb_arduino99_ino_ino » Vous trouverez les fichiers de la page web permettant de contrôler un micro-contrôleur Arduino, branchées sur un port dans le dossier : /MesProgrammes/www/arduinoUSB

20 6. Gestion d'un Arduino via internet par Raspberry L'ajout du module Ethernet W5100 permet d'accéder à internet et d'utiliser Arduino en serveur http. Le programme Arduino affiche l'adresse IP au démarrage. Le programme Arduino génère la page en html en prenant en compte l'état des entrées/sorties du micro- controleur. Les requêtes du type : http://IPArduino/?ad255 permettent de commuter les sorties du micro-contrôleur. Les requêtes du type : http://IPArduino/?o0255 permettent de changer le type d'action à venir.

Mon programme pour Arduino utilisé en serveur web : «WWW-arduino/arduino_web_essai110 » Vous trouverez les fichiers de la page web permettant de contrôler le micro-contrôleur Arduino dans le dossier : /MesProgrammes/www/arduinoIP

7. Gestion de sonde I2C Sondes de températures I2C interfacer par Ethernet :

Le protocole 1-wire doit être activé à chaque démarrage (voir annexe 6).

8. Un Arduino, seul, en serveur web Mon programme Arduino permet le fonctionnement autonome (pour la gestion de la page web) d'une carte Arduino-méga , 55 entrées/sorties sont disponibles. L'écran LCD (16x2) permet d'afficher l'adresse IP ou des messages personnels via le web.

Dans le programme pour Arduino utilisé en serveur web (WWW-arduino/arduino_web_essai110) mettre la variable « small » à 0. 21 9. Gestion de l'ensemble

Le dossier /MesProgrammes/www/ contient les fichiers de la page web de synthèse : /MesProgrammes/www/index.php

Prototype permettant de gérer 16 LED , 2 afficheurs 7 segments, des sondes 1-wire et des périphériques I2C :

22 XI. D'autres applications pour Raspberry

1. D'autres périphériques à faible coût – Emetteurs/récepteurs Modules RTC en I2C Sondes « Hall » à 433MHz : DS1307 : US5881LUA :

– Sondes de pression Convertisseur Transmission sans fil à 2.4G BMP085 : MCP3008 : nRF24L01 :

– Aduino mini pro Capteur d'humidité DHT22

2. Robotique Raspberry consomme peu d'énergie, ce qui permet de l'utiliser alimenter avec un accumulateur et un « Dongle Wifi » Pour l'exemple, le logiciel « Scratch » est installé par défaut et il est possible d'installer le logiciel open source Aseba ( programmation de robot ).

3. Box-TV Une version de la distribution OpenElec, spécialement développée pour Raspberry, permet d'utiliser Raspberry comme box-TV directement gérée par la télécommande du téléviseur HDMI.

23 ANNEXE 1 : Installation de la distribution « Raspian modifiée »

La carte SD : Sauvegarder la carte SD ( bit à bit /disque entier): sudo dd if=/dev/LeNomDeMaCarteSD of=/home/MonNomUtilisateur/maSauvegarde.iso

Sauvegarder la carte SD (bit à bit et partitions séparées pour modification): sudo dd if=/dev/ LeNomDeMaCarteSD of=/home/MonNomUtilisateur/maSauvegardep0.iso sudo dd if=/dev/ LeNomDeMaCarteSD of=/home/MonNomUtilisateur/maSauvegardep1.iso

Restauration: sudo dd if=/home/MonNomUtilisateur/maSauvegarde.iso of=/dev/ LeNomDeMaCarteSD ibs=4b obs=1b conv=notrunc,noerror

Une version dans laquelle I2C est activé ainsi que quelques programmes préinstallés : python-dev python3-dev Winrinpi2 RPi.GPIO-0.5.2a python-rpi.gpio python3-rpi.gpio python-pip python-smbus LAMP SSH Geany python pmw i2c-tools …

ANNEXE 2 : Contrôler les entrées/sorties

1. Contrôler les entrées/sorties de Raspberry Afin de contrôler les entrées/sorties de Raspberry, l'installation du paquet « python-rpi.gpio » ou « WiringPi » peut être nécessaire.

Les entrées/sorties seront alors contrôlables par des instructions du type : import RPi.GPIO RPi.GPIO.setmode(GPIO.BCM) RPi.GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)

2. Installation de « python-rpi.gpio » Pour cette installation ,télécharger « RPi.GPIO-0.5.2a.tar.gz » à l'adresse : http://code.google.com/p/raspberry-gpio-python/ Puis exécuter les instructions suivantes dans le terminal : sudo apt-get update sudo apt-get dist-upgrade sudo apt-get install python-rpi.gpio python3-rpi.gpio

Pour compiler votre propre version, il faut au préalable installer les source du kit de développement de 24 Python (« sudo apt-get install python-dev python3-dev »). Ensuite décompresser « RPi.GPIO-0.5.2a.tar.gz » , dans le terminal ce placer dans le dossier « RPi.GPIO-0.5.2a », et enfin exécuter : « sudo python setup.py install » ou « sudo python3 setup.py instal »

3. Installation de « WiringPi » Le projet « WiringPi » est une librairie qui contient un programme qui permet d'accéder facilement aux entrées/sorties de Raspberry. Pour Installer « WiringPi » : sudo apt-get install git-core git clone git://git.drogon.net/wiringPi ./build cd wiringPi git pull origin ./build

ANNEXE 3 : Schémas et rôles des entrées/sorties

Schémas et rôles des entrées/sorties du « GPIO »

GPIO P5 (rev.1) GPIO P5 (rev.2) GPIO P2

GPIO pin wiringPi pin function 17 0 in/out 18 1 in/out (Rev1) 21 / (Rev2) 27 2 in/out/PWM 22 3 in/out 23 4 in/out 24 5 in/out 25 6 in/out (Rev1)0/(Rev2) 2 8 in/out/((Rev1)SDA0/(Rev2)SDA1)(I²C) (Rev1)1/(Rev2) 3 9 in/out/((Rev1)SCL0/(Rev2)SCL1)(I²C) 8 10 in/out/CE0 (SPI Chipselect) 7 11 in/out/CE1 (SPI Chipselect) 10 12 in/out/MOSI (SPI) 9 13 in/out/MISO (SPI) 11 14 in/out/SCLK (SPI) 14 15 in/out/TxD 15 16 in/out/RxD

25 ANNEXE 4 : Communication I2C Un Nunchuk est conçu d'origine pour communiquer en I2C avec une Wiimote. Un Raspberry dispose d'une sortie I2C sur laquelle il est possible de brancher un Nunchuk. I2C sur un Nunchuk Quatre des six fils du Nunchuk sont à connecter au GPIO du Raspberry (la couleur des fils n'est pas une information fiable) : Nunchuk Raspberry fil blanc = Masse Pin 6 = Masse fil rouge = + 3.3I2C sur un NunchukV Pin 1 = + 3.3V fil vert = SDA Pin 3 = SDA fil jaune = SCL Pin 5 = SCL Le nunchuck utilise « fast I2C », à la vitesse par défaut de 38400 bauds Le Nunchuk est identifié par l'adresse "0x52". Il fournit des données d'accélération sur trois axes, l'état de deux boutons numériques et la position (x,y) du joystick analogique. Le Nunchuk transmet ces informations sous forme d'une donnée de 6 octets : [X], [Y], [AX(8bits)], [AY(8bits)], [AZ(8bits)] ,[AX(2bits), AY(2bits), AZ (2bits),BC,BZ] X et Y sont les positions du joystick analogique (0 → 256) , AX, AY, at AZ sont les donnée de l'accéléromètre sur 10 bits (0 → 1024) et BC et BZ donne l'état des deux boutons (0 = appuyé) . Pour initialiser la communication avec le Nunchuk, Raspberry doit d'abord envoyer à l'adresse "0x52" deux octets "0xF0,0x55". Envoyez ensuite à l'adresse "0x52" un octet "0x00" chaque fois que vous demandez des données au Nunchuk. Les données du Nunchuk reviendront par paquet de 6 octets. Activer I2C sur un Raspberry Par défault I2C est désactivé.Pour l'activer il faut : - modifier le fichier /etc/modprobe.d/raspi-blacklist.conf en commentant les lignes : #blacklist spi-bcm2708 #blacklist i2c-bcm2708 - ajouter les modules I2C et au noyau en ajoutant au fichier /etc/modules la ligne i2c-bcm2708 i2c-dev - installer 5 paquets : sudo modprobe i2c_dev sudo modprobe i2c-bcm2708 sudo apt-get install i2c-tools sudo apt-get install python-pip sudo apt-get install python-smbus - ajouter l'utilisateur Pi au groupe I2C sudo adduser pi i2c. - redémarrer sudo reboot Pour tester l'installation en ligne de commande exécuter : i2cdetect -y 1 (ou i2cdetect -y 0 si vous utilisez le port I2C 0 sur les pin 28 et 29) Le retour de la commande donne ; 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: ------10: ------20: ------30: ------40: ------50: -- -- 52 ------60: ------70: ------– 26 ANNEXE 5 : Communication Bluetooth Une Wiimote est conçu d'origine pour communiquer en bluetooth avec une console de jeu Wii. Un Raspberry dispose de port USB sur laquelle nous pouvons brancher un adaptateur bluetooth.

Configurer bluetooth sur un Raspberry Installer une librairies Bluetooth «non-recommended» : sudo apt-get install --no-install-recommends bluetooth

Remarques : des librairies python adaptées pour la Wiimote existent comme par exemple Cwiid, utilisée dans «/py/wiimote/wiimote_serge_version99_acc.py». Pour l'installer : sudo apt-get install python-cwiid

Bluetooth et Wiimote

Pour communiquer en python avec les péripheriques bluetooth, il est necessaire d'utiliser une librairie: import bluetooth

Les adresses des péripheriques actifs s'obtiennent par l'instruction : listePeripheriquesBluetooth=bluetooth.discover_devices(lookup_names=True)

Les wiimotes sont déclarées sous le nom : "Nintendo RVL-CNT-01"

ANNEXE 6 : Configurer les droits USB/1-wire/LCD Afin d'obtenir l'adresse ip de Raspberry « sans écran »

Configurer au démarrage les droits USB et paramètres de communication http://www.commentcamarche.net/faq/6858-demarrer-un-programme-en-tant-que-service-demon

Créer le fichier : /etc/init.d/arduino_ttyACM0

Définir les droits : sudo chmod 0755 /etc/init.d/arduino_ttyACM0 On teste notre script : sudo /etc/init.d/arduino_ttyACM0 start

Maintenant on ajoute le service au démarrage de l'ordinateur : sudo update-rc.d arduino_ttyACM0 defaults 99 Pour le retirer : sudo update-rc.d -f arduino_ttyACM0 remove

qui contient : #! /bin/sh # ### BEGIN INIT INFO # Provides: arduino_ttyACM0 # Required-Start: apache2

27 # Required-Stop: $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # X-Interactive: true # Short-Description: serge # Description: serge ### END INIT INFO # # # Ecrire sur ecran LCD sudo python /home/pi/LCDserge.py # # autorisation de lecture/écriture sur le port USB sudo chmod 777 /dev/ttyACM0 #sudo chmod 777 /dev/ttyACM0 #stty -F /dev/ttyACM0 115200 #stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts stty -F /dev/ttyACM0 cs8 115200 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts

#met arduino en position reception message echo " /?o9255" > /dev/ttyACM0 # récuperer l' adrese IP #action = "ip addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1" #ipv6 #ip addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1 #ipv4 echo " /?IP"$(/sbin/ifconfig eth0 | sed -n "2p" | cut -d: -f2 | cut -d " " -f1)" " > /dev/ttyACM0 # pour reseau WIFI #echo "/?o9IP"$(/sbin/ifconfig wlan0 | sed -n "2p" | cut -d: -f2 | cut -d " " -f1) > /dev/ttyACM0

#met arduino en position gestion entrée sorties echo " /?o0255" > /dev/ttyACM0 echo " /?ad255" > /dev/ttyACM0 echo " /?ad255" > /dev/ttyACM0

#activer 1-wire pour DS18b20 (sondes de temperature) sudo modprobe w1-gpio sudo modprobe w1-therm

Pour rendre fixe l'appellation d'un périphérique USB Créer un fichier (changer le ID_VENDOR et le ID_SERIAL) : /etc/udev/rules.d/usb.rules qui contient (Arduino mega 2560 r3): SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ENV{ID_VENDOR}=="FTDI", ENV{ID_SERIAL}=="FTDI_FT232R_USB_UART_A600eaMD", SYMLINK+="ttyACM0" qui contient (Arduino mega 1280): SUBSYSTEM=="tty", SUBSYSTEMS=="usb", ENV{ID_VENDOR}=="Arduino (www.arduino.cc)", ENV{ID_SERIAL}=="74133353537351505051", SYMLINK+="ttyACM0"

28 Références: http://doc.ubuntu-fr.org http://fr.wikipedia.org/ http://www.ac-nancy-metz.fr/ http://www.hobbytronics.co.uk/raspberry-pi-raspbian-distro https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/ http://www.raspberrypi-spy.co.uk https://sites.google.com/site/semilleroadt/raspberry-pi-tutorials/gpio https://www.modmypi.com/blog/raspberry-pi-gpio-en-francais http://wiibrew.org/wiki/Nunchuck#Nunchuk http://wiibrew.org/wiki/Wiimote/Extension_Controllers http://www.wiili.org/index.php/Wiimote/Extension_Controllers/Nunchuk http://www.instructables.com/id/Raspberry-Pi-I2C-Python/step4/Install-Necessary-Packages/ http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=28231 http://conoroneill.net/using-a-wii-nunchuck-instead-of-cheese-to-control-i-racer-rc-car-on-raspberry_pi- and-arduino/ http://www-igm.univ-mlv.fr/~dr/XPOSE2009/la_wiimote/presentation.html http://talk.maemo.org/showthread.php?t=60178 http://blog.idleman.fr http://www.raspberrypi-spy.co.uk

Sources images : http://skincarebylouisa.com/skin-treatment/dpl-therapy-system/why-infrared-light-emitting-diodes-can- help-your-skin/ http://fr.wikipedia.org/wiki/Afficheur_7_segments http://www.gifsmaniac.com http://www.seeedstudio.com/depot/bmz_cache/2/237d12b6debf7f2c28707f69bf0250d3.image.300x225.jpg http://www.raspberrypi-spy.co.uk/2012/09/raspberry-pi-p5-header/raspberry-pi-gpio-layout-revision-2/

Sources css: https://github.com/h5bp/html5-boilerplate/blob/master/doc/TOC.md

Sources javascript: https://jquery.org

29