Partage
  • Partager sur Facebook
  • Partager sur Twitter

Carte micro:bit et Python

Blutooth

    23 juin 2022 à 17:23:29

    Bonjour,

    Voilà, j'essaye de faire une sorte de télécommande avec une carte micro:bit, en passant par Python.

    Contrainte : Le prgm sera exécuté sur téléphone portable, avec Android 4.4 (kitkat) (ou ultérieur, mais c'est la plus vieille qu'il aura à utiliser). (Seule contrainte mais de taille.)

    L'idée serait de mettre dans la carte un script qui, en cas d'entrée de l'utilisateur, envoie un message au téléphone, qui affiche une image en fonction du message.
    Par exemple, on pourrait faire défiler un diaporama avec.

    1 - Le code de la carte, ça va. Je l'ai fait en Makecode Blocks, c'est le plus intuitif et je crois que c'est aussi le seul à pouvoir coder avec l'extension Blutooth.
    2 - L'affichage des images, ça va aussi, sauf que je n'ai encore jamais utilisé Python sur Android, je ne sais pas s'il y a des trucs à savoir (comment gérer le chemin d'accès, autorisations spéciales à donner...). Au passage, je ne sais pas trop quelle bibliothèque utiliser... PIL ?
    3 - Le problème, c'est la jonction entre la carte et le téléphone. Je sais comment coupler les deux ensemble par Blutooth, mais après comment faire pour que Python puisse lire les données envoyées ? Quelle est la rédaction ? Est-ce possible ?

    Je voudrais qqch un peu comme ça :

    from ??bluetooth?? import ??je-sais-pas-quoi??
    
    N = 0
    
    while True:
        if ??donnée_reçue?? == 1:
            N += 1
        elif ??donnée_reçue?? == 2:
            N -= 1
        afficher_image "image" + str(N) + ".png"
    Enfait, je suis un peu perdu, parce que je ne sais pas quelle application télcharger, je ne sais pas quelles sont les spécificités de chacunes etc.
    Ducoup peut-être que le problème a déjà été évoqué mais que je l'ai raté...

    Pourriez-vous m'aider ?

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2022 à 18:33:45

      voir les résultats de https://www.google.com/search?q=bluetooth+serial+android+python 

      dont https://gist.github.com/tito/7432757 (mais lui envoi des données depuis android, il suffit (en principe) d'utiliser le recv_stream qui a définit

      • Partager sur Facebook
      • Partager sur Twitter
        23 juin 2022 à 19:02:00

        Mmmmmm...

        Merci pour votre réponse.

        Je suis en train de regarder, j'ai quand même quelques questions :

        1) Lequel des deux scripts me recommandez-vous d'utiliser ?

        2) Qu'entendez-vous précisément par :

        umfred a écrit:

        il suffit (en principe) d'utiliser le recv_stream qui a définit

        ?

        Qqch comme 

        if __name__ == '__main__':
            recv_stream, send_stream = get_socket_stream('linvor')
            recv_stream.read()
            recv_stream.flush()

        ?

        3) Quelle application permet d'utiliser la bibli Pyjnius ?

        • Partager sur Facebook
        • Partager sur Twitter
          24 juin 2022 à 12:28:19

          je ne connait pas le module mais recv_stream c'est pour recevoir des données, donc une fois récupéré, tu peux regarder ce que tu as reçu.

          En fouinant un peu, j'ai trouvé ça https://stackoverflow.com/a/29747682 ; ce qui pourrait donner un truc comme ça (non testé)

          buff_read=BufferedReader(recv_stream)
          if buf_read.ready():
              try:
                  stream = buff_read.readLine()
              except IOException as e:
                  print "IOException: ", e.message
              except jnius.JavaException as e:
                  print "JavaException: ", e.message
              except:
                  print "Misc error: ", sys.exc_info()[0]
          
              if stream == 1:
                  // do something
              elif stream == 2:
                  // do other thing
          



          • Partager sur Facebook
          • Partager sur Twitter
            28 juin 2022 à 17:12:33

            Désolé d'avoir mis quelques jours à répondre, j'ai eu quelques problèmes pour installer Pydroid. Après il m'a dit que je devais attendre 24h avant de pouvoir envoyer un deuxième message alors que j'avais rien envoyé (????!!!!:colere:)

            J'ai exécuté le premier code d'ici (que vous m'avez conseillé ci-dessus) (sans trop le modifier pour voir déjà si ça marche) mais j'ai une erreur... 

            SystemError: NULL result without error in PyObject_Call

            Et il ne dit pas à quelle ligne ça plante dans le fichier (les erreurs affichées concernent le code de l'appli elle-même, pas du fichier)...

            Sur Internet j'ai trouvé comment résoudre le pb sur QPython mais pas sur Pydroid...

            Quant au deuxième code, celui qui utilise kivy, il n'a pas trop aimé le copié-collé et me met des syntaxError partout donc je suis en train de le modifier mais ça prend du temps.

            • Partager sur Facebook
            • Partager sur Twitter
              28 juin 2022 à 17:17:52

              @Import__Hello__Inconnu Bonjour, je viens de retirer des spams votre dernier message, si cela arrive encore vous pouvez poster dans ce sujet Si votre message est considéré comme spam

              • Partager sur Facebook
              • Partager sur Twitter
                28 juin 2022 à 18:18:35

                D'accord merci beaucoup !

                Effectivement ce n'est pas la première fois qu'il me fait le coup, j'y penserai la prochaine fois :D

                -
                Edité par Import__Hello__Inconnu 28 juin 2022 à 18:22:29

                • Partager sur Facebook
                • Partager sur Twitter
                  28 juin 2022 à 18:37:21

                  Import__Hello__Inconnu a écrit:

                  Sur Internet j'ai trouvé comment résoudre le pb sur QPython mais pas sur Pydroid...

                  Et cette solution n'est pas valable sur Pydroid ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 juin 2022 à 20:57:17

                    Enfait ils disaient d'ajouter

                    #qpy:kivy

                    au début du prgm mais ça c'est propre à qpython... Ducoup j'ai (juste) réfléchis et mis l'équivalent sur pydroid... Càd que j'ai importé kivy même si ça sert à rien :-° et ça marche :p.

                    Il arrive aussi à détecter la carte, mais pas à se connecter avec :

                    jnius.jnius.JavaException: JVM exception occurred: read failed, socket might closed or timeout, read ret: -1

                    J'ai aussi téléchargé Serial Bluetooth Terminal et j'ai parfois la même erreur (et sinon, soit j'ai une autre erreur, soit ça marche, alors que sur python jamais).

                    Enfin, la carte réagit comme si elle était connectée (elle fait du bruit comme prévu), donc le début de l'appairage se passe bien mais pas la fin...

                    Ce que je ne comprend pas c'est que parfois il suffit juste de réessayer pour que ça marche... Pourtant je ne change rien entre les deux tests...

                    Je continue de chercher de mon côté, si vous avez une idée d'où vient ce bug...



                    PS : Pour l'instant j'ai ça, je regarde et je vous dis.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 juin 2022 à 10:18:34

                      Comme le message l'indique soit port fermé soit timeout. à voir si tu peux régler ce timeout pour l'augmenter un peu

                      -
                      Edité par umfred 29 juin 2022 à 10:18:44

                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 juin 2022 à 21:02:54

                        J'avoue que je bloque un peu...

                        D'après ce site, le service UART a comme UUID "6E400001B5A3F393E0A9E50E24DCCA9E", donc j'ai modifié ça par rapport au code originel. Mais après, pour lire et écrire, il faut "6E400002B5A3F393E0A9E50E24DCCA9E" et "6E400003B5A3F393E0A9E50E24DCCA9E", mais bon je suppose que ça c'est automatique ?

                        Import__Hello__Inconnu a écrit:

                        PS : Pour l'instant j'ai ça, je regarde et je vous dis.

                        Et bien je vous dis que ça marche pas... :( :euh:

                        D'après le début de la discussion sur ce même site, ça pourrait être une erreur d'UUID, mais pourtant maintenant j'ai le bon alors ?

                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 juin 2022 à 10:54:33

                          est-ce que à côté de ton script, tu as un fichier dans lequel tu as défini les autorisations requises par ton application ? 

                          (a priori il faut le plugin pydroid permissions pour ça (https://play.google.com/store/apps/details?id=ru.iiec.pydroidpermissionsplugin&hl=fr&gl=US

                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 juin 2022 à 11:38:50

                            umfred a écrit:

                            (a priori il faut le plugin pydroid permissions pour ça (https://play.google.com/store/apps/details?id=ru.iiec.pydroidpermissionsplugin&hl=fr&gl=US


                            Ca c'est bon, pydroid m'a déjà demandé de le faire, par contre

                            umfred a écrit:

                            est-ce que à côté de ton script, tu as un fichier dans lequel tu as défini les autorisations requises par ton application ? 

                            Heu... Je n'ai pas trouvé comment faire...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              30 juin 2022 à 11:51:13

                              le plugin le fait peut-être automatiquement (si c'était via bulldozer, il y un fichier buildozer.spec dans lequel il faut indiquer les permissions > https://github.com/b3b/able/blob/master/examples/alert/buildozer.spec )
                              • Partager sur Facebook
                              • Partager sur Twitter
                                30 juin 2022 à 12:00:13

                                Non je ne le fais pas avec buildozer, je pense en effet qu'il le fait automatiquement.

                                Ca n'a donc pas l'air d'être ça...

                                Et je n'ai plus jamais cette erreur sur Serial Bluetooth Terminal o_O

                                Ce serait quand même bête d'être coincé ici... :'(

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  30 juin 2022 à 12:09:17

                                  Avec le UUID en 6E4...., tu as le même message d'erreur que précédemment ?

                                  Tu as regardé la piste du timeout trop court ?

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    30 juin 2022 à 15:08:32

                                    Oui, j'ai le même msg quel que soit l'UUID.

                                    Je commence aussi à penser que c'est le timeout et pas le port qui soit à l'origine de l'erreur. D'autant plus que quand j'essaye de lancer le prgm avec la carte hors tensions/loin du tél, j'ai le même message, alors que dans ce cas-là c clairement le timeout et pas le port le pb.

                                    Le seul truc c que je ne sais pas comment rallonger ce timeout...

                                    Pour l'instant, je remets mon code tel qu'il est en ce moment :

                                    '''
                                    https://gist.github.com/tito/7432757
                                    '''
                                    
                                    # Importer Kivy pour ne pas avoir de systemError
                                    from kivy.lang import Builder
                                    from kivy.app import App
                                    
                                    from jnius import autoclass
                                    
                                    BluetoothAdapter = autoclass('android.bluetooth.BluetoothAdapter')
                                    BluetoothDevice = autoclass('android.bluetooth.BluetoothDevice')
                                    BluetoothSocket = autoclass('android.bluetooth.BluetoothSocket')
                                    UUID = autoclass('java.util.UUID')
                                    
                                    def get_socket_stream(name):
                                        paired_devices = BluetoothAdapter.getDefaultAdapter().getBondedDevices().toArray()
                                        socket = None
                                        for device in paired_devices:
                                            if device.getName() == name:
                                                socket = device.createRfcommSocketToServiceRecord(
                                                    UUID.fromString("6E400001B5A3F393E0A9E50E24DCCA9E")) # UUID corrigé. En vrai j'ai encore des tirets comme dans l'original mais là flemme de tout recopier je suis sur ordi
                                                recv_stream = socket.getInputStream()
                                                send_stream = socket.getOutputStream()
                                                # Tentative de modification du port de -1 en 1
                                                if socket.port <= 0:
                                                    socket = device.createRfcommSocket(1)
                                                break
                                        socket.connect()
                                        return recv_stream, send_stream
                                    
                                    if __name__ == '__main__':
                                        recv_stream, send_stream = get_socket_stream('BBC micro:bit [xxxxx]') # Remplacer le xxxxx par l'id de la carte
                                        send_stream.write('hello\n')
                                        send_stream.flush()
                                    

                                    Output :

                                    JVM exception occurred: read failed, socket might closed or timeout, read ret: -1
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Carte micro:bit et Python

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    • Editeur
                                    • Markdown