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 et imprecisions!
Date de la dernière modification: 7 octobre 2024 et commencé mi-septembre 2024

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

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!
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).

L’idée ici est de programmer le Pi 5 comme 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 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!

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 installés, donc 3 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.

Installation

Le logiciel Windows Raspberry Pi Imager v1.8.5, pour créer la carte mémoire micro SD à insérer sous le boîtier du Pi 5, est disponible sur le site du Raspberry Pi.

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, oute 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.

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

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 le 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, 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.

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 d’avoir soit RELAY ON soit RELAY OFF dans le fichier input.txt pour enclencher ou déclencher le relais. On fera l’exercice plus loin en Java! Certains diront que c’est assez exotique (on pourrait utiliser une communication socket par exemple) mais c’est très efficace cette interface fichier pour développer une grosse application comme ma minuterie et en plus une interface Web depuis le PC. 

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!

DallasDS18B20

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:

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).

A suivre …..

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