Ciao ragazzi, è da parecchio che sto cercando di far comunicare il Raspberry Pi con il mio Arduino tramite la porta seriale. Non è stato un problema fin quando ho utilizzato processing, ma dato che voglio ampliare le mie conoscenze sto provando a farlo comunicare anche scrivendo un programmino in C!
Sto usando una libreria chiamata Wiring (Raspberry Pi | wiringPi | Serial Library | Gordons Projects).
Per ora ho caricato un semplice sketch:
int pinpiu = 3;
int pinmeno = 2;
void setup(){
Serial.begin(9600);
pinMode(pinpiu, OUTPUT);
pinMode(pinmeno, OUTPUT);
digitalWrite(pinmeno, LOW);
}
char c = 'A';
String messaggio = "";
void loop(){
messaggio = "";
if(Serial.available()>0);
c = Serial.read();
messaggio += c;
if (messaggio.indexOf('A')>=0)
digitalWrite(pinpiu, HIGH);
else if (messaggio.indexOf('B>')>=0)
digitalWrite(pinpiu, LOW);
}
Ovviamente ricevendo 'A', accende il led sul pin 3 e ricevendo 'B' lo spegne!
Tutto funziona usando il serial monitor su windows.
Una volta collegato al programma su linux (o meglio, Raspbian sul Raspberry),
sia utilizzando
ah, no l'usb è standard come deve essere.
Un traslatore di livello è un sistema per trasformare un livello logico ad un voltaggio in altyro voltaggio, sia in modo monodirezionale che in modo bidirezionale
lesto:
ah, no l'usb è standard come deve essere.
Un traslatore di livello è un sistema per trasformare un livello logico ad un voltaggio in altyro voltaggio, sia in modo monodirezionale che in modo bidirezionale
Ah, avevo capito un traslatore di livello per l'USB!
Dunque dove sta il problema? Perchè il led sul pin 13 lampeggia?
la USB del rasp cede poca potenza se non erro... la stai usando per alimentare qualcosa??
non è che stai alimentado la Rasp con l'USB del PC (mooolto malo!)
lesto:
la USB del rasp cede poca potenza se non erro... la stai usando per alimentare qualcosa??
non è che stai alimentado la Rasp con l'USB del PC (mooolto malo!)
No, lo sto alimentando con un trasformatore che gli fornisce la giusta tensione ed il doppio della corrente di cui necessita!
L'arduino è alimentato pure esternamente!
lesto:
se hai un chip ftdi o un secondo arduino prova a leggere cosa invia il programma in C con SoftSerial...
ma il codice del rasp lo hai usato su un PC normale?
Non ho ne chip FTDI ne secondo arduino! Posso provare a collegare un modulo xBee (con explorer) al raspberry e l'altro modulo all'arduino che invia i dati al pc!
Io per far comunicare raspy ed arduino uso python, ma non mi ha mai dato problemi ne collehato nei GPIO ne usando FTDI/PL quindi come gia ha detto lesto, controlla la lib..
Praticamente all'apertura e chiusura della porta seriale si riavviava l'arduino!
Ho risolto mettendo un condensatore sul pin Reset!
Adesso funziona perfettamente! Grazie!
lesto:
E l'autoreset, classico... C'è un post simile a cui ho appena risposto
Ma il problema è: Perchè anche se non do il comando di chiusura della porta seriale?
Ogni volta che apri il canale seriale il chip Atmega8/16U2 interpreta questo evento come un reset, è programmato per fare così. Questo permette di resettare la scheda quando dall'IDE vuoi spedire un nuovo sketch e predisporre l'Arduino in ricezione.
lesto:
E l'autoreset, classico... C'è un post simile a cui ho appena risposto
Ma il problema è: Perchè anche se non do il comando di chiusura della porta seriale?
Ogni volta che apri il canale seriale il chip Atmega8/16U2 interpreta questo evento come un reset, è programmato per fare così. Questo permette di resettare la scheda quando dall'IDE vuoi spedire un nuovo sketch e predisporre l'Arduino in ricezione.
Dunque il problema non è chiudere e riaprire ma il comando di apertura!
Non ho detto aprire e chiudere, ho detto "aprire" e basta. Le schede Arduino sono state fatte apposta così, affinché l'IDE avesse un modo per resettare la scheda.
Se non ti piace, puoi:
optare per il condensatore
tagliare la posta RESET-EN che c'è sulle schede
cambiare firmware all'Atmega8/16U2 affinché l'autoreset possa essere disattivato con un semplice ponticello, vedi thread di Astrobeed[/ulr]
Non ho detto aprire e chiudere, ho detto "aprire" e basta. Le schede Arduino sono state fatte apposta così, affinché l'IDE avesse un modo per resettare la scheda.
Se non ti piace, puoi:
optare per il condensatore
tagliare la posta RESET-EN che c'è sulle schede
cambiare firmware all'Atmega8/16U2 affinché l'autoreset possa essere disattivato con un semplice ponticello, vedi [thread di Astrobeed[/ulr]
[/quote]
Allora, perchè ogni volta che invio i dati in modo da farli immagazinare nelle variabili fader1, toggle1 e toggle2 quando poi invio il carattere 'A', per farmeli riinviare tutti hanno il valore "-1"?
void serialEvent(){
temporan = Serial.read();
if(temporan == 'A'){ //Richiesta dati iniziali
inviadatiiniziali();
Serial.flush();
}
else if (temporan == 'B'){ //Invio dati dal Raspberry
fader1 = Serial.read();
delay(temp);
toggle1 = Serial.read();
delay(temp);
toggle2 = Serial.read();
delay(temp);}