Creazione di una comunicazione SoftwareSerial tra due arduini!

Buonasera!
Volevo chiedervi come si fa a realizzare una comunicazione via SoftwareSerial tra due arduini:
Vi posto i miei due codici di prova:

/*
 * Arduino Master
 * 
 * Arduino Motors & Bluetooth --> read on the serial output from sensors
 * 
*/

#include <SoftwareSerial.h>

#define RX 18
#define TX 19
SoftwareSerial reader(RX,TX);

void setup() {
Serial.begin(9600);
reader.begin(9600);
Serial.flush();
reader.flush();
}

void loop() {
  if(reader.available()>0)
  {
    Serial.write(reader.read());
    }
    delay(1000);
}
/*
 * Arduino Slave
 * 
 * Arduino Sensors --> write on the serial output from sensors
 * 
*/

#include <SoftwareSerial.h>

#define RX 9
#define TX 10
SoftwareSerial writer(RX,TX);

void setup() {
Serial.begin(9600);
writer.begin(9600);
Serial.flush();
writer.flush();
}

void loop() {
    writer.print("Hello");
    writer.println(" ");

    Serial.print("Hello");
    delay(1000);
}

…anche con i collegamenti come devo fare? mettere in comune anche la GND o no?
Grazie!
Luca

TX Arduino_1 -----> RX Arduino_2
RX Arduino_1 <----- TX Arduino_2
GND Arduino_1 <–> GND Arduino_2

Poi è tutto software :slight_smile:

Guglielmo

forse intendi:

TX Arduino_1 -----> RX Arduino_2
RX Arduino_1 <----- TX Arduino_2
GND Arduino_1 <-> GND Arduino_2

???

comunque a livello software quello che ho messo è corretto? perchè io ho provato ma non funziona… :confused:

LucaAlba98: forse intendi ...

:D :D :D ... ovviamente SI, correggo il post ;)

Guglielmo

Il test fallo con questo che un programmino ampiamente collaudato e dimentica quell’istruzione delay() !!!

#include <SoftwareSerial.h>

#define  SS_RX 10            // RX PIN to receive  data
#define  SS_TX 11            // TX PIN to transmit data

SoftwareSerial ssSerial(SS_RX, SS_TX);

void setup()
{
  delay (2000);
  //
  Serial.begin(9600);        // Initialize USB Serial port
  ssSerial.begin(9600);      // Initialize SoftwareSerial port
  //
  Serial.println("--- Ports ready ---");
  Serial.println("");
}

void loop()
{
  if (ssSerial.available() > 0) Serial.write(ssSerial.read());
  if (Serial.available() > 0) ssSerial.write(Serial.read());
}

Guglielmo

Altra cosa ... che Arduino stai usando ? ... perché, in funzione del modello, NON tutti i pin vanno bene, leggiti il reference della SoftwareSerial che lo dice chiaramente !

Guglielmo

gpb01:
Il test fallo con questo che un programmino ampiamente collaudato e dimentica quell’istruzione delay() !!!

#include <SoftwareSerial.h>

#define  SS_RX 10            // RX PIN to receive  data
#define  SS_TX 11            // TX PIN to transmit data

SoftwareSerial ssSerial(SS_RX, SS_TX);

void setup()
{
  delay (2000);
  //
  Serial.begin(9600);        // Initialize USB Serial port
  ssSerial.begin(9600);      // Initialize SoftwareSerial port
  //
  Serial.println("— Ports ready —");
  Serial.println("");
}

void loop()
{
  if (ssSerial.available() > 0) Serial.write(ssSerial.read());
  if (Serial.available() > 0) ssSerial.write(Serial.read());
}




Guglielmo

…questo dove lo carico? sul master o sullo slave?

gpb01:
Altra cosa … che Arduino stai usando ?

arduino uno…sul reference mi sembra di non aver visto nulla contro la uno o mi sbaglio? :slight_smile:

LucaAlba98: ...questo dove lo carico? sul master o sullo slave?

Io credo che dovresti capirlo da solo, altrimenti non ne uscirai mai :(. Guarda lo sketch, cerca di capire cosa fa e tutto ti sarà chiaro!

non mi era chiaro questo passaggio....

void loop()
{
  if (ssSerial.available() > 0) Serial.write(ssSerial.read());
  if (Serial.available() > 0) ssSerial.write(Serial.read());
}

...perchè legge e poi scrive quello che legge? non lo capisco proprio! :( :(

Ma… non noti che è la stessa cosa che faceva uno dei due sketch che hai postato tu?

if(reader.available()>0)
{
  Serial.write(reader.read());
  }
  // Via quella orribile delay()!
}

Legga da una seriale (quella collegata all’altro modulo) e scrive sull’altra (ovvero sul monitor seriale!). E viceversa.

si in effetti non lo avevo notato :sweat_smile: :sweat_smile: :sweat_smile: :sweat_smile: :sweat_smile: ..quindi va su quello che legge! :D

Sì, ma questo serve solo a fare il debugging, ovvero a vedere che l'altro invii effettivamente i dati e che li invii come te li aspetti. Poi invece di stampare sul monitor serial quel che ricevi dovrai raccoglierlo in una stringa, effettuarne il parsing e fare quel che vuoi con i dati che estrai.

ah sisi okok! quindi con l'altro farò la prova di inviare i dati e basta vero?

E cos'altro vorresti fare?

:relaxed: :relaxed: :relaxed: :relaxed: :relaxed: :relaxed: :relaxed:

Devi procedere per passi quando metti in piedi un qualche sistema di comunicazione. Il primo passo è verificare che chi invia invii effettivamente i dati che ti aspetti, nel formato che ti aspetti. Tu sei in questa fase, e quello sketch ti aiuterà, visualizzando su seriale ciò che ricevi.

Quando sei certo di questo, allora inizierai ad estrarre i dati.

LucaAlba98: Questo è estratto dalla tua presentazione ...

LucaAlba98: ..... A livello di programmazione conosco bene C#, HTML, ASP.NET, ho alcune nozioni di C, Assembly (anche se so che non è utilizzato come prima..) e so gestire e controllare in ottimo modo Database (Access sopratutto). A livello di elettronica ho buone basi e è da due anni che conosco lo splendido mondo Arduino. ...

... capisci che, vista la presentazione, le tue domande ci lasciano a dir poco ... "sconcertati" ? ? ? :o :o :o

Guglielmo

SukkoPera:
Devi procedere per passi quando metti in piedi un qualche sistema di comunicazione. Il primo passo è verificare che chi invia invii effettivamente i dati che ti aspetti, nel formato che ti aspetti. Tu sei in questa fase, e quello sketch ti aiuterà, visualizzando su seriale ciò che ricevi.

Quando sei certo di questo, allora inizierai ad estrarre i dati.

certo certo! infatti non sto ancora facendo comunicare il sistema di dati veri, ma sto facendo dei test su arduini singoli che non sono nel progetto per evitare dei disastri! :slight_smile: :slight_smile:

gpb01:

LucaAlba98: Questo è estratto dalla tua presentazione …

… capisci che, vista la presentazione, le tue domande ci lasciano a dir poco … “sconcertati” ? ? ? :o :o :o

Guglielmo

Guglielmo non capisco cosa intendi… :sweat_smile: :sweat_smile:
molto spesso faccio domande anche molto scontate perchè sono un tipo molto ansioso e devo avere la certezza assoluta di quello che faccio…

Ok test fatto e funziona! ora per passare gli output di sensori da uno ad un altro arduino basta solo fare così? io vorrei però che questa operazione venisse fatta in background (l'arduino che riceve svolge anche operazioni mentre è in ascolto).... devo usare millis? o ci sono altri metodi?

nessuno?