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.
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.
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.
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:
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:
byte comando=0;
void loop() {
if (Serial.available() > 0)
{
switch (Serial.read()) {
case '2':
tmrpcm.play("test.wav");
delay(7000);
break;
}
}
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.
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.
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.
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.
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.
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