Offline
Newbie
Karma: 0
Posts: 40
|
 |
« on: April 27, 2012, 07:50:25 am » |
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
Online
Faraday Member
Karma: 51
Posts: 3181
|
 |
« Reply #1 on: April 27, 2012, 08:11:21 am » |
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
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 40
|
 |
« Reply #2 on: April 27, 2012, 08:20:24 am » |
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
Online
Faraday Member
Karma: 51
Posts: 3181
|
 |
« Reply #3 on: April 27, 2012, 08:27:55 am » |
Forse in giro trovi qualche libreria per creare un parser xml su arduino.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 40
|
 |
« Reply #4 on: April 27, 2012, 08:33:50 am » |
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=1158138779Grazie ancora.
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Online
Faraday Member
Karma: 51
Posts: 3181
|
 |
« Reply #5 on: April 27, 2012, 08:37:15 am » |
Nel codice del link al posto di tutti gli if potresti usare uno switch case  ( http://arduino.cc/en/Reference/SwitchCase)
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 87
Posts: 8494
:(){:|:&};:
|
 |
« Reply #6 on: April 27, 2012, 09:59:27 am » |
direi che xml è troppo ridondante per una comunicazione (seriale) che è già lenta di suo. [{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. [{20,10,30, idPunto}, {20,10,30, idPunto}, {20,10,30, idPunto}]
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 40
|
 |
« Reply #7 on: April 27, 2012, 10:03:55 am » |
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
Tesla Member
Karma: 87
Posts: 8494
:(){:|:&};:
|
 |
« Reply #8 on: April 27, 2012, 10:11:18 am » |
i dati li metti dove vuoi, una struttura, un array, un'array di strutture... 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
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 40
|
 |
« Reply #9 on: April 27, 2012, 10:21:28 am » |
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
Online
Faraday Member
Karma: 51
Posts: 3181
|
 |
« Reply #10 on: April 27, 2012, 10:28:22 am » |
Per ulteriore dritte potresti postare il codice mano a mano che lo sviluppi.  Qui siamo molto disponibili con chi condivide e ci da i mezzi per farsi aiutare. 
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 40
|
 |
« Reply #11 on: April 30, 2012, 06:02:10 am » |
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. 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
Tesla Member
Karma: 87
Posts: 8494
:(){:|:&};:
|
 |
« Reply #12 on: April 30, 2012, 09:24:10 am » |
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
|
|
|
|
|
Milan
Offline
Sr. Member
Karma: 0
Posts: 366
|
 |
« Reply #13 on: September 26, 2012, 04:04:01 am » |
Scusate, ma come mai non c'è nulla nel setup e nel loop e funziona ugualmente?
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 87
Posts: 8494
:(){:|:&};:
|
 |
« Reply #14 on: September 26, 2012, 04:43:57 am » |
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
|
|
|
|
|
|