Show Posts
Pages: [1] 2 3 ... 27
1  International / Generale / Re: Arduino e Raspberry on: March 06, 2013, 04:06:19 am
Ottima risposta antimix! Grazie.

Poichè io non utilizzo il PI per programmare l'arduino, ma uso il mio computer ho preferito lasciare il condensatore! Non mi è di intralcio!
Adesso l'Arduino non si resetta più e poichè ogni volta che chiamo il comando che ho scritto io (non è un loop quindi ogni volta che lo chiamo riparte da capo: variabili = 0) ho fatto in modo che l'Arduino invia i dati già immagazzinati e il codice sul PI va a lavorare su quelli e li rimanda indietro!
Funziona perfettamente!
Grazie a tutti!
2  International / Generale / Re: Arduino e Raspberry on: February 27, 2013, 06:13:13 am
Potrebbe essere dovuto al fatto che il comando di apertura della seriale invia dei dati che l'arduino legge in modo errato?
3  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 01:17:02 pm
subito dopo il comando B, metti il codice per leggere:

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

e vediamo cosa succede, se i ati ono già "pazzi" oppure no.

sarebbe da provare anche via serialMonitor, per capire se è qualche settaggio di default della libreria C che fa le bizze

Così li invia giusti i dati!
Però ripeto se provo ad accendere l'altro gruppo, il primo si spegne (fatto sta che comunque i dati poi li ricevo comunque giusti in base al gruppo acceso).

Es.
Se invio che fader deve essere 150 e di conseguenza il primo gruppo acceso (dunque 1) e poi invio che si deve accendere il secondo gruppo la risposta è che il fader è 0 e il toggle1 pure!
4  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 01:04:35 pm

Io dal raspberry invio:


tira il freno a mano e analizza quello che invii dal Rasp PRIMA di inviare quel comando.

Invia il carattere 'A'.
Come fa con il carattere 'B', e poi invia i dati, correttamente ricevuti dall'arduino (dico che sono correttamente ricevuti perchè le luci si accendono e posso anche variare la luminosità modificando il valore di fader1).

Ripeto che se invio per esempio il comando per accendere un gruppo di led (impostando toggle1 a 1), e poi invio un altro comando per accendere un secondo gruppo (impostando toggle2 a 1), il primo gruppo si spegne! Come se le variabili, sull'arduino, ripartissero da zero!
5  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 12:50:02 pm
l'arduino INVIA -1  perchè a priori HA LETTO -1, altrimenti invierebbe 0 oppure il valore precedente
Prendiamo in esame la funzione:

Code:
void serialEvent(){
  temporan = Serial.read();

  if(temporan == 'A'){ //Richiesta dati iniziali
    inviadatiiniziali();
  }
  else if (temporan == 'B'){ //Invio dati dal Raspberry
    fader1 = Serial.read();
    delay(temp);
    toggle1 = Serial.read();
    delay(temp);
    toggle2 = Serial.read();
    delay(temp);
}
}
Io dal raspberry invio:
Code:
serialPutchar(fd, 'B');
    serialPutchar(fd, fader1);
  serialPutchar(fd, toggle1);
    serialPutchar(fd, toggle2);

E l'arduino legge correttamente!
Successivamente io dal raspberry invio:
Code:
serialPutchar(fd, 'A');
delay(250);
while(serialDataAvail(fd) > 0){
printf("Carattere: %c \n",serialGetchar(fd));

Dunque l'arduino mi dovrebbe ritornare indietro i valori precedentemente inviati!
Così il raspberry mostra a video tramite il printf ciò che legge! CARATTERE PER CARATTERE!
Ecco quello che esce:
Code:
-
1
-
1
-
1
6  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 12:45:09 pm
Non è l'arduino che legge "-1", l'arduino invia "-1".
Al primo avvio però se prima di inviare dati (tramite 'B') invio semplicemente 'A', mi risponde con i tre 0 com'è giusto che sia, dopo che invio i dati DAL RASPBERRY ALL'ARDUINO, e si accendono le luci, se invio 'A' per chiedere questi dati indietro, si spegne tutto e l'arduino invia tre volte -1.

Il problema è che sul serial monitor io non chiedo di leggere quando non ci sono dati, poichè il serial monitor, appunto, legge solo quello che viene inviato dall'arduino! E l'arduino invia tre volte "-1"
7  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 12:38:50 pm
Vuoi toglierti i dubbi? Metti nel setup la stampa di un messaggio:
Code:
void setup() {
  ........ il tuo codice
  Serial.println("Avvio programma!");
}

Se compare quella scritta, l'Arduino si è resettato ed hai ragione tu. Se non ricompare mai, l'Arduino NON si è resettato ed ha ragione lesto... Su, prova...  smiley-wink

NON si resetta! Allora dove sta il problema?
Perchè appena invio il comando A, le tre variabili assumono il valore -1.


-1 non equivale a null? Cioè non dichiarata/esistente?
8  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 12:32:36 pm
non è come se si resetta!

Code:
char fader1 = 0;
char toggle1 = 0;
char toggle2 = 0;

quindi resettando leggeresti 0... l'unico modo che hai per leggere -1 è che stai leggendo il buffer seriale quando è vuoto.

Lo pensavo io, dunque mentre le luci sono accese ho scollegato l'arduino dal raspberry e l'ho attaccato al pc, aperto il monitor seriale e inviato il carattere 'A', ricevo -1 -1 -1.
Con il monitor seriale, se fosse come dici tu, non dovrebbe succedere poichè lui legge solo quello che c'è!
9  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 12:29:03 pm
allora si accende il led ul pin 13, perche esso lampeggia semrpe quando il chip è resettato

sicuro che non lampeggi il led sul pin 13?

No, non si accende! Ecco perchè è molto strano! Ogni volta che chiamo il comando sul raspberry per inviare i dati (e di conseguenza invia il comando per aprire la porta seriale e chiuerla) il programma resetta i valori! Infatti se fai caso al codice per il raspberry il comando per il toggle 2 è diviso dal toggle1 infatti quando accendo un gruppo di led, non posso accendere l'altro insieme perchè sull'arduino si resetta quella variabile!
10  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 12:10:09 pm
il problema non  quando leggi A o B, ma quando leggi B dopo fai delle altre read che non aspettano.. ti ho pure postato il codice corretto.....................

Allora....
Quando il Raspberry invia il carattere 'A', l'arduino deve inviare le variabili "fader1","toggle1" e "toggle2" (il problema è che quando il raspberry legge questi valori legge -1 -1 -1).
Quando il Raspberry invia il carattere 'B' invia anche i valori che io decido di inviare dal pc! Dunque invierà per esempio B 130 1 1, dove 130 sarà il valore di fader1 e toggle1 e toggle2 avranno il valore 1;
Tutto funziona quando invio i dati DAL raspberry ALL' arduino! Si accendono le luci in maniera corretta!
Se io poi invio il carattere 'A', DAL raspberry ALL'arduino, quest'ultimo mi dovrebbe ritornare riinviare (al raspberry) gli ultimi valori di fader1, toggle1 e toggle2, ma come detto prima invia -1 -1 -1!

Edit.
E' come se a ogni volta che do un comando (e viene inviato il comando di apertura della porta seriale) si resettasse tutto! Nonostante ci sia il condensatore da 100uF!
11  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 11:53:45 am
Ma non è quello il problema!
Il problema è quando l'arduino riceve 'A' è deve inviare i dai tramite inviadatiiniziali() al raspberry!
E' appunto il raspberry che legge -1! Quando do il comando per dire al raspberry di richiedere i dati, l'arduino spegne le luci e invia tre volte "-1"

Edit.
L'attesa del carattere è inserita già nel loop:

Code:
while(Serial.available() <= 0){}

Dato che quel codice è inserito direttamente nella funzione serialEvent() quel codice viene eseguito solo quando c'è qualcosa nel buffer seriale no?
12  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 10:15:51 am
per favore metti i codici completi.

sicuro di non avere problemi di ram?
Arduino:
Code:
/*Controllo luci casa by Xfox, parte arduino master.
 Questo programma permette di controllare tramite TouchOSC (android o iOS)
 un Arduino Master e tre ATMega328 Slave. */

//Includo librerie
#include <Wire.h>

int fader1 = 0; //Valore fader uno
int toggle1 = 0; //Valore toggle uno
int toggle2 = 0; //Valore toggle due

int fader2 = 0; //Valore fader 2
int toggle3 = 0; //Valore toggle 3
int toggle4 = 0; //Valore toggle 4

int fader3 = 0; //Valore fader 3
int toggle5 = 0; //Valore toggle 5
int toggle6 = 0; //Valore toggle 6


int temp = 1;
int temporan = 0;

void setup(){
  Serial.begin(9600);
  //Inizializzo I2C Come master
  Wire.begin();
}

long attesa = 0;
void loop(){
  //Richiedo dati


  if(attesa <= millis()){

    attesa = millis() + 100;

    Serial.print('B');
    while(Serial.available() <= 0){}
    delay(10);


    Wire.beginTransmission(0x01); //Avvio trasferimento dati a Slave1
    Wire.write(fader1);
    Wire.write(toggle1);
    Wire.write(toggle2);
    Wire.endTransmission(); //Termino trasferimento a Slave1
    delay(5);

    /*
  Wire.beginTransmission(0x02); //Avvio trasferimento dati a Slave2
     Wire.write(fader2);
     Wire.write(toggle3);
     Wire.write(toggle4);
     Wire.endTransmission(); //Termino trasferimento a Slave2
     delay(5);
     
     Wire.beginTransmission(0x03); //Avvio trasferimento dati a Slave3
     Wire.write(fader3);
     Wire.write(toggle5);
     Wire.write(toggle6);
     Wire.endTransmission(); //Termino trasferimento a Slave3
     delay(5);
     */
  }
}

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();
        Serial.print(fader1);
    delay(temp);
    toggle1 = Serial.read();
    Serial.print(toggle1);
    delay(temp);
    toggle2 = Serial.read();
        Serial.print(toggle2);
    delay(temp);
    /*
  fader2 = Serial.read();
     delay(temp);
     toggle3 = Serial.read();
     delay(temp);
     toggle4 = Serial.read();
     delay(temp);
     
     fader3 = Serial.read();
     delay(temp);
     toggle5 = Serial.read();
     delay(temp);
     toggle6 = Serial.read();
     delay(temp);
     */
  }
}

//Funzione di inizializzazione comunicazione
void inviadatiiniziali(){
  Serial.print(fader1);
  delay(temp);
  Serial.print(toggle1);
  delay(temp);
  Serial.print(toggle2);
  delay(temp);
}


Raspberry:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

char fader1 = 0;
char toggle1 = 0;
char toggle2 = 0;

int fd;

int main(int argc, char *argv[]){

 if ((fd = serialOpen ("/dev/ttyACM0", 9600)) < 0)  {  //Indirizzo Arduino via USB
  // if ((fd = serialOpen ("/dev/ttyUSB0", 9600)) < 0)  { //Indirizzo modulo xBee via USB
 printf ("Unable to open serial device!!! \n");
    return 1 ;
  }

if (strcmp(argv[1], "Led") == 0){
  if (strcmp(argv[2], "1") == 0){ //Primo gruppo di Led
    if (strcmp(argv[3], "ON") == 0){ //Controllo sul Led bianchi
      toggle1 = 1;
      fader1 = atoi(argv[4]);
    }
    else if (strcmp(argv[3], "OFF") == 0)
      toggle1 = 0;

    else if(strcmp(argv[3], "RGB") == 0){ //Controllo Led RGB
      if(strcmp(argv[4], "ON") == 0)
        toggle2 = 1;

      else if(strcmp(argv[4], "OFF") == 0)
        toggle2 = 0;
    }
  }
  int i = 0;
  for(i = 0; i < 2; i++){
serialPutchar(fd, 'B');
    serialPutchar(fd, fader1);
    serialPutchar(fd, toggle1);
    serialPutchar(fd, toggle2);
  }
} //Fine comando Led

else if (strcmp(argv[1],"Status") == 0){

//Devo inviare un carattere per farmi ritornare i valori iniziali
serialPutchar(fd, 'A');
delay(250);
while(serialDataAvail(fd) > 0){
printf("Carattere: %c \n",serialGetchar(fd));

/*
fader1 = serialGetchar(fd);
delay(1);
toggle1 = serialGetchar(fd);
delay(1);
toggle2 = serialGetchar(fd);
delay(1);
*/
}
/*
else
printf("Dati non ricevuti!");

  printf("Door status: Open/Close    \tDoor lock: Y/N ");
  printf("\nTemperature: X");
  printf("\n\nLight status\tWhite \tRGB");
  printf("\t\n1:%c \t\t%c \t%c", toggle1, fader1, toggle2);
  printf("\t\n2: \t\t0-255 \t0-1");
  printf("\t\n3: \t\t0-255 \t0-1");
*/
}

  printf("\n");
  serialClose(fd);

  return 0;
}


No, non dovrei aver nessun problema di RAM!
Ad ogni modo, collegando l'arduino al raspberry ed inviando il comando per accendere le luci, ricoleggandolo (con le luci accese, è alimentato esternamente) al pc e aprendo il serial monitor dell'IDE (non si resetta poichè ho messo il condensatore come detto prima) e inviando il comando 'A' si spegne tutto e ricevo i 3 "-1"!
13  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 10:07:47 am
bhe se non c'è nulla che setta quei valori cosa speri di ottenere?

Ti ho dato solo il pezzo che si occupa di leggere!
Questo codice è scritto in gcc su un Raspberry!
(Il ciclo l'ho messo perchè mi sono reso conto che se invio due volte i dati li acquisisce).

La prova che riceve i dati è data dal fatto che quei tre dati servono:
fader1 a stabilire l'intensità di un gruppo di tre led bianchi
toggle1 accende/spegne quel gruppo

toggle2 fa lo stesso con un altro gruppo!

Non appena invio il comando per la lettura 'A' si spengono e mi invia 3 volte "-1"

Code:
  int i = 0;
  for(i = 0; i < 2; i++){
serialPutchar(fd, 'B');
    serialPutchar(fd, fader1);
    serialPutchar(fd, toggle1);
    serialPutchar(fd, toggle2);
  }
14  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 09:59:15 am
che codice stai usando a lato PC?
e hai disattivato l'autoreset? sicuro che non lampeggi il led sul pin 13?

Code:
serialPutchar(fd, 'A');
delay(250);
while(serialDataAvail(fd) > 0){
printf("Carattere: %c \n",serialGetchar(fd));
}
15  International / Generale / Re: Arduino e Raspberry on: February 25, 2013, 09:48:14 am
Xfox, forse non hai letto cosa ho scritto  smiley-wink
Quote
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]

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"?



Code:
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);
}
Pages: [1] 2 3 ... 27