Pages: [1] 2   Go Down
Author Topic: Inviare dati ad arduino da Flex  (Read 1071 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti,
  sto provando a inviare dei dati ad arduino, ma sono insicuro sull'approccio migliore.

I dati che devo inviare sono le coordinate 3d, di uno o più punti.

Inizialmente pensavo di concatenare le variabili X+Y+Z+IdentificativoPunto in una stringa e inviarla con la libreria firmata, ma non riesco a modificare i vari esempi che ci sono per questa libreria e comunque non vorrei prendere una strada sbagliata, mi vorrei affidare alla vostra esperienza.

Il massimo sarebbe poter inviare un array di punti, del tipo:

[{x:20, y:10, z:30, idPunto:"manoDestra"},
   {x:20, y:10, z:30, idPunto:"manoSinistra"},
   {x:20, y:10, z:30, idPunto:"gomitoDestro"}]

Grazie.
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 104
Posts: 6626
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dovresti crearti un protocollo di trasmissione dove il primo carattere indica l'id e i seguenti tre numeri l'x, la y e la z.
In ricezione memorizzi i 4 dati salvandoli in un array.
Non ti conviene inviare parentesi o cose più complicate che poi dovresti interpretare lato Arduino.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao,
   grazie per la risposta.

Quindi che tu sappia non esiste qualcosa di già fatto? nella comunicazione con i server utilizzo un protocollo AMF, quando invio o ricevo i dati sono già in un formato nativo per flash.

Anche l'invio di un xml andrebbe banissimo.... cavolo non avevo pensato a xml, ci saranno già delle librerie... ?
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 104
Posts: 6626
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Forse in giro trovi qualche libreria per creare un parser xml su arduino.
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ancora grazie, avvolte serve proprio uno scambio di idee.

Ho trovato questo post con del codice che mi ha reso più chiaro come leggere la stringa.
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1158138779

Grazie ancora.
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 104
Posts: 6626
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nel codice del link al posto di tutti gli if potresti usare uno switch case  smiley-wink (http://arduino.cc/en/Reference/SwitchCase)
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10115
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

direi che xml è troppo ridondante per una comunicazione (seriale) che è già lenta di suo.

Quote
[{x:20, y:10, z:30, idPunto:"manoDestra"},
   {x:20, y:10, z:30, idPunto:"manoSinistra"},
   {x:20, y:10, z:30, idPunto:"gomitoDestro"}]

questo mi pare un protocollo molto migliore, però eviterei la stringa che da il nome: tanto hai già l'id.al massimo crei una stringa apposta del tipo

<idPunto:nome>

così dici una volta sola l'id a quale nome corrisponde e sei a posto.

eviterei di inviare anche x: y: e z:, i valori separati da virgole vanno più che bene, anzi son più facili da gestire perchè fai una split sulla virgola e hai già i 4 valori che ti servono, senza ulteriori lavorazioni.

Quote
[{20,10,30, idPunto},
   {20,10,30, idPunto},
   {20,10,30, idPunto}]
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si in effetti, anche se esistono librerie che rendono tutto più semplice, preferisco trovare la soluzione più performante.

Non capisco una cosa, per quale motivo dovrei mettere i dati che mi arrivano in un array?

      while (serialAvailable()){           
         strArray = serialRead();
         i++;
      }

Quindi mi arriva la stringa come scomposta e la devo successivamente ricomporre?
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10115
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

i dati li metti dove vuoi, una struttura, un array, un'array di strutture...

Quote
Quindi mi arriva la stringa come scomposta e la devo successivamente ricomporre?
se intendi che non la laeggi tutta insieme, hai ragione. ma in base al tuo protocollo sai benissimo che ce la stringa iniza per < devi aspettare >, e se invece inizia per { devi aspettare }. tutti i dati che ricevi al di fuori di questi vanno scartati come dati corrotti.
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ottimo, ora mi sono chiare un paio di cose che non riuscivo a capire.

Ok, già con queste info, credo di poter creare un ciclo per decodificare una struttura di dati, ottimo, ti ringrazio.

Se ti vengono in mente delle dritte da darmi, fai pure.
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 104
Posts: 6626
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per ulteriore dritte potresti postare il codice mano a mano che lo sviluppi.  smiley-mr-green
Qui siamo molto disponibili con chi condivide e ci da i mezzi per farsi aiutare.  smiley-cool
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, finalmente sono riuscito a leggere i dati dalla seriale e convertirli in 3 valori numerici, che rappresentano le coordinate 3D inviate dal computer.
ho fatto veramente fatica a capire il funzionamento delle variabili in c++, ed ancora ora non credo di averle capite bene.
Dichiarando le variabili all'interno di una funzione, ho la certezza che usciti da qualle funzione venga liberata la memoria?

Ecco il codice di tutto il programmino per Arduino, inviando trmmite il monito della serviale una stringa del tipo "A11|12|13|" dovrebbe accendersi il led 13.
Code:
int x;
int y;
int z;


void setup()
{
  Serial.begin(57600);
  pinMode(13, OUTPUT);
}

void loop()
{

}


boolean controlloPosizione3D(int posX, int posY, int posZ, int range){
//  Serial.println("boolean controlloPosizione3D(int posX, int posY, int posZ, int range)");
//  Serial.println("if(controlloPosizione(x,posX,range))");
  if(controlloPosizione(x,posX,range)){
//     Serial.println("if(controlloPosizione(y,posY,range))");
    if(controlloPosizione(y,posY,range)){
//       Serial.println("if(controlloPosizione(z,posZ,range))");
      if(controlloPosizione(z,posZ,range)){
//        Serial.println("return true;");
        return true; 
      }
    }
  }
//  Serial.println("return false;");
  return false;
}

// controlla se il valore A è vicino al valore B, utilizzando range come distanza per il controllo
boolean controlloPosizione(int valueA, int valueB, int range){
//  Serial.println("boolean controlloPosizione(int valueA, int valueB, int range)");
//  Serial.println("if((valueB + range) < valueA and  (valueB - range) > valueA)");
  if((valueB + range) > valueA and  (valueB - range) < valueA){
//    Serial.println("return true;");
    return true;
  }
//  Serial.println("return false;");
  return false;
}

void serialEvent() {
    readSerialString();
    if(controlloPosizione3D(10,10,10,20)){
        digitalWrite(13, HIGH);   // set the LED on
    } else {
        digitalWrite(13, LOW);    // set the LED off
    }
 }

void readSerialString () {
  char stringaParametri[10];
  int valori[3];
  int i = 0;
  int j = 0;
  while (Serial.available()){
    char inChar = (char)Serial.read();
    //Serial.println("inChar : " + String(inChar));
    stringaParametri[i] = inChar;
    if(inChar == '|'){
      //Serial.println("if(inChar == '|')");
      int valore = atoi(stringaParametri);
      valori[j] = valore;
      //Serial.println("j : " + String(j));
      //Serial.println("String(valori[j]) : " + String(valori[j]));
      i=0;
      j++;
    }
    else {
      i++;
    }
  }

  x = valori[0];
  y = valori[1];
  z = valori[2];

  Serial.println("x : " + String(x));
  Serial.println("y : " + String(y));
  Serial.println("z : " + String(z));
}


Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10115
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dichiarando le variabili all'interno di una funzione, ho la certezza che usciti da qualle funzione venga liberata la memoria?

certo. O meglio, le variabili dichiarate all'interno di un blocco ({ } per intenderci) muoiono al termine del blocco.

non ho guardato il codice, sono al lavoro e di fretta
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Milan
Offline Offline
Sr. Member
****
Karma: 0
Posts: 375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusate, ma come mai non c'è nulla nel setup e nel loop e funziona ugualmente?
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10115
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

perchè la funzione serialEvent() viene chiamata in automatico dal micro quando arriva qualcosa via seriale. Però credo che sei sempre nel contesto interrupt, quindi è sbagliatisimo il fatto che il programma si basi su questa metodologia. La funzione dovrebbe riempire un buffer o cmq fare delle cose semplici, che poi vengono rilevate dal codice del loop che esegue la parte di logica "pesante".
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1] 2   Go Up
Jump to: