Go Down

Topic: Delegare calcoli a PC usando Processing e passare dati ad Arduino. Come fare? (Read 10530 times) previous topic - next topic

D4NI3L3

Come da titolo vorrei sapere se ci fosse un modo (e se ci fosse come fare) per poter far fare al PC il grosso dei calcoli e poi passare i dati ottenuti ad Arduino.

Chiedo questo perchè mi sto trovando ad affrontare un problema in cui devo passare a due servi le informazioni sull'angolo che devono ottenere. Ho costruito un manipolatore 2 DOF e con un algoritmo di cinematica inversa sapendo le coordinate passo i dati a una serie di funzioni che li trasformano in angoli da passare ai servi, con un laser montato in cima vorrei poter inseguire delle traiettorie, quindi tracciare forme e altro.

Il fatto è che per fare ciò dovrei usare degli algoritmi di interpolazione passando le coordinate tra le quali interpolare. Ho trovato una libreria carina che mi permette di fare un'interpolazione spline lineare e non.

Questo per spiegarvi su cosa sto lavorando, veniamo al problema. Arduino non ce la fa a fare tutti i calcoli, anche provando a disegnare un rettangolo e quindi dovendo fare diverse interpolazioni tra le coordinate degli spigoli, costruendo dei vettori con i dati e passandoli poi alle funzioni che si occupano dei calcoli non riesco ad ottenere risposta dalla comunicazione seriale. In pratica già arrivando su 4 o 5 cicli for e qualche while e if non ottengo nessuna comunicazione con la scheda. Non potendo definire a mano vettori per ogni singola forma che dovrei fare perchè mi verrebbe un lavoro immenso e un sacco di cicli for devo calcolare in questo modo i punti intermedi nelle figure che voglio fare.

Quello che vorrei sapere è come fare a delegare il PC per eseguire i calcoli di interpolazione e poi mandare per ogni forma i vettori con i dati ad arduino. In pratica è possibile tramite comunicazione seriale mandare dei vettori (che poi sarebbero due per ogni forma: x e y) che son stati calcolati dal PC? Che interfaccia dovrei usare? Come posso fare?

Quello che vorrei fare ad esempio è:

1) Passare una lettera dell'alfabeto al PC.
2) Il PC legge la lettera e prende delle coordinate di punti notevoli che caratterizzano la forma in stampatello della lettera (queste le definirò io, non credo di trovare algoritmi interpretativi del font che automaticamente ricostruiscano la forma e le coordinate).
3) Sapute le coordinate notevoli interpolerà tramite un altro algoritmo e definirà quindi un percorso di punti da seguire.
4) Passerà i vettori delle coordinate dei punti da seguire ad Arduino che si occuperà poi dei calcoli per passare le info ai servi e quindi tracciare la traiettoria.

Io l'ho pensato così per ora, se avete consigli su come migliorare la sequenza o su come farla meglio sono ben accetti. Il mio limite attualmente è la potenza elaborativa che mi può dare Arduino.

Non sono molto esperto dell'utilizzo della scheda ma ho diverse conoscenze e imparo alla svelta, vi prego di aiutarmi. Anche se avete link a guide o tutorial o qualsiasi cosa sono ben accetti. Anche progetti già fatti o esempi di codice.

Grazie a chi mi saprà aiutare. Buona serata.

Maurotec

Non sono sicuro ma credo che tu stia reinventando la ruota, cioè le reprap usano il linguaggio Gcode per muovere gli assi.
C'è un software che ricordo serva per azionare un manipolatore o braccio meccanico, mi pare che si chiami OpenScada, ma si tratta di un ricordo molto vecchio.

Non sono un esperto di cinematica ancora peggio per quella inversa, comprendo il significato ma non saprei scrivere un pezzo di codice per la cinematica inversa.

Ciao.

D4NI3L3

#2
Jul 29, 2013, 10:40 am Last Edit: Jul 29, 2013, 10:52 am by D4NI3L3 Reason: 1

Non sono sicuro ma credo che tu stia reinventando la ruota, cioè le reprap usano il linguaggio Gcode per muovere gli assi.
C'è un software che ricordo serva per azionare un manipolatore o braccio meccanico, mi pare che si chiami OpenScada, ma si tratta di un ricordo molto vecchio.

Non sono un esperto di cinematica ancora peggio per quella inversa, comprendo il significato ma non saprei scrivere un pezzo di codice per la cinematica inversa.

Ciao.


Quello che voglio fare non ha uno scopo applicativo. Lo sto facendo per la tesi, devo mettere su un sistema di controllo e un inseguimento di traiettoria. Il laser deve disegnarmi una lettera quando gliela passo.

La mia domanda comunque non riguarda i calcoli o l'algoritmo di cinematica inversa, quelli li ho già fatti e so come farli. Il mio problema è solo come delegare al PC il grosso dei calcoli per poter poi passare ad arduino i dati già pronti.

Forse con Processing posso fare una cosa del genere.

nid69ita


Quello che vorrei sapere è come fare a delegare il PC per eseguire i calcoli di interpolazione e poi mandare per ogni forma i vettori con i dati ad arduino. In pratica è possibile tramite comunicazione seriale mandare dei vettori (che poi sarebbero due per ogni forma: x e y) che son stati calcolati dal PC? Che interfaccia dovrei usare? Come posso fare?


Tramite seriale e ti crei tu un tuo protocollo.
Decidi prima questo protocollo. Esempio mandi dei dati del genere
Code: [Select]
#x;y@
dove #indica inizio di una coppia e @ la fine e ; separatore
Se devi mandare un tot di valori allora puoi mandare un primo blocco con il numero di quanti ne spedirai, esempio:
Code: [Select]
$002@
#001:x1;y2@
#002:x2;y2@

Dove il primo dice ci saranno 2 coppie, poi spari le coppie numerandole. Non sò come sono i tuoi x,y

E' solo una idea.
my name is IGOR, not AIGOR

astrobeed


Arduino non ce la fa a fare tutti i calcoli,


Trovo assurdo che un Atmega 328p @16MHz non riesce a fare la cinematica inversa di due d.o.f. , sicuramente il tuo codice ha qualche problema.
Scientia potentia est

D4NI3L3



Quello che vorrei sapere è come fare a delegare il PC per eseguire i calcoli di interpolazione e poi mandare per ogni forma i vettori con i dati ad arduino. In pratica è possibile tramite comunicazione seriale mandare dei vettori (che poi sarebbero due per ogni forma: x e y) che son stati calcolati dal PC? Che interfaccia dovrei usare? Come posso fare?


Tramite seriale e ti crei tu un tuo protocollo.
Decidi prima questo protocollo. Esempio mandi dei dati del genere
Code: [Select]
#x;y@
dove #indica inizio di una coppia e @ la fine e ; separatore
Se devi mandare un tot di valori allora puoi mandare un primo blocco con il numero di quanti ne spedirai, esempio:
Code: [Select]
$002@
#001:x1;y2@
#002:x2;y2@

Dove il primo dice ci saranno 2 coppie, poi spari le coppie numerandole. Non sò come sono i tuoi x,y

E' solo una idea.


Come li mando però? Questo è il punto.

Sto facendo delle prove con processing ma ci sto diventando scemo, ho fatto ricerche a destra e a manca ma non sono riuscito a venire a capo del problema.

Cerco di spiegarmi meglio.

Diciamo che con processing definisco due array contenenti ad esempio 6 valori numerici ciascuno. Avrò quindi un totale di sei punti con le coordinate X e Y. Quindi un vettore X che contiene 6 coordinate x dei sei punti e un vettore Y che contiene le 6 coordinate y dei sei punti. Questi due vettori caratterizzano dei punti di una traiettoria, il mio laser infatti dovrà puntare a queste coordinate una dopo l'altra.

Per fare questo utilizzo un algoritmo di cinematica inversa passandogli questi due vettori, l'algoritmo funziona regolarmente e tutto viene calcolato.

Il problema è che le lettere dell'alfabeto sono 26. Non posso definire 2 vettori di coordinate per ogni lettera perchè viene un lavoro infinito ne tantomeno poi definire un ciclo for per ogni lettera perchè non ce la fa arduino, non tanto a tenere i vettori quanto a calcolare tutti i cicli for di iterazione dei vettori per il calcolo della cinematica inversa. Penso mi verrebbe qualcosa di enorme. Volevo delegare questa parte ad un altro software come processing.

Solo che non so come passare i dati da processing ad arduino visto che i vettori sono dati float e dovrei passarne due alla volta.

D4NI3L3



Arduino non ce la fa a fare tutti i calcoli,


Trovo assurdo che un Atmega 328p @16MHz non riesce a fare la cinematica inversa di due d.o.f. , sicuramente il tuo codice ha qualche problema.


Non ci siamo capiti. La cinematica inversa la fa tranquillamente, il problema è l'iterazione tra i vettori per passare i dati per il calcolo e la gran mole di dati da scrivere. Ero anche partito con l'utilizzare un algoritmo per l'interpolazione. Io davo le coordinate dei punti notevoli e poi con dei cicli for ricostruivo i vettori di coordinate tramite interpolazione. Peccato che Arduino non dava risposta.

Leggi il post sopra a questo così capisci quello che devo fare.

testato

ma di quanti dati parliamo ? non e' che e' un problema di ram che ti si esaurisce ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

D4NI3L3


ma di quanti dati parliamo ? non e' che e' un problema di ram che ti si esaurisce ?


No non è la ram. Alla fine sto optando per la scrittura a mano di tutti i vettori per ogni lettera, è una rottura ma non mi è riuscito di fare altrimenti. Ho trovato un modo per ottimizzare il codice ma saprò se funziona solo a lavoro ultimato. Non mi piace per niente ma non vedo alternative, spero con i nuovi servi di riuscire a fare un lavoro più pulito.

paulus1969

Ma non puoi prendere dei font vettoriali già fatti?

A parte questo... non capisco quale sia esattamente la difficoltà nel passare i valori tramite seriale (non capisco neanche per quale motivo passare dei float per comandare dei servomotori, visto che tanto il PC fa tutti i calcoli tanto vale fargli passare direttamente gli angoli).

Cosa è che ti risulta difficile? Inviare i dati? Riceverli con Arduino? Trovare un formato opportuno per inviare vettori?

D4NI3L3


Ma non puoi prendere dei font vettoriali già fatti?

A parte questo... non capisco quale sia esattamente la difficoltà nel passare i valori tramite seriale (non capisco neanche per quale motivo passare dei float per comandare dei servomotori, visto che tanto il PC fa tutti i calcoli tanto vale fargli passare direttamente gli angoli).

Cosa è che ti risulta difficile? Inviare i dati? Riceverli con Arduino? Trovare un formato opportuno per inviare vettori?


Hai ragione, non ho pensato a far calcolare gli angoli al PC. In effetti potrei fare tutti i calcoli e poi passare il tutto ad Arduino come singoli dati.

Per quanto riguarda i float io scrivo le coordinate dei punti che compongono la lettera e poi mi calcolo gli angoli con un algoritmo di cinematica inversa. Le coordinate mica sono intere. Con i servi che ho ora inoltre non ha senso ma con i servi che dovrei prendere avrei una risoluzione di circa 0.3 gradi, dato che mi serve precisione è meglio se non approssimo, in tal caso potrei ottenere dei valori float anche per gli angoli poi da passare ai servi.

Il mio problema è che non sapevo come inviare delle coppie di vettori contenenti float via seriale perchè la funzione write() non accetta float.
Inoltre non ho ben capito come dovrei fare a interagire con processing. Con Arduino ho il monitor e lì invio i dati, su processing dovre dovrei scrivere? Devo avviare lo sketch su processing e usare quello per l'invio di dati senza quindi toccare l'ide di arduino? I feedback che chiedo ad arduino sul monitor li vedo lo stesso?

Ho fatto un sacco di ricerche oggi e non ne sono venuto a capo. Abbi pazienza, non ho molta esperienza con questi sistemi, è da poco che mi ci sono avvicinato e devo ancora capire molte cose. Processing poi non l'ho mai usato, mi son visto decine di esempi, tutorial e quant'altro ma devo venirne a capo. Certo un vostro aiuto in tal senso sarebbe gradito.  :)

Per quanto riguarda font vettoriali già fatti se mi sai dire dove li posso trovare sarei ben felice di usarli.   :smiley-mr-green:

testato

per la questione processing tu avrai su arduino la seriale in ascolto, e su processing stampi su seriale,
come vedi su rpocessing i comandi sono simili ad arduino, ed anche i concetti
queste sono le funzioni della seriale processing http://processing.org/reference/libraries/serial/

lato arduino caricherai uno sketch che via concatenazione andra' ad aggiornarti le variabili che ti interessano.
Non potrai usare contemporaneamente il monitor dell'ide, perche' la seriale puo' essere occupata da un solo processo, pero' nella consolle Processing potrai vedere cio' che scrivi
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

D4NI3L3


per la questione processing tu avrai su arduino la seriale in ascolto, e su processing stampi su seriale,
come vedi su rpocessing i comandi sono simili ad arduino, ed anche i concetti
queste sono le funzioni della seriale processing http://processing.org/reference/libraries/serial/

lato arduino caricherai uno sketch che via concatenazione andra' ad aggiornarti le variabili che ti interessano.
Non potrai usare contemporaneamente il monitor dell'ide, perche' la seriale puo' essere occupata da un solo processo, pero' nella consolle Processing potrai vedere cio' che scrivi


Ok, questo più o meno l'avevo capito e ho anche buttato giù uno sketch, grazie per i chiarimenti comunque, ora è più chiaro.

La cosa che non mi è chiara è come accedere alla console o comunque dove devo inserire i dati su processing. Quando facevo partire lo sketch mi appariva una mini finestra con un quadrato grigio e basta. Non c'è il monitor come su Arduino. Da qui i miei dubbi.

paulus1969

Birdfont - Fontforge (credo siano per Linux soltanto)
Inkscape
permettono anche di creare font SVG.
Font vettoriali già pronti ne trovi a bizzeffe in rete.

Per il colloquio con Processing non saprei aiutarti, non lo uso, di solito queste cose le faccio con Visual Studio o Python.
Se la difficoltà è per il passaggio dei float puoi benissimo passare degli interi e poi dividere su Arduino per 10 oppure 100 a seconda di quante cifre decimali ti servono.
Esempio: se fai calcolare gli angoli dal PC e li trasmetti ad Arduino e vuoi gestire il decimo di grado, trasmetterai interi e poi li dividi per 10 su Arduino trasformandoli lì in float. Quindi se vuoi trasmettere 55.2 trasmetti 552, se vuoi trasmettere 55 tieni conto che è 55.0 e trasmetti 550 e così via.

nid69ita


La cosa che non mi è chiara è come accedere alla console o comunque dove devo inserire i dati su processing. Quando facevo partire lo sketch mi appariva una mini finestra con un quadrato grigio e basta. Non c'è il monitor come su Arduino. Da qui i miei dubbi.


No, il monitor di Processing non c'e', dovresti usare altro per spedire dati a manina verso Arduino (esempio Putty) oppure apri un altro IDE Arduino e sfrutti la sua console (anche senza sketch).
Per Processing ho usato la libreria G4P che permette di disegnare un minimo di interfaccia (che sò, tre pulsanti e per ogni pulsante invii qualcosa)
libreria: http://www.lagers.org.uk/g4p/index.html    
editor: http://www.lagers.org.uk/g4ptool/index.html
my name is IGOR, not AIGOR

Go Up