Script Bouton.sh

Bonsoir, bonjour à tous

J’ai une rpi4 et j’essaie de créer un script sh afin de lire l’état d’un bouton connecté au gpio 22 (bcm15) et la masse avec une résistance entre les deux.
J’ai déjà essayé plusieurs scripts et commande, mais l’état du gpio via cat value ne change pas et je n’arrive pas à comprendre pourquoi

Via les commande
Echo 22 > export
Cat direction
In
Cat value
Le résultat est 0
J appuie sur le bouton et refait cat value
Résultat toujours 0

Ce scripts doit absolument être en .sh car il doit être porté sur la raspberry avec lineageos

Merci d’avance pour votre aide

Je m’y connais pas assez en sh pour vérifier tout ça, mais est-ce un bouton « switch » ou un bouton « Press » ?

  • Un bouton « switch » à 2 état, relevé=off et abaissé=on, la tu maintient le lien « on » sans toucher au bouton
  • Un bouton « press » à 2 état aussi, mais garde le « on » seulement si l’utilisateur garde le bouton enfoncé, soit le contact.

Je me demande car si tu ne fait pas un « cat » exactement au moment que tu presse sur un bouton de type « press », tu verra jamais le changement d’état, tandis que le type « switch » garde l’état alors la tu va capter.

Le GPIO te retourne l’état « now » et non celui du « last action », le seul moyen est d’avoir un script, par exemple en Python, qui écoute les pins et qui va ainsi détecter le changement d’état, que ce soit 1ms ou 10s. J’ai un script pour ça.

C’est un bouton « press » , j’ai fait le test avec un script py et le script fonctionne.
Les scripts que j’ai testé en sh mentionne un bouton « press »
Et le problème avec lineageos c’est que je dois passer par un sh

Bon, quand c’est un press faut faire une écoute du port GPIO, pour capter le court moment de son changement d’état, ou sinon c’est d’inposer de presser jusqu’à ce que le code sh vérifie l’état.

Ton problème ici est que le moment que tu press et le moment que tu vérifie ton état ne sont pas « sync », je connais pas exactement comment tu as monté ton tout, mais si tu vérifie à toutes les secondes, entre chaque « check » tu perd l’état, et c’est là que ton « Press » s’effectue.

Pour éviter ce problème, tu as plusieurs solution.

  • Si l’idée est de savoir quand le bouton est pressé, mais ne pas pouvoir l’écouter car c’est pris en charge par un autre processus, il faudrait alors éditer ce module qui prend en charge. Lui ajouter une code qui laisse une trace de l’action « press » jusque au moment que ton script le prenne en charge. Dans ce contexte, ton script efface la trace pour revenir à l’état « no press » au prochain scan. ALors la un script a intervalle long peut capter.
  • Si ton bouton n’est pas écouté, il faut le faire via un script, Python c’est le best et si c’est juste une question de ligne de commande, tu peux créer un script de lancement en SH pour Python, car le SH à la fin, c’est aussi une manière scripté de faire ce qu’ont peut tapper à la main.
  • Exiger l’utilisation prolongé de la touche, pour que ton scan arrive a détecter l’un des moments qui change d’état.
  • Trouver un moyen rapide pour capter le changement d’état, genre 1000 fois par secondes, car un « press » moyen est valide de 20ms à 200ms.

Et si ton bug est le démarrage de Python via un script SH…

#!/bin/bash
/usr/bin/python3 /chemin/vers/ton/script/python.py &

Si tu ajoute devant sude -E, tu garde les paramètre de ton user « pi », et non ceux de celui de « root ».

J’ai un script python qui fonctionne bien , mais dans mon cas je dois absolument trouver une solution en .sh

Quand j’ai tapé plusieurs fois la commande cat value, le bouton est rester appuyer plusieurs seconde avant et après , je suppose que l’état aurai du changer de 0 à 1 ?

Démarre ton script Python depuis le script SH, meilleur des solutions.

Avec lineageos , de l’interface Android dapres ce que j’ai lu on ne sais pas accéder au gpio, il faut passer par sysfs et le scripts python utilise des bibliothèques dans debian.

Je continue de chercher

A moin que je me trompe quand les gpio sont en « in » le seul moyen des les changer d’état est de mettre du 3v3 dessus ?

hello,

peur être plus d’info ici:

Merci mais j’ai déjà vu ce lien là et c’est en python

Bonjour,

Il est possible (à confirmer) que /sys/class fasse parti de Raspbian ? Je n’ai pas trouvé l’info si Lineageos supporte nativement les GPIO.

Si c’est pas la cas, as-tu essayé d’écrire plutôt que de lire ? Ceci permettrait de valider que les commandes dans /sys/class soit valides.

echo "22" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio22/direction
echo "1" > /sys/class/gpio/gpio22/value

Mesurer avec un voltmètre ou une installer une led, éventuellement câbler le GPIO20 sur le GPIO22

Puis essaie ceci

echo "20" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio20/direction
cat /sys/class/gpio/gpio20/value

D’autres pistes de langages ici:

https://elinux.org/RPi_GPIO_Code_Samples#sysfs.2C_part_of_the_raspbian_operating_system

A+

J’ai vu cette solution la aussi sur un autre site, jvais la tester.
Mais en python le script que j’ai testé n’utilise qu’une pin et une masse,j’ai testé et après le démarrage du pi, la pin passe en 3v donc a moin que je me trompe , il devrait y avoir moyen de le faire via sh.
J’ai aussi testé
Echo out > direction
Echo 1 > value
La pin se met en 3v et quand je connecte à la masse , la tension descend mais cat value reste sur 1, est ce normal ?

ben oui ! c’est une sortie, tu le met à un il reste a un .

et si tu initialisais ton gpio 22 a 1 en input, il devrait passer a 0 lors de l’appuie sur le bouton ? ou pas ?

D’ailleurs, je ne sais pas comment se comporte dans le temps une sortie à l’état haut (3,3V) et mise à la masse (0V) physiquement. A mon humble avis, ça sens le court-circuit sur le GPIO, il y a peut être un risque qu’il grille ?
J’espère qu’il y a à minima une résistance de protection.
Il faut savoir qu’historiquement les ports GPIO des PI n’étaient pas protégés du coup plusieurs ont grillés leurs ports GPIO par mauvaises manip. Je n’ai pas l’info si les ports GPIO des dernières version de PI sont protogés ou non ? Dans le doute je recommande de prendre qqs précautions.

A+

Quand il est en in et que je tape echo 1 > value c’est refusé

a la lecture de ce document concernant le pi4

qui permet d’avoir la liste et l’implantation des gpio et de ce document

surtout le chapitre 5.1. Overview et 5.3. Alternative Function Assignments
Et :
Raspberry Pi Documentation - Raspberry Pi OS je cite:
"Une broche GPIO désignée comme broche d’entrée peut être lue comme haute (3V3) ou basse (0V). Ceci est rendu plus facile grâce à l’utilisation de résistances internes pull-up ou pull-down. Les broches GPIO2 et GPIO3 ont des résistances de rappel fixes, mais pour les autres broches, cela peut être configuré dans le logiciel. "

ce que j’en ai compris c’est que oui il y a des résistances de protection, qu’on sait pas trop dans quelle état elles sont (!) mais qu’on peut en configurer certaines ( en up ou down )
je désespère pas de trouver,un jour, leurs valeurs …

Merci pour toute ces informations

J’ai laissé tombé avec la masse , n’ayant pas compris comment python faisait, j’ai donc mis une pin en in et l’autre en out value à 1 et biensur une résistance.

Cela fonctionne, j’ai du modifier mon câblage.

Merci encore à tous