Go Down

Topic: Braccio meccanico: vi presento il mio progetto (è già fatto, tranquilli) (Read 5 times) previous topic - next topic

ndrplz

Ciao a tutti,
dato che quando al tempo mi sono approcciato ad Arduino ho trovato su questo forum molte persone disponibili e informazioni utili, vorrei rendervi partecipi e sollecitare vostri consigli, apprezzamenti, domande o aspre critiche riguardo al progetto da me realizzato.  :)

Si tratta di un braccio meccanico a 4 gradi di libertà, in grado di afferrare e spostare piccoli oggetti.
Ho realizzato sia un controllo manuale tramite joystick della Wii, sia un'interfaccia software per il controllo "remoto".

Seguono i link ai video!

http://www.youtube.com/watch?v=tyTMXIS-Bn4

http://www.youtube.com/watch?v=UNz29bjrMEE

Ciao,
A.
Youtube channel: http://www.youtube.com/user/plzndr

leo72

Carino, molto bello!
Se metti anche schemi e codice questo progetto può andare in Megatopic senza meno, così altri che vorranno replicare il tuo lavoro avranno già un bel po' di cose pronte da usare  :D

ndrplz

Grazie, appena ho un attimo di tempo in questi giorni metto volentieri a disposizione il tutto :)
Youtube channel: http://www.youtube.com/user/plzndr

niki77

Bravo, è un bel lavoro.

Ho notato però che il movimento, soprattutto della leva del braccio principale(quella attaccata al basamento per intenderci) è molto brusco.
Dovresti provare a gestire una sorta di accelerazione per rendere tutto più fluido.
A tal proposito non sò se sai che i servi, variano la velocità del motore interno in base alla distanza che devono percorrere, quanto maggiore è la distanza , quanto è maggiore la velocità di rotazione del motore.
Potresti pensare di gestire una sorta di rampa incrementando la posizione del servo stesso a passi sempre crescenti fino ad arrivare al punto di destinazione.
Poi dai video non si capisce, ma pare che il movimento non sia interpolato, o meglio, che si riesca a gestire un grado di movimento unico per volta, è così?


Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

ndrplz

Quote
Ho notato però che il movimento, soprattutto della leva del braccio principale(quella attaccata al basamento per intenderci) è molto brusco.
Dovresti provare a gestire una sorta di accelerazione per rendere tutto più fluido.
A tal proposito non sò se sai che i servi, variano la velocità del motore interno in base alla distanza che devono percorrere, quanto maggiore è la distanza , quanto è maggiore la velocità di rotazione del motore.
Potresti pensare di gestire una sorta di rampa incrementando la posizione del servo stesso a passi sempre crescenti fino ad arrivare al punto di destinazione.


Ciao, prima di tutto grazie.
Il movimento della "spalla" (per capirci) in effetti è un po' brutale... In effetti non sapevo che il servo regolasse la velocità in base alla distanza da percorrere, tuttavia avevo già tentato alcune soluzioni del tipo da te descritto per controllarne il movimento a livello software ma i risultati erano stati un po' deludenti  :smiley-roll-sweat:

Quote
Poi dai video non si capisce, ma pare che il movimento non sia interpolato, o meglio, che si riesca a gestire un grado di movimento unico per volta, è così?

Se ho ben capito la domanda la risposta è sì, si può muovere solo un'articolazione alla volta (ogni ciclo di Arduino). E' stata una mia scelta di programmazione per controllarne un po' maggiormente il movimento!

Ciao,
A.
Youtube channel: http://www.youtube.com/user/plzndr

flz47655

Ciao, magari questo articolo che ho fatto può esserti utile per rendere più fluidi i movimenti, i servi hanno i loro limiti in queste applicazioni (dovuti al loro sistema di controllo) ma diciamo che è un inizio: http://www.delucagiovanni.com/public/phpbb3/viewtopic.php?f=3&t=357

Ciao

astrobeed


i servi hanno i loro limiti ma diciamo che è un inizio:


Più che altro i servo RC hanno il loro modo di funzionare, come prima cosa tocca pensare allo scopo per cui sono stati progettati, ovvero muovere parti mobili su un modello radiocomandato seguendo fedelmente i comandi impartiti da un pilota umano, cosa che fanno benissimo.
Altro particolare importante è la qualità del servo, quelli low cost sono pietosi come comportamento, si muovono a scatti ed hanno una elevata dead band (punto morto), quelli di qualità superiore sono perfetti nei loro movimenti e consentono di ottenere movimentazioni molto fluide e precise.
Semmai il vero limite è nel controller per automatizzare i movimenti dei servo, Arduino offre la classe servo però questa è limitata alla generazione di un impulso PPM della durata desiderata, non prevede nessun tipo di controllo del profilo di movimento.
Se rimani nel "limitato" mondo di Arduino, con tutti i vari paletti imposti, difficilmente riesci a realizzare un controller servo decente, se lavori in C e utilizzi l'ATmega 328 in modo nativo allora riesci a realizzare un buon controllo servo.
Un ottimo esempio è la SSC32, progetto open source, basato su un ATmega 168 che consente un ottimo controllo del servo.

flz47655

Ciao Astro,
Se hai dato un'occhiata all'articolo avevo imposto la posizione tramite il classico comando di arduino servo.write() per far seguire al servo un profilo di velocità e accelerazione dolce, ho pubblicato anche il codice e i grafici che ho ottenuto coi mezzi che avevo a disposizione.

Come potrei migliorare la situazione lavorando in modo nativo?

astrobeed


Come potrei migliorare la situazione lavorando in modo nativo?


Tutto il tuo ragionamento non è applicabile ad un servo RC, ha già una sua logica interna e un suo profilo di movimento, non puoi modificarli, i servo RC sono progettati per seguire fedelmente, in proporzione, i movimenti dello stick sul radiocomando, se vuoi spostarli in modo fluido devi emulare questi movimenti.
Altro dettaglio, se usi la servo.write hai solo 255 step su 180°, già questo introduce una forte granularità nel movimento che si traduce in un "tremolio" durante l'avanzamento anche se utilizzi servo di fascia alta, anzi su questi si nota ancora di più, devi usare la " servo.writeMicroseconds();" che ti consente di ottenere una risoluzione di 1000 step su 90° e ottenere un movimento fluido.

astrobeed

Qui http://www.lynxmotion.com/driver.aspx?Topic=oldvideos#arms trovi una serie di video dimostrativi dei bracci robot di Lynxmotion, usano tutti la SSC32 come servo controller, così ti rendi conto cosa intendo con movimenti fluidi  e precisi, e si può fare di meglio :)
In diversi video viene utilizzata la cinematica inversa per realizzare movimenti composti coordinati, però questa è solo una questione di analisi matematica.

flz47655

Si, l'articolo principalmente era per mostrare le traiettorie punto-punto, teoricamente e con un esempio di codice. Non avendo motori DC con encoder adatti.. ho fatto prove con quello che avevo in casa, dei servo low-cost.

Avevo puntato sul fatto che i servo hanno una loro inerzia e dando nuove posizioni da raggiungere prima del raggiungimento della posizione precedente li mantenevo in movimento "forzando" il profilo di movimento originale. Come si vede anche dai grafici, per forza di cose il movimento è comunque scattoso ma ci sono comunque dei miglioramenti come descritto nell'articolo.
Non conoscevo la servo.writeMicroseconds() provvederò ad utilizzarla visto che non comporta grandi cambiamenti di codice, unica cosa ho visto che ha una risoluzione di 1000 step su 180° e non su 90°, quindi una risoluzione di 0.18°, un bel miglioramento comunque rispetto ai 0.7° del servo.write()  :D

Ho visto il video, sicuramente non sono come il mio servo low-cost, ho dato un'occhiata anche al sorgente di SSC32 ma è completamente senza documentazione.. :smiley-eek: alcune parti sono scritte in Assembly e non è immediato studiarlo purtroppo.

Ciao

astrobeed


SNon conoscevo la servo.writeMicroseconds() provvederò ad utilizzarla visto che non comporta grandi cambiamenti di codice, unica cosa ho visto che ha una risoluzione di 1000 step su 180° e non su 90°, quindi una risoluzione di 0.18°, un bel miglioramento comunque rispetto ai 0.7° del servo.write()  :D


La risoluzione è di 1000 step su 90° perché il comando standard dei servo prevede una variazione compresa tra 1000us e 2000us per 90°,  per ottenere 180° l'impulso cambia tra 500us e 2500us.
Non tutti i servo rispettano questo standard, a seconda del produttore e del modello è possibile sia che il punto neutro non si trovi a 1500us e che gli estremi (+/-45°) si trovano a valori minori di 1000 e 2000 us.

flz47655

Ok, dalla documentazione di Arduino non era chiaro

Quote
Writes a value in microseconds (uS) to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft. On standard servos a parameter value of 1000 is fully counter-clockwise, 2000 is fully clockwise, and 1500 is in the middle.


Uwe in un intervento diceva http://arduino.cc/forum/index.php?topic=125982.0

Quote
Con myservo.writeMicrosecond() dai come valore il tempo in µsecondi del impulso dove 1000 corrisponde a 0 di myservo.write() e 2000 a 180


Con queste informazioni avevo dedotto che la risoluzione era 180/(2000-1000) = 0.18°

astrobeed


Ok, dalla documentazione di Arduino non era chiaro


Abbiamo già accertato in più di una occasione che la documentazione di Arduino è errata  :)

Quote

Uwe in un intervento diceva http://arduino.cc/forum/index.php?topic=125982.0
Quote
Con myservo.writeMicrosecond() dai come valore il tempo in µsecondi del impulso dove 1000 corrisponde a 0 di myservo.write() e 2000 a 180



Non è corretto, del resto basta guardare il datasheet di un qualunque servo per rendersi conto che l'impulso compreso tra 1000us e 2000us è quello per una variazione compresa tra +/- 45° rispetto alla posizione centrale, sono possibili leggeri scostamenti da questi valori a seconda del produttore e del modello.

flz47655


Go Up