Uso di newsoftserial per collegare due arduino tra di loro

Ciao, vorrei provare ad usare questa libreria per collegare due arduino tra di loro in modo tale che se il primo arduino invia un evento, il secondo riceve ed esegue l’azione associata.

Ci sarebbe una guida o qualcosa che spiega come usare il tutto?

Ho aggiunto la libreria, e ho provato ad usare gli esempi inclusi, ma forse sbaglio anche i collegamenti.

Ad esempio, la base è questa: (ho solo cambiato i valori del serial begin)

include <NewSoftSerial.h>

NewSoftSerial mySerial(2, 3);

void setup()  
{
  Serial.begin(9600);
  Serial.println("Goodnight moon!");

  // set the data rate for the NewSoftSerial port
  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop()                     // run over and over again
{

  if (mySerial.available()) {
      Serial.print((char)mySerial.read());
  }
  if (Serial.available()) {
      mySerial.print((char)Serial.read());
  }
}

Ho collegato al pin 2 del primo arduino il 3 del secondo e viceversa, ho aperto il serial monitor di uno dei due arduino, ma mi stampa solo goodnigth moon, ma non hello world?

Da quello che ho capito, sempre se non sbaglio funziona la seriale hardware (che sarebbe quella emulata sull 'usb) ma non quella software che sarebbe il mySerial…

Mi chiarite le idee e mi aiutate a capire come funziona?
Grazie :wink:

Devi avere sul tuo secondo arduino una routine che legga i dati ricevuti su mySerial, seriale sulla quale scrive il primo arduino...

Hai collegati tutti 2 alla USB? senó ti serve collegare la massa dei 2 Arduini. Ciao Uwe

Hai collegati tutti 2 alla USB? senó ti serve collegare la massa dei 2 Arduini. Ciao Uwe

Grazie, si ho collegato solo una usb, e anche la massa dei due arduini in comune su una breadboard..

Ok ora non mi resta altro che capire come fare sul secondo arduino .. ora escogito qualcosa ;)

P.S. Ho collegato il secondo cavo usb e avevo dei rpoblemi,,, cioè uscivano dei geroglifici quando scrivevo qualcosa... ho capito dov'era il problema.. settando entrambe le velocità uguali, ora decodifica bene.. Grazie.. Ora mi metto a fare delle prove un po più specifiche

Ok provato a fare accendere una luce e simulato un pulsante tramite seriale. Tutto Funzionante :grin: !

La cosa si complica un po, quando cerco di inviare un comando tramite ethernet shield, al primo arduino e poi da quello trasformarlo in seriale e trasmetterlo al secondo arduino con la newsoftserial…

Prima di tutto è possibile farlo? Se si , come?

Io avevo pensato a una cosa del genere :
Ricevi una stringa da una pagina web e scrivi via seriale sul secondo arduino la lettera “L”

if(readString.startsWith(“GET /luce”)) {
** mySerial.print(L);**

Sul primo arduino con eth shield avremo:

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
#include <NewSoftSerial.h>

..... tutti i settaggi della eth shield
NewSoftSerial mySerial(2, 3);
String readString; //string
byte l;

void setup()  
{
  Ethernet.begin(mac, ip, subnet);
  Serial.begin(9600);
  Serial.flush(); // svuoto il buffer di ricezione seriale
  mySerial.begin(9600);
  mySerial.flush(); // svuoto il buffer di ricezione seriale
}

void loop()
{
Client client = server.available();
if (client) {
  boolean currentLineIsBlank = true;
  while (client.connected()) {
    if (client.available()) {
      char c = client.read();
        readString.concat(c);
      if (c == '\n' && currentLineIsBlank) {
         Serial.print(readString);

 //QUI IL COMANDO CHE HO PENSATO SI POTESSE INVIARE ALL'ALTRO Arduino
        if(readString.startsWith("GET /luce")) {
          mySerial.print(L);
}

  if (mySerial.available()) {
      Serial.print((char)mySerial.read());
  }
 if (Serial.available()) {
     mySerial.print((char)Serial.read());
   //Resetto "String" per la prossima lettura
        readString="";
        //Fermo il client
        client.stop();
  }
}
}
}
}
}

Ma non funziona, non mi apre nemmeno la comunicazione ethernet con l’arduino…
Idee?

nessuno?

Se nessuno mi sa rispondere mettiamola in altri termini allora..

Se invece di un pulsante simulato da una ethernet shield usassi un pulsante fisico come faccio a far si che se premo il bottone su arduino uno, l'azione venga eseguite dall'arduino due?

Non ci sono riuscito in nessun modo.

Dall'arduino con il pulsante dovresti inviare una stringa di testo sull'altro, e poi gestire il tutto con un if, tipo così:

ARDUINO 1

Serial2.println("Bottone premuto");

ARDUINO 2

*istruzioni per ricevere il testo*

if (testoricevuto=="Bottone premuto") {
  istruzioni
}

Alla fine non dovrebbe essere per nulla diverso dalla comunicazione seriale che avviene tra arduino e pc

GianfrancoPa:
Dall’arduino con il pulsante dovresti inviare una stringa di testo sull’altro, e poi gestire il tutto con un if, tipo così:

Si… è questo il problema di fondo :D… l’idea c’è, ma è il come realizzarla che mi manca…
Ho aggiunto la parte allo sketch gia funzionante, ma non va…

Li posto entrambi.

ARDUINO 1

#include <NewSoftSerial.h>
const int buttonPin = 6;
int buttonState=0; 
NewSoftSerial mySerial(2, 3);
void setup()  
{
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
  Serial.println("=================================================");
  Serial.println("Ciao sono Arduino");
  Serial.println("Dimmi cosa devo fare!");
  Serial.println("---------------------------------------------");
  Serial.println("|        I COMANDI DISPONIBILI SONO:        |");
  Serial.println("---------------------------------------------");
  Serial.println("L o l per accendere la luce!");
  Serial.println("P o p per impulso led!");
  Serial.println("=================================================");
  Serial.flush(); // svuoto il buffer di ricezione seriale
  mySerial.begin(9600);
  mySerial.flush(); // svuoto il buffer di ricezione seriale
}

void loop()
{
  if (mySerial.available()) {
      Serial.print((char)mySerial.read());
  }
 if (Serial.available()) {
     mySerial.print((char)Serial.read());
  }
 if (mySerial.available() && (buttonState == HIGH) ) {
      Serial.println("accendi_led");
  }
   if (Serial.available() && (buttonState == HIGH) ) {
      mySerial.println("accendi_led");
  }
}

ARDUINO 2 (luigino :grin:)

#include <NewSoftSerial.h>
#define led 6
#define button 4

byte rx = 0;    // variabile per contenere il carattere ricevuto

NewSoftSerial mySerial(2, 3);

void setup()  
{
  
  pinMode(6, OUTPUT);
  pinMode(4, OUTPUT);
  Serial.begin(9600);
  Serial.println("Ciao sono Luigino328");
  Serial.flush(); // svuoto il buffer di ricezione seriale
  mySerial.begin(9600);
  mySerial.flush(); // svuoto il buffer di ricezione seriale
}

void loop()
{

      if (mySerial.available() >0) // Controllo se il buffer di ricezione contiene qualcosa
		{
		rx = mySerial.read(); // leggo il carattere ricevuto e lo memorizzo in rx
                mySerial.flush(); // svuoto il buffer di ricezione seriale
 
		if (rx=='L' || rx=='l' || rx=='accendi_led') // ho ricevuto la L maiuscola o minuscola
			{
 
			if (digitalRead(led) == HIGH) // il led era acceso?
				{
				digitalWrite(led,LOW); // lo spengo
				mySerial.println("Led spento");
                                Serial.println("Led spento");
				}
			else  // il led era spento
				{
				digitalWrite(led,HIGH); // lo accendo
				mySerial.println("Led acceso");
                                Serial.println("Led acceso");
				}
 
			}
 
		else if (rx=='P' || rx=='p')// non ho ricevuto la P
                         {
			digitalWrite(button,HIGH); // lo spengo
                        delay(600);
			digitalWrite(button,LOW); // lo accendo
                        Serial.println("pulsante premuto");
                        mySerial.println("pulsante premuto");
                      }
                    }
                  }

Inviando con l’interfaccia seriale L o P funziona alla grande, ma se premo il bottone non mi stampa nulla…
Mi sa che questa espressione non è buona

if (Serial.available() && (buttonState == HIGH) ) {
mySerial.println(“accendi_led”);

Consigli?

i due if del primo arduino li modificherei così:

  if (buttonState == HIGH) {
      Serial.println("accendi_led");
      mySerial.println("accendi_led");
  }
}

Questo perchè la pressione del pulsante è indipendente dal fatto se si scrive o meno sulla seriale, da come avevi scritto tu sembra che il led viene acceso solamentese premo il pulsante e contestualmente do in pasto qualche cosa alla seriale

Grazie domani lo provo. :wink:

Bene! Sono riuscito a fare andare tutto, anche i comandi da ethernet shield. ]:D

Ora non resta altro che aspettare questi benedetti moduli RF per iniziare a testare il tutto in modo wireless :D Ordinati il 25 febbraio da sparkfun.. e chissà quando arrivano. :sweat_smile: :sweat_smile: