Arduino e Raspberry

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

char * messaggio = "A";

....
serialPrintf(fd,messaggio);

sia utilizzando

//serialPutchar(fd, 'A');

Non succede nulla!
Sull'Arduino si accende il led RX per un istante e il LED sul pin 13 lampeggia qualche volta! Perchè?

metti il codice C, credo sia qualche roblema con la configurazione che fa resettare il micro

edit: lo sai che il rasp parla a 3V e che ti serve un traslatore di livello, vero?

lesto:
metti il codice C, credo sia qualche roblema con la configurazione che fa resettare il micro

edit: lo sai che il rasp parla a 3V e che ti serve un traslatore di livello, vero?

Questo è tutto il codice arduino:

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);
  }

Questo tutto quello del raspberry:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <wiringPi.h>
#include <wiringSerial.h>

int main(int argc, char *argv[]){
int fd;
char * messaggio = "A";
if ((fd = serialOpen ("/dev/ttyACM0", 9600)) < 0)
  {
  printf ("Unable to open serial device!!! \n");
//    return 1 ;
  }

if (strcmp(argv[1], "1") == 0){
printf("Valore uno");
serialPrintf(fd,messaggio);

//serialPutchar(fd, 'A');
}

else if (strcmp(argv[1], "2") == 0){
printf("Valore due");
serialPutchar(fd, 'B');
}

else if (strcmp(argv[1],"Temp") == 0)
printf("Temperatura");

else if (strcmp(argv[1],"Status") == 0){
printf("Door status: Open/Close    \tDoor lock: Y/N ");
printf("\nTemperature: X");
printf("\n\nLight status:\n\tWhite \tRGB");
printf("\t\n1: \t0-255 \t0-1");
printf("\t\n2: \t0-255 \t0-1");
printf("\t\n3: \t0-255 \t0-1");
}

3.3V anche sulla porta USB? Cos'è esattamente un traslatore di livello?

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!

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?

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!

Comunque no, solo su Raspberry!

prova il codice anche da PC, magfari è la libreria che usi che è fallata

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!

E l'autoreset, classico... C'è un post simile a cui ho appena risposto

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?

Xfox:

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.

leo72:

Xfox:

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!

Xfox, forse non hai letto cosa ho scritto :wink:

Ogni volta che apri il canale seriale

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:

  1. optare per il condensatore
  2. tagliare la posta RESET-EN che c'è sulle schede
  3. cambiare firmware all'Atmega8/16U2 affinché l'autoreset possa essere disattivato con un semplice ponticello, vedi thread di Astrobeed[/ulr]

leo72:
Xfox, forse non hai letto cosa ho scritto :wink:

Ogni volta che apri il canale seriale

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:

  1. optare per il condensatore
  2. tagliare la posta RESET-EN che c'è sulle schede
  3. 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);}

void inviadatiiniziali(){
  Serial.print(fader1);
  delay(temp);
  Serial.print(toggle1);
  delay(temp);
  Serial.print(toggle2);
  delay(temp);
}


](http://arduino.cc/forum/index.php/topic,130621.0.html)

che codice stai usando a lato PC?
e hai disattivato l'autoreset? sicuro che non lampeggi il led sul pin 13?

lesto:
che codice stai usando a lato PC?
e hai disattivato l'autoreset? sicuro che non lampeggi il led sul pin 13?

serialPutchar(fd, 'A');
delay(250);
while(serialDataAvail(fd) > 0){
printf("Carattere: %c \n",serialGetchar(fd));
}