Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Pages: [1] 2 3   Go Down
Author Topic: Braccio meccanico: vi presento il mio progetto (è già fatto, tranquilli)  (Read 5881 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 3
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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!





Ciao,
A.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 342
Posts: 23339
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-grin
Logged


Offline Offline
Newbie
*
Karma: 3
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie, appena ho un attimo di tempo in questi giorni metto volentieri a disposizione il tutto smiley
Logged


MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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ì?


Logged

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

Offline Offline
Newbie
*
Karma: 3
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2447
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: October 11, 2012, 09:56:04 am by flz47655 » Logged

Rome (Italy)
Offline Offline
Shannon Member
****
Karma: 141
Posts: 10131
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2447
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Rome (Italy)
Offline Offline
Shannon Member
****
Karma: 141
Posts: 10131
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Rome (Italy)
Offline Offline
Shannon Member
****
Karma: 141
Posts: 10131
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
In diversi video viene utilizzata la cinematica inversa per realizzare movimenti composti coordinati, però questa è solo una questione di analisi matematica.
Logged

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2447
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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()  smiley-grin

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
Logged

Rome (Italy)
Offline Offline
Shannon Member
****
Karma: 141
Posts: 10131
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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()  smiley-grin

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

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2447
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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°
Logged

Rome (Italy)
Offline Offline
Shannon Member
****
Karma: 141
Posts: 10131
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, dalla documentazione di Arduino non era chiaro

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

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

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2447
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, grazie
Logged

Pages: [1] 2 3   Go Up
Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Jump to: