Go Down

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

Subsea

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().

Subsea

#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"

Subsea


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);
 }
 }
}

Subsea

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

Subsea

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

Subsea

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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy