Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Comment faire 2 choses à la fois

Sujet résolu
    20 mai 2018 à 19:53:27

    Bonjour / Bonsoir à tous :)

    J'ai un arduino composé d'un écran, et qui est piloté par une télécommande 433MHz. L'arduino doit en permanence rafraîchir l'écran et en même temps il doit écouter en permanence son récepteur 433MHz pour vérifier si on lui envoie une commande.

    Le problème, c'est que le le µcontrôleur d'un arduino est incapable de faire 2 choses en même temps. J'ai donc pris la décision de lui faire écouter le capteur pendant un court instant, puis de rafraichir l'écran, le tout en boucle et le plus rapidement possible. Mais je me retrouve quand même en face d'un problème : lorsque j'envoie une commande à l'arduino via un émetteur 433MHz, l'arduino a un risque de ne pas interprêter ma commande car si lorsque j'envoie ma commande, l'arduino est en train de rafraichir l'écran (et donc de ne pas écouter le capteur) la commande va lui passer sous le nez et l'arduino n'aura strictement rien vu. Du coup c'est très lourd.

    Une fois que le récepteur 433MHz arrive à démoduler une commande , il l'envoie sous forme de pleins de bits en série sur un seul pin de l'arduino (l'arduino contrôle le récepteur à l'aide de la bibliothèque VirtualWire) et je me pose une question : est-ce qu'il existerai un moyen pour que l'arduino puisse stocker les données séries envoyés par le récepteur (donc la commande quoi) du temps qu'il rafraîchisse l'écran, puis qu'il puisse y avoir accès et les lire quand il a fini de rafraîchir l'écran ? Une sorte de mémoire tampon qui pourrait stocker une information pendant que l'arduino est occupé à faire autre chose.

    Je ne sais pas si j'ai réussi à bien me faire comprendre, j'ai l'habitude de faire face à quelques problèmes techniques avec les arduino mais celui-là ça fait 2 jours que je cherche une solution et je ne trouve que des demi-solutions qui ne me satisfait pas... Si vous avez des idées pour m'aider ce serait cool :) .

    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2018 à 20:22:14

      Je ne sais pas trop si cela va te décevoir ou non mais c'est déjà le cas.

      La lib virtual wire utilise l'interruption du Timer1 pour déclencher l'appel d'une fonction cadencé sur une fréquence 8 fois supérieur à la vitesse de communication paramétrée.

      Cette fonction appelée automatiquement sous interruption se charge de lire l'état de la pins de réception et enregistrer le message reçu en mémoire.

      Ton arduino peut donc être en train d'exécuter des fonctions en relation avec l'écran LCD, celles-ci seront temporairement interrompu de très nombreuses fois par le Timer1 qui va gérer la réception.

      Une fois ton rafraichissement terminé, tu peux tout simplement appeler vw_have_message pour vérifier si un message a bien été enregistré ou non.

      -
      Edité par lorrio 20 mai 2018 à 20:23:36

      • Partager sur Facebook
      • Partager sur Twitter
        21 mai 2018 à 0:17:43

        Je te remercie enormement je ne savais pas tout ça, merci :) .

        Ça signifie donc que mon problème viens d'ailleurs et non pas de là où je pensais.

        Ah, autre chose que j'ai pu remarquer, ça peut aussi venir de là : j'ai regardé la sortie de mon récepteur à l'oscilloscope, lorsque je lui envoie une commande j'arrive bien à remarquer les bits de données en série qui respectent bien la vitesse que j'ai paramétré mais quand je n'envoie rien le récepteur sort n'importe quoi, comme si il tentait de démoduler tous les parasites qui passent. J'ai cherché sur internet et il y a beaucoup de monde qui disent que la bande de 433MHz est trop saturé et est trop parasités, comme c'est une plage de fréquences libres tout le monde l'utilise pour tout et n'importe quoi... Peut être que je devrais utiliser un couple émetteur - récepteur qui utilise une autre plage.

        -
        Edité par Mandragora42_ 21 mai 2018 à 0:26:06

        • Partager sur Facebook
        • Partager sur Twitter
          21 mai 2018 à 15:42:17

          Bonjour,

          Ce qu'il te faudrait c'est "un genre" de FIFO (mémoire tampon) capable de stocker l'information envoyée par l'emetteur 433MHz et de pouvoir la lire derrière par l'arduino. Comme ça pas de perte d'information.

          Ou alors faire une analyse de timing de telle manière à ce que l'arduino ai une fréquence d'exécution assez élevée pour pouvoir raffraichir l'écran et récupérer les données du recepteur 433MHz en un cycle d'horloge.

          Quel est le baudrate de la liason série du récepteur 433MHz?

          • Partager sur Facebook
          • Partager sur Twitter
            21 mai 2018 à 18:47:36

            Le 433 MHz est effectivement une fréquence libre très utilisée : télécommande, jouet... tout le monde l'exploite.

            De plus, ton récepteur utilise un module OOK qui a l'avantage d'être très low cost mais aussi très sensible.

            Le principe de cette modulation est simple puisqu'il consiste uniquement à envoyer ou non une onde porteuse.

            Du coup, si 2 émetteurs émettent en même temps, ils se brouillent mutuellement car la fréquence porteuse sera pratiquement toujours présente (si un module n'émet pas la porteuse, ce sera l'autre qui le fera).

            Comme cette bande de 433 MHz est très utilisée, il est fort probablement que ton récepteur capte une porteuse venant de plus loin (un appareil chez le voisin par exemple) et donc il donne n'importe quoi.

            Tu ferais mieux d'utiliser des modules qui exploitent un modulation plus complexe ainsi qu'un système de CRC (validation des trames reçues) faite par le module.

            Par exemple, on pourrait citer les modules NRF24L01 qui exploitent la bande de 2.4 GHz.

            Celui-ci possède de nombreux avantages par rapport à ton module radio 433 MHz :

            • Fréquence de la porteuse disponible sur 127 canaux et non 1 seul (tu trouveras forcément un canal moins bruité que les autres)
            • Gestion de la validation des packets (si une donnée est mal transmise, le module le module receveur peut le détecter et ne pas transmettre la donnée corrompu à l'arduino)
            • Gestion des acquittement (le module émetteur peut savoir si le récepteur a bien reçu ou non ce qu'il vient d'envoyer)
            • Gestion des répétitions (le module émetteur peut répéter automatiquement l'émission d'un packet si le récepteur ne l'a pas reçu)
            • Gestion des adresses (il est possible de spécifier une adresse précise pour désigner un module destinataire de la trame afin que seul celui-ci le reçoive et non tous les autres modules présents)
            • Communication bidirectionnel (un module peut émettre et recevoir)
            • Et pleins d'autres...

            Bref, à moins de 3€ le module, c'est largement mieux que du 433 MHz.

            -
            Edité par lorrio 21 mai 2018 à 18:47:46

            • Partager sur Facebook
            • Partager sur Twitter

            [Arduino] Comment faire 2 choses à la fois

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown