Travaux Pratiques
Prog. Systèmes embarqués
Enseignant: M. Nejmeddine Bahri
Sommaire
TP1: Programmation et compilation des programmes C et python
sous Linux
TP2: Gestion des entrées/sorties numériques de Raspberry
TP3: Gestion des entrées/sorties analogiques de Raspberry
TP4: Acquisition de la température/Humidité et affichage sur LCD
TP5: Gestion de la communication série (RS232/Bluetooth) avec
Raspberry: Application pour la domotique
TP6: Computer vision avec Raspberry
TP7: Raspberry et l'Internet des objets (Internet of Things IOT)
TP1: Programmation et compilation des programmes C et
python sous Linux
I- Prise en main du Raspberry Pi
- Préparation de la carte SD
Télécharger Raspbian
Première étape, télécharger le système d’exploitation Raspbian. C’est totalement gratuit !
Pour ce faire, il suffit de se rendre sur le site officiel du Raspberry Pi dans la rubrique dédiée aux
téléchargements.
Installer Raspbian sur une carte SD depuis Windows
Une fois que vous avez récupéré l’archive ZIP de Raspbian, dé-zippez-la et vous obtiendrez un fichier
image.
Vous ne pourrez pas directement coller cette image sur votre carte SD. Il faudra auparavant utiliser un
logiciel pour installer correctement l’image de Raspbian.
Ainsi, nous allons utiliser celui qui est recommandé c’est à dire Win32 Disk Imager.
Dans « image file », sélectionnez le fichier image de Raspbian que vous avez téléchargé. Dans
« device », choisissez la lettre correspondant à votre lecteur de carte SD.
Cliquez sur Write et attendez quelques instants. Le logiciel va installer Raspbian sur votre carte SD.
Un message de confirmation apparaîtra une fois l’opération terminée.
Vous pouvez retirer la carte SD du lecteur. Raspbian est installé sur votre carte !
- Démarrage et authentification :
Brancher son Raspberry Pi
Ensuite, il est nécessaire de préparer les branchements de son Raspberry Pi afin qu’il puisse fonctionner.
Il a besoin d’alimentation électrique, d’une carte SD et d’autres périphériques facultatifs : clavier, souris,
réseau…
Pour certaines versions du Raspbian il faut taper au cours du démarrage: startx pour travailler en mode
graphique
Utilisateur : pi
Password : raspberry
Configurer Raspbian
Lorsque vous arrivez ici, normalement votre ordinateur a dû démarrer et afficher l’écran de
paramétrage de Raspbian.
On se retrouve face à un menu plutôt fourni permettant de configurer Raspbian :
info : donne simplement des informations sur l’écran de paramétrage. Pas super utile.
expand_rootfs : par défaut, la distribution utilisera seulement 2 GB d’espace sur la carte
SD. Si vous avez une carte avec plus d’espaces (4Go ou +), vous pouvez dire par cette
commande à Raspbian d’utiliser tout l’espace disponible sur la carte.
overscan : utile pour modifier l’affichage afin qu’il s’adapte à du 16/9. Avec des écrans et
télé récentes, cette commande est inutile.
configure_keyboard : pour configurer le clavier
change_pass : pour changer le mot de passe de l’utilisateur par défaut (pi)
change_locale : pour définir le jeu de caractères à utiliser
change_timezone : pour afficher l’heure en fonction de sa zone géographique
memory_split : pour répartir la mémoire physique entre le GPU (processeur graphique) et
le CPU (processeur). Par défaut, le GPU utilise 64Mo.
overclock : permet d’augmenter la performance des processeurs et de la RAM en
augmentant leur cadence. Ces modifications peuvent réduire la durée de vie du micro-PC. 5
overclocking types sont prêts à l’emploi :
ssh : pour activer le SSH. Déjà activé par défaut.
boot_behaviour : pour indiquer si l’on souhaite utiliser le Pi en mode graphique ou en
mode texte.
update : pour mettre à jour le système
Une fois que vous avez terminé, il ne vous reste plus qu’à sélectionner « Finish ».
Et voilà, vous devriez arriver sur le bureau de Raspbian !
Enfin, si vous souhaitez retrouver l’écran de paramétrage de Raspbian, il suffit de saisir cette
commande dans un terminal :
sudo raspi-config
- Clavier
Par défaut, le clavier (keyboard layout) est configuré pour les claviers UK (anglais/américain) sur les
différentes distributions pour Pi.
Il faut donc modifier le layout utilisé par le système. Les claviers Azerty se décline en deux layouts
très proches: le layout (FR) et le Layout (BE).
Pour modifier le layout:
sudo nano /etc/default/keyboard
Dans le fichier, Remplacez le "gb" par "fr" de façon à avoir la ligne suivante:
XKBLAYOUT="fr"
Réglage de l’heure :
sudo date 0413144917
Sat Apr 13 [Link] UTC 2017
Reboot : Primordial sinon les changements ne prennent pas effet!
sudo reboot
- Mise à jour des paquets
Dans le terminal des commandes, tapez :
sudo apt-get update
sudo apt-get upgrade
Apt-get est un outil logiciel à utiliser en ligne de commande. Il permet d'effectuer l'installation et
la désinstallation de paquets en provenance d'un dépôt APT (serveurs qui contiennent un ensemble
de paquets).
L'option update met à jour la liste des fichiers disponibles dans les dépôts APT présents dans le
fichier de configuration /etc/apt/[Link]. L'exécuter régulièrement est une bonne pratique,
afin de maintenir à jour votre liste de paquets disponibles.
L'option upgrade met à jour tous les paquets installés sur le système vers les dernières versions
(couramment utilisé).
- Démarrage de Raspberry à distance en mode SSH
Démarrer Raspberry en mode SSH en utilisant le client SSH Putty.
- Démarrage de Raspberry à distance en mode graphique
Travailler en mode graphique en utilisant le serveur/client VNC
- Programmation et compilation des applications C et python sous
Linux
En utilisant les commandes Linux sous le terminal de commandes:
1- Créer un dossier test sous le répertoire /home/pi.
2- Dans le dossier test, créer deux dossiers nommés respectivement source et header.
3- Dans le dossier source, créer deux fichiers: test.c et main.c.
4- Dans le dossier header, créer un fichier: test.h.
5- Dans le fichier test.c, écrire une fonction nommée calcul qui prend comme paramètre
un tableau T de 20 entiers et qui permet de déterminer et afficher le nombre de 0, le
nombre des entiers positifs et le nombre des entiers négatifs (0 est un entier positif).
6- Le fichier test.h contient la déclaration de la fonction calcul.
7- Dans le fichier main.c, remplir un tableau T de 20 entiers et l’afficher sur l’écran puis
faire appel à la fonction calcul.
8- Créer un fichier Makefile dans le dossier source comportant les instructions
nécessaires pour compiler cette application tout en générant le fichier objets .o pour
chaque fichier source .c.
9- Dans le même fichier Makefile, créer une cible nommée CLEAN qui permet de
supprimer tous les fichiers temporaires .o générés après la compilation.
10- Créer une autre cible nommée sup_exec qui permet de supprimer le fichier exécutable
généré après la compilation.
11- Au niveau du terminal, taper les commandes linux qui permettent de compiler et
exécuter cette application.
12- Utiliser les cibles CLEAN et sup-exec décrites dans le Makefile pour supprimer les
fichiers temporaires et le fichier exécutable générés.
13- Réécrire cette application mais cette fois en utilisant le langage PYTHON. Utiliser
deux fichiers: [Link] et [Link].
14- Exécuter cette application sous le terminal en utilisant la commande Linux adéquate.
TP2: Gestion des entrées sorties numérique de Raspberry
Objectif: programmer les entrées/sorties numériques de la carte Raspberry en utilisant le
langage python et C.
- Gestion d’une sortie (LED)
Montage :
Code :
Compilation et exécution :
sudo python nom_du_programme.py
Pour quitter « ctrl+c »
Si vous essayiez de ré-exécuter le programme une autre fois, un message de warning est affiché
« This channel is already in use »
Pour ignorer le message ajouter la ligne suivant au programme juste après l’import des bibliothèques :
« [Link](False) ».
- Programmation en C en utilisant la bibliothèque WiringPi:
Code :
Enregistrer ce fichier sous le nom blink
avec l’extension .c (blink.c)
Pour compiler taper dans LXterminal:
gcc -Wall -o blink blink.c –lwiringPi
Pour l’exécuter taper:
sudo ./blink
- Acquisition d’une entrée (bouton poussoir)
Montage : Code :
- PIR Motion Detector
Montage : Code :
- Contrôle GPIO avec Scratch
Comment contrôler les broches GPIO avec le Raspberry Pi en Scratch
Votre Raspberry Pi doit être connecté à Internet pour installer le logiciel mais la connexion n'est pas
nécessaire pour lancer ScratchGPIO.
sudo wget [Link] -O /boot/install_scratch_gpio.sh
Ensuite, tapez et lancez :
sudo /boot/install_scratch_gpio.sh
Cela va installer tous les logiciels supplémentaires requis et quelques exemples simples.
Vous pouvez maintenant lancer l'i cône Scratch spéciale (Scratch GPIO) de votre bureau. C'est en fait
une version normale de Scratch, elle lance juste un petit programme Python en arrière-plan pour
communiquer avec le GPIO. Si d'autres programmes Python accédant au GPI O tournent déjà,
l'ouverture de Scratch GPIO peut planter votre Pi . Pour éviter cela, ouvrez une fenêtre LX Terminal et
lancez :
sudo killall python
Pour tester l'accès au GPIO dans Scratch, cliquez sur Fichier>Ouvrir et sélectionnez blink11 dans
/home/pi /Scratch. Une fois le programme chargé, cliquez sur le drapeau vert et votre LED devrait
clignoter : allumée 1 seconde, éteinte 2 secondes.
Modifier le programme pour allumer LED avec une touche de clavier :
Cliquer sur « controls » puis choisir « When Key pressed »
Placer-le au-dessus « forever »
Maintenant changer la touche pour activer le clignotement de la LED en cliquant sur « space »
TP3: Gestion des entrées/sorties analogiques de Raspberry
Objectif: programmer les entrées/sorties analogiques de la carte Raspberry en utilisant le
langage python et C.
Analogue input :
Le Pi n'inclus pas de convertisseur Analogique/Digital mais un convertisseur ADC externe tel que le
MCP3008 peut être utilisé avec du code Python pour faire une lecture analogique en utilisant le
protocole SPI Serial Peripheral Interface.
Voici une liste de quelques entrées analogiques qui peuvent être lue avec ce montage:
Un potentiomètre
Une Photorésistance
Un FSR (résistance sensible à la force) voir notre FSR et Flex Sensor.
Un senseur de température comme le TMP36
Montage :
Les connexions entre le MCP3008 et le Raspberry Pi sont les suivantes:
MCP3008 VDD (pin 16) → Raspberry 3,3 V
MCP3008 VREF (pin 15) → Raspberry 3,3 V
MCP3008 AGND (pin 14) →; Raspberry GND
MCP3008 CLK (pin 13) → Raspberry SCLK
MCP3008 DOUT (pin 12) → Raspberry MISO
MCP3008 DIN (pin 11) → Raspberry MOSI
MCP3008 CS (pin 10) → Raspberry CE0
MCP3008 DGND (pin 9) → Raspberry GND
Brochage
SCLK - Broche 23 - GPIO #11 (aussi appelée "CLK")
MOSI - Broche 19 - GPIO #10
MISO - Broche 21 - GPIO #9
CE0 - Broche 24 - GPIO #8 (aussi appelée "CS0")
CE1 - Broche 26 - GPIO #7 (aussi appelée "CS1")
Configuration SPI :
Sélectionner “Advanced Options” choisir “SPI”
Une fenêtre vous demande si vous voulez activer l’interface ARM SPI :
Sélectionner “Yes” puis “Ok”
Sélectionner “Finish” redémarrer la raspberry PI SPI est activé
Installation de la bibliothèque SPI SPIdev :
sudo apt-get install python-dev
mkdir python-spi
cd python-spi
git clone [Link]
cd py-spidev
sudo python [Link] install
Le code : lecture de la valeur lue sur la voie CH0 du CAN MCP3008
- PWM
La modulation de largeur d'impulsions (MLI ; en anglais : Pulse Width Modulation, soit PWM), est une
technique couramment utilisée pour synthétiser des signaux continus à l'aide des circuits à
fonctionnement tout ou rien, ou plus généralement à états discrets.
Remarque :
Pour raspberry il y’a deux types de PWM : Hardware PWM et Software PWM
- Hardware PWM : pin GPIO12
- Software PWM : avec programmation de n’importe quel pin à travers la bibliothèque [Link]
- Varier l’intensité de l’éclairement d’une LED branchée sur GPIO11.
Code :
- p = [Link](11, 50) # active GPIO11 en mode
PWM avec la fréquence 50Hz sous le nom “p”
- [Link](5) # démarrer la génération de pwm avec
dutyCycle = 5%
- [Link](10) # changer DutyCycle 10%
- [Link](3)
- [Link]() # arreter le génération de pwm
- [Link]() # désactiver tt les GPIO
- Controller un moteur DC
Les ponts en H
Pour quoi l'utiliser ?
Les fonctions du pont en H sont :
fournir de forts courants aux moteurs en permettant leur contrôle par le microcontrôleur.
pouvoir inverser la tension aux bornes du moteur pour inverser le sens de rotation.
Controller un moteur pas à pas (stepper motor)
Code :
- Servo motors
Le principe
Pour commander un servomoteur, il faut lui envoyer une impulsion comprise entre 1 ms et 2 ms, répéter
cette impulsion toutes les 20 ms pour maintenir l'axe du servomoteur en position.
La position neutre du servomoteur correspond à une impulsion de 1,5 ms.
- 1ms : -90° en angle de sortie
- 1.5ms : 0° en angle de sortie
- 2ms : +90° en angle de sortie
Le déplacement angulaire total est de 180°.
Montage et code
- Exécuter plus d'un programme de contrôle au même temps
Code1 : Code2 :
Exécuter les deux programme en ajoutant le symbole & à la fin de chaque ligne
sudo python [Link] &
sudo python [Link] &
On vous renvoie les informations.
[1] : c'est le numéro du processus en arrière-plan.
2577 : c'est le numéro d'identification général du processus.
Cette information vous permet de tuer le processus avec kill si nécessaire.
sudo kill 2577
sudo kill 2579
Autre méthode sans numéro d’identification :
sudo killall sudo python [Link]
- Auto Start dans Raspberry Pi
Exécuter un script après la connexion
Comment exécuter automatiquement un script après la connexion.
Étape 1: Ouvrez une session de terminal et modifier le fichier /etc/profile
sudo nano /etc/profile
Étape 2: Ajoutez le nom et le chemin de votre script suivit de & à la fin du fichier
sudo python /home/pi/python_programme_1.py &
sudo python /home/pi/python_programme_2.py &
/home/pi/your_programe_1.sh &
/home/pi/your_programe_2.sh &
Exemple : Programme_1.sh
#!/bin/sh
cd home/pi/
sudo python your_python_sript.py &
exit 0
cd /
Étape 3: Enregistrer et quitter
TP4: Acquisition de la température/Humidité et affichage sur
LCD
Objectif: Acquisition d'une grandeur physique( Température) et affichage sur un LCD
Matériel
Raspberry Pi
Un capteur de temperature et humidité DHT11
Un afficheur LCD 16x2
Un potentiomètre
Montage :
Réaliser le montage de la figure ci-dessous
Configuration du l'afficheur LCD
##### Télécharger la bibliothèque Adafruit_Python_CharLCD
[Link]
#####Installer les dépendances suivantes:
sudo apt-get update
sudo apt-get install build-essential python-dev python-smbus
python-pip
#####Installer l bibliothèque [Link]:
sudo pip install [Link]
#####Exécuter la commande suivante
sudo python [Link] install
Configuration du capteur DHT11
##### Télécharger la bibliothèque Adafruit_Python_DHT
[Link]
#####Installer les dépendances suivantes:
sudo apt-get update
sudo apt-get install build-essential python-dev
#####Exécuter la commande suivante
sudo python [Link] install
Le code
import sys
import time
import Adafruit_DHT
import Adafruit_CharLCD as LCD
# Raspberry Pi pin configuration:
lcd_rs = 27 # Note this might need to be changed to 21
for older revision Pi's.
lcd_en = 22
lcd_d4 = 25
lcd_d5 = 24
lcd_d6 = 23
lcd_d7 = 18
#lcd_backlight = 4
# Define LCD column and row size for 16x2 LCD.
lcd_columns = 16
lcd_rows = 2
# Initialize the LCD using the pins above.
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5,
lcd_d6, lcd_d7,
lcd_columns, lcd_rows)
# Define DHT sensor type and RPi pin connected to data pin of
the sensor.
sensor = Adafruit_DHT.DHT11
pin = 17
lcd.set_cursor(3,0)
[Link]("hello Nejmeddine")
print "hello pi"
[Link](1)
while 1:
# Try to grab a sensor reading. Use the read_retry method
which will retry up
# to 15 times to get a sensor reading (waiting 2 seconds
between each retry).
humidity, temperature = Adafruit_DHT.read_retry(sensor,
pin)
# Un-comment the line below to convert the temperature to
Fahrenheit.
# temperature = temperature * 9/5.0 + 32
if humidity is not None and temperature is not None:
print('Temp={0:0.1f} °C
Humidity={1:0.1f}%'.format(temperature, humidity))
[Link]()
lcd.set_cursor(2,0)
[Link]('Temp={0:0.1f} C \n
Humidity={1:0.1f}%'.format(temperature, humidity))
else:
print('Failed to get reading. Try again!')
[Link](1)
TP5: Gestion de la communication série avec Raspberry:
Application pour la domotique
- Interface RS-232 :
Les UART (Universal Asynchronous Receiver Transmitter) assurent l’émission et la réception
asynchrone.
Sur le Raspberry Pi, les niveaux sont 0v, 3.3v, TXD : Port GPIO14, RXD : Port GPIO15
Par défaut l’UART du Raspberry Pi sert de port de débug pour Linux.
Libérer l’UART du mode debug
1ère méthode:
Executer la commande sudo raspi-config et aller vers advanced options -> serial. Choisir disabled.
/dev/ttyAMA0 est maintenant un port Linux libre
2ème méthode:
Empêcher l’émission de messages du Kernel et l’activation du mode debugging sur l’UART
Sudo nano /boot/[Link]
Supprimer :
console=ttyAMA0,115200 kgdboc=ttyAMA0,115200
Enregistrer et redémarrer :
sudo reboot
/dev/ttyAMA0 est maintenant un port Linux libre
Test de connexion
Récupérer la bibliothèque Python
sudo apt-get install python-serial
Exemple 1 : [Link]
import serial
port = [Link]("/dev/ttyAMA0", baudrate=115200,
timeout=3.0)
# le programme redemarre toutes les 3s
while True:
[Link]("\r\nEcrire quelque chose:")
rcv = [Link](10) # lit 10 caracteres
[Link]("\r\nVous avez ecrit :" + repr(rcv))
# l’appel de la function repr() n’est pas indispensable
Exemple 2: utilisation de l’UART ; programmation en langagge C avec WiringPi:
Teste du port série :
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>
int main ()
{
int i=0;
int fd ;
int nb_char=0;
char donnee;
fd = serialOpen ("/dev/ttyAMA0", 9600); // configuration et
ouverture du port serie
if (wiringPiSetup () == -1)
{
fprintf (stdout, "oops: %s\n", strerror (errno)) ;
return 1 ;
}
while (i<10)
{
printf ("nombre envoye -> %02d\n", i) ; // affiche
sur le terminal le nombre qui va être envoyé
serialPutchar (fd, i) ; // envoi via TX le nombre i
delay(100); // attente de 100 ms
donnee = serialGetchar (fd); // récupération du
caractère
printf ("nombre recu ->%02d\n\n", donnee) ; //
affichage du caractere recu
i++; // incrémentation de i;
}
serialClose (fd); // fermeture du port série;
return 0 ;
}
Sur la carte raspberry Pi, relier les pattes Rx et Tx du GPIO afin de recevoir les données envoyées, cela
permet de tester le fonctionnement sans utiliser un autre périphérique. Compiler et exécuter le code
présenté ci-dessus.
- Utilisation du module Bluetooth HC05 :
Matériel:
Raspberry Pi,
Module Bluetooth HC05
Smartphone
Application Android
led et resistance
Connexion de HC05 avec la Raspberry Pi
Raspberry Pins | Bluetooth Pins
RX (Pin 10) ———> TX
TX (Pin 8) ———> RX
5V ———> VCC
GND ———> GND
Installation de l'application Android [Link]
Télécharger l'application Led-Controller à partir de ce lien et l'installer sur votre Smartphone.
[Link]
Le programme:
Exécuter ce programme sur la carte Raspberry.
import serial
import [Link] as GPIO
[Link](False)
[Link]([Link])
[Link](40, [Link])
serialPort = [Link]("/dev/ttyAMA0", 9600, timeout = 2)
while True:
data = [Link](1) #lire 1 octet
if (data == "0"):
[Link](40, 0)
print("led eteinte\n")
if (data == "1"):
[Link](40, 1)
print("led alumee\n")
Associez votre appareil au module Bluetooth HC05 et par la suite appuyer sur ON/OFF au niveau de
l'application Android. L'état de la Led branchée sur la pin 40 doit être changé.
- Utilisation du module Bluetooth intégré pour Raspberry Pi3 :
La carte Raspberry PI3 intègre un module Bluetooth intégré. Dans ce cas, HC05 ou HC06 ne sera plus
utile. On peut directement travaille avec le Bluetooth intégré.
Configuration du Bluetooth intégré
Installer les dépendances ci-dessous:
sudo apt-get update
sudo apt-get install python-pip python-dev ipython
sudo apt-get install bluetooth libbluetooth-dev
sudo pip install pybluez
sudo apt-get install -y libusb-dev libdbus-1-dev libglib2.0-
dev libudev-dev libical-dev libreadline-dev
sudo apt-get install pi-bluetooth
sudo apt-get install bluetooth bluez blueman
Le programme
Exécuter ce programme sur la carte Raspberry.
import bluetooth
import [Link] as GPIO
[Link]([Link])
[Link](40, [Link])
[Link](False)
server_socket = [Link]([Link])
port = 1
server_socket.bind(("", port))
server_socket.listen(1)
client_socket, address = server_socket.accept()
print "Accepted connection from ", address
try:
while 1:
data = client_socket.recv(1024)
print "Received: %s" % data
if (data == "0"):
[Link](40, 0)
if (data == "1"):
[Link](40, 0)
finally:
print("Cleaning Up!")
[Link]()
client_socket.close()
server_socket.close()
L'application Android BlueTerm
1. Télécharger l'application Android BlueTerm et l'installer sur votre Smartphone à partir de Play
store
2. Associez votre appareil avec le Bluetooth de Raspberry
Lancer l'exécution en écrivant au niveau de l'application le caractère '1' ou '0' pour allumer ou éteindre la
Led branchée sur la pin 40 de la carte Raspberry.
TP6: Computer Vision avec Raspberry
Computer Vision
- Utilisation d’une USB webcam standard:
Tout d'abord, installez le paquet fswebcam:
sudo apt-get install fswebcam
Entrez la commande de fswebcam suivi par un nom de fichier, et une photo sera prise avec la webcam,
et enregistré dans le fichier spécifié:
fswebcam [Link]
Cette commande affiche les informations suivantes:
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing frame...
Corrupt JPEG data: 2 extraneous bytes before marker 0xd4
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to '[Link]'.
Préciser la résolution
La webcam utilisée dans cet exemple a une résolution de 1280x720. Afin de spécifier la résolution que
je veux, utilisez l'option -r:
fswebcam –r 1280x720 [Link]
Pas de bannière :
fswebcam -r 1280x720 --no-banner [Link]
Pour arrêter fswebcam:
pkill fswebcam
- Serveur webcam avec motion: video streaming
Motion est un système de surveillance assez complet. Il est extrêmement personnalisable : détection de
mouvement, enregistrement image par image, enregistrement vidéo, etc.. Son installation est aussi
simple que précédemment :
# sudo apt-get install motion
On va s’intéresser maintenant au fichier de configuration :
# sudo nano /etc/motion/[Link]
Modifiez [Link] en fonction de vos besoins. Pour ma part, j'ai modifié uniquement ces lignes :
daemon on
process_id_file /home/pi/motion/[Link]
width 640
height 480
webcam_quality 75
webcam_motion on
webcam_localhost off
Le daemon (service) motion est désactivé par défaut, pour l'autoriser :
# sudo nano /etc/default/motion // modifier
start_motion_daemon=yes
Un redémarrage est nécessaire
sudo reboot
Puis démarrer motion :
# motion
La mise en service de base est faite, le flux de la webcam se fait en pointant sur [Link]
- OpenCV
(Open Computer Vision) est une bibliothèque graphique libre, spécialisée dans le traitement d'images et
vidéos, calculs matriciels et les algorithmes d’apprentissage etc.
L'installation d'OpenCV pour Python
sudo apt-get install –y python-opencv
sudo apt-get install –y libcv-dev libopencv-dev libcv2.3
opencv-doc
test de la lib openCV :
git clone [Link]
[Link]
cd RPi-OpenCV-Face-Rec-Python »
python test_python_openCV.py »
Résultat:
Reconnaissance faciale en python:
Dans le même dossier RPi-OpenCV-Face-Rec-Python
Tapez dans le terminal la commande:
python fd_python_openCV.py --cascade=[Link] 0
Traitement de vidéo avec OpenCV:
Taper le code python ci-dessous et déterminer quelles sont les différentes fonctions traitées par ce
programmes en analysant les vidéos affichées sur l'écran.
import numpy as np
import cv2,cv
port=0
capture = [Link](port) #read the video
#capture = [Link]('[Link]') #read the video
[Link](3,320.0) #set the size
[Link](4,240.0) #set the size
[Link](5,15) #set the frame rate
#define the codec and create video writer object
fourcc=[Link](*'XVID')
out=[Link]('[Link]',fourcc,20.0,(320,240))
while ([Link]()):
flag, frame = [Link]() #read the video in frames
if flag==True:
gray=[Link](frame,cv2.COLOR_BGR2GRAY)#convert each frame
to grayscale.
blur=[Link](gray,(5,5),0)#blur the
grayscale image
th_max,th_img=[Link](gray,0,255,cv2.THRESH_BINARY+cv2.T
HRESH_OTSU)
th_min=0.5*th_max
edge=[Link](gray,th_max,th_min)
#frame=[Link](frame,0) #inverser l'image
[Link]('frame_rgb',frame) #show video
[Link]('grayscale',gray) #show video
[Link]('filter',blur) #show video
[Link]('edges',edge) #show video
[Link](frame) #save video
[Link](1)
else:
[Link]()
[Link]()
[Link]()
TP6: Raspberry et l'Internet des objet: IOT
Internet des objets
L'internet des objets est « un réseau de réseaux qui permet, via des systèmes d’identification
électronique normalisés et sans fil, d’identifier et de communiquer numériquement avec des objets
physiques afin de pouvoir mesurer et échanger des données entre les mondes physiques et virtuels.
- WebIOPi
Webiopi est une application web qui permet de contrôler les broches GPIO du raspberry depuis une
interface web. L’interface permet ainsi de changer l’état d’une broche de « IN » à « OUT » ou
inversement comme l’image ci-dessous.
Pour modifier les états, il faut :
Cliquer sur la touche OUT > IN pour changer de direction GPIO .
Cliquer sur la broche pour changer l’état de sortie GPIO .
Installation
wget [Link]
[Link]
tar xvzf [Link]
cd WebIOPi-0.7.0
sudo ./[Link]
Démarrer/Arrêter le service :
$ sudo python -m webiopi
Ou
sudo /etc/init.d/webiopi start
sudo /etc/init.d/webiopi stop
Démarrer WebIOPi au démarrage du système :
sudo update-rc.d webiopi defaults
sudo reboot
Modifier le port HTTP :
On se déplace dans le répertoire du soft.
cd /etc/webiopi/config
Puis il vous suffit de remplacer la ligne correspondant au port souhaité :
[HTTP]
[HTTP]
enabled = true
port = 8000
passwd-file = /etc/webiopi/passwd
doc-root = /home/pi/webiopi/examples/scripts/macros
welcome-file = [Link]
Première utilisation
Ouvrez un navigateur sur une machine de votre réseau, tapez l'URL [Link] ou utilisez
localhost sur votre Pi si vous avez un clavier et un écran connectés dessus. Vous serez alors invité à vous
connecter, l'utilisateur par défaut est webiopi et le mot de passe est raspberry.
Vous devriez alors accéder à la page suivante :
Une fois sur l’interface web, il vous suffit de choisir le lien d’en-tête GPIO sur la page principale:
Avec cet écran par défaut, vous pouvez modifier les fonctions du GPIO d'entrée à sortie, et changer l'état
des broches. Il suffit de cliquer sur les boutons IN/OUT, et sur chaque broche pour changer son état
lorsqu' elle est réglée en sortie.
- SERVEUR WEB
L’ordinateur Raspberry Pi est connecté en réseau par un connecteur Ethernet et/ou une liaison WIFI. Il
peut devenir un serveur WEB permettant le contrôle distant de processus ou la transmission à distance
des données à travers Internet.
Exemple1 : Commander des LED connectées sur Raspberry Pi via une page
web en utilisant le serveur web Apache
Suivez les instructions présentées dans le lien ci-dessous:
[Link]
1) Installation du serveur Appache et l’interpréteur php
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install apache2 php5 libapache2-mod-php5
2) Donner des droits au dossier d’apache
Ceci permettra de facilement administrer les sites. Pour cela, lancez les commandes suivantes :
sudo chown -R pi:www-data /var/www/
sudo chmod -R 770 /var/www/
3) Création de l’interface web
4) Réaliser le montage suivant
5) Aller dans le dossier /var/www et remplacer le
fichier [Link] par le fichier [Link] donné
avec l’exercice et copier tout le contenu du dossier
fournir dans /var/www
6) Tapez l’adresse ip de votre raspberry Pi sur un
navigateur web et la page web sera affichée.
Enjoy !!!!
Exemple2 : Commander une LED branchée sur le gpio4 du Raspberry Pi via une page
web en utilisant le module webpy
Le module webpy contient un serveur web interne.
Suivez les instructions présentées dans ce lien :
[Link]
navigateur-internet/
Procédure de création d’un site WEB avec webpy
Télécharger et installer le module
wget [Link]
tar -xzvf [Link] (décompression)
cd [Link]-0.37
sudo python [Link] install
Maintenant il va falloir créer une arborescence :
cd / (racine)
mkdir webpyserver (le dossier du serveur)
cd /webpyserver
mkdir templates (contiendra les pages html dont [Link]
mkdir static (feuille de style CSS éventuelle)
Le dossier webpyserver contiendra le fichier Python à exécuter; le dossier webpyserver/templates
contiendra une page HTML et le dossier webpyserver/static contiendra une feuille de style au format
CSS.
Réalisation du site WEB
Dans le dossier webpyserver, créér le fichier [Link]
Ce programme récupère les données des GPIO et gère l’interface homme-machine de la page Web.
#!/usr/bin/env python
import web
import [Link] as GPIO
from web import form
# definit GPIO4 en sortie
[Link]([Link])
[Link](4, [Link])
# definit la page de nom index pour le site web
urls = (‘/’, ‘index’)
dossier_web = [Link](‘templates’)
app = [Link](urls, globals())
# definit les boutons a afficher
ma_forme = [Link](
[Link]("btn", id = "btnon", value = "on", html = "On", class_ = "bouton_on"),
[Link]("btn", id = "btnoff", value = "off", html = "Off", class_ = "bouton_off")
)
# definit l action a effectuer quand la page index est appelee
class index:
# utilise quand la page est demandee
def GET(self):
forme = ma_forme()
return dossier_web.index(forme, "Raspberry Pi control GPIO4")
# utilise quand une forme web est soumise
def POST(self):
userdata = [Link]()
if [Link] == "on":
[Link](4,True) # Allume la LED
if [Link] == "off":
[Link](4,False) # Eteind la LED
# recharge la page web
raise [Link](‘/’)
# programme
if __name__ == ‘__main__’:
[Link]()
Dans le sous dossier templates créer le fichier [Link] C’est la page html d’accueil du site Web, elle
est ici simplifiée au maximum.
$def with (form, title)
<!doctype html>
<html>
<head>
<title>$title</title>
</head>
<body>
<br />
<form class="form" method="post">
$:[Link]()
</form>
</body>
</html>
Maintenant il suffit de lancer la commande python [Link] pour démarrer le serveur Web, puis à partir
d’un navigateur, taper l’adresse IP du Raspberry en utilisant le port 8080
ip : [Link] :8080
; voilà le résultat
- Firebase
Firebase est une plate-forme de développement d' applications Web et mobiles développée par
Firebase en 2011, puis acquise par Google en 2014.
Firebase fournit une base de données en temps réel et un backend en tant que service. Le service
fournit aux développeurs d'applications une API qui permet aux données d'application d'être
synchronisées entre les clients et stockées sur le cloud de Firebase.
Cette base de données temps réel peut être exploitée dans le domaine de l'IOT pour lire/écrire l'état
des capteurs/actionneurs ainsi que stocker en temps réel des grandeurs physiques telles que la
température, l'humidité, la pression etc...
NB: Il faut avoir un compte Gmail pour s'inscrire et avoir un compte sur cette base.
Programme pour enregistrer les valeurs de la température et l'humidité lues à
partir du capteur DHT11 dans la base temps réel de FIrebase.
import [Link] as GPIO
import time
import sys
import Adafruit_DHT
sensor = Adafruit_DHT.DHT11
pin = 17
firebase = [Link]('[Link] None)
while True:
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
print('Temp={0:0.1f}* Humidity={1:0.1f}%'.format(temperature, humidity))
put1= [Link]('salon','/humidity', humidity)
put2= [Link]('salon','/temperature', temperature)
else:
print('Failed to get reading. Try again!')
[Link](1)
Programme pour commander des lampes en lisant la valeur/état de chaque lampe
à partir de la base de Firebase.
Pour commander les lampes, l'utilisateur peut modifier la base en changeant le 0 par 1 et le 1 par 0 pour
chaque lampe.
from firebase import firebase
import [Link] as GPIO
import time
[Link]([Link])
[Link](False)
[Link](11,[Link])
[Link](12,[Link])
[Link](13,[Link])
firebase = [Link]('[Link] None)
while True:
led1=[Link]('/chambre/lampe1', None)
led2=[Link]('/chambre/lampe2', None)
led3=[Link]('/cuisine/lampe', None)
print led1,led2,led3
[Link](11,led1)
[Link](12,led2)
[Link](13,led3)