Go Down

Topic: communication entre arduino mega et uno?[REGLE] (Read 841 times) previous topic - next topic

nonos

May 24, 2012, 12:35 am Last Edit: May 24, 2012, 10:48 am by nonos Reason: 1
bonjour,
je suis entrain de bidouiller un code pour controller des leds via un ecran tactile...
tout marche,
sauf que je n'ai pas assez de sorties pwm disponible sur ma carte mega, (l'ecran tactile me prend des sorties)
j'ai a ma disposition une carte uno....et je pense relier les 2, pour qu'elle communique entre elles (en fait j'ai juste besoin que la mega donne la bonne valeur de la led a la carte uno, ..relation maitre-esclave)
j'ai essayer plusieurs choses, et je bute...je n'arrive pas a les faire communiquer ensemble dans un premier temps
j'utilise la librairie SoftEasyTransfer, et  NewSoftSerial sous arduino 23

le code de la carte master (mega)
Code: [Select]
#include <SoftEasyTransfer.h>

/*   For Arduino 1.0 and newer, do this:   */
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(2, 3);

/*   For Arduino 22 and older, do this:   */
#include <NewSoftSerial.h>
NewSoftSerial mySerial(2, 3);



//create object
SoftEasyTransfer ET;

struct SEND_DATA_STRUCTURE{
 //put your variable definitions here for the data you want to send
 //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
 int blinks;
 int pause;
};

//give a name to the group of data
SEND_DATA_STRUCTURE mydata;

void setup(){
 mySerial.begin(9600);
 //start the library, pass in the data details and the name of the serial port.
 ET.begin(details(mydata), &mySerial);
 
 pinMode(13, OUTPUT);
 
 randomSeed(analogRead(0));
 
}

void loop(){
 //this is how you access the variables. [name of the group].[variable name]
 mydata.blinks = random(5);
 mydata.pause = random(5);
 //send the data
 ET.sendData();
 
 //Just for fun, we will blink it out too
  for(int i = mydata.blinks; i>0; i--){
     digitalWrite(13, HIGH);
     delay(mydata.pause * 100);
     digitalWrite(13, LOW);
     delay(mydata.pause * 100);
   }
 
 delay(5000);
}


j'ai bien ma led qui s'allume aleatoirement..pas de probleme

le code de l'esclave (uno)
Code: [Select]
#include <SoftEasyTransfer.h>

/*   For Arduino 1.0 and newer, do this:   */
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(2, 3);

/*   For Arduino 22 and older, do this:   */
#include <NewSoftSerial.h>
NewSoftSerial mySerial(2, 3);


//create object
SoftEasyTransfer ET;

struct RECEIVE_DATA_STRUCTURE{
 //put your variable definitions here for the data you want to receive
 //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
 int blinks;
 int pause;
};

//give a name to the group of data
RECEIVE_DATA_STRUCTURE mydata;

void setup(){
 mySerial.begin(9600);
 //start the library, pass in the data details and the name of the serial port.
 ET.begin(details(mydata), &mySerial);
 
 pinMode(13, OUTPUT);
 
}

void loop(){
 //check and see if a data packet has come in.
 if(ET.receiveData()){
   //this is how you access the variables. [name of the group].[variable name]
   //since we have data, we will blink it out.
   for(int i = mydata.blinks; i>0; i--){
     digitalWrite(13, HIGH);
     delay(mydata.pause * 100);
     digitalWrite(13, LOW);
     delay(mydata.pause * 100);
   }
 }
 //you should make this delay shorter then your transmit delay or else messages could be lost
 delay(250);
}


et la ..rien....

en premier probleme je pense a une erreur de cablage...
mega pin 3---> uno pin 2
       pin 2---> pin 3
(j'ai aussi essayé l'inverse)
faut il utiliser une autre pin, 0,1 (rx,tx) ?
faut il utiliser un autre type de connections (j'ai une horloge sur le port sda et scl de l'arduino mega)?
merci

nadirovick

Bonjour,
essaye avec TX/RX normalement c'est le bon cablage
TX "Mega" --> RX "Uno" Maitre
RX "Mega" --> TX "Uno" Esclave
:D

skizoh

alors écoute ton câblage est bon tu a bien inversé 2 et 3  (rx / tx) et oui 2 3 sont très bien pour les software serial je les utilise aussi, à tu la possibilité d'utiliser le débug? (port série afficher en console dans l'IDE) ça te permettrai d'afficher ce que t'envoie d'un coté et ce que tu reçois de l'autre, tu n'envoie peut être juste pas les bonne valeur ou alors les interprète mal..

Skizo !
Un tien vaux mieux que deux tu l'auras !

nonos

merci pour vous reponses..
bon j'ai changé un peu de facon de faire..
je suis revenu a une version precedente de EasyTransfer Arduino Library v1.7
, et je ne passe plus par la librairie newsoftserial
j'ai branché sur les pin rx0 et tx1 en croisant ...
et la ca marche...il me reste a adapter le code
je mets le code pour en dessous si un jour quelqu'un se trouve dans la meme situation que moi...

Code: [Select]
#include <EasyTransfer.h>

//create object
EasyTransfer ET;

struct RECEIVE_DATA_STRUCTURE{
  //put your variable definitions here for the data you want to receive
  //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
  int blinks;
  int pause;
};

//give a name to the group of data
RECEIVE_DATA_STRUCTURE mydata;

void setup(){
  Serial.begin(9600);
  //start the library, pass in the data details and the name of the serial port. Can be Serial, Serial1, Serial2, etc.
  ET.begin(details(mydata), &Serial);
 
  pinMode(13, OUTPUT);
 
}

void loop(){
  //check and see if a data packet has come in.
  if(ET.receiveData()){
    //this is how you access the variables. [name of the group].[variable name]
    //since we have data, we will blink it out.
    for(int i = mydata.blinks; i>0; i--){
      digitalWrite(13, HIGH);
      delay(mydata.pause * 100);
      digitalWrite(13, LOW);
      delay(mydata.pause * 100);
    }
  }
 
  //you should make this delay shorter then your transmit delay or else messages could be lost
  delay(250);
}

et

Code: [Select]
#include <EasyTransfer.h>

//create object
EasyTransfer ET;

struct SEND_DATA_STRUCTURE{
  //put your variable definitions here for the data you want to send
  //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO
  int blinks;
  int pause;
};

//give a name to the group of data
SEND_DATA_STRUCTURE mydata;

void setup(){
  Serial.begin(9600);
  //start the library, pass in the data details and the name of the serial port. Can be Serial, Serial1, Serial2, etc.
  ET.begin(details(mydata), &Serial);
 
  pinMode(13, OUTPUT);
 
  randomSeed(analogRead(0));
 
}

void loop(){
  //this is how you access the variables. [name of the group].[variable name]
  mydata.blinks = random(5);
  mydata.pause = random(5);
  //send the data
  ET.sendData();
 
  //Just for fun, we will blink it out too
   for(int i = mydata.blinks; i>0; i--){
      digitalWrite(13, HIGH);
      delay(mydata.pause * 100);
      digitalWrite(13, LOW);
      delay(mydata.pause * 100);
    }
 
  delay(5000);
}

skizoh

ok, dommage que tu n'ai pas réussi de l'autre façon mais bon, le principale c'est que tu t'en sois sortie, merci pour le partage ;)

Skizo !
Un tien vaux mieux que deux tu l'auras !

Go Up