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
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 !
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"
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?
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 )
#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");
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
Bene!
Sono riuscito a fare andare tutto, anche i comandi da ethernet shield. ]
Ora non resta altro che aspettare questi benedetti moduli RF per iniziare a testare il tutto in modo wireless
Ordinati il 25 febbraio da sparkfun.. e chissà quando arrivano.