Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Serial ou SPI ?

    29 septembre 2013 à 12:55:19

    Bonjour,

    Dans mon projet domotique, je cherche à relier 2 cartes Arduino ensemble, elles sont séparées par plusieurs mètres.

    Dois-je utiliser Serial plutôt que SPI ou le contraire ? Pourquoi ?

    Merci d'avance :)

    • Partager sur Facebook
    • Partager sur Twitter
    Faites un tour sur www.nawrasg.fr :)
      30 septembre 2013 à 0:15:47

      SPI, cela signifie "Serial Peripheral Interphace".

      Donc entre les deux, il n'y a pas de grande différence.

      Si tu as une distance de plusieurs mètres entre tes cartes, il te faut juste faire attention à ne pas avoir une débit trop élevé ;)

      =====

      Pour que l'on puisse te dire quelle solution est la mieux pour ton problème, il faudrait que tu nous en dise d'avantages :

      - que transmets tu ? (uniquement des ordres du genre "eteindre lumière", "allumé lumière" ou des données du genre "température: 21 °C", "vent: 21 km/h ouest" ou ... ?)

      - dans quel sens transmet tu ? (toujours de la carte A vers la carte B ou dans les 2 sens ?)

      - y a t'il uniquement que 2 cartes ? (le projet doit-il pouvoir s'étendre à plusieurs cartes ?)

      ...

      • Partager sur Facebook
      • Partager sur Twitter
        30 septembre 2013 à 14:56:27

        Pour l'instant, je ne transmettrai pas des string mais que des char avec des int/double, et la carte principale mettra au propre les données reçues. Dans l'avenir, j'envisage de créer un objet qui constituera une sorte de protocole et dans ce cas là, les cartes s'échangeront ces objets !

        A priori, la communication est full duplex. Bien que le projet se limitera à 2 cartes, j'aimerais garder la possibilité d'agrandir. La carte principale est une mega 2560.

        • Partager sur Facebook
        • Partager sur Twitter
        Faites un tour sur www.nawrasg.fr :)
          30 septembre 2013 à 19:28:19

          Tant que ton système dispose d'une carte mère et de X cartes esclaves, les 2 sont utilisable.

          La communication peut se faire dans les 2 sens, mais c'est toujours le maitre qui l'ordonne.

          En clair, un esclave ne peut pas décider de lui même d'envoyer des données au maitre.

          Il faut donc faire du pooling : toutes les secondes, le maitre interroge les esclaves uns à uns pour voir si il ont quelque chose à dire.

          Si l'esclave n'a rien à dire, la communication s'arrête et le maitre passe à un autre esclave

          Si l'esclave indique qu'il a quelque chose à dire, le maitre continue la communication pour récupérer le message

          Cependant, si ton système est critique et qu'un esclave doit vraiment pouvoir informer le maitre d'un évènement, on peut rajouter un autre fil que l'esclave contrôle.

          Lorsque ce fil est à l'état bas, cela veut dire que l'esclave n'a rien à dire.

          Inversement, lorsque l'esclave a quelque chose à dire, il passe ce fil à l'état haut.

          Ainsi, si le maitre voit que le fil passe à l'état haut, il sait que l'esclave a quelque chose a dire et il lance la communication.

          =====

          Notons que les sorties en SPI sont Totem-Pole alors que les sorties OneWire sont en Pull-Up.

          Le SPI permet donc d'avoir un meilleur débit sur une longue distance.

          Je ne pourrais pas te dire des chiffres précis mais il existe surement des graphiques annonçant le débit maxi à respecter en fonction de la distance.

          • Partager sur Facebook
          • Partager sur Twitter
            30 septembre 2013 à 21:07:28

            J'ai eu ce problème de maître-esclave dans un autre projet et je l'ai contourné en 2 cartes comme maîtres !

            Merci :)

            • Partager sur Facebook
            • Partager sur Twitter
            Faites un tour sur www.nawrasg.fr :)
              1 octobre 2013 à 0:03:24

              Hum oui, 2 cartes maitres, ça marche aussi, à condition d'avoir un système de détection de collision.

              Enfin, sans ce système, ça marche temps que les 2 maitres ne décident pas de communiquer en même temps.

              • Partager sur Facebook
              • Partager sur Twitter
                1 octobre 2013 à 14:05:34

                A mon sens, si il n'y a pas de relation maitre/esclave entre les cartes, le plus simple est de prendre une liaison série asynchrone full duplex, éventuellement en passant sur autre chose que du 0/5V pour être plus robuste

                • Partager sur Facebook
                • Partager sur Twitter
                64kB de mémoire, c'est tout ce dont j'ai besoin
                  3 octobre 2013 à 9:16:12

                  Bonjour Nawrasg,

                  La théorie dis que si tu dois relier deux éléments avec une liaison série RS avec une distante importante, il faut utiliser une liaison en différentielle RS422 ou RS485

                  Cela permet d'éviter un maximum de parasite, car les signaux étant en Q et Q* on peut annuler les parasites.

                  La liaison série de base sur l'arduino étant en niveau TTL, le mieux et de rajouter des émetteurs de lignes sur la liaison RX et un récepteur de ligne sur le TX ( un opto peut le faire aussi)

                  Mais cela est la théorie pour ne pas avoir de souci avec la distance, en pratique avec des MAX232 ou MAX233 tu peut faire de la RS232 et parcourir 6 mètres sans problème.

                  Par contre, la liaison série en TTL peut fonctionner mais ce n'est pas dans les règles de l'art.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 octobre 2013 à 10:58:37

                    Il faut ? Elle sort d'où ta théorie ? Le RS232 trimbale sa masse avec le signal, ça marche très bien sur des distances assez longues. De mémoire, le RS232 a été spécifié pour faire des câbles allant jusqu'à 1km. C'est sur, en environnement bruité, je passerais sur du différentiel, mais ce n'est pas obligatoire dans tous les cas. Il faut s'adapter au problème à résoudre, et c'est pour ça que j'avais éludé la question par

                    éventuellement en passant sur autre chose que du 0/5V pour être plus robuste.

                    J'ai déjà fait du série à 9600 bauds sur 10m de câbles en 0/5V à partir d'un robot autonome isolé de la terre. De temps en temps je choppais une perturbation sur l'accélération du robot (quand les moteurs rayonnent le plus), mais ça marche. Inutile de sortir systématiquement l'artillerie lourde.

                    PS : l'inconvénient des transmissions différentielles, c'est que tu perds le côté full duplex, sauf en doublant les fils

                    -
                    Edité par Natalya 3 octobre 2013 à 11:05:01

                    • Partager sur Facebook
                    • Partager sur Twitter
                    64kB de mémoire, c'est tout ce dont j'ai besoin
                      3 octobre 2013 à 11:56:56

                      Bonjour,

                      Ma théorie vient du câblage de liaison série dans le domaine aéronautique, la masse ne protège pas de toutes les perturbations, seul une liaison en différentielle peut le faire.

                      La RS232 est donnée jusqu'à 15 mètres en théorie pour 19200 bauds, à 9600 bauds on peut aller à 150m,  tu as raison , j'ai parlé un peu vite, j'ai zappé la question de vitesse de transmission. Mais 1km c'est en dessous de 2400 bauds.

                      C'est sûr que le différentiel double les câbles comme tu le dis, après, le paramètre essentiel à prendre en compte est la sécurité des données, si le projet ne nécessite pas de garanti essentielle des données, tu peux faire du RS TTL avec un peu de longueur.

                      Ma culture aéronautique prend un peu trop le dessus sur la pratique de la bidouille ;)

                      • Partager sur Facebook
                      • Partager sur Twitter

                      [Arduino] Serial ou SPI ?

                      × 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