Forum Programmation.python codes python pour faire marcher une mini télécommande sans fil (bluetooth) sur mon Raspberry pi

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
17
oct.
2023

Bonjour,
j'ai un raspberry Pi Zero 2W (RPIZ2W) equipé d'une mini camera que je souhaite actionner à distance avec ces petits "bluetooth remote shutter" aussi référencé sous le nom de "AB Shutter 3".

L'appareil a été apparié à mon RPIZ2W et il ne me reste plus qu'à créer le code (python) pour l'associer à cette tache sur mon RPIZ2W : à savoir la prise de photo (libcamera-still…).

J'ai trouvé sur un forum cette solution qui à l'air très simple (pas de téléchargement supplémentaire susceptible de planter mon RPIZ2W comme j'ai pu voir dans la majorité des cas […]) et qui apparemment marche bien (consistant à considérer l'AB Shutter" comme un clavier une touche…)

https://forums.raspberrypi.com/viewtopic.php?t=293457#p1776446

Ne connaissant pas du tout le code python, quelqu'un peut il me dire si le code est complet ou seulement partiel, si je dois l'écrire tel-quel, quels sont les "variables" que je dois changer pour l'adapter à mon cas et mon matériel? je crois par exemple comprendre que c'est à la fin après "do" entre les parenthèses que je dois écrire la commande pour la tache à effectuer… mais sur les parenthèses précédentes dois-je entrer qqchose?…

Bref ne le comprenant pas je ne sais pas trop comment l'utiliser, il n'y a que quelques lignes… et monsieur Douglas m'a gentiment répondu d'aller apprendre la programmation python!
Merci pour votre aide

  • # Oui, il y a tout

    Posté par  (Mastodon) . Évalué à 6. Dernière modification le 17 octobre 2023 à 18:37.

    Oui, ça doit marcher tel quel, et comme t'es un peu perdu je t'explique vite fait :

    import keyboard

    Ça utilise la librairie keyboard. Les fonctions et constantes commençant par keyboard sont censé venir de là (dans notre cas c'est keyboard.read_event() et keyboard.KEY_DOWN)

    Bien sûr, tu auras au préalable installé la librairie sur ton RPi avec la commande sudo pip3 install keyboard (à ne faire qu'une fois puisque c'est une installation)

    VOLUME_UP = 115

    Définition de la constante du numéro de la touche attendue.

    def do():
        print("Button was pressed")

    Définition d'une fonction. C'est cette fonction qui est appelée lors de l'appui de la touche (elle s'appelle do mais elle peut s'appeler n'importe comment c'est une fonction quoi). Je te conseille de la laisser telle quelle ne serait-ce que pour vérifier que tout marche bien. Ensuite tu complexifieras en mettant ce que tu veux faire réellement à chaque appui sur le bouton.

    while True:
        ev = keyboard.read_event()
        if ev.scan_code == VOLUME_UP and ev.event_type == keyboard.KEY_DOWN:
            do()

    Boucle infinie qui attends un événement clavier (read_event), puis qui regarde si c'est la bonne touche et un appui (il y a un autre événement quand on lâche la touche qu'on ne veut pas ici) : elle appelle do. Pour info en python les boucle et autre if n'ont pas d'accolade, c'est l'indentation qui défini la portée des instructions.

    Tu mets tout ça tel quel dans un fichier demo.py par exemple (attention, ne le nomme surtout pas keyboard.py ça foutra en l'air l'import) et tu l'exécutes par sudo python3 demo.py (il faut être root car tu interceptes le clavier).

    C'est censé afficher "Button was pressed" à chaque fois que tu appuies sur ton bouton.

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

    • [^] # Re: Oui, il y a tout

      Posté par  . Évalué à 2.

      Un grand merci pour cette aide et le temps passé pour les explications très claires.

      Je vais suivre tes conseils et le faire tel-quel dans un premier temps pour voir si le "button was pressed" marche; ensuite on vera pour l'action réelle à effectuer sur l'appui du button…

      J'ai un peu commencé à regarder, me suis un peu inquiété d'avoir à ré-installer des trucs du style
      python3-pip a priori ca marche toujours (mais faudra que je vois si je peux allouer plus de mémoire au cma pour améliorer les performances en mode rafale notamment…)

      prochaine étape création de button.py avec vim button.py je crois!? sur la racine alors…
      et test pour voir concrètement comment ca marche l'execution (sudo python3 button.py)

  • # Echec du test...

    Posté par  . Évalué à 1.

    Bonjour,

    Si proche du but après tout ces problèmes d'installation…
    Comme je l'ai dit dans le précédent commentaire, j'ai vraiment l'impression que le RPIZ2W est "sous-dimensionné" pour la camera ARDUCAM Imx519, et que l'ensemble est très "instable"…

    la commande "sudo pip3 install keyboard" ne marchant pas j'ai du faire qq check
    "sudo apt install python3" retournant deja installé OK […]
    du coup j'ai fait "sudo apt install python3-pip" qui a conduit au téléchargement de fichiers supplémentaires et permis finalement l'installation du "keyboard"…

    pour la création du programme(fichier) python j'ai tâtonné également avec les commandes ….
    Finalement "touch" button.py pour créer et "nano" button.py pour l'écrire…

    une fois tous les petits problèmes réglés "sudo python3 button.py" faisait systématiquement planter le système… non réponse et déconnection du RPI (user@raspberrypi.local) sur mon invite de commande
    j'ai après avoir du me reconnecter en ssh à chaque fois j'ai essayé
    chmod +x button.py qui a eu pour conséquence de faire passer mon fichier en vert sur le listing… sans changer le résultat sur "sudo python3 button.py"…

    du coup le truc c'est que la prise de photo ne marche plus "camera not available"…
    écœuré, saoulé…

    • [^] # Re: Echec du test...

      Posté par  (Mastodon) . Évalué à 4. Dernière modification le 19 octobre 2023 à 08:17.

      Dis-toi que si tout était simple, informaticien ne serait pas un métier ;) Ce que je dis à qui veut l'entendre c'est que en informatique rien n'est compliqué, mais la difficulté vient de l'entassement de petits trucs (pas compliqués en soit) qui fait que au final le système est complexe.

      sudo apt install python3-pip

      Oui, pip est un outil comme un autre, il faut qu'il soit installé et en effet c'est pas toujours le cas par défaut. Tu as fait ce qu'il fallait.

      pour la création du programme(fichier) python j'ai tâtonné également avec les commandes

      Linux est un nouveau système pour toi, il te faut tout apprendre. C'est long et fastidieux, mais ensuite quelle efficacité tu y trouveras ! Courage :)

      sudo python3 button.py faisait systématiquement planter le système

      Là on rentre dans le dur :) La première idée que j'ai c'est que le module keyboard accède à un clavier… inexistant ! Peux-tu essayer en branchant un clavier USB sur ton RPi pour voir si ça change de comportement ?

      chmod +x button.py

      Allez, petite explication sur ce que tu as fait et pourquoi ça n'a rien résolu.

      Si tu fais ls tu peux voir les fichiers de ton répertoire (tu dois le savoir je pense) et si tu fais ls -l tu as quelques détails supplémentaires sur les fichiers, comme la taille, la date, et une suite de trucs style -rw-r--r--. C'est une description des droits sur ce fichier, qui a le droit (comme chantait le poète) de faire quoi.

      Ça se lit par paquet de 3 (et en écrivant ceci je vois un tout premier - que je sais même pas à quoi il sert, alors oublions-le). Il y a 3 paquets de 3 caractères.

      Dans un paquet :

      • le premier caractère est le droit en lecture ('r' si tu as le droit de lecture '-' si tu n'as pas le droit)
      • le second caractère est le droit en écriture ('w' si tu as le droit de lecture '-' si tu n'as pas le droit)
      • le troisième caractère est le droit en exécution ('x' si tu as le droit de lecture '-' si tu n'as pas le droit)

      Et les paquets sont :

      • les droits du propriétaire
      • les droits des utilisateurs dans le même groupe que le propriétaire
      • les droits des autres utilisateurs

      Dans mon tout premier exemple on a rw-r--r-- c'est à dire que moi j'ai le droit de lire et écrire le fichier (mais pas de l'exécuter), ceux de mon groupe juste de le lire, et le reste du monde juste de le lire également.

      En ajoutant un chmod +x je rends le fichier exécutable (ce qui pour un fichier texte ne sert à rien en fait) et du coup je vois maintenant rwxr-xr-x.

      Ça ne sert à rien parce que quand tu lances la commande python3 demo.py (avec ou sans sudo ça importe peu pour l'explication), l'exécutable c'est bien python, qui va aller lire le fichier demo.py. Et il a juste besoin des droits en lecture.

      Tu peux t'amuser à faire des chmod +x et chmod -x et faire les ls -l à chaque fois pour bien voir la différence.

      (J'anticipe quelques éventuels commentaires : oui on peut en fait rendre ce fichier directement exécutable, mais ne compliquons pas les choses et restons-en là).

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

      • [^] # Re: Echec du test...

        Posté par  (Mastodon) . Évalué à 4.

        La première idée que j'ai c'est que le module keyboard accède à un clavier… inexistant !

        Pour voir si ça peut venir de là (et apprendre encore et encore…)

        Sur la page du module keyboard je vois écrit : To avoid depending on X, the Linux parts reads raw device files (/dev/input/input*) but this requires root.

        Du coup, avec et sans clavier USB branché, fais un ls -l /dev/input/input* pour voir ce qu'il s'y passe. Ça peut expliquer des choses…

        En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # re-essais

    Posté par  . Évalué à 2.

    Merci pour l'investissement les explications et les encouragements,
    Je vais essayé de faire un petit retour sur ce que j'ai pu essayer et voir avec le peu de temps que j'ai eu ce soir… Bon:
    ls -l /dev/input/input* = ls: cannot access '/dev/input/input*': No such file or directory
    ls /dev/input = mice
    ls /dev/input (BT shutter allumé) = mice event0 (il me semble que j'avais plus de trucs quand j'ai checké cette commande il y a quelques jours, en tous cas pas de keyboard ici!?)
    re tentative d'installation du keyboard (bien plus tard)
    sudo pip3 install keyboard = Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
    Requirement already satisfied: keyboard in /usr/local/lib/python3.9/dist-packages (0.13.5)
    sinon ls -l /dev/input =
    total 0
    crw-rw---- 1 root input 13, 64 Oct 19 18:22 event0
    crw-rw---- 1 root input 13, 63 Oct 18 20:17 mice
    check sur le bluetooth devices OK (=Device 54:98:0B:BF:BE:F0 AB shutter3)
    du coup par la suite j'ai essayé de suivre une autre procédure (qui m'a l'air assez proche , mais non plus avec le keyboard mais avec evdev et les "inputs" du coup…) expliquée ici
    https://helloraspberrypi.blogspot.com/2020/06/detect-bluetooth-remote-shutter-ab.html
    qui m'a mené un peu plus loin…
    sudo apt install input-utils = OK mais command lsinput ne marche pas comme dans la demo
    sudo apt install evdev = successffuly installed
    du coup j'essaye cet autre programme python dans pyABS3.py (touch , nano etc une hésitation dans la synthaxe du fichier - espace ou pas apres print?)
    mais la commande python3 pyABS3.py a renvoyé quelque chose =
    device /dev/input/event0, name "AB shutter3", phys "b8:27:eb:71:5b:7c"
    (comme dans la démo) du coup j'essaye le clicker (mon BT ABShutter3) et la pas de réponse immédiate; après un certain moment:
    Traceback (most recent call last):
    File "/home/lapor/pyABS3.py", line 11, in
    for event in ABShutter3.read_loop():
    File "/usr/local/lib/python3.9/dist-packages/evdev/eventio.py", line 46, in read_loop
    for event in self.read():
    File "/usr/local/lib/python3.9/dist-packages/evdev/eventio.py", line 71, in read
    events = _input.device_read_many(self.fd)
    OSError: [Errno 19] No such device

    • [^] # Re: re-essais

      Posté par  (Mastodon) . Évalué à 4.

      Ne t'éparpille pas !

      ls -l /dev/input/input* = ls: cannot access '/dev/input/input*': No such file or directory

      Je t'ai peut-être raconté une connerie, même chez moi à l'instant où je tape, j'ai pas de input mais bien des event0, event1, event2

      re tentative d'installation du keyboard (bien plus tard)

      Tu n'installes pas un keyboard, tu installes une librairie python de manipulation de keyboard. Elle était déjà installée, donc ça n'a rien fait. C'est complètement indépendant de la présence d'un keyboard ou pas. Le keyboard, c'est le kernel Linux qui s'en occupe (tous les drivers nécessaires sont présents dans le kernel, il se débrouille comme un grand).

      ls /dev/input (BT shutter allumé) = mice event0 (il me semble que j'avais plus de trucs quand j'ai checké cette commande il y a quelques jours, en tous cas pas de keyboard ici!?)

      C'est bien dans event0 que ça va se passer.

      Du coup on va la jouer simple, choper tous les événements qu'on voit passer. Une fois ton bouton associé en BT, lances ce script et clique sur le bouton :

      from evdev import InputDevice
      
      device = InputDevice('/dev/input/event0')
      
      print(device)
      
      for event in device.read_loop():
         print(f"t={event.type}")
         print(f"v={event.value}")
         print(f"c={event.code}")
         print('---')

      après un certain moment: Traceback (most recent call last) [...]

      Bon on dirait que le device a disparu, style désassociation BT ? Bon, on regardera ça après, un problème à la fois :)

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # code pyABS3.py

    Posté par  . Évalué à 2. Dernière modification le 20 octobre 2023 à 09:07.

    from evdev  import InputDevice, categorize, ecodes
    
    ABShutter3 = InputDevice('/dev/input/event0')
    
    EV_VAL_PRESSED = 1
    EV_VAL_RELEASED = 0
    BTN_SHUTTER = 115
    
    print(ABShutter3)
    
    for event in ABShutter3.read_loop():
        if event.type == ecodes.EV_KEY:
            if event.value == EV_VAL_PRESSED:
                if event.code == BTN_SHUTTER:
                     print('---')
                     print('Shutter3 pressed')
                     print(event)
  • # Suite des tests

    Posté par  . Évalué à 1. Dernière modification le 20 octobre 2023 à 21:06.

    alors OK nouveau script dans scriptest.py

    je le fais lire avec sudo python3 scriptest.py

    retour immediat: device /dev/input/event0, name "AB Shutter3", phys "b8:27:eb:71:5b:7c"

    appui sur le button BT Shutter retourne a chaque clic: (3 series de valeurs séparées par --- (j'arrive pas à le mettre en forme tel qu'il m'apparait sur l'invite de commande dans le texte ici)

    t=4
    v=786666
    c=4
    ---
    t=1
    v=1
    c=114
    ---
    t=0
    v=0
    c=0
    ---
    

    Là il y a une réponse au "lancement de programme"
    Là il y a une réponse (premiere fois) au clic sur mon BT shutter!…

    • [^] # Re: Suite des tests

      Posté par  (Mastodon) . Évalué à 4.

      Ça me plaît ça :

      t=1
      v=1
      c=114
      

      Du coup tu reprends tes essais du tout début (le script avec "Button was pressed") sauf que tu mets 114 comme valeur dans le script.

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

      • [^] # Re: Suite des tests

        Posté par  . Évalué à 1.

        users@raspberrypi:~ $ python3 button.py (modifié just avec la valeur 114)
        Traceback (most recent call last):
        File "/home/lapor/button.py", line 9, in
        ev = keyboard.read_event()
        File "/usr/local/lib/python3.9/dist-packages/keyboard/init.py", line 924, in read_event
        hooked = hook(queue.put, suppress=suppress)
        File "/usr/local/lib/python3.9/dist-packages/keyboard/init.py", line 461, in hook
        append(callback)
        File "/usr/local/lib/python3.9/dist-packages/keyboard/generic.py", line 67, in add_handler
        self.start_if_necessary()
        File "/usr/local/lib/python3.9/dist-packages/keyboard/_generic.py", line 35, in start_if_necessary
        self.init()
        File "/usr/local/lib/python3.9/dist-packages/keyboard/
        init_.py", line 196, in init
        _os_keyboard.init()
        File "/usr/local/lib/python3.9/dist-packages/keyboard/_nixkeyboard.py", line 113, in init
        build_device()
        File "/usr/local/lib/python3.9/dist-packages/keyboard/_nixkeyboard.py", line 109, in build_device
        ensure_root()
        File "/usr/local/lib/python3.9/dist-packages/keyboard/_nixcommon.py", line 174, in ensure_root
        raise ImportError('You must be root to use this library on linux.')
        ImportError: You must be root to use this library on linux.

        Sur l'installation de ma librarie keyboard j'avais keyboard in /usr/local/lib/python3.9/dist-packages (0.13.5), du coup le probleme ne vient-il pas de la premiere ligne import keybord : introduire un From ou mettre un chemin d'acces?

        • [^] # Re: Suite des tests

          Posté par  (Mastodon) . Évalué à 4. Dernière modification le 21 octobre 2023 à 13:39.

          ImportError: You must be root to use this library on linux.

          Souviens-toi, il te faut faire sudo python3 button.py parce que ça attaque directement des périphériques système :)

          En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # Suite des tests

    Posté par  . Évalué à 1.

    J'y comprend RIEN!!!!!!!! quand je parlais "d'instabilité" du système […] lol

    sudo python3 button.py = pas de réponse /blocage

    je me ré-oriente sur l'autre programme (evdev … pyABS3.py dans lequel j'ai également modifié la valeur 114)

    sudo python3 pyABS3.py = gros paragraphe d'erreur avec notamment "no such file in directory"

    je re-essaye la commande lsinput (qui ne marchait pas) et là bim:

    /dev/input/event0
    bustype : BUS_BLUETOOTH
    vendor : 0x5ac
    product : 0x22c
    version : 283
    name : "AB shutter3"
    phys : "b8:27:eb:71:5b:7c"
    uniq : "54:98:0b:bf:be:f0"
    bits ev : EV_SYN EV_KEY EV_MSC

    derriere je re-essaye sudo python3 pyABS3.py (qui ne marchait pas il y a une minute) et là bim réponse du lancemant de programme OK
    device /dev/input/event0, name "AB shutter3", phys "b8:27:eb:71:5b:7c"

    j'appuie sur le clicker AB SHUTTER3 et là BINGO

    Shutter3 pressed

    event at 1697888681.629218, code 114, type 01, val 01

    Shutter3 pressed

    event at 1697888689.987540, code 114, type 01, val 01

    Shutter3 pressed

    event at 1697888697.805622, code 114, type 01, val 01

    je reviens vers mon invite de commande et là après mes lignes shutter pressed
    j'ai à nouveau:

    Traceback (most recent call last):
    File "/home/lapor/pyABS3.py", line 11, in
    for event in ABShutter3.read_loop():
    File "/usr/local/lib/python3.9/dist-packages/evdev/eventio.py", line 46, in read_loop
    for event in self.read():
    File "/usr/local/lib/python3.9/dist-packages/evdev/eventio.py", line 71, in read
    events = _input.device_read_many(self.fd)
    OSError: [Errno 19] No such device

    Avec un arret du programme retour à users@raspberrypi: ~$

    je relance le programme : CA MARCHE… mais le même message d'erreur ré-apparait après un temps d'inactivité et le programme s'arrète avec toujours un retour sur users@raspberrypi: ~$

    Il SEMBLE qu'on avance un peu mais dans l'objectif du projet je vois de nouveaux problèmes
    Il faut que ce programme soit actif à l'allumage du PI (le module est concu pour être autonome et opéré dans la nature loin de mon laptop et d'une éventuelle session ssh pour lancer le programme
    Par ailleurs celui-ci ne doit pas se désactiver après 1 minute du coup
    et il doit activer la caméra et non plus simplement écrire shutter PRESSED (camera not available)

    • [^] # Re: Suite des tests

      Posté par  (Mastodon) . Évalué à 4. Dernière modification le 21 octobre 2023 à 20:33.

      Bon, à distance ça commence à être compliqué de te donner des conseils, mais tu vois que en insistant, en simplifiant au maximum (une chose à la fois comme je dis toujours), en procédant étape par étape tu dois arriver à faire ce que tu veux.

      "La route est longue mais la voie est libre" (elle est pas de moi).

      • Pour le démarrage automatique c'est pas un problème, une fois que tu auras un script qui marche tu pourras en faire un service systemd (premier résultat de ma recherche Google, je te laisse regarder tout ça mais il n'y a pas spécialement de piège autre que le fait qu'il faut absolument qu'il soit exécuté en root, donc un service système et pas user)
      • Pour la stabilité, c'est quand même curieux cette affaire, regarde avec dmesg si t'as des messages particuliers lors de la déconnexion (à première vue je soupçonne un truc autour de l'économie d'énergie qui fait qu'il se déconnecte)

      Bon courage :)

      En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # Bonjour

    Posté par  . Évalué à 3.

    Encore un grand merci pout ton aide, j'aurais pas pu avancer comme ca sans toi! :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.