Go Down

Topic: Comunicazione seriale tra Arduini (Read 5794 times) previous topic - next topic

Jul 19, 2012, 04:19 pm Last Edit: Jul 26, 2012, 10:17 am by SUBSEA Reason: 1
Un saluto a tutti. è da un po' di tempo che mi scervello con questo problema: io ho caricato questi due sketch su due diversi arduino uno, sperando che si accendesse il led collegato sul pin  appena collegavo l'rx di uno al tx dell'altro, ma così non è stato... Qualcheduno può trovarmi l'intoppo?

Code: [Select]
void setup(){
 Serial.begin(9600);
 pinMode(13,OUTPUT);
}
void loop(){
 if(Serial.read()=='1'){
   digitalWrite(13, HIGH);
 }
}


Code: [Select]
void setup(){
 Serial.begin(9600);
 }
void loop(){
   Serial.print('9');
}


:smiley-sad-blue: :smiley-red:

PaoloP

Spedisci 9 e verifichi 1.
Non credo si accenderà mai.

Madwriter

#2
Jul 19, 2012, 04:49 pm Last Edit: Jul 19, 2012, 04:53 pm by Madwriter Reason: 1

Spedisci 9 e verifichi 1.
Non credo si accenderà mai.

poi ti consiglio di inziare solo con un serial "read" generico cosi vedi se almeno riesci a trasmettere ;)
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

PaoloP

Tra le altre cose... ti conviene utilizzare il comando Serial. available() prima di Seria.read().

#4
Jul 19, 2012, 04:59 pm Last Edit: Jul 19, 2012, 05:40 pm by SUBSEA Reason: 1
Così dovrebbe andare bene?
Code: [Select]
void setup(){
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}
void loop(){
  if (Serial.available()>0){
  if(Serial.read()=true){
    digitalWrite(13, HIGH);
  }
  }
}


P.S. scusate prima ho postato il codice sbagliato, comunnque sono sicuro di inviare e ricevere 9.

brexino

#5
Jul 19, 2012, 09:53 pm Last Edit: Jul 19, 2012, 09:55 pm by brexino Reason: 1
Attenzione,  if(Serial.read()=true){ cosi, non verifichi, ma assegni

Code: [Select]

void setup(){
 Serial.begin(9600);
 pinMode(13,OUTPUT);
}
void loop(){
 if (Serial.available()>0){
 if(Serial.read()==true){
   digitalWrite(13, HIGH);
 }
 }
}


In più, cosi il 13 si accenderà sempre, o quasi, perchè gli stai dicendo "SE RIESCI A LEGGERE, ACCENDI IL LED", non "SE LEGGI 9, ACCENDI IL LED"


pitusso

Ciao,
se posso darti un consiglio:
utilizza una connessione SoftwareSerial.
In questo modo puoi utilizzare il Serial monitor per inviare comandi all'altro Arduino e soprattutto per fare debug, facendoti stampare a video quello che arriva.

C'è un esempio che dovresti poter utilizzare direttamente (l'unica modifica che ti consiglio è di settare le velocità delel porte seriali sw e hw ugualmente):
Example -> SoftwareSerial -> SoftwareSerialExample


brexino

#8
Jul 19, 2012, 09:59 pm Last Edit: Jul 19, 2012, 10:03 pm by brexino Reason: 1

Cioè? Come dovrei fare?  :smiley-fat:


Te l'ho detto, devi verificare che dalla lettura, ottieni il 9, crei una variabile char e gli assegni il valore letto, poi verifichi se nella variabile c'è il 9, e di conseguenza accendi o spegni il led

Code: [Select]
void setup(){
 Serial.begin(9600);
 pinMode(13,OUTPUT);
}
void loop(){
 char C;
 if (Serial.available()>0){
 C = Serial.read();
 if(C == "9")
  {
   digitalWrite(13, HIGH);
 }
  else
  {
   digitalWrite(13,LOW);
 }
 }
}

Purtroppo mi da un errore durante la compilazione... Dice che non è possibile fare la conversione da "pointer" e "integer".  :smiley-sad-blue:

ale92

se sostituisci ' ' agli " " sul if la compilazione va a buon fine

E' vero, la compilazione non mi dà problemi, e rispetta le funzioni anche quando gliele invio da serial monitor; quando però gliele invio tramite il pin tx dell'altro arduino sull' rx del ricevente non dà segni di vita. Ho provato anche con uno sketch più semplice:
Code: [Select]
void setup(){
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}
void loop(){
  if (Serial.available()>0){
      digitalWrite(13, HIGH);
      }
}

ed è la stessa storia: serial monitor sì, altro arduino no  :smiley-sad-blue:

Madwriter

Prova cosi
Arduino RX
Code: [Select]
int incomingByte = 0;   // for incoming serial data

void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                // read the incoming byte:
                incomingByte = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(incomingByte, DEC);
        }
}


Arduino TX:
Code: [Select]
void setup(){
  Serial.begin(9600);
  }
void loop(){
    Serial.print('9');
Serial.print(9);
  Serial.write(45);
}


Giusto per test   :smiley-mr-green:
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

Purtroppo niente neanche così... Cosa può essere? :smiley-eek-blue:

Madwriter


Purtroppo niente neanche così... Cosa può essere? :smiley-eek-blue:

Allora dobbiamo usare un pò di logica debbugghiana  :smiley-mr-green:
Colega sia il tx che l'rx al serial monitor dell'ide e vedi se comunicano bene, a questo punto potrebbe esserci qualcosa nel collegamento che cavi usi?
colleghi RX con TX e TX con RX?
"Due cose sono infinite: l'universo e la stupidità umana, ma riguardo l'universo ho ancora dei dubbi..." Albert Einstein

Go Up