Go Down

Topic: Comunicazione seriale tra due arduino (Read 688 times) previous topic - next topic

Michele95

Salve a tutti,
Ho visto il collegamento di due arduino nano in comunicazione seriale.
Mi chiedevo come si fa a realizzare la seguente cosa:
Con il primo arduino invio dei comandi per esempio "Comando1" o un numero tipo "1" o "2" ecc ecc. L'altro arduino invece deve ricevere i comandi e farmi una determinata azione in base al comando. Per esempio con i if o case. Esempio arriva "Comando 1" e accende led 1, arriva "Comando 2" accende led 2 e così via e alla fine di ogni comando ritornare nello stato di lettura pronto per eseguire il prossimo comando.


Grazie

torn24

#1
Oct 19, 2019, 03:35 pm Last Edit: Oct 19, 2019, 03:56 pm by torn24
Nella comunicazione tra due arduino si usano i metodi write() per scrivere e read per leggere.
La comunicazione è a del tutto identica come se usi il monitor seriale.
Per inviare comandi meglio inviare un unico byte come comando, ottieni lo stesso risultato e il tutto diventa più semplice a livello di codice.

Sull'arduino che riceve userai nel loop()  if (Serial.available() > 0), se c'è qualcosa sulla seriale leggo.

Esempio:


Code: [Select]

/* Arduino ricevente */
byte comando=0;
void loop(){

    
    if (Serial.available() > 0) {
    
        comando = Serial.read();

        if(comando==65){

           accendi led1
        }else if(comando==66){
            accendi led2
        }
  }

}

/*********** Arduino trasmittente */


void loop(){

     if(pulsante==HIGH){
    
          Serial.write(65);

     }



}


Michele95

Io ho provato mettendo il serial.write (valore numerico); e poi mettendo l'if come hai detto tu in quella ricevente ma non succede nulla. Ho provato a farlo pure con il Softwareserial.h ma nulla.

Claudio_FF

Si vede che da qualche parte c'è qualcosa che non va.
********* IF e SWITCH non sono cicli ! *********
**** Una domanda ben posta è già mezza risposta ****
*** La corrente si misura in mA, la quantità di carica in mAh ***

torn24

Se posti il programma magari possiamo scoprire se c'è qualcosa che non va ! :)

Comunque devi impostare la Serial.begin() alla stessa velocità per i due arduino...

Il programma per comunicare è di poche righe di codice, probabile che comunque ci sia un errore.

Datman

Accendi led 1 e accendi led 2 naturalmente vanno sviluppati...
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Michele95

#6
Oct 21, 2019, 03:54 pm Last Edit: Oct 21, 2019, 03:56 pm by Michele95
Si il serialbegin l'ho fatto a 115200 su tutti e due, colleganto il tx con l'rx del secondo e l'rx con tx. Praticamente se lo scrivo io il comando sul monitor seriale del secondo mi funziona ma collegati tra loro no. Come se il primo non invia il comando al secondo.
Il codice dell'arduino che invia il dato è il seguente:

Code: [Select]

if (distanza < 30) {
  Serial.println("Accensione sistema ");
  tone(buzzer, 1000, 2000);
  digitalWrite(ledbocca, HIGH);
  delay (5000);
  Serial.write("a");
  }


Il codice dell'arduino che riceve è questo:

Code: [Select]

byte comando=0;

void loop() {
   if (Serial.available() > 0)
 {
    switch (Serial.read()) {
      case '2':
      tmrpcm.play("test.wav");
      delay(7000);
      break;
    }
  }

gpb01

Hai messo in comune anche i GND ? ? ?

Guglielmo
Search is Your friend ... or I am Your enemy !

Michele95

#8
Oct 21, 2019, 04:35 pm Last Edit: Oct 21, 2019, 04:36 pm by Michele95
Si alimentazione in comune hanno e i gnd pure.
I codici dei due arduino come vi sembrano riguardo la comunicazione? Sono teoricamente giusti?

gpb01

#9
Oct 21, 2019, 04:39 pm Last Edit: Oct 21, 2019, 04:40 pm by gpb01
Scusa, ma cosa c'entra ...

Code: [Select]
Serial.write("a");
... con

Code: [Select]
switch (Serial.read()) {
     case '2':

... stai trasmettendo 0x61 ("a") ed in ricezione ti aspetti 0x32 ('2') ? ? ?

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

Altra cosa ... usa delle SoftwareSerial e NON le Serial ... altrimenti come fai a fare debug sulla porta USB che è collegata alla "Serial" ? ? ?

Guglielmo
Search is Your friend ... or I am Your enemy !

torn24

A parte che invii 'a' e confronti con '2', la condizione non si verificherà mai vera e non eseguirà niente.
Io sapevo, non so se sbaglio, che se colleghi i pin della seriale poi la seriale con il PC non funzionava, quindi   Serial.println("Accensione sistema "); non dovrebbe funzionare perché usando i pin la seriale del PC non è più disponibile.

Michele95

Allora siccome ho provato con diverse cose alla fine lo postato sbagliato ma assicuro che l'ho provato con sia 2 che a ecc ecc in tutte e due per verificare la condizione. So benissimo che se lascio tx e rx attaccati fra di loro non comunica con l'arduino il PC, infatti staccato i due e lo programmavo. Il print sul seriale è rimasto dal programma nativo che non prevedeva questa comunicazione.

Federico66

Allora siccome ho provato con diverse cose alla fine lo postato sbagliato ma assicuro che l'ho provato con sia 2 che a ecc ecc in tutte e due per verificare la condizione.
Non possiamo che crederti sulla parola, ma è difficile darti una mano se non posti i due programmi che hai usato nel tuo test (magari completi); inoltre, se usassi le seriali software per le comunicazioni, potresti verificare direttamente cosa arriva o non arriva sul ricevente!
La SoftwareSerial semplifica il lavoro a te e a chi cerca di aiutarti, che ad esempio, potrebbe chiederti di stampare direttamente il byte ricevuto, in modo da fare una semplice verifica sulla ricezione.

Code: [Select]

SoftwareSerial serial1(4, 3);

//..omissis..

void loop() {
  if (serial1.available() > 0) {
    char c = serial1.read();
    Serial.println(c);
  }
}



Una volta che ti sei accertato che i dati arrivano, allora inizi a verificare il dato in base alle tue esigenze.

Federico
"La logica vi porterà da A a B. L'immaginazione vi porterà dappertutto." A. Einstein

AmericanDreamer

ah no'
questa la so io


dunque: devi installare la Softwareserial, perchè non puoi usare i pin 0 1 per il debug e anche pr la comunicazione dall'esterno
quindi crei una seriale software usando due pin che vuoi, scegli liberamente vanno tutti bene, sia sun uno che sull'altro arduino
quindi colleghi il pin che hai usato come rx di un arduino al tx dell'altro, e viceversa, qualcuno consiglia di mettere una resistenza da 1000 Ohm in serie (perche?)
tieni le velocità basse: le seriali finte della softwareserial non vanno ne veloci ne lente(perchè lente no?)
usa 9600 che non sbagli mai
fai che un arduino trasmette una volta al secondo un solo carattere, sempre lo stesso
e vedi se lo riconosci dall'altro arduino
e poi se lo riconosci vai avanti facendo il test if...

ecco, lo ho scritto, ma ho solo copiato gli appunti che prendevo leggendovi i mesi scorsi
ne ho un quaderno, ma non sono sicuro che vadano bene

Go Up