Vélo porte containers
Il reste encore quelques Raspberry Pi Zero W. Et si l'on s'en servait comme d'un porte container pour le vélo ? L'objectif est de faire un éclairage à base de neopixel, géré par un container Docker... Pour un vélo. Si, si !
Sur Aliexpress on peut trouver des "UPS" (Uninterruptible Power Supply), des "onduleurs" pour quelques euros, dans lequel on peut installer deux batteries 18650. Certains modèles proposent un seul emplacement, ou quatre...
Dans les mêmes magasins virtuels, on peut aussi trouver des batteries 18650, 8€ pour quatre batteries de 3Ah.
On rappelle que ce sont des cellules qui sont chargées à 4.2V et qui se déchargent jusqu'à 3.2V (plus bas on "tue" la cellule.
C'est aussi chez Aliexpress que l'on trouve des neopixels rings, des anneaux de LEDs adressables (chaque LED est composée de 3 LED RVB). Bien sûr on trouve toutes les tailles, de la simple LED, à des anneaux de 45 LEDs, en passant par 6, 12, 24, 35...
Ces anneaux disposent de quatre connexions : deux pins pour l'alimentation, une pour DI (Digital In) et une pour DO (Digital Out) dans le cas ou l'on souhaite les chainer...
Ce genre de babioles s'anime via des Arduinos ou des SBCs. Arduino, c'est du pur code en C, ça consomme moins, mais c'est moins rigolo qu'une Single Board Computer qui dispose d'un vrai système d'exploitation avec lequel on peut jouer !
La Orange Pi Zero 2W n'est pas un foudre de guerre, mais ce n'est pas cher, il y a du Wifi (pour du headless c'est obligatoire) et on peut installer un système d'exploitation fiable. Pour utiliser les GPIOs il faut souder un connecteur, de quoi s'amuser un peu avec le fer à souder.
Le package (carte + OS) propose quelques avantages : on peut installer une version 64 bits de l'OS (bien meilleure pour ce que l'on souhaite faire), désactiver des cœurs et réduire la vitesse pour consommer moins.
Installer l'OS
Mmm... Avec la dernière version de l'OS il faut définir avec RPI-Imager les paramètres réseaux et SSH à l'avance, ce que j'ai effectué, mais je n'ai jamais réussi à parvenir à mes fins. Au bout de deux heures de tergiversations insupportables au cube, j'abandonne.
Du coup j'installe la version précédente de l'OS. Le réseau fonctionne mais ssh non... J'ai soudé un câble USB sur les pastilles pour pouvoir accéder à la pi avec un clavier, trouvé un adaptateur pour le connecteur hdmi, lancé raspi-config et activé SSH...
Tout ça, c'est vraiment pénible. Ca donne l'idée que tout est fait pour un système "avec le bureau", le clickodrome ou l'on configure tout à la souris. Moi je veux un système headless qui ne m'emmerde pas, et là ce n'est pas gagné.
Enfin bon, au bout d'un moment j'arrive à me connecter à la machine. On va installer Docker sur la machine :
> sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
> curl -fsSL https://get.docker.com -o get-docker.sh
> sudo sh get-docker.sh
> sudo systemctl enable docker
Il faut être un peu patient... La petite Raspberry n'est pas une formule 1, mais après 15 minutes on est récompensé.
Docker est présent.
Pour avoir :
une interface conviviale via le navigateur, on va installer portainer pour manipuler docker (plutôt que de manger la ligne de commande)
une liste de containers facilement installable, on va utiliser le projet suivant : https://github.com/pi-hosted/pi-hosted/tree/master
L'installation se passe avec la ligne suivante :
wget -qO- https://raw.githubusercontent.com/pi-hosted/pi-hosted/master/install_portainer.sh | bash
Éventuellement curl -fsSL https://tailscale.com/install.sh | sh
L'installation de portainer est très rapide, le script a défini que le port sera sur 9000.
Ci dessous, je me connecte à la Pi sur le port 9051 et portainer va m'aider à gérer les containers.
En bas de l'écran je vois bien que j'ai 4 CPU et 439 MB RAM, héhé !
A noter que malgré les ressources limitées, tout cela fonctionne confortablement.
L'avantage de Portainer configuré par pi-hosted c'est que l'on dispose de toute une liste d'application déjà configurées.
Copier le lien dans Settings / Settings / App Template : https://raw.githubusercontent.com/novaspirit/pi-hosted/master/template/portainer-v2-arm64.json
Ensuite dans la liste des Templates on va installer Pixel-server...
Avant d'installer le container :
créer le dossier /portainer/Files/AppData/Config/pixel-server
Passer la ligne de commande suivante :
wget -qO- https://raw.githubusercontent.com/pi-hosted/pi-hosted/master/tools/install_pixel-server.sh | bash
Dans le dossier /portainer/Files/AppData/Congi/pixel-server le script d'installation génère trois fichiers :
auth.cfg
pixelserver.cfg
user.cfg (ce fichier est vide)
Dans le fichier auth.cfg j'ai ajouté la ligne suivante :
network_allow_auth = 0.0.0.0
Et dans le fichier pixelserver.cfg j'ai ajouté les lignes suivantes :
ledcount=16
gpiopin=18
ledfreq=800000
leddma=5
ledmaxbrightness=50
ledinvert=False
ledchannel=0
striptype=RGB
## GRB
algorithm=Argon2
Et aussi une modification des droits du fichier qui semble requise :
sudo chmod 775 pixelserver.cfg
Crée un user pour Pixel-Server
Quand le container est lancé, il faut créer un utilisateur. Pour cela, avec Portainer, on ouvre une session dans la console : Containers>pixel-server>Console en sh plutôt qu'en bash.
Par exemple, si mon user password c'est brigitte / brigitte, alors ça donnera ça (pardon pour les lignes en trop, mais je cherche comme tout le monde) :
Retour dans le navigateur dans Portainer : je lance l'installation du container.
Après quelques secondes, dans la liste des containers on voit que pixel-server fonctionner.
Il est disponible sur le port 85... Mais avant d'aller sur le port il faut créer un utilisateur. Cela se passe sur la ligne de commande :
sudo docker exec -it pixel-server sh -c 'python3 createadmin.py <user> <password> >> users.cfg'
Ensuite, dans le navigateur, on peut se rendre sur le port 85, ouvrir une session et configurer l'animation :
on choisi une sequence
une vitesse
éventuellement une couleur
Et on clique en haut à droite sur le bouton Apply.
Voilà, on a fabriqué un feu arrière de vélo (à condition d'avoir choisi du rouge) en toute simplicité. Ca change d'une pile avec une résistance et une mauvaise LED. Là, nous sommes dans le futur, il ne nous manque plus qu'un peu d'IA pour parfaire le tout. Peut-être une autre fois.
Access point
On transforme la Raspberry en Access Point. Cela va faire que l'on peut se connecter "de partout" sur le réseau proposé par la Raspberry, par exemple avec le smartphone, pour configurer ou stopper le néopixel ring.
Il y a une recette de cuisine ici : https://thepi.io/how-to-use-your-raspberry-pi-as-a-wireless-access-point/ et ça peut marcher...
J'ai eu un peu de mal de mon côté et ci-dessous ce que j'ai effectué pour que cela fonctionne :
# install des paquets
sudo apt install hostapd
sudo apt install dnsmasq
# stop des services (a prirori inutile)
sudo systemctl stop hostapd
sudo systemctl stop dnsmasq
# edition
sudo nano /etc/dhcpcd.conf
# ajout des lignes à la fin
interface wlan0
static ip_address=192.168.4.1/24
nohook wpa_supplicant
# edition dnsmasq - peut être que le fichier n'existe pas
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo nano /etc/dnsmasq.conf
# ajouter
interface=wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
# editer hostpad
sudo nano /etc/hostapd/hostapd.conf
# copier
interface=wlan0
ssid=bike_server
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=MotDePasseComplexe007
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
# Editer
sudo nano /etc/default/hostapd
# Indiquer où se trouve le fichier de conf
DAEMON_CONF="/etc/hostapd/hostapd.conf"
# démasaquer le service
sudo systemctl unmask hostapd
#
sudo chown root:hostapd /etc/hostapd/hostapd.conf
# créer le groupe
sudo addgroup hostapd
# m'ajouter
sudo adduser renaud hostapd
# permissions
sudo chmod 640 /etc/hostapd/hostapd.conf
# activer au démarrage
sudo systemctl enable hostapd
sudo systemctl enable dnsmasq
# démarrer les services
sudo systemctl start hostapd
sudo systemctl start dnsmasq
Quelques mesures
UPS sans charge (auto-décharge) :
tension de départ 4.193V
après trois jours : 4.158V
Les deux batteries sont des 2600mAh.
L'alimentation du circuit ne coûte pratiquement rien en énergie. Je n'ai pas continué le test plus longtemps, on doit pouvoir tenir facilement 10 jours, peut être 30, à condition de ne rien tirer de la batterie.
Raspberry Pi 2W Access point avec le néopixel ring en mode flash, rouge
au démarrage la carte consomme jusqu'à 3W en pic, le temps du boot
ensuite la consommation avec le néopixel ring démarré est entre 0.8W et 1.374 (min / max)
la consommation totale sur une heure est d'environ 1.1W, soit 1Wh de consommation en fonctionnement
la raspberry toute seule consomme environ 0.82 Ah
avec le néopixel en mode flash rouge, on a des pics à 1.3Ah
sur un test de 37h c'est 42W qui ont été consommés, soit une consommation de 1.2Wh
avec deux batteries de 2600mAh on est à 2600*3.7*2 = 19240 soit 20Ah de capacité, soit largement 12heures (environ 14W de consommés, ce qui correspond à mes observations empiriques.
Si la batterie fait 20Wh de capacité, alors en va pouvoir fonctionner 16 heures sur la batterie. Ce qui n'est pas recommandé néanmoins, car la technologie Lithium-Ion déteste les décharge profonde : cela réduit le nombre de cycles (charges / décharges). Il vaut mieux recharger le plus souvent possible les cellules et ne pas descendre en descond de 20% de capacité.
La capacité totale de la batterie (ou du couple des batteries) est indiquée par le vendeur, mais il ne faut accorder aucune confiance aux chiffres annoncés. Un appareil tel que le Litokala fit le job pour une vingtaine d'euros, en indiquant par exemple combien d'énergie est injectée dans chaque 18650 chargée.
Certains modèles permettent de réaliser la décharge en mesurant la quantité consommée.