Question:
Communication de plusieurs PIC avec un PC
Sodrohu
2011-09-07 15:16:15 UTC
view on stackexchange narkive permalink

J'ai une tâche dans laquelle je dois connecter 5 ucontrollers ou plus à un PC dans le but d'envoyer des données qui seront stockées sur le PC. Les conditions sont les suivantes:

  • Les ucs en question sont PIC 16F877As; chacun d'eux fait partie d'un système qui garde une trace du nombre de vis utilisées (à partir de maintenant), alimentées par DCV constant à partir des prises afin que l'alimentation ne soit pas un problème.
  • les données envoyées ne sont que Nombres; le nombre actuel de vis utilisées
  • l'environnement est celui d'une chaîne de montage en usine; les compteurs à vis sont utilisés dans la ligne et l'environnement est généralement bruyant
  • les données reçues par le PC sont à stocker dans une table; J'ai pensé que je pourrais m'occuper de cette partie plus tard
  • la distance entre chaque PIC est d'environ 2-3 mètres; le PC est en bout de ligne, à environ 10 mètres, le lien entre le PIC et le PC peut être soit physique soit sans fil, même si je préfère le sans fil car il est plus sans tracas (je pense ...), bien que la robustesse des données envoyé est la priorité
  • comme d'habitude, le système doit être fait pour être aussi bon marché que possible sans sacrifier la fiabilité

J'ai réussi à connecter un PIC à un PC en utilisant RS- 232 donc j'en sais assez pour que vous ne puissiez pas facilement connecter les 5 PIC directement à un PC en utilisant RS; problèmes trop gênants et de distance. Ce que je pense, c'est quelque chose comme un hub; les 5 PIC se connectent à un PIC maître qui en retour obtient toutes les données des 5 PIC et les envoie au PC. J'ai lu des trucs sur I2C et je pense que c'est assez faisable. J'ai également recherché des solutions sans fil comme XBee; J'ai obtenu SKKCA de Cytron mais je ne sais pas comment le faire gérer les communications de données plusieurs-à-un.

Quelqu'un a de meilleures idées sur la façon dont je peux faire cela de la manière la moins douloureuse et la moins chère possible? Tout ce projet est un one-man show, je préfère donc garder les choses simples et peu coûteuses.

Peut-être voulez-vous simplement un adaptateur à plusieurs ports série? http://www.moxa.com/product/UPort_1610-16.htm
Je ne pense pas que la connexion RS-232 puisse être maintenue à des distances de 5 mètres ou plus, mais l'appareil lui-même est agréable. De plus, je suis coincé à l'autre bout du monde, donc tant que je peux le commander, cela va prendre trop de temps et trop cher.
RS232 peut communiquer à ces distances, surtout si vous n'utilisez pas une vitesse de transmission élevée. Compte tenu de ce que je pense de votre discussion, cela ne semble pas être beaucoup de données, donc un débit en bauds lent (par exemple 2400) peut aller très loin. http://www.lammertbies.nl/comm/info/RS-232_specs.html
@kenny - Pour 10m, une vitesse de transmission lente ne devrait pas être nécessaire. Selon votre page liée, 2400 bauds devraient pouvoir fonctionner à 3 000 pieds.
Avez-vous essayé [RS485] (http://en.wikipedia.org/wiki/RS-485)? Il a une meilleure immunité au bruit que RS232 et il est multipoint.
Cinq réponses:
Olin Lathrop
2011-09-07 17:51:20 UTC
view on stackexchange narkive permalink

Je ne sais pas à quel point vous êtes coincé sur le 16F877A, mais c'est un mauvais choix pour quelque chose comme ça. Pensez à la série 16 comme étant réservée à des situations spéciales, comme un volume élevé où un prix un peu inférieur compte, une puissance extra faible ou une petite taille physique. Vous n'avez aucun de ces problèmes, et le 16F877A est de toute façon une ancienne pièce à usage général.

J'utiliserais quelque chose comme un 18F4580, qui a un émetteur-récepteur CAN intégré. Votre application réclame juste CAN. C'est un bus différentiel, donc a une bonne immunité au bruit. Vos distances peuvent être facilement gérées même au débit maximum de 1 Mbit / s. RS-485 comme d'autres l'ont mentionné est également différentiel, mais il s'arrête aux spécifications électriques. Vous devez concevoir votre propre protocole en plus de cela, en tenant compte des collisions, des tentatives, de l'arbitrage, des erreurs de bits, etc. C'est bien sûr faisable, mais il y a beaucoup plus de petits pièges qui ne vous sont probablement pas apparents à première vue. Il y a de nombreuses façons de se tromper, et la plupart des gens le font, du moins la première fois.

Avec CAN, tout cela est défini dans le standard et implémenté dans le matériel. Vous envoyez un message, et il apparaît simplement aux autres nœuds. Plusieurs nœuds essayant de transmettre en même temps sont gérés automatiquement. il existe un schéma d'arbitrage défini que les périphériques CAN matériels implémentent, avec une nouvelle tentative automatique jusqu'à ce que le message passe. Chaque message contient également un CRC 16 bits, qui est à nouveau généré et vérifié dans le matériel.

Il faudra un peu d'effort pour apprendre CAN et le périphérique CAN, mais ce sera moins que de faire votre propre protocole sur RS-485, du moins si vous le faites correctement. En outre, CAN est une bonne chose à apprendre alors que le RS-485 est un héritage d'une époque révolue.

Si vous ne pouvez pas utiliser un PIC avec CAN intégré (bien qu'il y en ait avec le même encombrement que l'archaïque 16F877A), vous pouvez utiliser la puce CAN externe qui communique avec le PIC via SPI. Notre version gratuite des outils de développement PIC sur http://www.embedinc.com/pic/dload.htm comprend le code source à la fois pour piloter la puce CAN externe et le périphérique CAN interne d'un 18F4580.

Vous aurez besoin de quelque chose qui permette au PC de communiquer avec le bus CAN, mais de telles choses sont disponibles dans le commerce. Nous avons notre propre adaptateur USB vers CAN qui n'a pas encore été intégré à un produit, mais je serais prêt à en publier le design et le code source. Si je me souviens bien, National Instruments est l'une des sociétés qui fabrique des adaptateurs CAN prêts à l'emploi pour un PC.

Obtient mon vote - je suis d'accord que cela semble être un travail facile pour un PIC et CAN à moitié décent.
+1 pour CAN, ce qui laisse suffisamment de place pour de futures extensions.
Première fois que j'ai entendu parler de CAN. Est-il possible pour moi de faire le CAN sans fil ou est-ce que cela doit être strictement physique? Quant au 16F877A, c'est le PIC que je connais le mieux, et celui que j'ai actuellement. Je préférerais bien sûr les utiliser, mais si la situation nécessite un meilleur matériel, je devrai utiliser le bon PIC. Combien de temps faudra-t-il pour implémenter le système CAN en moyenne?
Un adaptateur USB vers CAN a l'air cher ... du moins ceux que j'ai trouvés sur Google, comme celui-ci [CANUSB] (http://www.canusb.com/index.htm) ... peut implémenter une méthode de concentrateur, avec les esclaves au maître via CAN, et le maître au PC en utilisant RS-232?
@Sodrohu: Bien sûr, vous pouvez créer votre propre convertisseur RS-232 vers CAN. Le 18F4580 possède à la fois un périphérique CAN et un UART, de sorte qu'il peut effectuer la fonction de convertisseur dans un seul microcontrôleur.
@Sodrohu: CAN est en fait une spécification de protocole qui suppose un bus électrique qui passe passivement à un état et passe à l'autre état lorsqu'il est activement piloté par un ou plusieurs nœuds. Ceci est presque toujours implémenté sous la forme d'une paire différentielle terminée par 120 Ohms à chaque extrémité. En tout cas, cela ne se prête pas bien à la radio. L'utilisation de la radio est un problème distinct et ajoutera une complexité considérable à votre système.
@Olin Lathrop: Vous avez fait une bonne affaire avec CAN. Franchement, je suis intrigué, mais je pense que je vais commencer par RS-485 pour voir s'il est assez bon pour la tâche actuelle. En outre, je suis assez nouveau dans la communication uc en général (en dehors de RS232), donc je suis impatient de tout essayer juste pour découvrir comment c'est. Si je peux faire fonctionner le RS485, j'essaierai de commencer par la méthode CAN.
Sodrohu: Tout est bien sûr, mais apprendre à utiliser le matériel CAN sera plus facile que de concevoir, mettre en œuvre et tester seul un protocole RS-485 robuste.
Mike DeSimone
2011-09-07 18:16:55 UTC
view on stackexchange narkive permalink

RS485 est, en fait, la solution habituelle pour cet environnement. CAN est également une bonne solution, mais pourrait être un peu plus pour votre application. Il est vraiment destiné aux configurations à plusieurs maîtres. Vous n'en avez pas besoin car vous avez un PC qui maîtrise le bus.

Il existe une version simplifiée de CAN appelée LIN Bus qui suppose un seul maître connecté à plusieurs esclaves . Il est généralement relié à un bus CAN pour les réseaux plus complexes. Des puces d'émetteur-récepteur sont disponibles qui connectent LIN à un TTL UART standard et à quelques broches PIO. Microchip en vend trois et fournit un code d'assistance.

Existe-t-il un moyen de rendre le RS-485 sans fil, ou est-ce strictement physique?
RS-485 est une norme de couche physique pour la connexion filaire. Le sans fil sera plus complexe à mettre en œuvre que le 485 ou le CAN.
D'après votre description de votre environnement, le sans fil sera beaucoup plus complexe, car votre situation EMI nécessitera des récepteurs sophistiqués pour faire sortir votre signal de la boue, et encore besoin d'alimentation à chaque point où vous avez besoin d'un capteur. C'est faire une montagne d'une taupinière.
Leon Heller
2011-09-07 17:05:36 UTC
view on stackexchange narkive permalink

Mettez un émetteur-récepteur RS-485 sur chaque carte et implémentez un simple réseau maître-esclave. J'utiliserais une puce plus moderne que la 16F877A, comme la PIC16F887, ou une PIC18.

Y a-t-il des avantages évidents à utiliser quelque chose de plus moderne qu'un 16F877A dans ce domaine?
kenny
2011-09-07 17:09:06 UTC
view on stackexchange narkive permalink

En supposant que vous n'aimez pas la solution RS485 proposée, que diriez-vous d'utiliser RS232 en guirlande? Chaque vis de comptage esclave fait écho à toutes les méthodes non configurées.

Une autre option est RFID, demandez à chaque comptage de vis d'envoyer un identifiant / message RFID avec le nombre de vis dans son identifiant.

Daisy chain RS232: Quand on sort, ils sortent tous. Enfin, pas du tout, mais vous voyez l'idée. De plus, tous les microcontrôleurs doivent passer par toute la bande passante en plus du travail qu'ils sont censés faire. La RFID nécessiterait un scanner à proximité de chaque unité pour s'assurer qu'elle reste alimentée.
Saneesh A T
2011-09-28 00:27:28 UTC
view on stackexchange narkive permalink

Ici, la puissance n'est pas un problème, vous pouvez simplement opter pour une solution sans fil.

Parce que vous avez besoin d'une solution à faible coût, je préfère ce qui suit ....

Tout d'abord, vous pouvez créer un réseau USART câblé où toutes vos broches RX sont connectées au côté TTL d'un seul MAX, et les broches TX connectées au même MAX. Attribuez une adresse à chacun des esclaves. Les esclaves restent inactifs dans la ligne de communication tout en poursuivant toutes ses autres activités. Envoyez les entrées (nombre de vis utilisées) à une file d'attente, dans ce cas, simplement un tableau.

Maintenant le côté maître,

Qui est le PC et est connecté au RS232 côté du MAX. Vous pouvez simplement créer votre propre protocole pour communiquer avec chacun des esclaves. Le meilleur moyen est d'utiliser une communication 9 bits avec détection d'adresse. Vous pouvez créer un ensemble de commandes simples comme suit,

COMMANDE: ECHO_ADDRESS

HEX VALUE: 0XAA

SIGNIFICATION: Si ECHO_ADDRESS est reçu, l'esclave adressé sera renvoyer son adresse.


COMMANDE: SEND_COUNT

HEX VALUE: 0XA1

SIGNIFICATION: Si le SEND_COUNT est reçu, l'esclave adressé envoie le numéro de données présentes dans sa mémoire tampon.


Je pense que cette solution est bon marché et que vous n'avez pas besoin d'aller pour un processeur avancé. Le processeur que vous avez sélectionné a suffisamment de RAM et de ROM.

Maintenant, si vous mettez à niveau le système vers la connectivité sans fil, la méthode la moins chère consiste à obtenir des émetteurs-récepteurs RF ordinaires. retirez le câble connecté à vos broches RX et TX et insérez-y l'émetteur-récepteur. Connectez le même émetteur-récepteur RF à votre MAX. Ici, la fréquence de l'émetteur du côté MAX et la fréquence du récepteur des esclaves doivent être identiques et vice-versa.

Lors de la sélection de la fréquence RF, il est préférable de prendre en compte les distorsions de l'environnement.

Hai,
Le sans fil que j'ai mentionné n'est pas un émetteur-récepteur sans fil moderne comme Zigbee, Wi-Fi ... J'ai suggéré un simple transciver RF à faible coût. Dans ce cas, il n'a pas besoin d'un débit de données élevé. J'utilise le module sans fil d'environ 2 $ pour une communication de datarate inférieure et il donne des performances satisfaisantes. Maintenant, pourquoi j'ai suggéré le sans fil, la réponse que je pense que le client sera plus heureux s'il n'y a pas de câbles ou besoin de câblage supplémentaire, et que le produit a l'air bien.

Nous pouvons connecter de nombreuses broches TX ensemble . Parce que notre maître contrôle le bus, les risques de collision sont trop faibles. Mais vous avez raison, il peut y avoir des collisions dues à une erreur de communication. Nous devons protéger l'appareil de cette collision, cela peut être fait par un isolateur électrique.

Ce n'est peut-être pas une solution parfaite mais cela fonctionne pour la situation actuelle.

Le sans fil n'est ni simple ni bon marché, et c'est une mauvaise solution pour les appareils qui ne bougent pas et qui existent dans un environnement électriquement bruyant.
Il n'est pas non plus nécessaire d'écrire «Merci d'avance» et «Merci d'avoir écouté» sous tous vos messages. Vos lecteurs vous remercieront avec des votes positifs, des réponses et des commentaires si votre message vaut la peine d'être lu. Veuillez arrêter cette pratique.
Le sans fil n'est ni économique ni simple comparé aux bus filaires comme RS-485 ou CAN. Vous ne pouvez pas non plus câbler les broches TX de plusieurs UART ensemble et vous avez complètement ignoré les collisions.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...