Go Down

Topic: Communication 4D Shield <=> Arduino (Read 829 times) previous topic - next topic

alpaph

Bonjour à tous,

Je suis en train de développer une petite télécommande qui s'appuie d'une part sur un arduino nano et d'autre part sur un display 4D system 128.
Les commandes seront émises depuis le display. L'arduino interprétera et exécutera les commandes.

Coté Arduino, j'utilise l'excellent protocole partagé par Barbudor (http://arduino.cc/forum/index.php/topic,102540.0.html) et coté display, j'ai implémenté une couche protocole (nettement moins bien codé  :~).

Avant de relier les deux systèmes par deux fils Rx et Tx, j'ai fait des essais de chaque système, indépendamment, via un moniteur série. Chaque système répond correctement, comme souhaité.

Là où je bloque, c'est lorsque je fais mes essais " grandeur réelle", avec chaque système raccordé via deux fils Rx et Tx.
La communication ne s'établit pas.
En creusant un peu, je m'aperçois que le protocole coté Arduino ne perçoit pas (via la fonction available) les caractères envoyés par le display.

Je ne sais plus par quel bout prendre l'affaire.

  • est-ce que quelqu'un a déjà eu ce problème ?

  • quel moyen de débogage je pourrais mettre en place pour avancer ?

  • ... ???????



Merci à tous pour votre aide.

Philippe.

barbudor

Quel modèle Arduino ?
Un petit schéma de principe sur les connexions entre modules pourrait peut être nous éclairer.
(même un gribouillu papier photographié avec une webcam ou un téléphone c'est mieux que rien  ;))
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

schizophrene

Une erreur simple, que beaucoup de "nouveaux" font: il faut relier le Rx Arduino avec le Tx 4D, et le Tx Arduino avec le Rx 4D. Et non pas les Rx ensembles, Tx ensembles.

alpaph

Alors, voici quelques éléments.
@schizophrene : les Tx et Rx de chaque module sont bien inversés.

Voici un petit schéma de principe :


Pour le moment, j'ai une alimentation commune, les masses sont reliées et donc deux fils de communication.

Merci.

A+

barbudor

N'oublie pas que l'ATmega328 n'a qu'une seule liaison série.
Donc si tu essaye de t'en servir à la fois pour communiquer avec le PC et l'écran en même temps, tu risque d'avoir des problèmes de conflit électriques d'une part et logiciel d'autre part.
La ProMini328 n'ayant pas d'interface USB intégrée comment fais-tu tout cela ?
Le PC est-il relié ?
Comment débogues tu ?


Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

alpaph

Effectivement. Pour tester mon montage, je déconnecte le FTDI que j'utilise pour téléverser mon programme de l'arduino. Le PC n'est donc pas relié pendant mes essais, et du coup, le débogage est super-galère.
Naïvement, je pensais qu'en testant unitairement chaque module via un moniteur série, ça marcherait tout seul lorsque je brancherait  8)

Donc, pour creuser, je mets "des petits indicateurs lumineux" dans le protocole. Notamment, je voulais savoir si après avoir émis un caractère, la condition "if ( prot_pStream->available() )" de prot_loop était valide. Ce qui n'est pas le cas. Maintenant, je n'arrive pas à savoir si le problème est logiciel ou "électrique" (au sens transmission des signaux).
Pour le debug, j'ai aussi une Duemilanove, il y aurait peut-être un truc à faire avec ???


------------------------------------------------------------------------------------
Programme modifié pour debug (une LED a été ajouté sur TEST_PIN)
void prot_loop()
{
  // variable pour recevoir le prochain caractère reçu
  char c;
  // indicateur pour boucler dans la fonction tant qu'il y a des caractères dispo
  // Par defaut : true : on boucle ici jusqu'à épuisement des caractères
  // false dans certains état de l'automate : RECEIVED car comme on ne consomme
  // pas les caractères, on resterait bloqué
  bool loop_on_available = true;
 
  if ( prot_pStream->available() )
  {
    digitalWrite(TEST_PIN, HIGH);
    delay(200);
    digitalWrite(TEST_PIN, LOW);
    while ( loop_on_available && prot_pStream->available() )
...

alpaph

Bon, j'ai un peu les b....s  ]:)

Je viens de transférer mon programme sur la Duemilanove et ça fonctionne nickel. Avec le même raccordement entre le Display et l'Arduino, enfin tout pareil.

Est-ce que quelqu'un aurait une explication ? Y a t-il une différence de gestion du port série ?

skywodd


Est-ce que quelqu'un aurait une explication ? Y a t-il une différence de gestion du port série ?

Au niveau de la gestion non, mais au niveau du câblage il me semble qu'il y a une astuce à base de résistances pour faire cohabiter le chipset FTDI avec la "liaison série utilisateur" sur D0/D1.
Si tu débranche ton câble FTDI de l'arduino ProMini cela reviens au même, tu doit avoir un problème autre pars (câblage, fréquence F_CPU, config port série, ...).
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

B@tto

Peut-être un problème de masse : sa connexion entre l'arduino et le display n'est pas directe. Dans la théorie c'est bon puisque indirectement, par le biais des régulateurs, elles sont reliées. En pratique il y a peut-être une perturbation.
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

skywodd


Peut-être un problème de masse : sa connexion entre l'arduino et le display n'est pas directe. Dans la théorie c'est bon puisque indirectement, par le biais des régulateurs, elles sont reliées. En pratique il y a peut-être une perturbation.

Une masse reste une masse, qu'elles soit connectées au niveau du régulateur ou directement ça revient au même ...
Ça serait différent si il y avait une masse virtuelle, mais ce n'est pas le cas sur les cartes arduino ...
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up