Accès aux ports GPIO "pérenne" ?

Vous souhaitez piloter votre framboise à partir d'une page web ? Ou mieux encore à partir d'un smartphone ou d'une tablette Android ? Venez donc visiter cette rubrique...

Modérateur : Francois

smog
Messages : 46
Enregistré le : mar. 24 nov. 2020 08:03

Accès aux ports GPIO "pérenne" ?

Message par smog » mar. 24 nov. 2020 08:26

Bonjour à tous,
Depuis longtemps branché sur Framboise314, je m'intéresse aussi au forum. J'ai appris beaucoup de choses, même si d'autres sont encore nébuleuses. En particulier la notion de droits et autorisations.
Je profite de ce message pour dire un très grand merci à François et à toutes les bonnes volontés pour l'apport inestimable que vous nous offrez. Le beau côté du WEB porté bien haut !

Je rencontre un souci à propos de l'accès aux ports GPIO. je vais essayer de faire rapide et efficace.

Je teste de petites solutions "en touriste" pour comprendre, davantage que pour une utilisation définitive (à vrai dire, commander des lampes ou du chauffage à distance ne m'apporterait pas grand-chose dans mon petit appartement ;-)
J'ai monté une petite solution sur RPi 3 basée sur le schéma suivant :
• Une interface WEB avec des images de lampes (éteintes au départ), sous lesquelles se trouvent des boutons (ON/OFF).
• Le clic sur un de ces boutons lance un script JS/AJAX qui permet de changer l'image (une lampe allumée ou éteinte suivant le cas) et d'envoyer une requête CGI vers un script CGI écrit en C, qui met les ports GPIO à 0 ou 1.
• Les ports GPIO sont reliés à de simples DELs qui simulent l'éclairage réel.

C'est assez simple mais très formateur (le CGI ne s'impose pas par rapport à d'autres solutions comme PHP mais c'est pour raisons pédagogiques, là n'est pas la question).
J'utilise la bibliothèque WiringPi en C sur Rpi 3B (Buster).

L'ensemble fonctionne bien, mais je ne comprends pas certains aspects (ou du moins j'ai besoin d'un peu d'aide pour comprendre et aller plus loin, je compte sur vous !) :

• J'ai donné les droits aux services Apache et associé l'utilisateur pi (moi) à www-data. Cela me permet d'accéder sans soucis aux dossiers www et cgi-bin. OK. Mais quid de l'accès aux ports GPIO ? J'ai fait pareil, ça fonctionne, j'ai donné les droits sur les fichiers dev/mem et dev/gpiomem pour pouvoir y accéder à ces ports (j'ai galéré avant de comprendre pourquoi l'accès était interdit à mon script CGI). Problème : dès que je redémarre le Rpi, il faut que je redonne ces droits sur la lecture/écriture des ports GPIO. Pourquoi ne sont-ils pas "mémorisés" ? Est-ce propre aux ports GPIO (parce que pas de souci avec les dossiers cgi-bin et www) ? Y-a-t-il une solution (j'ai pensé à automatiser ceci au démarrage de l'ordinateur, est-ce faisable ? est-ce une méthode souhaitable ?) Sinon, y a-t-il une autre démarche préférable pour "autoriser" durablement l'accès aux GPIO ?

• Au redémarrage, les ports GPIO reviennent à "IN" au lieu de "OUT". Est-ce possible de mémoriser et restaurer les paramètres à chaque redémarrage ? j'imagine que oui, mais je ne sais quelle démarche suivre. Ou bien une autre technique est-elle plus adaptée ?

Je vous remercie d'accorder un peu de temps à la lecture et à l'aide éventuelle que vous pourrez m'apporter !

Bonne journée à tous !

destroyedlolo
Raspinaute
Messages : 1585
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: Accès aux ports GPIO "pérenne" ?

Message par destroyedlolo » mar. 24 nov. 2020 22:06

smog a écrit :
mar. 24 nov. 2020 08:26
• J'ai donné les droits aux services Apache et associé l'utilisateur pi (moi) à www-data. Cela me permet d'accéder sans soucis aux dossiers www et cgi-bin. OK. Mais quid de l'accès aux ports GPIO ? J'ai fait pareil, ça fonctionne, j'ai donné les droits sur les fichiers dev/mem et dev/gpiomem pour pouvoir y accéder à ces ports [...] Problème : dès que je redémarre le Rpi, il faut que je redonne ces droits sur la lecture/écriture des ports GPIO. Pourquoi ne sont-ils pas "mémorisés" ?
C'est normal : ne sont pas des fichiers normaux mais de pseudo fichiers créés et gérés par le kernel. Tu devais pouvoir gérer ca en créant des règles udev (je te laisse chercher).
Par contre, c'est crade car ca donne accès a la mémoire (et donc a tous) à tout ce qui passe par ton serveur web.
La solution la plus simple serait de faire un CGI qui ferait un sudo vers un utilisateur qu'a les droits d'utiliser ces fichiers (non, pas root !).
smog a écrit :
mar. 24 nov. 2020 08:26
• Au redémarrage, les ports GPIO reviennent à "IN" au lieu de "OUT". Est-ce possible de mémoriser et restaurer les paramètres à chaque redémarrage ? j'imagine que oui, mais je ne sais quelle démarche suivre. Ou bien une autre technique est-elle plus adaptée ?
C'est aussi normal pour éviter de griller tes GPIO au démarrage.
C'est a ton programme de les initialiser correctement lors du démarrage.

A+
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Accès aux ports GPIO "pérenne" ?

Message par Bud Spencer » mer. 25 nov. 2020 09:56

Des requête Ajax qui call des cgi pour piloter les gpios …. Techniquement, c’est le pire choix que tu pouvais faire pour ce genre de chose, aussi bien en terme d'efficacité que de pérennité et en plus avec WiringPi qui est obsolète et surtout dépréciée.

Jette un coup d’œil la et . Tu vas voire à quel point les méthodes que tu utilises sont obsolètes et limitées. Il y a aujourd’hui de quoi développer des applications simples et très efficaces qui savent embarquer elles même leur propre service de publication web et qui sont en mesure de dialoguer bilatéralement et en temps réel entre elles et des client http quel qu’ils soient.

Pour l’état et la configuration des i/o, si tu veux les retrouver au démarrage, tu n’as pas d’autres choix que de les enregistrer à chaque changement (fichier, eeprom …) et de les initialiser au redémarrage.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

dyox
Raspinaute
Messages : 969
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: Accès aux ports GPIO "pérenne" ?

Message par dyox » mer. 25 nov. 2020 13:01

Bonjour,
Au redémarrage, les ports GPIO reviennent à "IN" au lieu de "OUT". Est-ce possible de mémoriser et restaurer les paramètres à chaque redémarrage ? j'imagine que oui, mais je ne sais quelle démarche suivre. Ou bien une autre technique est-elle plus adaptée ?
Oui c'est possible. Pour tout changement de configuration hardware, un seul fichier :
https://www.raspberrypi.org/documentati ... xt/gpio.md

smog
Messages : 46
Enregistré le : mar. 24 nov. 2020 08:03

Re: Accès aux ports GPIO "pérenne" ?

Message par smog » mer. 25 nov. 2020 16:07

Beaucoup de boulot ces jours pour répondre en détail, mais très rapidement, un immense merci.
Je vais regarder tout ça. Ça me rassure sur les idées que j'avais, et me fait très plaisir de voir que je peux compter sur votre aide. C'est super sympa et très encourageant !

@BudSpencer : oui, j'imagine bien, et te remercie infiniment pour ces mines d'informations que je vais décortiquer. En fait, ma solution est inadaptée (je m'en doutais bien) mais elle me permet de mettre en œuvre AJAX et CGI sur un projet concret pour voir un peu comment ça marche, plus que pour une optimisation. Mais tes liens sont un cadeau de Noël ! :idea:

Juste un truc : en C/C++ je n'avais trouvé que WiringPi pour piloter les GPIO (en fait les autres langages sont très bien, mais je souhaitais capitaliser des trucs travaillés en C). Il y en a d'autres ? Je trouve plein de bibliothèques pour Python, mais une seule pour le C...

smog
Messages : 46
Enregistré le : mar. 24 nov. 2020 08:03

Re: Accès aux ports GPIO "pérenne" ?

Message par smog » mer. 25 nov. 2020 16:10

[quote=dyox post_id=36299 time=1606305719 user_id=781]
Bonjour,

[quote]Au redémarrage, les ports GPIO reviennent à "IN" au lieu de "OUT". Est-ce possible de mémoriser et restaurer les paramètres à chaque redémarrage ? j'imagine que oui, mais je ne sais quelle démarche suivre. Ou bien une autre technique est-elle plus adaptée ?[/quote]
Oui c'est possible. Pour tout changement de configuration hardware, un seul fichier :
https://www.raspberrypi.org/documentati ... xt/gpio.md
[/quote]

Ah oui, une autre grande marche passée grâce à toi ! Merci merci !!!

PS : les BBcodes sont activés d'après les propriétés de mon compte, mais ça ne semble pas marcher... Il me dit ci-contre qu'ils sont désactivés...

dyox
Raspinaute
Messages : 969
Enregistré le : dim. 28 déc. 2014 15:28
Localisation : Le long de la côte, au dessus du pays des bigoudennes, aïe

Re: Accès aux ports GPIO "pérenne" ?

Message par dyox » mer. 25 nov. 2020 16:19

Pour les BBcodes, il faut montrer pattes blanches, soit 5 messages ; plus que 2 :mrgreen:

smog
Messages : 46
Enregistré le : mar. 24 nov. 2020 08:03

Re: Accès aux ports GPIO "pérenne" ?

Message par smog » mer. 25 nov. 2020 16:22

[quote=dyox post_id=36302 time=1606317555 user_id=781]
Pour les BBcodes, il faut montrer pattes blanches, soit 5 messages ; plus que 2 :mrgreen:
[/quote]
Plus qu'un ! ;-)

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: Accès aux ports GPIO "pérenne" ?

Message par Bud Spencer » mer. 25 nov. 2020 18:01

smog a écrit :
mer. 25 nov. 2020 16:07
Juste un truc : en C/C++ je n'avais trouvé que WiringPi pour piloter les GPIO (en fait les autres langages sont très bien, mais je souhaitais capitaliser des trucs travaillés en C). Il y en a d'autres ? Je trouve plein de bibliothèques pour Python, mais une seule pour le C...
Rassure-toi, si tu veux faire du web, tu auras toujours l’occasion d’utiliser des requête ajax notamment pour récupérer des données sur des serveurs qui ne fournissent pas de socket web ou de grpc et pour ce qui est du c, c++, ça sert toujours aussi, mais la combinaison des 2 c’est un peu has-been surtout quand on a d’autre choix possibles (ce qui n’est pas toujours le cas). Pour WiringPI je n’ai jamais été trop fan. Trop de problèmes de versioning et (comme l’avait précisé son hauteur) pas vraiment faite pour être wrapée. De toutes façon, elle est deprecated, donc a oublier pour tous nouveau projet. Si tu cherches une lib pour du bas niveau, je te recommande vivement la bcm2835 qui est à mon sens la meilleure de toutes. Sinon depuis les kernel 4.8, tu peux directement utiliser libgpiod qui a l’avantage d’être standard.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

destroyedlolo
Raspinaute
Messages : 1585
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: Accès aux ports GPIO "pérenne" ?

Message par destroyedlolo » mer. 25 nov. 2020 21:14

smog a écrit :
mer. 25 nov. 2020 16:07
Juste un truc : en C/C++ je n'avais trouvé que WiringPi pour piloter les GPIO (en fait les autres langages sont très bien, mais je souhaitais capitaliser des trucs travaillés en C). Il y en a d'autres ? Je trouve plein de bibliothèques pour Python, mais une seule pour le C...
Pourquoi une librairie ? Tu peux utiliser aussi le kernel, soit par /sys/class (déprécié) ou encore par /dev/gpiochip* qui le remplace.
Et ca, ca marche quelques soit le langage et la machine.
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

Répondre

Retourner vers « Des interfaces pour le Raspberry Pi »