Partage
  • Partager sur Facebook
  • Partager sur Twitter

Contrôler 20 Arduinos Méga via Wifi

    30 août 2018 à 10:17:04

    Bonjour à tous !

    J'ai actuellement une vingtaine de Méga pour faire tourner la salle de mon Escape Game. Nous proposons plusieurs difficultés et des énigmes qui s'adaptent au nombre de joueurs. Actuellement et par manque de temps, j'ai ajouté des boutons sur les énigmes à difficulté ou et/ou nombre de joueur variable.

    Le Maitre du jeu, quand il reboot la salle, passe par les coulisses et appuie sur ces boutons en fonction de la composition de l'équipe suivante.

    Ça marche nickel, mais c'est pas forcément le plus rapide et pratique. D'autant plus que la salle va bientôt être doublée, donc 2 fois plus de boulot pour le MJ !

    Je voudrai donc passer par une solution en un clic !

    De plus, ça me permettrait, pour toutes les énigmes, de pouvoir également contrôler les relais et les ouvertures de trappes, histoire d'override si une équipe galère VRAIMENT =p

    Je compte partir sur des ESP8266 Est-ce une bonne solution ? J'ai une mauvaise expérience avec des modules radio nrf24l01+, je pense que les 8266 seront plus stables non ?

    J'ai 2 possibilités, partir sur les petits modules à quelques euros et quelques pin :

    http://www.les-electroniciens.com/videos/arduino-ep16-installation-du-module-wifi-esp8266

    ou carrément sur une carte, plus cher mais bon, si c'est plus pratique ça ne me pose pas de problème :

    https://www.planete-domotique.com/carte-de-developpement-iot-wifi-esp8266-lua-arduino-lolin-v3-wemos.html

    Mon installation est composée d'arduino Uno et Méga, une vingtaine environ. Certains ont déjà pas mal de Pin déjà pris, voire aucune de dispos =p

    Ceci concerne principalement les Uno, que je peux évidemment passer en Méga !

    Certains de mes Arduinos ont également déjà les Pin I2C utilisés, d'autres les Pin RX/TX.

    Enfin, je souhaiterai contrôler mes bébés via une page Web, qui peut être très moche, tant que ça marche =p

    Sauf que je ne sais pas comment gérer cette partie ? Existe t'il des solution un peu toutes faites ?

    Merci d'avance pour votre aide, encore !

    Thibaut

    • Partager sur Facebook
    • Partager sur Twitter
      30 août 2018 à 11:13:45

      Hello

      Il existe des librairies pour implémenter des webservices sur des cartes à base de arduino+ESP8266, ESP32... dans ce style : https://github.com/marcoschwartz/aREST

      Après, tu peux faire une page web (pas forcément moche) hébergée sur le poste de travail du maître du jeu qui va appeler les webservices de chacune de cartes pour en avoir le status ou venir y exécuter des fonctions.

      Tu peux très bien imaginer un scénario de reset de salle, où une fonction sur la page web (jquery ou autre) va passer en revu chaque élément de la salle pour les remettre à zéro.

      -
      Edité par Arkturus 30 août 2018 à 11:16:39

      • Partager sur Facebook
      • Partager sur Twitter
        30 août 2018 à 12:30:18

        Merci Arkturus.

        J'ai bien un site Web, mais c'est du WordPress, je n'ai donc aucun connaissance en jquery ou autre.

        Est-ce réalisable avec des Builder avec système de bloc sur PC, comme on peut voir dans cette vidéo ?

        https://www.youtube.com/watch?v=i2IUDaC1n4k

        Merci d'avance,

        Thibaut

        • Partager sur Facebook
        • Partager sur Twitter
          3 septembre 2018 à 8:30:19

          Le ESP8266 communique avec une liaison Série Tx/Rx donc il te faut avoir une liaison série libre sur tes arduino.

          Tu peux utiliser les pins Tx/Rx de l'arduino mais elles servent aussi au Serial ainsi qu'à la reprogrammation de l'arduino.

          Donc attention... en faisant ça, il te faudra déconnecter l'ESP à chaque mise à jour du code et il ne sera plus possible d'utiliser le Serial pour afficher des messages de debug.

          Une autre solution serait d'utiliser la lib SoftwareSerial pour émuler un Tx et un Rx.

          Mais il faut savoir que cette lib utilise les interruptions de façon bloquante pour l'émission et la réception.

          De ce fait, il ne peut y avoir qu'un seul SoftwareSerial d'actif en même temps et cela peut perturber les autre interruptions.

          Par exemple, tu auras de sérieux problème si tu utilises les interruptions FALLING/RISING/CHANGE pour faire un compte tour.

          Mieux vaudrait passer sur le Mega qui a plusieurs Serial de base ;)

          * * *

          Une autre solution serait d'exploiter le fait qu'un EPS est programmable comme un arduino.

          Dans ce cas, tu pourrais l'utiliser pour envoyer des informations binaire à l'arduino.

          Si l'on reprend la vidéo que tu as posté juste avant, l'auteur propose de piloter une LED directement avec l'EPS.

          Imaginons maintenant que tu ne connectes pas une LED mais une pin INPUT de l'arduino à la place.

          Alors l'arduino sera capable de lire l'information de cette pin avec un digitalRead.

          Au final, cela revient au même que ta solution avec un bouton sauf que le bouton est émulé par l'EPS et tu peux changer son état par wifi ;)

          * * *

          Pour ce qui est du choix du module, tout dépend de ce que tu veux faire.

          Le petit fonctionnera très bien mais dispose d'un nombre très limité de pins.

          Du coup, si tu veux utiliser la seconde options (pas de Tx/Rx mais des boutons émulés par l'EPS), un shuield avec pleins de pins te permettra de mettre pleins de boutons émulé ;)

          • Partager sur Facebook
          • Partager sur Twitter
            3 septembre 2018 à 10:10:33

            Bonjour,

            j'adoooooooore ta seconde solution ! Ça parait tellement plus simple et pratique !

            Donc concrètement, j'ai une énigme, pilotée avec un méga.

            Les joueurs doivent appuyer en même temps sur 2-3-4-5-6 boutons en fonction du nombre de joueur.

            Les boutons 3-4-5-6 (la salle est pour 2 joueurs mini) sont condamnable via des maglocks et que j'active actuellement via mon bouton.

            Un push, la variable nbjoueur = 3, un autre push la variable = 4 etc ...

            J'ai ensuite un if {} qui check la valeur de la variable est passe en high ou low les maglocks en fonction de sa valeur.

            Là, en plus du bouton (je préfère le garder au cas où =p), je pin une sortie de mon ESP sur une pin dispo du méga, j'ajoute un pinMode(buttonESPPin, INPUT); un buttonESPState = digitalRead(buttonESPPin); et j'incrémente ma variable de la même façon ?

            Est-ce que, c'est pas très important c'est un petit plus, mais je peux piner mon ESP sur la même Pin que mon bouton actuel ? Ou, mais ça m'étonnerait, déclarer 2 pins pour mon bouton const int buttonPin = 2,42; ? =p

            Et enfin, les GND du méga et de l'ESP doivent elles être communes ?

            Encore merci Lorrio, c'est top ton idée ! Je n'y avais pas pensé et je n'avais rien trouvé de tel sur internet et pourtant j'ai beauuuuucoup creusé !

            • Partager sur Facebook
            • Partager sur Twitter
              3 septembre 2018 à 13:21:45

              Incrémenter une variable à chaque changement d'état de l'ESP, ce n'est pas forcément une bonne idée car tu ne connaitras pas forcément la valeur actuellement avant de déclencher un changement d'état.

              Si tu veux gérer une variable depuis, il est plutôt préférable d'opter pour un codage binaire :

              • avec une seule entrée, tu peux coder 1 bits, soit 2 valeurs possible (typiquement 0 ou 1)
              • avec 2 entrées, tu peux coder 2 bits, soit 4 valeurs possibles (0,1,2 ou 3)
              • avec 3 entrées, tu peux coder 3 bits, soit 8 valeurs possibles (de 0 à 7)
              • ...

              * * *

              Comme tu l'as évoqué, il est aussi possible de câbler un bouton ET une pin de l'ESP sur la même pin de l'arduino.

              Dans ce cas de figure, le câblage est le suivant :

              .
              
                   5V
                    |
                    |
                    |
                   ***
                   * *
                   *R* Résistance
                   * * (pull up)
                   ***
                    |
                    |
                    |
                    +--------+----------- Pin Arduino
                    |        |
                    |        |   
                    |        |   |\ |
               BP \          +---|D*|---- Pin EPS
                   \             |/ |
                    |           Diode
                    |
                    |
                   GND

              Dans ce cas de figure, si tu enfonces le bouton, l'arduino va lire l'état LOW.

              Et si jamais l'EPS écrit un LOW sur sa pin, cela aura exactement le même effet qu'enfoncer le bouton.

              ATTENTION à ne pas oublier de mettre la diode !!! Et ne pas te tromper de sens non plus !!!

              En faisant ça, tu peux donc te servir de l'EPS pour simuler l'appui de certain bouton dans le cas de figure où il te manquerait des joueurs ;)

              * * *

              Et pour finir, OUI, le GND de l'EPS doit être relié au GND de l'arduino.

              -
              Edité par lorrio 3 septembre 2018 à 13:22:35

              • Partager sur Facebook
              • Partager sur Twitter
                4 septembre 2018 à 10:09:34

                Merci Lorrio.

                Ce n'est donc pas forcément pratique de piner 2 entrées sur la même pin. Je vais ajouter un peu de code, ça me prendra moins de temps =p

                Par contre je ne comprends pas pourquoi mon histoire de variable poserait problème, ça fonctionne actuellement correctement et j'ajouterai juste une seconde condition à la condition unique actuelle de mon bouton physique, la condition du "bouton ESP".

                if (buttonState == LOW) || (buttonESPState == LOW)

                diff = diff + 1 ...

                Sachant que j'ai ensuite une condition qui ramène mon diff = 4 à diff = 1, pour bien reste à 1-2-3-1-2-3-1-2-3-1 etc ...

                Avec vérification du previous state.

                Et question bonus, comment je peux reset un arduino sans appuyer le bouton ?

                -
                Edité par Thibaut Leuridan 4 septembre 2018 à 10:19:05

                • Partager sur Facebook
                • Partager sur Twitter
                  4 septembre 2018 à 12:59:24

                  Pour faire un reset, plusieurs solutions :

                  • software: déclencher un reset watchdog
                  #include <avr/wdt.h>
                  
                  void resetCPU() {
                    cli();
                    wdt_enable(WDTO_15MS);
                    for (;;) { /* wait */ }
                  }
                  • hardware: forcer la pin RESET à l'état LOW, soit avec un bouton, soit avec ton ESP connecté à cette pin.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 septembre 2018 à 9:00:55

                    Parfait la méthode avec l'ESP.

                    Merci pour tout. Je repasserai suite à mes tests, en cas de besoin.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 septembre 2018 à 10:34:24

                      Ça marche à la perfection ! Et au delà même ! L'appli est incroyable.

                      Je me demandais une chose du coup, si j'envoie une valeur PWM via blynk et avec mon ESP8266, Est-ce que je peux la lire sur mon arduino ?

                      Par exemple, j'ai un widget slider qui permet de changer une valeur de 0 à 255, je le slide sur 129 et je veux que mon arduino fasse quelque chose en fonction de ça, comment le savoir ?

                      Pour le coup d'utiliser l'ESP en mode bouton, pas de soucis, mon ESP envoie un 0 ou 1 sur mon arduino, via une Pin et je fais juste un digitalread.

                      Merci !

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 septembre 2018 à 11:09:30

                        Par défaut, la fréquence du PWM de l'ESP8266 est de 1kHz, ce qui est pas trop mal.

                        Deux solutions s'offrent à toi :

                        • Soit tu utilises un timer en mode capture pour mesurer le temps à l'état HIGH de chaque pulse
                        • Soit tu utilises les interruptions sur changement d'état pour faire une mesure software des temps en te basant sur micros
                        • Soit tu rajoutes un filtre RC (du genre 10k/10uF) et tu mesures la valeurs avec analogRead
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 septembre 2018 à 21:17:45

                          Merci beaucoup Lorrio.

                          Je ne connais aucune des 3 méthodes. Histoire de ne pas me "taper" les trois, est-ce que l'une d'entre elles est plus facile ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 septembre 2018 à 8:42:02

                            D'un point de vue programmation, la numéro 3 est la plus simple, car c'est un simple analogRead qui permettra de lire la valeur analogique coté arduino.

                            En revanche, elle va te demander un tout petit peu de câblage pour mettre une résistance en série avec un condensateur.

                            ***

                            La numéro 2 est un peu plus complexe d'un point de vue programmation mais elle nécessite aucun câblage particulier, il faut juste relier la pin de l'ESP à la pin de l'arduino.

                            Par contre, cette méthode est très sensible aux autres interruptions qui peuvent perturber la mesure, donc à utiliser en connaissance de cause.

                            ***

                            La numéro 1 est encore plus complexe en programmation mais elle ne nécessite aucun câblage particulier (comme la numéro 2) tout en étant insensible aux autre interruptions.

                            -
                            Edité par lorrio 21 septembre 2018 à 8:42:28

                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 septembre 2018 à 8:54:32

                              Merci ! Je vais creuser 1 et 3 =p
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Contrôler 20 Arduinos Méga via Wifi

                              × 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