Pages: [1] 2   Go Down
Author Topic: Communication RS232 TTL  (Read 2781 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,

Je continue mon projet, et après de nombreux problèmes hard résolus grâce à vous (je pense notamment à Barbudor, Skywood, ...), je vais attaquer la partie programmation.

Je vous présente donc mon projet.

Je vais avoir un Arduino Nano embarqué dans mon robot et un Arduino Uno dans mon boitier de commande.

L'Arduino Uno présent dans mon boîtier de commande sera notamment relié à une manette permettant de piloter le robot, à l'Arduino Nano mais aussi au PC.

Les deux Arduinos sont reliés par fils et communiquent par protocole série RS232 : ArduinoNano>MAX232>FILs 25m>Max232>ArduinoUno.

Je vais donc avoir à gérer au niveau du Arduino Uno deux communication série (PC+Arduino Nano) et une communication I2C (Manette).

J'aimerais donc avoir quelques conseils, pistes sur lesquels m'appuyer pour commencer à coder. Est-ce que je peux trouver un moyen efficace de coder tout ce petit système ?

Merci d'avance.
Romain
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L'Arduino UNO n'a qu'une liaison série physique, et c'est celle qui est déjà reliée au PC.

Si tu l'utilises aussi pour communiquer avec la Nano, tout Serial.print() va aller au PC et à la Nano.
Et en réception ca sera la cacophonie.

Une solution est bien sur de prendre un SoftwareSerial.
Compte tenu que le Serial est déjà relié à l'interface USB, le SoftwareSerial serait probablement dédié à la communication avec la Nano.
Malheureusement -de mon point de vue- le SoftwareSerial présente de gros défauts du point de vue temps réel.
En gros j'aime pas, surtout si tu as une communication plutôt dense entre les 2 cartes.

A la place d'une UNO, pourquoi ne pas envisager :
- Une MEGA qui possède plus de liaisons série physiques ?
- Une Leonardo (ou compatible : VinciDuino, Olimex) sur laquelle la liaison USB est physiquement distincte de la liaison série.
Logged

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 ?

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

D'accord, c'est bien ce que j'avais cru voir dans quelques topics que j'ai pu lire à ce sujet.

Mais j'aurais souhaité plus de détails, notamment sur :

- le SerialSoftware
- la léonardo

Si tu n'as pas le temps, n'hésites pas à juste me donner quelques liens internet pour faire des débuts de recherches et je reviendrais vers toi si il y a des choses avec lesquelles j'ai du mal.

Merci BarbuDor

EDIT : J'ai déjà trouvé les informations que je cherchais sur la Léonardo et cette carte ne gère pas la communication I2C pour la manette...ou TWI c'est pareil... je sais pas je vais continuer de chercher... il n'y a que la méga qui peut faire l'affaire ?
« Last Edit: July 01, 2012, 11:35:32 am by rhum187 » Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

EDIT : J'ai déjà trouvé les informations que je cherchais sur la Léonardo et cette carte ne gère pas la communication I2C pour la manette...ou TWI c'est pareil... je sais pas je vais continuer de chercher... il n'y a que la méga qui peut faire l'affaire ?

La Léonardo a aussi une liaison I2C comma la UNO, donc qu'est-ce qui cloche de ton point de vue ?


SoftwareSerial est une bibliothèque qui permet d'utiliser n'importes quelles broches numérique comme une liaison série asynchrone (UART).
Mais comme toute la gestion des bits et des timings est faite en logiciel, cela est très contraignant du point de vue temps réel.
Ainsi si ton programme est occupé ailleurs, tu risque de perdre des caractères en réception, alors que sur le Serial normal, les caractères sont reçus sous interruption et mémorisés dans un buffer de 16 octets pour te laisser un peu de temps.
http://arduino.cc/en/Reference/SoftwareSerial
Logged

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 ?

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
La Léonardo a aussi une liaison I2C comma la UNO, donc qu'est-ce qui cloche de ton point de vue ?

En fait j'ai vu après mon post que la liaison I2C était aussi OK.

J'avais écrit ça parce que (c'est peut-être trivial mais souvent très parlant) j'ai trouvé sur la plupart des distributeurs Arduino que le Uno était plus chère que la Léonardo...

Alors qu'est-ce qui peut expliquer cette petite différence de prix ?
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est les soldes
la Léonardo est la nouvelle carte Arduino et la Uno est en perte de vitesse. Donc les prix chutent.

Perso je vient d'acheter une VinciDuino qui est un clone Espagnol de la Leonardo 100% compatible. Je l'ai payé 16 Euros port compris (en kit !, pré-cablé ca serait plutot 21 euros port compris).
Je viens de voir sur Ebay un clone chinois de la VinciDuino pour 16Euros port compris.

Maintenant si ce que tu veux faire est plus facile avec une Léonardo ou compatible qu'avec une Uno, ca vaut peut être les quelques € supplémentaires car il n'y a pas de solution miracle pour ajouter une liaison série fiable sur une Uno (cf mon avis sur SoftwareSerial).

J'ai lancé une discussion sur les différents modèles Léonardo et compatibles ici : http://arduino.cc/forum/index.php/topic,112471.0.html

Notamment si tu es bricoleur puisque tu part aussi sur une Nano, tu peux aussi jeter un coup d'oeil à la Teensy qui ne coûte que 16$.
Logged

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 ?

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Malheureusement -de mon point de vue- le SoftwareSerial présente de gros défauts du point de vue temps réel.
En gros j'aime pas, surtout si tu as une communication plutôt dense entre les 2 cartes.
Regarde du coté de http://www.pjrc.com/teensy/td_libs_AltSoftSerial.html c'est une librairie de "software serial" sans latence et entièrement full-duplex (émission et réception simultané).
Par contre tu n'as pas le choix des broches du "soft serial" et tu ne peut en avoir qu'un.

A la place d'une UNO, pourquoi ne pas envisager :
- Une MEGA qui possède plus de liaisons série physiques ?
- Une Leonardo (ou compatible : VinciDuino, Olimex) sur laquelle la liaison USB est physiquement distincte de la liaison série.
Je ne recommande ABSOLUMENT pas d'utiliser une carte leonardo en étant débutant (ou niveau intermédiaire) !
C'est une carte certes trés puissante mais aux spécificités hardware extrêmement complexe !
Cette carte est à destination de personnes ayant une certaine assurance dans le domaine de l'arduino et de la programmation embarqué !
Débuter avec une carte arduino leonardo c'est comme foncer droit dans un mur avec une F1 ...

Du reste même des blogueurs anglais comme tronixstuff sont du même avis :
http://tronixstuff.wordpress.com/2012/06/21/first-look-the-arduino-leonardo/
Quote
However if you’re looking for your first Arduino board – this isn’t the board for you right now. There are too many incompatible shields out there, and the inability to cheaply replace the microcontroller will see some beginners burn out their first couple of boards rendering them useless. Get yourself an Arduino Uno or compatible board such as the Freetronics Eleven.

In conclusion, classifying the Leonardo board as good or bad is not a simple decision. It may or may not be an improvement – depending on your needs. Right now – for beginners, this is not the board for you. For those who understand the differences between a Uno and Leonardo, sure – no problem. Frankly, I would get a LeoStick instead.  At the end – it’s up to you to make an informed decision.

Mon point de vue sur le sujet (milieu de page, partie "arduino 1.0.1") :
http://skyduino.wordpress.com/2012/06/28/test-olimexino-32u4-arduino-leonardo-compatible-et-arduino-1-0-1/

C'est les soldes
la Léonardo est la nouvelle carte Arduino et la Uno est en perte de vitesse. Donc les prix chutent.
Non c'est pas tout à fait ça smiley-wink
La leonardo ne fait pas l'unanimité ils faut essayer de passer le stock en baissant les prix :
- mise sur le marché trop tardive ce qui as fait perdre envie à pas mal de monde,
- clone communautaire moins chère et plus intéréssant,
- hardware inexistant (ya vraiment pas grand chose sur la carte) qui donne pas envie comparé à la concurrence,
- partie logiciel mal conçu et trop légère pour être vraiment utile (clavier qwerty + souris usb, rien d'autre et aucun choix de configuration)
- deux bootloader différent entre 1.0.0 RC2 et 1.0.1 = une chance sur deux de tomber sur un bootloader "foireux"
- un hardware incompatible avec 80% des shields / breakout existante (c'est pas entièrement la faute de la team arduino)
(voir mon article pour la liste complète)

Et au contraire la UNO se vend comme des petits pain.

Maintenant si ce que tu veux faire est plus facile avec une Léonardo ou compatible qu'avec une Uno, ca vaut peut être les quelques € supplémentaires car il n'y a pas de solution miracle pour ajouter une liaison série fiable sur une Uno (cf mon avis sur SoftwareSerial).
Plus facile ... non !
Tu va tellement galérer à comprendre par toi même (les tutoriels pour arduino classique ne fonctionnerons pas avec la leonardo, enfin une grande partie) que tu va perdre plus de temps qu'avec une carte UNO.

Notamment si tu es bricoleur puisque tu part aussi sur une Nano, tu peux aussi jeter un coup d'oeil à la Teensy qui ne coûte que 16$.
Je conseille aussi d'utiliser une Teensy (si tu reste sur la solution USB bien sur), le logiciel est compatible arduino, simple, bien documenté, et surtout ... complet !
Mon test de la teensy++ 2.0 : http://skyduino.wordpress.com/2011/09/03/test-teensy-2-0/
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok,

Je viens d'acheter.... une Léonardo...

Je n'avais pas vu ton post Skywood...

Mais j'ai tout de même acheté une Uno dans le lot (oufff).

Du coup, je suis un peu perdu. Je pensais que la config serait simple pour une petite application telle que la mienne.
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Du coup, je suis un peu perdu. Je pensais que la config serait simple pour une petite application telle que la mienne.
... côté leonardo il va falloir réfléchir avant de coder.

Tu veut faire ça en gros :
ordi -> usb -> leonardo -> serial -> max232 -> fils -> max232 -> serial -> arduino nano ?

Pour la partie ordi -> usb -> leonardo :
- il faut utiliser Serial,
- ne pas oublier d'ajouter un while(!Serial); apres le Serial.begin(),
- ajouter un delay(1) (minimum) aprés avoir envoyer des données à l'ordi sinon il va crouler sous le flot de données entrant

Pour la partie leonardo -> serial -> max232 :
- il faut utiliser Serial1,
- pas de while(!......), c'est un port série physique
- pas de delay non plus (port physique = vitesse de transmission physique = delai physique)

Pour la partie max232 -> serial -> arduino nano :
- c'est du classique Serial, tu devrais pouvoir te débrouiller smiley-wink
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui, c'est exactement ça que je souhaite faire !

Donc si j'ai bien compris (n'hésites pas à me corriger si je me trompe) :

Quote
ne pas oublier d'ajouter un while(!Serial); apres le Serial.begin(),
Cela permet de n'exécuter la suite du programme seulement lorsque l'on ouvre le port COM du PC.

Quote
ajouter un delay(1) (minimum) aprés avoir envoyer des données à l'ordi sinon il va crouler sous le flot de données entrant
Le Léonardo est plus rapide que la plupart des autres Arduino. Il peut saturer le buffer d'écriture du port COM. On ajoute une milisec de retard pour que le SerialMonitor tourne correctement et ne plante pas ?
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
ne pas oublier d'ajouter un while(!Serial); apres le Serial.begin(),
Cela permet de n'exécuter la suite du programme seulement lorsque l'on ouvre le port COM du PC.
Voila c'est ça.

Quote
ajouter un delay(1) (minimum) aprés avoir envoyer des données à l'ordi sinon il va crouler sous le flot de données entrant
Le Léonardo est plus rapide que la plupart des autres Arduino. Il peut saturer le buffer d'écriture du port COM. On ajoute une milisec de retard pour que le SerialMonitor tourne correctement et ne plante pas ?
Oui, comme le port COM est émulé via la liaison usb il peut tourner à plusieurs Mo/s, vitesse que les logiciel comme le Serial Monitor ne supporte pas.
Le délai créer un léger temps d'attente qui permet au logiciel côté PC de gérer les données qui lui arrive.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En fait je suis en train de me demander si je ne peux pas faire beaucoup plus simple :

Je reste sur la configuration : ordi -> usb -> ARDUINO UNO-> serial -> max232 -> fils -> max232 -> serial -> ARDUINO NANO

Je pense que les instructions Serial qui seront envoyés par le Uno au Nano via le protocole RS232, seront également envoyés au PC via l'USB. Si tel est le cas alors pas de problèmes :

J'ai juste à coder chaque commandes envoyés par ma manette avec un caractère ASCII.

La communication dans mon projet se limite à : j'appuis que le bouton A ====> le soft installé sur le PC (VB.NET) détecte qu'un A est envoyé ===> action gérée par le soft

Donc je ne vois pas pourquoi j'aurais besoin de SerialSoftware ou d'utiliser un Leonardo dans la mesure où je ne souhaite pas faire de com : PC vers UNO mais juste Uno vers PC
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Parce que dans le sens inverse, ta liaison série de Uno va recevoir les série de la Nano et du PC avec risque de court-circuit et de cacophonie si les 2 parlent en même temps.
Cf mon premier post.

Pour être plus précis j'auras écrit :

Code:
Ordi [COMx] <---usb---> [Serial] Leonardo [Serial1] <-> Max232 <---fils RS32---> Max232 <-> [Serial] Nano
contre :

Code:
                         v--> Max232 <---fils RS32---> Max232 <-> [Serial] Nano
Ordi [COMx] <---usb---> (*) <--> [Serial] UNO

Donc problème au niveau du (*)
Logged

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 ?

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je ferais plusieurs essais et je vous tiens au courant de mes conclusions.

Je suis en ce moment en train de réfléchir à ma "stratégie de programmation" et je me pose cette question.

Actuellement, j'envoie ma commande PWM via l'accéléromètre du Nunchunk (merci Skywodd pour le tuto ^^). Y a t'il un meilleur moyen que de faire un truc du genre :

si je suis entre telle et telle valeur ====> envoyé un X sur le port série ====> le x étant lu pour une PWM de 80
si je suis entre telle et telle valeur ====> envoyé un Y sur le port série ====> le x étant lu pour une PWM de 100
si je suis........................................................... zzzzzZZZZZZZZZZZZZZzzzzzzzzzzzzzzzzzzz

Il faudrait que je sois capable d'envoyer directement la PWM directement convertie. Pour la convertir pas de problème, j'ai déjà inséré des petites fonctions affines qui me permettent de faire la convertion : données provenant du Nunchunk vers PWM. Mais pour décoder les données envoyées... je ne sais pas comment faire. Je vous mets le petit bout de code

Code:
if ((int)chuck.readRoll()>=22 && (int)chuck.readRoll()<=53 && (int)chuck.buttonZ==1)
  {
    Serial.print("\t");
    Serial.print((int)((255/30)*(int)chuck.readRoll()-170), DEC);
  }
  else if ((int)chuck.readRoll()>53 && (int)chuck.buttonZ==1)
  {
    Serial.print("\t");
    Serial.print(255, DEC);
  }
  else if ((int)chuck.readRoll()<=-30 && (int)chuck.readRoll()>=-90 && (int)chuck.buttonZ==1)
  {
    Serial.print("\t");
    Serial.print(-(int)((-255/55)*(int)chuck.readRoll()-(1275/11)), DEC);
  }
  else if ((int)chuck.readRoll()<-90 && (int)chuck.buttonZ==1)
  {
    Serial.print("\t");
    Serial.print(-255, DEC);
  }
  else
  {
     Serial.print(0, DEC);
  }
  Serial.println();
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

analogWrite ?
Je vois pas ou ce situe ton probléme en fait smiley-red

Pour ton code tu peut utiliser une petite astuce valable uniquement avec le compilateur gcc :
les switch / case avec intervalle :
Code:
if((int)chuck.buttonZ == 1) {
  Serial.write('\t');
  int roll = chuck.readRoll();
  switch(roll) {
    case 22...53:
      Serial.print((255 / 30) * roll - 170, DEC);
    break;

    case 54...255:
      Serial.print(255, DEC);
    break;
   
    case -90...-30:
      Serial.print(-((-255 / 55) * roll - (1275 / 11)), DEC);
    break;
   
    case -255...-89:
      Serial.print(-255, DEC);
    break;
  }
} else {
  Serial.print(0, DEC);
}
Serial.println();

De plus :
- tu as certaines conditions de tes if qui sont identique partout -> pas top
- tu appelle nunchunk.readRoll() un nombre incalculable de fois -> pas top
- tu fait un Serial.print("\t") à chaque fois -> une fois hors des if suffit, et un Serial.write('\t') est préférable (plus rapide)
C'est juste quelques conseils comme ça smiley-wink
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: [1] 2   Go Up
Jump to: