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 ?)
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.
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.
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
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.
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
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
[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.