Menu Fermer

Raspberry Pi 5 avec Java et Python

Une étude de mon tout dernier Pi

En travail : études des différences avec les anciennes versions du Pi, en particulier les broches GPIO!

Au début, il y aura sans doute quelques erreurs, des imprecisions et pas mal d’adaptations dus aux libraries et au modèles anciens comme le Raspberry Pi 4!
Date de la dernière modification: 15 octobre 2024 et commencé mi-septembre 2024

Le Raspberry Pi est un outil didactique incroyable comme pour apprendre à configurer un système d’exploitation, à utiliser les commandes Linux, sa console et évidemment la programmation Python et Java (deux des languages les plus présents dans le monde informatique aujourd’hui).

Le point de départ c’est évidemment mon Un livre sur Java, Python, Eclipse et le Raspberry Pi 3 dont je reprends les exemples, fais des adaptations pour le Pi 5 et découvre des alternatives de design!

Projet: au choix, minuterie pour ma pompe de filtration (piscine) ou luminaire intérieur.
Besoin, au minimum: un relais (5 – 220V), un ou plusieurs capteurs de température et un senseur de lumière.
Pas d’écran, mais accès avec une connexion à distance et un serveur Web.
Développement du logiciel sur PC (dont Eclipse ou simplement Notepad++ ).

L’application décrite dans l’article Raspberry Pi 3 – Java – Un projet conséquent fonctionne depuis plus de 10 ans sur mon armoire à l’entrée avec un Pi Zero (un de mes 6 Raspberry Pi)!
Les luminaires sont allumés en fonction des heures du lever et du coucher du soleil. Il y a une partie d’aléatoire (simulation de présence) ainsi qu’un capteur de mouvements si je descend les escaliers et qu’il y a pas assez de lumière (donc un autre capteur) .

Celui que j’utilise le plus souvent, ces jours-ci, en début d’automne 2024, est décrit dans Comment régler sa pompe à chaleur pour une consommation optimale d’électricité. Je consulte son interface Web plusieurs fois par jour! 

L’idée ici est de programmer le Pi 5 comme on le ferait avec une minuterie journalière mécanique, où il suffit d’abaisser les touches des quarts d’heure. Pour une piscine, les périodes de filtrations dépendent essentiellement de la température de l’eau et il pourrait être possible de passer en auto-consommation si l’on possède une installation photovoltaïque (partie à étudier encore)!

Un peu d’histoire et quelles versions

Mon premier Raspberry Pi date de 2014, il n’avait ni Wi-Fi, ni Java.
J’y avais ajouté un dongle Wi-Fi USB et installé à la main une machine virtuelle Java (mon langage de programmation favori)!

On trouver de nos jours, sur le Web, une foule d’articles et de codes dédiés aux composants électroniques divers qu’on peut attacher aux broches GPIO du Raspberry Pi.
Les exemples en Python d’avant Pi 5 (donc avec la librairie RPi.GPIO) devront donc être adaptés et revisités pour satisfaire ce nouveau Pi 5 avec de nouvelles bibliothèques GPIO (un peu déçu et contrarié).
Donc attention: un Ctrl-C Ctrl-V d’anciens scripts code Python ne suffira pas.

Voir aussi, par exemple: Voici le Raspberry Pi 5 avec des améliorations à tous les étages!

J’ai actuellement trois Raspberry Pi actifs, deux en travail sur mon bureau , donc 5 IPs différents.
La commande cat /sys/firmware/devicetree/base/model retourne le modèle et c’est pratique! 
The Pi 5 est similaire au Pi 4 avec les mêmes broches GPIO, mais attention aux librairies GPIO.

Installation

Le logiciel Windows Raspberry Pi Imager v1.8.5, pour créer la carte SD, est disponible sur le site du Raspberry Pi.
Cette carte sera ensuite insérée 
sous le boîtier du Pi 5.

Ce logiciel permet aussi de créer une carte SD avec un autre système d’exploitation supporté et valide pour par exemple le Raspberry Pi 4.
Le Pi 5 avec Bookworm 64 bits ne fonctionne pas pour mesurer la lumière avec un photo senseur et la librairie gpiozero. Il faut alors utiliser un Pi 4 avec Bullseye 32 bits et la librairie 
RPi.GPIO utilisée dans mon livre. 

On lance l’application pour ensuite choisir le modèle Pi 5 et la version PI OS (64 bit) plus rapide de 25% que la 32 bit.
On choisira le stockage (K: chez moi), un lecteur USB de cartes SD avec une carte vierge ou effaçable (SanDisk Ultra PLUS microSDHC de 32 GBytes pour moi).
En cliquant sur SUIVANT on obtient la fenêtre suivante:

Pour les anciens Raspberry Pi (voir mon livre Programmer en Java pour le Raspberry Pi), la partie de la configuration WiFi et du SSH étaient bien moins agréable!

Le bouton MODIFIER REGLAGE permet de définir un nom pour ce Pi et le paramètres WiFi. J’utilise le même mot de passe que mes autres Pi et il faut connaître les paramètres du routeur!

Dans l’onglet SERVICES positioner les cases SSH avec mot de passe!

On enregistre les réglages (bouton ENREGISTRER) , on les applique et on en démarre l’écriture avec le bouton OUI.
Accepter que toutes les données soient effacées (disque USB K: chez moi) et c’est parti:

A la fin de l’écriture on reçoit un message indiquant qu’on peut retirer la carte SDCelle-ci contient le système d’exploitation Raspberry Pi OS.

Je lance mon outil Web pour l’accès à mon routeur, j’insère la mini carte SD dans (sous) le Pi 5, je branche l’alimentation et j’attends de voir le clignotement de la led verte: je vois alors dans mon outil du routeur mon nouvel appareil actif avec l’adresse IP 192.168.1.121 (ou autre) et le nom attribué PiPiscine!

Avec la page Web qui gère le réseau de mon routeur, je lui attribue une adresse IP fixe, c’est bien pratique!

Premier accès avec Putty  (expliquer: à faire)
Il me permet d’accéder à mon nouveau Pi 5 dans une console!
Et ça fonctionne!

Premier accès avec WinScp  (expliquer: à faire)
C’est un accès pour transférer des fichiers depuis ou sur mon PC.
Et ça fonctionne!

Pour terminer, dans Putty, la commande sudo halt permet de stopper correctement le Pi, c’est beaucoup mieux que de couper l’alimentation! 

Utiliser un écran et un clavier

Ce Pi 5 sera installé quelque part dans la maison, sans écran, ni clavier, ni souris: un “simple” objet connecté accessible avec PuTTY et WinSCP et plus tard au travers du Web!

L’installation décrite ci-dessus a évidemment monté tout le logiciel afin de pouvoir travailler avec un écran HDMI, un clavier USB et une souris USB. Il faudra sans doute un mini adaptateur pour un câble standard HDMI. Le Pi 5 c’est MICRO-HDMI.
A tout moment on pourra donc configurer son matériel et son Pi 5 pour y travailler (voire jouer ou consulter le Web) comme un PC traditionnel

J’y reviendrai à l’occasion pour les détails de configuration (écran, langue, etc) avec la commande sudo raspi-config , voire avec un VNC client.

Mise à niveau et test de Python

C’est nécessaire, et l’info ici: https://www.pcguide.com/raspberry-pi/how-to-update/

sudo apt update (long processus, plusieurs minutes)
sudo apt full-upgrade (assez plus rapide)
sudo apt dist-upgrade
sudo apt autoremove
sudo reboot

On relance et on vérifie un mini script Python déposé dans le répertoire python:

pi@PiPiscine:~/python $ python hello.py
Hello world!
pi@PiPiscine:~/python $

Cool, cela fonctionne, et je ne suis pas vraiment surpris!  Par contre le script suivant ne marche pas:

 

pi@PiPiscine:~/python $ python relay.py
Traceback (most recent call last):
   File “/home/pi/python/relay.py”, line 19, in <module>
   setup()
   File “/home/pi/python/relay.py”, line 9, in setup
   GPIO.setup(RelayPin, GPIO.OUT)   # RelayPin en mode output
   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   RuntimeError: Cannot determine SOC peripheral base address
pi@PiPiscine:~/py
 

C’est un script tiré de mon livre pour vérifier un relais connecté sur les broches GPIO et c’est la librairie RPi.GPIO qui est en cause!
Il y a donc du travail, pour comprendre voire réutiliser du logiciel fonctionnant sur mes Raspberry Pi d’anciennes générations !
De nombreux exemples de code Python sur le Web contiennent des références comme import RPi.GPIO as GPIO qu’il faudra adapter ou recoder (voir ci-dessous, par exemple avec la librairie gpiozero). 

Un certain nombres de scripts Python tirés de mon livre, dont ce script relay.py, se trouvent sur mon site dans le fichier CodePython.zip.
Ils sont valides pour les versions du Raspberry Pi jusqu’au Pi4.

J’ai aussi écrit de nombreux articles comme le Python Web Flask et SQLite pour le Raspberry Pi et d’autres disponible ici dans la catégorie Raspberry Pi 3/4.

Documentation: la librairie gpiozero

Ce n’est pas forcément un bon début, mais tout y est: gpiozero 2.0.1 Documentation Release 2.0.1! C’est un PDF de 266 pages!

Les habitués comme moi de la librairie RPi.GPIO pourront consulter ce guide de migration: 
https://gpiozero.readthedocs.io/en/stable/migrating_from_rpigpio.html

Avant de faire une quelconque installation il fait vérifier si elle n’est pas déjà installée!

Programmer en Python sur le Pi 5 ou sur un PC Windows

Pour débuter pourquoi pas cette liste de livres sur le langage Python que je dois encore vérifier.

Pour tous mes Raspberry Pi j’ai toujours développé mon code Python sous PC Windows. Il y a évidemment l’alternative de travailler sur le Pi 5 avec un écran et un clavier. Je ne l’ai jamais fait, pour l’instant.

Souvent le code Python est vraiment minimaliste chez moi, puisque je travaille en Java pour le cœur de mes programmes. Donc une simple console avec vi ou nano suffit, et on exécute directement!

Si on est débutant en Python, il y aura des soucis, car il faudra comprendre le code, trouver des exemples et les essayer. Sur le PC on a pas de GPIO, et il faudra se débrouiller. Mon outil de travail c’est Eclipse avec Java, mais on peut jouer aussi avec Python. Je devrai sans doute revisiter mon article PyDev, un IDE pour Python, sous Eclipse et pour le Raspberry Pi 3 pour ce Pi 5.

Pour de simples vérifications, on peut entrer le code directement:

pi@PiPiscine:~/python $ python
Python 3.11.2 (main, Aug 26 2024, 07:20:54) [GCC 12.2.0] on linux
Type “help”, “copyright”, “credits” or “license” for more information.
>>> from gpiozero import LED
>>> led = LED(23)
>>> led.on()
>>> led.off()
>>>

Ici j’utilise la librairie gpiozero et j’entre les 4 instructions l’une après l’autre dans ma fenêtre PuTTY de Windows! 

Pour de simples vérifications, comme l’existence de la librairie avec from gpiozero import LED, on peut entrer le code directement.
Nous voyons LED ici, mais chez moi, c’est un relais connecté au GPIO 23 (la broche 16), avec 
l’alimentation 3.3 Volt, et il clique bien aux enclenchements/déclenchements du relais!

Dans le document Raspberry Pi Zero WH j’explique comment je travaille avec WinSCP et PuTTY
Ici j’ai édité sur mon PC avec Notepad++ le fichier relayPi5.py avant transfert et exécution sur le Pi 5.
S’il y a des erreurs, je peux revenir dans 
Notepad++ (c’est très efficace). 

Les broches GPIO du Raspberry Pi 5 avec la librairie gpiozero

Donc j’utilise la librairie gpiozero.
On pourra se balader sur ce site Web 
et ses nombreux articles en liens dans la barre de gauche.

Ici une image bien propre de la définition des broches et de la numérotation GPIO du Raspberry Pi 5 (cliquer sur X pour le retour). Le RELAY_PIN ci-dessous est bien le GPIO 23 sur la broche 16.

 

Un joli serveur en Python pour le relais

Je l’ai nommé gpioRelayServer.py!

import os

import time
import gpiozero

print('Python GPIO Relay Server')

RELAY_PIN = 23

relay = gpiozero.OutputDevice(RELAY_PIN, active_high=False, initial_value=False)
relay.on()
time.sleep(2)
relay.off()
time.sleep(1)
relay.on()
time.sleep(1)
relay.off()

while True:
    if os.path.isfile('input.txt'):
        str = open('input.txt', 'r').read()
        if (str.startswith('RELAY ON')):
            relay.on()
        else:
           if (str.startswith('RELAY OFF')):
               relay.off()

    os.remove("input.txt")

Cela fonctionne super bien! On lance ce script en arrière-plan dans une console PuTTY avec la commande python gpioRelayServer.py &. C’est une boucle infinie. Le fichier input.txt sera effacé en cas d’activation ou de coupure du relais. 

Il suffit alors d’écrire le texte RELAY ON ou RELAY OFF dans le fichier input.txt pour enclencher ou déclencher le relais.
On fera sans doute l’exercice plus loin en Java!
Certains diront que c’est assez exotique (on pourrait utiliser une communication socket par exemple) mais 
cette interface fichier est très efficace pour développer une grosse application comme ma minuterie et/ou en plus une interface Web.

Ne pas oublier: sans boucle, le programme Python sera stoppé et avec lui l’instance de l’objet relay qui coupera le relais!

Installation de Java et testing (en travail)

En développant un mini Web server écrit en Java et déposé sur ce dernier Pi 5, j’aurai finalisé cette partie.

C’est assez vite fait, ça fonctionnemais il y aura du travail à expliquer la bête:

Cela consiste en:

  • installer la machine virtuelle Java sur le Pi 5
  • expliquer l’environment Eclipse pour Java sur PC
  • écrire un classe de test consistant en un mini serveur Web sur le port 8000 et la vérifier d’abbord sur PC
  • télécharger les classes .class sur le Pi 5 avec WinScp et vérifier le résultat ci-dessus!

Juste un peu de temps à présent pour la description. Patience!

Mes notes actuelles à documenter ici:

 – sudo apt install default-jdk
 – sudo update-alternatives –config java
 – pour trouver le path: /usr/lib/jvm/java-17-openjdk-arm64/bin/java
 – JAVA_HOME=”/usr/lib/jvm/java-17-openjdk-arm64/bin/java”
 – dans /etc/environment
 – sudo reboot
 
Dans une console PuTTY, pour vérifier l’installation et la version: 
pi@PiPiscine:~ $ java -version
openjdk version “17.0.12” 2024-07-16
OpenJDK Runtime Environment (build 17.0.12+7-Debian-2deb12u1)
OpenJDK 64-Bit Server VM (build 17.0.12+7-Debian-2deb12u1, mixed mode, sharing)
pi@PiPiscine:~ $
 
Je devrai aussi expliquer comment configurer mon routeur pour un accès de l’extérieur!

Mise en place du Pi4J

C’est la partie la plus délicate et la plus intéressante pour moi.
C’était le cœur de mon bouquin, une bibliothèque Java pour le GPIO du Raspberry Pi!
On trouvera une introductions dans Welcome to Pi4J.

L’architecture et les chips du Pi 5 demande une nouvelle version de Pi4J et une version Java supérieure à 8.
Je suis un peu dans l’expectative après avoir vu quelques exemples de code et j’ai de la peine à la mettre en place (PC, Eclipse, etc).

Donc … en travail!

Dallas DS18B20

Le Dallas DS18B20 est un capteur de température digital qui utilise le protocole 1-wire. J’en ai connecté un sur la broche 07 (GPIO 04).
On n’utilise pas de librairie GPIO et tout se fait au travers du système d’exploitation avec un lecture de fichier, par exemple, pour moi: 
/sys/bus/w1/devices/28-021318ab83aa/w1_slave!
Il faudra simplement lire ce fichier et décoder la température, ici, 25.3 degrés du t=:

cat /sys/bus/w1/devices/28-021318ab83aa/w1_slave
95 01 4b 46 7f ff 0c 10 65 : crc=65 YES
95 01 4b 46 7f ff 0c 10 65 t=25312

 

Donc, à suivre,  … aussi en travail!

Donner plus de détails (sudo raspi-config (Interface option, I2C, etc,, sudo modprobe w1-gpio, sudo modprobe w1-therm, …) !
J’aime bien Rui Santos (https://randomnerdtutorials.com/), beaucoup utilisé pour mes ESP. Voir donc son Raspberry Pi: Temperature Readings with DS18B20 Sensor (Python)

Le code de Raspberry_DS18B20_Tutorial.py fonctionne correctement, mais il faudra mettre des parenthèses pour l’instruction print (question de version de Python).

Mesure d’intensité de lumière

Ici il nous faut un photosenseur et une capacité utilisable sans module supplémentaire ADC (conversion analoqique à digital).

Le script qui suit fonctionne bien sur un Raspberry Pi 4 avec 
avec Bullseye 32 bits et la librairie RPi.GPIO.
C’est impossible de faire l’équivalent sur un Pi 5 avec la librairie gpiozero. On trouvera des références sur le Web (octobre 2024) mais pas d’indication sur une correction possible.

# coding: utf-8
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)

#Définition du pin sur la broche 13
pin_to_circuit = 13 # (GPIO 2)

def rc_time (pin_to_circuit):
    count = 0

    #Configuration en sortie
    GPIO.setup(pin_to_circuit, GPIO.OUT)
    GPIO.output(pin_to_circuit, GPIO.LOW)
    time.sleep(0.1)  #pause de charge

    #Configuration en entrée
    GPIO.setup(pin_to_circuit, GPIO.IN)

    #Comptage
    while (GPIO.input(pin_to_circuit) == GPIO.LOW):
        count += 1

    return count

try:
    # Boucle éternelle
    while True:
        print rc_time(pin_to_circuit)
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()

Donc, si on a besoin absolument de la mesure de lumière pour activer par exemple un relais, il faudra rester avec le Pi 4

Mais cela m’intéresse: je vais m’amuser à adapter ce script pour faire une moyenne dans le temps en retirant quelques valeurs extrêmes et déposer le résultat dans une fichier lisible par une application ou un serveur Web. C’est avec ce genre de code qu’on apprend à maitriser la programmation!

Pour toutes, voire n’importe quelles questions, suggestions ou demandes de code, on pourra utiliser Ma forme de contact