Delegare calcoli a PC usando Processing e passare dati ad Arduino. Come fare?

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.

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.

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.

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.

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

#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:

$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.

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.

nid69ita:

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

#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:

$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.

astrobeed:

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.

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

Testato:
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.

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?

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?

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. :slight_smile:

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

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 Serial / Libraries / Processing.org

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

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 Serial / Libraries / Processing.org

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.

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.

D4NI3L3:
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: Quarks Place
editor: Quarks Place

Se ti può interessare, ho fatto un robot polare che scrive frasi usando le lettere dell'alfabeto partendo da caratteri trutype con delle spline. Considera che è fatto tutto dentro l'arduino, non c'è alcuna comunicazione con il pc. La cinematica inversa è calcolata all'interno dell'arduino e come, nel caso del tuo scara, è abbastanza elementare. Per disegnare i segmenti usa l'algoritmo di Bresenham, che è uno standard per queste cose. Io uso degli stepper, perchè con i servi è impossibile raggiungere queste precisioni a meno di andare su prodotti molto costosi. Il codice è completamente commentato, quindi dovrebbe essere abbastanza semplice seguirlo.
Questo è il link: Polar robot arm – sketching a city skyline « Robottini
Questo robottino disegna slyline di città, ma dentro c'è tutto il codice per scrivere frasi, lettere e quello che ti pare. Puoi anche impostare la scala, quindi scrivere lettere più o meno grandi, maiuscole o minuscole. Prova a dare una occhiata per vedere se ti può essere utile.

nid69ita:

D4NI3L3:
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: Quarks Place
editor: Quarks Place

Molto interessante, bello anche l'editor che ti da già il codice. Dopo la provo magari. Se avessi dubbi su come installarla o farla funzionare se non ti dispiace ti rompo ancora le scatole. :slight_smile:

alegiaco:
Se ti può interessare, ho fatto un robot polare che scrive frasi usando le lettere dell'alfabeto partendo da caratteri trutype con delle spline. Considera che è fatto tutto dentro l'arduino, non c'è alcuna comunicazione con il pc. La cinematica inversa è calcolata all'interno dell'arduino e come, nel caso del tuo scara, è abbastanza elementare. Per disegnare i segmenti usa l'algoritmo di Bresenham, che è uno standard per queste cose. Io uso degli stepper, perchè con i servi è impossibile raggiungere queste precisioni a meno di andare su prodotti molto costosi. Il codice è completamente commentato, quindi dovrebbe essere abbastanza semplice seguirlo.
Questo è il link: Polar robot arm – sketching a city skyline « Robottini
Questo robottino disegna slyline di città, ma dentro c'è tutto il codice per scrivere frasi, lettere e quello che ti pare. Puoi anche impostare la scala, quindi scrivere lettere più o meno grandi, maiuscole o minuscole. Prova a dare una occhiata per vedere se ti può essere utile.

Grazie mille, gentilissimo. Do un'occhiata al codice.

Anche io ho quegli stepper motor uguali uguali. Vedo che usi anche i markerbeam, volevo prendere lo starter kit, come ti ci trovi?

alegiaco:
Se ti può interessare, ho fatto un robot polare che scrive frasi usando le lettere dell'alfabeto partendo da caratteri trutype con delle spline. Considera che è fatto tutto dentro l'arduino, non c'è alcuna comunicazione con il pc. La cinematica inversa è calcolata all'interno dell'arduino e come, nel caso del tuo scara, è abbastanza elementare. Per disegnare i segmenti usa l'algoritmo di Bresenham, che è uno standard per queste cose. Io uso degli stepper, perchè con i servi è impossibile raggiungere queste precisioni a meno di andare su prodotti molto costosi. Il codice è completamente commentato, quindi dovrebbe essere abbastanza semplice seguirlo.
Questo è il link: Polar robot arm – sketching a city skyline « Robottini
Questo robottino disegna slyline di città, ma dentro c'è tutto il codice per scrivere frasi, lettere e quello che ti pare. Puoi anche impostare la scala, quindi scrivere lettere più o meno grandi, maiuscole o minuscole. Prova a dare una occhiata per vedere se ti può essere utile.

Allora ho dato un'occhiata rapida a tutto. Intanto complimenti, gran bel progettino.

Ho scaricato il codice, ho anche visto che nel problema dal quale ti sei ispirato c'è un link a un programma java che ti restituisce un codice da implementare su arduino.

Ho ancora diversi dubbi però, dici che è fatto su Arduino ma il codice che ho scaricato è uno sketch di Processing, per caso quello scketch mi da qualcosa per arduino?

Mi hanno comunque detto di studiarmi la pianificazione di traiettoria di cui a lezione di robotica ci hanno parlato in linea generica. Dovrò fare la pianificazione di traiettoria nello spazio operativo per segmenti e archi di cerchio, una volta fatta dovrò al solito darla in pasto alla cinematica inversa per avere gli angoli.

Ottima l'idea della penna, con il laser non si vede il risultato a meno di non fare un tracking video con After Effects. Infatti dovrei anche cercare una superficie fotosensibile perchè rimanga impressa la traiettoria tracciata dal laser e non so dove trovarla.

Rispondi appena puoi che ho i tempi stretti e grazie mille dell'aiuto, con il tuo link mi hai dato ottime idee e mi hai aiutato parecchio. Davvero un bel progetto, mi è piaciuto un sacco e mi ha convinto a prendere i markerbeam.

Processing ha la consolle, è la parte nera sotto al codice, cosi come scrivi su seriale scruvi anche su consolle, quindi se scrivi cobtemporaneamente su ebtrambe hai visione di cosa stai facendo.
Su arduino si usa il trucco di stampare su seriale per fare debug perché arduino non ha una consolle, mentre processing si