pas asses de port USB sur votre raspberry PI , rassurez vous il existe des USB HAT pour étendre la capacité .
il en existe autant de modèles que de type de RPI et de type de port USB ( USB 2 ou USB 3).
voici quelques photos d’un HAT ( chapeau en anglais) avec port USB 3 pour raspberry PI 4B:
il se monte sur le RPI via des colonnettes et est fourni avec une petite platine de raccordement pour le port USB3 du RPI ( a droite sur la photo ci dessous)
il n’est pas obligatoire de le monter par dessus , le RPI , il peut etre connecté via un cordon USB classique ( prendre le cordon adapté au type d’USB).
voici une configuration sur SSD BOARD avec le RPI sur un ecran HDMI 7″ touschscreen 1024 x 600:
le port GPO du RPI comporte 40 broches alignées en 2 rangés sur un meme connecteur plastique . voyons le brochage de cette interface plus en détail:
chaque broche peut etre utilisé de façon logicielle comme entrée ou sortie. la numerotation des broches (Pin) n’est pas dans l’ordre physique du bornier . les broches O et 1 ( broches physiques 27 et 28) sont reservées pour des utilisations avancées.
voici un petit schema qui recapitule la numerotation des broches vis a vis de la position physique. certaines broches ont des fonctions spécifiques (couleur rouge , orange ou verte) et certaines des fonctions alternatives ( voir colonne Alternate Function en gris ci dessous). il est a noter que contrairement a l’ARDUINO , il n’y pas de broche Analogiques, RPI n’utilise que des entrées/sorties digitales (niveau haut ou bas). derniere particularité, pour l’alimentation PWR= Power) ) , les broches physiques 2 et 4 generent du 5V et les broches physiques 1 et 17 du 3,3V.
ATTENTION: contrairement a l’ARDUINO qui utilise des tension TTL de 5V le niveau haut des broche GPIO est a 3,3V
Gestion PWM: le Pulse Width Modulation peut etre generé de façon logicielle sur toutes les broches GPIO.
Gestion SPI : possible sur les broches Function alternative couleur ROSE
I2C: broche SDA = GPIO2 et SCL = GPIO 3 en bleu ci dessous
SERIAL: TX sur broche physique 8 (GPIO14) et RX sur broche Physique 10 (GPIO15) . en vert ci dessous.
brochage du GPIO : ci dessous fichier format JPG a imprimé pour penses bete GPIO
si besoin , le pinout ( sans les fonctions alternatives) est disponible en ligne de commande et en tapant dans BASH la commande ci dessous:
pinout
pour finir et pour vos montage a base de RPI , il existe en vente en ligne plétore de cables en nappe et connecteurs pour les réalisations, voici 2 exemples parmis tant d’autres:
THONNY PYTHON est un editeur PYTHON basique fourni avec l’environnement DEBIAN dans la version complète avec le BUREAU . on y accède via le menu général en haut a gauche , option « Programmation »:
une fois l’editeur ouvert , nous avons un ecran similaire a celui ci :
pour examiner l’editeur THONNY PYTHON de façon plus pratique , nous allons ecrire un petit programme basique avec une interface graphique utilisant la bibliothèque TKinter . pour cela il va falloir au préalable l’ installer. ouvrir l’éditeur en Ligne de commande BASH et taper la commande ci dessous:
sudo apt-get install python-tk
une fois la bibliothèque installée , écrivons un petit programme PYTHON: attention bien respecter l’indentation ( décalage des lignes) comme dans l’exemple ci dessous car c’est la façon dont Python reconnait les bloc de fonction ( boucle de test if , boucles while, definition de fonctions ,etc ..)
une fois saisi dans Thonny Python, cela donne la chose suivante:
pour lancer l’execution du programme , il suffit de cliquer sur la fleche « Run » dans la ligne des icones de commande:
quand cela est fait vous devez voir apparaitre le petit menu ci dessous avec une case blanche à remplir . saisissez un nombre puis cliquez sur la case « calcul de la racine » et vous devriez obtenir le résultat du calcul de la racine carrée du nombre entré dans la fenêtre. voila votre premier programme simple écrit sous tonny Phyton et utilisant une interface graphique a base de fonctions et commandes de la bibliothèque TKinter . nous aborderons les possibilité de TKinter de façon plus approfondie dans un tuto spécifique.
si vous utilisez le bureau sous Debian ou linux, il est utile de créer des icônes de lancement pour les programmes python que vous avez développé . cela évitera le passage par la ligne de commande.
nous allons voir ici comment procéder.
tout d’abord il va falloir créer un fichier qui va contenir les commandes pour la création de l’icône. on va créer un fichier texte du type « nom.desktop » dans le répertoire /home/pi/Desktop.
pour créer le fichier texte , 2 possibilité , l’editeur de texte du bureau ou la ligne de commande qui devra etre du genre:
sudo nano nom.desktop
en ligne de commande il faudra bien entendu soit se positionner dans le répertoire de destination /home/pi/Desktop ou inclure le chemin dans la commande sudo :
sudo nano /home/pi/Desktop/nom.desktop
le contenu du fichier texte « nom.desktop » devra etre le suivant, en vert et bleu le formalisme obligatoire et en noir lespartie dependant de votre application:
[Desktop Entry]Version=
Name=MonApplication
Comment=Ceci est mon application super méga géniale
Exec=python3 /chemin/du/programme/MonProg.py
Icon=/chemin/du/fichier/MonIcone.png
Terminal=false
Type=Application
Categories=
on trouve des exemples d’icônes dans le repertoire /usr/share/pixmaps mais il est egalement possible de créer ses propres icones et par exemple les stocker soit dans /usr/share/pixmaps ou dans le répertoire programme . il faudra compléter Icon = chemin avec le chemin de l’icône choisie. dans l’exemple ici , après Exec= on a python 3 / chemin ……. mais si vous utilisez une autre version de python, adapter le contenu en conséquence.
une fois l’icône crée et le fichier nom.desktop crée , vous devriez voir votre icône apparaitre sur le bureau et quand vous cliquez dessus cela lance le programme python visé .
utilitaire de copie d’ecran ou copie partielle d’ecran , pour l’installation passer en mode commande et taper la suite de commandes ci dessous
sudo apt update
sudo apt upgrade
sudo apt install gnome-screenshot
IDE ARDUINO :
pour developper des programmes arduino et les telecharger dans l’arduino , installer l’ IDE sur votre raspberry PI.pour l’installation passer en mode commande et taper la suite de commandes ci dessous
sudo apt update
sudo apt upgrade
sudo apt-get install arduino
IDE PROCESSING :
pour developper des programmes processing afin de dialoguer avec un arduino branché sur le port USB , installer l’ IDE PROCESSING sur votre raspberry PI.pour l’installation passer en mode commande et taper la suite de commandes ci dessous
sudo apt update
sudo apt upgrade
curl https://processing.org/download/install-arm.sh | sudo sh
le raspberry PI est prévu pour recevoir une camera dédiée sur son connecteur spécifique. voyons comment la brancher et l’utiliser .
on trouve la camera en achat en ligne , il en existe 2 versions, le modele V1 de 5 mégapixels avec câble en nappe de 15cm et câble en nappe d’un mètre pour moins de 10 euros , et le modele V2 , en 8 mégapixels à 25-30 euros suivant les vendeurs. il existe par ailleurs tout un tas de modele compatible avec des lentilles/objectifs additionnels.
BRANCHEMENT DE LA CAMERA:
le raspberry PI possède un slot de connexion spécifique pour la camera, il est prévu pour y inserer le cable en nappe livré avec la camera. les connections sont situées du coté gauche du connecteur, il faut donc bien veiller a mettre la nappe du bon coté. il faut egalement déclipper le petit masque plastique en le soulevant vers le haut avec l’ongle, avant d’insérer la nappe puis le rebloquer vers le bas une fois celle ci insérée.
CONFIGURATION et TEST:
une fois la camera branchée et le RPI démarré , il va falloir configurer l’ensemble , pour cela ouvrir le menu « preferences » puis « aspberry Pi Configuration »:
puis cocher la case « camera/ Enable » dans le menu « interface ».
pour tester la camera , lancer le shell (LXterminal)et tapper la commande ci dessous et valider par l’appui sur Enter:
raspistill -o Desktop/image.jpg
une image a été ajoutée sur le bureau , vous pouvez l’ouvrir pour voir son contenu.
sans extension particulière , la photo est prise à la définition maximale de la camera, mais vous pouvez définir les dimension en utilisant les option -h -w :
nous verrons dans la rubrique « RASPBERRY PI – TUTOS » comment contrôler la camera en langage Python de façon a pouvoir intégrer image et vidéos dans une interface ou un programme spécifique de votre conception.
nous abordons ici quelques bases de la boite a outils TKinter qui permet de créer des interfaces graphiques sous python.
cet article est une reprise et une traduction de certains tutos en langue anglaise trouvés ça et là sur le net (voir liste en fin d’article).
INSTALATION DE TKinter:
si TK inter n’est pas present par defaut sur votre version de l’OS linux, voici la commande pour installer la bibliotheque:
sudo apt-get install python-tk
STRUCTURE DE TKinter
TKinter utilise deux grands principes, la fenêtre (Window/frame) et le Widget ( gadget) qui s’affiche dans une Frame créant ainsi une relation parent/enfant entre le frame et le widget.
il y a 4 stades pour créer un Widget:
Création du widget dans une frame
Configuration des attributs du widget ( police de caractères, style, couleur ,etc..)
encapsulation dans une zone de position de la frame pour le rendre visible
liaison/association du widget a une fonction ou un évènement ( saisie de texte par exemple)
voyons tout de suite des exemples pour rentrer dans le vif du sujet:
Creation de BOUTONS:
import tkinter as tk
def write_slogan():
print("Tkinter est facile a utiliser!")
root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
button = tk.Button(frame,text="QUIT",fg="red", command=quit)
button.pack(side=tk.LEFT)
slogan = tk.Button(frame,text="Hello",command=write_slogan)
slogan.pack(side=tk.LEFT)
root.mainloop()
l’exécution de ce bout de python dans thonny python ouvre la fenêtre ci dessous. si on clique sur Hello avec la souris , un message s’affiche, si on clique sur QUIT, on sort du programme et la fenetre se referme.
analysons la structure du module python créé:
import tkinter as tk
cette ligne importe la boite a outil TKinter et les commandes associées
def write_slogan(): print("Tkinter est facile a utiliser!")
ici on defini une fonction « write » qui va afficher la chaine de caractere « TKinter est facile a utiliser »
c’est ici dans ces 2 lignes , que l’on crée le widget bouton appelé « button »), qu’on défini ses attributs ( text=QUIT + police de caractere rouge + command « quit » et qu’on l’encapsule a gauche dans la frame.
ici on créé un deuxieme widget bouton appelé « slogan » , avec ses attributs ( text=Hello sans police de caractere particuliere et auquel on associe la commande d’appel de la fonction « write_slogan » definie en debut de programme. pour finir , on encapsule le bouton a droite dans la fenetre.
on termine le programme par une fonction de boucle « root.mainloop() ».
dans cet exemple, nous utilisons les widgets « Label » et « Entry » qui permettent respectivement de definir deux etiquettes de texte et deux zones de saisie de caracteres. ce coup ci , la particularité pour le positionnement de chacun des widget est d’utiliser le principe des lignes et colonnes pour designer l’emplacement de chaque widget . les chaines de caractères saisies seront affectées chacune a 2 variables e1 et e2 qui pourront etre utiliser par la suite ( pas de traitement dans cet exemple).
LES SLIDERS:
from Tkinter import
master = Tk()
w = Scale(master, from_=0, to=42)
w.pack()
w = Scale(master, from_=0, to=200, orient=HORIZONTAL)
w.pack()
mainloop()
le widget « Scale » permet de créer des slider de saisie de variables. si rien n’est defini dans l’attribut le slider est vertical , pour le positionner horizontalement , mettre l’attribut orient=HORIZONTAL.
LES MENUS:
from tkinter import
from tkinter.filedialog import askopenfilename
def NewFile():
print("New File!")
def OpenFile():
name = askopenfilename()
print(name)
def About():
print("This is a simple example of a menu")
root = Tk()
menu = Menu(root)
root.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=NewFile)
filemenu.add_command(label="Open...", command=OpenFile)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=About)
mainloop()
dernier widget que nous voyons dans ce post , la création de menus . le bout de programme affiché et disponible dans le fichier zip permet de créer et afficher le menu ci dessus .
mariage de raison ou comment faire communiquer un RASPBERRY PI et un ARDUINO UNO via port USB et un software .
ARDUINO et RASPBERRY sont très complémentaires en utilisation. l’ ARDUINO pour commander et communiquer avec des capteurs et globalement pour tout traitment de signal évolué , RASPBERRY PI lui est adapté pour les traitements et les calculs complexes nécessitant de la puissance, pour les affichages haute definition et les traitements grapiques evolués, pour les connexions wifi et inthernet et pour l’utilisation de software gourmants en memoire ou necessitant de la puissance de processeur .
il est donc intéressant de pouvoir les faire communiquer ensemble . partant du fait qu’ils ont tous les deux un port USB , alors autant en profiter . nous allons voir ici comment.
pour traiter la question au travers d’un exemple pratique, nous allons utiliser le montage a base d’un u capteur DHT11 pour mesurer la temperature et l’humidité) utilisé dans la rubrique ARDUINO-TUTOS:
l’idée est tout simplement de lire les données avec l’ARDUINO et de les envoyer au RASPBERRY PI via le port USB pour les afficher en clair soit via une interface graphique simple développée sous TKINTER soit via une interface graphique développée avec PROCESSING.
NOTA: tous les développements expliqués ci dessous peuvent être entièrement réalisés sous RASPBERRY PI 4 ( de preference avec mini 4Go de RAM) à condition d’installer l’IDE ARDUINO et PROCESSING sur le RPI . pour cela voir la partie « RASPBERRY – generalités / utilitaires divers »
avant de continuer , dans un premier temps il faut connecter l’ARDUINO UNO et le RPI via USB ( si pas deja fait pour telecharger l’ARDUINO) puis determiner la dénomination du port USB connecté a l’ARDUINO .
pour cela ouvrir le mode de commande en ligne puis taper la ligne de commande suivante:
dmesg -s 1024
apres avoir validé , un tas de lignes defilent a l’ecran et vers la fin ou trouve l’identifiant du port USB de connexion de l’ARDUINO:
ouvrir Thonny Python et copier/coller dedans le programme ci dessous ( lien du pgme version zip) en verifiant de bien mettre la designation correste du port USB ( ligne 9 partie rouge du pgme ci dessous), bien respecter egalement l’indentation des lignes:
lancer l’execution du programme ( fleche verte en haut dans la barre de commande de thonny python), vous devriez avoir quelque chose comme cela:
mis a part la partie affichage utilisant TKinter ( voir rubrique spécifique), la partie stratégique du programme est en ligne 9 ou l’on vient tout simplement lire le contenu de la chaine de caractère qui arrive sur le port série et la stocker dans une variable chaine « ser » puis ensuite en lignes 13 et 14 ou l’on vient récupérer les portions de chaines de caractère relatives a la température et a l’humidité dans des variables chaine « temp » et « humi » pour ensuite les afficher via l’interface TKinter ( partie dans la boucle « while 1 »).
petite particularité , au passage , dans le programme on recupère la date et l’heure du RPI en ligne 12 du pgme pour la stocker dans une variable « now » pour affichage dans le GUI TKinter.
COMMUNICATION USB avec PROCESSING :
pour executer la communication avec processing , ne rien changer a la partie ARDUINO, Ouvrir l’IDE PROCESSING et copier/coller le programme suivant puis lancer l’execution ( fleche en haut a gauche dans l’IDE processing).
// Import Meter library
import meter.*;
// Import serial library
import processing.serial.*;
Serial port; // Define a port
Meter m, m2;
void setup(){
// First we need to create a empty window
size(950, 400); // Size of the window (width, height)
background(0, 0, 0); // Background color of window (R,G,B)
// Create new port
port = new Serial(this, "/dev/ttyACM0", 9600); //name of the port would be different for linux
// Lets add a default meter to empty window
// TEMPERATURE METER
m = new Meter(this, 25, 80); // here 25, 10 are x and y coordinates of meter's upper left corner
m.setTitleFontSize(20);
m.setTitleFontName("Arial bold");
m.setTitle("Temperature (C)");
// Change meter scale values
String[] scaleLabels = {"0", "10", "20", "30", "40", "50", "60", "70", "80"};
m.setScaleLabels(scaleLabels);
m.setScaleFontSize(18);
m.setScaleFontName("Times new roman bold");
m.setScaleFontColor(color(200, 30, 70));
// We can also display the value of meter
m.setDisplayDigitalMeterValue(true);
// Lets do some more modifications so our meter looks nice
m.setArcColor(color(141, 113, 178));
m.setArcThickness(15);
m.setMaxScaleValue(80);
m.setMinInputSignal(0);m.setMaxInputSignal(80);
m.setNeedleThickness(3);
// HUMIDITY METER
// lets take some refference from first meter
int mx = m.getMeterX(); // x coordinate of m
int my = m.getMeterY(); // y coordinate of m
int mw = m.getMeterWidth();
m2 = new Meter(this, mx + mw + 20, my);
m2.setTitleFontSize(20);
m2.setTitleFontName("Arial bold");
m2.setTitle("Humidity (%)");
// Change meter scale values
String[] scaleLabels2 = {"0", "10", "20", "30", "40", "50", "60", "70", "80", "90", "100"};
m2.setScaleLabels(scaleLabels2);
m2.setScaleFontSize(18);
m2.setScaleFontName("Times new roman bold");
m2.setScaleFontColor(color(200, 30, 70));
// We can also display the value of meter
m2.setDisplayDigitalMeterValue(true);
// Lets do some more modifications so our meter looks nice
m2.setArcColor(color(141, 113, 178));
m2.setArcThickness(15);
m2.setMaxScaleValue(100);
m2.setMinInputSignal(0);
m2.setMaxInputSignal(100);
m2.setNeedleThickness(3);
}
void draw(){
// Lets give title to our window
textSize(30);
fill(0, 255, 0); // Font color , (r,g,b)
text("Temperature and Humidity", 250, 40); // ("text", x, y)
if (port.available() > 0) {
String val = port.readStringUntil(10); // until \n => 10 in ascii
if(val!=null){
String[] list = split(val, ',');
if(list.length==2){
float temp = float(trim(list[0])); float hum = float(trim(list[1]));
m.updateMeter(int(temp)); // int is used due to updateMeter accepts only int values
m2.updateMeter(int(hum));
println("Temperature: " + temp + " C " + "Humidity: " + hum + "%");
// delay(1000);
}
}
}
}
processing est developpé a la base pour de la gestion graphique poussée , ce que ne sait pas faire TKinter , vous obtiendrez donc un resultat au look bien plus « high tech » sous processing avec des indicateurs genre compteurs/afficheurs du type ci dessous:
le data loging ou enregistrement de donnée est un basique dans les systeme a microcontroleurs.
nous allons voir ici comment créer un fichier et enregistrer des données avec un programme en Python. pour cela nous allons examiner le cas pratique de données arrivant d’un arduino uno connecté via port USB et reprendre l’exemple de la rubrique PI & ARDUINO via USB. avec l’ARDUINO UNO qui collecte les données d’un DHT11 et voir comment les enregistrer à la volée dans un fichier sur le RPI. nous aurons ainsi les bases d’une petite station météo tournant sous RPI. ce principe pourrais également être appliqué pour un banc de mesure ou tout autre système dont l’objectif est la collecte et la sauvegarde de données.
nous allons egalement reprendre le programme de gestion des données arrivant du port série (revoir rubrique PI & ARDUINO série pour le detail) et le modifier pour y ajouter des commandes qui ouvriront un fichier et enregistreront les données au fur et a mesure . ouvrir le fichier ci dessous dans thonny python ou tout autre editeur pyton.
le morceau de programme qui gerer la creation ouverture de fichier et l’enregistrement de données et la partie surlignée en vert dans la copie ci dessous :
il y a 3 lignes:
– la première ouvre le fichier ( le créée si pas existant) , a noter que le fichier créé est au format CSV (Comma-Separated Values) qui st un format texte de données tabulaires permettant une ouverture lecture sur Excel .
– la ligne suivante enregistre les données sous forme concaténée ( addition de chaine avec le signe +) en les séparant d’une virgule pour obtenir le format CSV.
-la troisième ligne referme le fichier.
si vous exécutez le programme et ensuite examinez le fichier sous Notepad ou excel vous aurez quelques chose comme ci dessous:
voyons comment intégrer la Pi camera dans un programme Python pour exploiter photos et vidéos dans des appli perso.
dans la partie RASPBERRY – generalités, nous avons vu comment brancher et configurer la camera ainsi que les premiers pas avec le shell.
PIcam dans PYTHON: bases
petit exemple tres basique de commande de la camera en python, ouvrir le programme ci dessous dans thonny python et l’executer ( fleche verte play de TP). attention, ne fonctionne qu’avec un ecran connecté mais pas en mode SSH.
from picamera import PiCamera
from time import sleep
camera = PiCamera()
camera.start_preview()
sleep(5)
camera.stop_preview()
l’apercu de la camera s’affiche en plein ecran pendant 5 secondes puis se referme. la valeur sleep() permet de fixer la durée d’affichage
si par hasard , l’image s’affiche tournée , on peut corriger l’orientation en ajoutant la ligne ci dessous apres « camera = PiCamera() » et en adaptant l’angle a l’orientation souhaitée:
camera.rotation = 180
on peu egalement rendre l’image plus ou moins transparente en ajustant la valeur alpha que l’on precise dans « camera.start_preview()« , par exemple:
camera.start_preview(alpha=150)
la valeur alpha peut varier de 0 a 255.
PRENDRE une PHOTO pendant le liveview:
il suffit d’ajouter une commande « camera.capture() » en précisant le chemin d’enregistrement de l’image.
from picamera import PiCamera
from time import sleep
camera = PiCamera()
camera.start_preview()
sleep(5)
camera.capture('/home/pi/Desktop/image.jpg')
camera.stop_preview()
le capteur de la camera adapte automatiquement la luminosité de l’image a condition de mettre au moins 2 secondes dans la valeur sleep().
en incluant la séquence d’instruction dans une boucle « for i in range() » on peut programmer une sequence de prise de vues automatique
ENREGISTRER de la video dans un fichier:
c’est aussi simple que de prendre une photo, charger et exécuter l’exemple ci dessous:
from picamera import PiCamera
from time import sleep
camera = PiCamera()
camera.start_preview()
camera.start_recording('/home/pi/Desktop/video.h264')
sleep(5)
camera.stop_recording()
camera.stop_preview()
nous venons de voir quelques bases pour l’utilisation de la camera sous python, pour approfondir les sujet , voir le site dédié a la PI camera lien ci dessous:
dernier point interressant a regarder , l’intégration dePIcam avec un GUI TKinter . pour cela , nous allons utiliser le petit bout de programme ci dessous, l’ouvrir dans Thonny Python et voir ce qu’il fait quand on le lance:
a l’ouverture du programme , s’affiche un frame TKinter avec des boutons et slider de commande:
quand on clique sur le bouton « Camera ON » , on lance une cession de la camera qui s’affiche en mode vidéo dans une fenêtre :
ensuite on peut modifier les réglages « brightness/contrast et saturation » de la camera :
le bouton « camera OFF » ferme la camera ( la video disparait) et le bouton « FIN du PGME » permet de refermer le programme.
en créant un icone de lancement sur le bureau associé au pgme Python ( voir rubrique RASPBERRY généralités » on peut créer une application indépendante sans thonny python. a ce stade de multiples evlutions/options sont envisageables, ajouter un bouton pour prendre une image, ajouter un bouton pour enregistrer une sequence video dans un fichier , etc….