Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
openatelier:projet:sampler_puredata_pour_raspberry_pi_sans_ecran [2025/05/25 09:58] cyril |
openatelier:projet:sampler_puredata_pour_raspberry_pi_sans_ecran [2025/05/26 11:45] (Version actuelle) cyril [Lancement automatique du script python au démarrage du Raspberry Pi] |
||
---|---|---|---|
Ligne 73: | Ligne 73: | ||
ChasetheDevil = Button(13) #désigne la broche GPIO 13, l'active et lui donne un nom | ChasetheDevil = Button(13) #désigne la broche GPIO 13, l'active et lui donne un nom | ||
President = Button(21) #désigne la broche GPIO 21, l'active et lui donne un nom | President = Button(21) #désigne la broche GPIO 21, l'active et lui donne un nom | ||
- | mixer.pre_init(44100,-16,2, 2048) | + | mixer.pre_init(44100,-16,2, 2048) #configure les différents paramètres de alsa pour lire le fichier son. En deça de 2048, il y a des décrochages et la lecture des fichiers n'est pas fluide. |
mixer.init() #créé une instance de la classe "mixer" de la bibliothèque "Pygame" | mixer.init() #créé une instance de la classe "mixer" de la bibliothèque "Pygame" | ||
Ligne 93: | Ligne 93: | ||
President.when_pressed = pres #lorsque le boutton auquel est assigné President est pressé, cela lance la fonction "pres" | President.when_pressed = pres #lorsque le boutton auquel est assigné President est pressé, cela lance la fonction "pres" | ||
- | pause() | + | pause() #mets le script en pause, il attend donc une nouvelle instruction en permanence |
</code> | </code> | ||
+ | |||
+ | Prochaine étape: faire en sorte que ce script se lance automatiquement au démarrage du Raspberry Pi! | ||
+ | |||
+ | ====Lancement automatique du script python au démarrage du Raspberry Pi ==== | ||
+ | |||
+ | On va utiliser la méthode "systemd" (si j'ose dire...) qui gère le lancement de "services" au démarrage du Raspberry Pi (en gros...). | ||
+ | |||
+ | Tout est décrit ici: [[https://www.youtube.com/watch?v=kQjnesqBMzQ]] et tout se passera en ligne de commande. | ||
+ | |||
+ | * On crée un nouveau fichier pour le nouveau service: | ||
+ | |||
+ | <code> sudo nano /etc/systemd/system/waxmonde.service</code> -> vous pouvez donner le nom du service que vous voulez bien entendu... | ||
+ | |||
+ | * Dans nano, on édite le fichier avec ce qui suit: | ||
+ | <code> [Unit] | ||
+ | Description=Lecteur de samples Waxmonde v1.0 | ||
+ | After=alsa-restore.service | ||
+ | [Service] | ||
+ | ExecStart=/usr/bin/python3 /home/waxmonde/samples/gpio_music_box08.py | ||
+ | WorkingDirectory=/home/waxmonde/samples | ||
+ | User=waxmonde | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | </code> | ||
+ | |||
+ | Vous pouvez retrouver les explications sur les différentes sections du code sur les internets. | ||
+ | |||
+ | Il y a par exemple la documentation officielle ici: [[https://systemd.io/]] | ||
+ | |||
+ | Et la documentation pour systemd sur debian ici (PatchboxOs étant basée sur Debian) : [[https://wiki.debian.org/systemd]] | ||
+ | Vous pouvez sauvegarder votre fichier, sachant qu'il est possible qu'il y ait des réglages à faire ultérieurement. | ||
+ | |||
+ | * À la suite de quoi, on donne les droits qu'il faut à ce fichier: | ||
+ | <code> sudo chmod 644 /etc/systemd/system/waxmonde.service</code> | ||
+ | Vous pouvez vous référer au man de chmod pour plus de détails sur cette commande. | ||
+ | |||
+ | * On démarre le service: | ||
+ | |||
+ | <code> sudo systemctl start waxmonde.service</code> | ||
+ | systemctl est la commande qui permet de gérer les lancements, arrêts, etc. des différents services à chaud. | ||
+ | |||
+ | * On rend le servie actif au démarrage: | ||
+ | |||
+ | <code> sudo systemctl enable waxmonde.service</code> | ||
+ | |||
+ | * On vérifie le statu du service, à savoir s'il a été lancé, si cela a fonctionné et si il est actuellement en route ou à l'arrêt: | ||
+ | |||
+ | <code> sudo systemctl status waxmonde.service</code> | ||
+ | |||
+ | Dans notre cas, on avait ceci en réponse: | ||
+ | |||
+ | <code>× waxmonde.service - Lecteur de samples Waxmonde v1.0 | ||
+ | Loaded: loaded (/etc/systemd/system/waxmonde.service; enabled; preset: enabled) | ||
+ | Active: failed (Result: exit-code) since Sun 2025-05-25 13:18:30 CEST; 8h ago | ||
+ | Duration: 19.682s | ||
+ | Process: 585 ExecStart=/usr/bin/python3 /home/waxmonde/samples/gpio_music_box08.py (code=exited, status=1/FAILURE) | ||
+ | Main PID: 585 (code=exited, status=1/FAILURE) | ||
+ | CPU: 1.999s | ||
+ | |||
+ | May 25 13:18:29 patchbox python3[585]: pygame 2.1.2 (SDL 2.26.5, Python 3.11.2) | ||
+ | May 25 13:18:29 patchbox python3[585]: Hello from the pygame community. https://www.pygame.org/contribute.html | ||
+ | May 25 13:18:29 patchbox python3[585]: Traceback (most recent call last): | ||
+ | May 25 13:18:29 patchbox python3[585]: File "/home/waxmonde/samples/gpio_music_box08.py", line 9, in <module> | ||
+ | May 25 13:18:29 patchbox python3[585]: mixer.init() #créé une instance de la classe "mixer" de la b> | ||
+ | May 25 13:18:29 patchbox python3[585]: ^^^^^^^^^^^^ | ||
+ | May 25 13:18:29 patchbox python3[585]: pygame.error: ALSA: Couldn't open audio device: Unknown error 524 | ||
+ | May 25 13:18:30 patchbox systemd[1]: waxmonde.service: Main process exited, code=exited, status=1/FAILURE | ||
+ | May 25 13:18:30 patchbox systemd[1]: waxmonde.service: Failed with result 'exit-code'. | ||
+ | May 25 13:18:30 patchbox systemd[1]: waxmonde.service: Consumed 1.999s CPU time. | ||
+ | lines 1-18/18 (END) | ||
+ | </code> | ||
+ | |||
+ | Ce qui signifie que le service a été lancé, que le script s'est lancé mais qu'il a rencontré une erreur. | ||
+ | |||
+ | L'erreur ici est que alsa ne sait pas sur quel carte son se lancer, alors que le script lorsqu'il est lancé à la main, en ssh, s’exécute sans soucis. | ||
+ | |||
+ | La question a été posée sur le forum de la distribution PatchboxOs, utilisée ici sur le raspberry pi: | ||
+ | |||
+ | |||
+ | [[https://community.blokas.io/t/how-to-start-a-python-script-at-the-boot-of-patchboxos/5852]] | ||
+ | |||
+ | Et par ce biais des explications ont été trouvées ici: | ||
+ | |||
+ | |||
+ | [[https://forums.raspberrypi.com/viewtopic.php?t=360496]] | ||
+ | |||
+ | |||
+ | |||
+ | Il faut donc créer un fichier de conf dans /etc/, le tout en sudo donc: | ||
+ | |||
+ | Dans un premier temps on va chercher la bonne dénomination de carte son à utiliser par alsa. La commande est la suivante (pas besoin d'être sudo): | ||
+ | aplay -l | ||
+ | <code> | ||
+ | **** List of PLAYBACK Hardware Devices **** | ||
+ | card 0: vc4hdmi [vc4-hdmi], device 0: MAI PCM i2s-hifi-0 [MAI PCM i2s-hifi-0] | ||
+ | Subdevices: 1/1 | ||
+ | Subdevice #0: subdevice #0 | ||
+ | card 1: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones] | ||
+ | </code> | ||
+ | |||
+ | Dans le fichier de conf que l'on va créer, il faudra donc spécifier la carte son ainsi que la connectique (device) qui nous intéressent avec "hw:1,0". Ici, le premier chiffre est pour la carte utilisée, le second, après la virgule, est pour le 'device' utilisé. Il pourrait y avoir plusieurs devices par carte dans le cas d'une carte son externe avec entrées et sorties multiples. | ||
+ | <code>sudo touch /etc/asound.conf</code> <- la commande sudo permet d'avoir les droits d'écriture, la commande touch créé le fichier dont le nom est précisé après avec son emplacement, ici /etc/asound.conf. C'est à cet endroit que alsa viendra chercher la configuration qui va bien pour lui permettre de diffuser la lecture de fichiers son. | ||
+ | |||
+ | <code>sudo nano /etc/asound.conf</code> <- la commande nano ouvre un éditeur de texte basique mais puissant en ligne de commande et permet de mettre ce qui suit dans le fichier asound.conf: | ||
+ | |||
+ | <code> pcm.!default { | ||
+ | type asym | ||
+ | playback.pcm { | ||
+ | type plug | ||
+ | slave.pcm "hw:1,0" | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | On sauvegarde le fichier, dans nano il faut faire : ctrl+O, puis entrée, puis ctrl+X | ||
+ | On peut rebooter le raspberry pi (sudo reboot) | ||
+ | |||
+ | |||
+ | On teste sans se connecter en ssh (au cas où et puisque c'est comme cela que cela fonctionnera en production) en appuyant sur un des boutons pour déclencher la lecture d'un fichier son. | ||
+ | |||
+ | |||
+ | On est content.e et on va fêter ça dans un endroit sympa comme son jardin puisqu'on a du linge à étendre!!! |