Primo movimento della mano bio meccanica

Finalmente siamo riusciti ad ottenere il primo movimento della mano bio meccanica, saprai che il progetto a cui sto collaborando è nato dall’idea di Federico che ha anche realizzato un sito su cui pubblichiamo le evoluzioni ed i progressi.

primo movimento della mano

Il montaggio della mano si è rivelato più impegnativo del previsto, sia per la complessità dell’articolazione umana a cui ci siamo ispirati sia per la difficoltà di montaggio dovuta a spazi limitati e meccaniche molto vicine.

Osservazioni sul montaggio

nonostante la estrema accuratezza della realizzazione eseguita dalla Partec su disegno di Federico abbiamo verificato che la teoria e la pratica spesso non seguono la stessa linea temporale.

In pratica le tolleranze tra le parti in movimento delle dita, tendini e servi che sul disegno risultavano sufficienti hanno rivelato in pratica i loro limiti dopo il montaggio del primo tendine.

Aggiungi che il materiale con cui realizzare i tendini no deve essere ne troppo rigido e tantomeno eccessivamente elastico, nel primo caso la minima tensione rischia di impedirne il movimento, nel secondo non esercita la dovuta tensione.

Abbiamo provato differenti materiali prima di trovarne uno adatto, anche se ancora non definitivo.

Il primo movimento della mano

Lo sketch utilizzato per eseguire il primo movimento della mano è quello del moto armonico già presentato in un precedente articolo, a cui ho apportato proprio nei giorni scorsi alcune modifiche parlanti nulla di fantascientifico ho rinominato alcune variabili in modo che fosse umanamente più facile comprendere ogni servo a quale dito dovesse corrispondere:

/**********************************************************
 * Servo con movimento armonico e Arduino
 *
 * Data creazione 27 marzo 2013
 * Ultima modifica 15 aprile 2013
 *
 * autore: Mauro Alfieri
 * web:    mauroalfieri.it
 * tw:     @mauroalfieri
 *
/**********************************************************/

#include <Servo.h>

#define pinPollice 3
#define pinIndice  5
#define pinMedio   6
#define pinAnulare 9
#define pinMignolo 10
#define pinPolso   11

#define rad2grad 57.295779513
#define incremento 8
#define limitAngolo 360
#define differenza 30

float angoloPollice  = 0;
float angoloIndice  = 0;
float angoloMedio   = 0;
float angoloAnulare = 0;
float angoloMignolo = 0;
float angoloPolso   = 0;

float gradoPollice  = 0;
float gradoIndice   = 0;
float gradoMedio    = 0;
float gradoAnulare  = 0;
float gradoMignolo  = 0;
float gradoPolso    = 0;

boolean firstLoop=true;

Servo servoPollice;
Servo servoIndice;
Servo servoMedio;
Servo servoAnulare;
Servo servoMignolo;
Servo servoPolso;

void setup() {
  Serial.begin( 9600 );
  Serial.println( " ------------------ Avvio ------------------------" );

  servoPollice.attach( pinPollice );
  servoPollice.write( gradoPollice );

  servoIndice.attach( pinIndice );
  servoIndice.write( gradoIndice );

  servoMedio.attach( pinMedio );
  servoMedio.write( gradoMedio );

  servoAnulare.attach( pinAnulare );
  servoAnulare.write( gradoAnulare );

  servoMignolo.attach( pinMignolo );
  servoMignolo.write( gradoMignolo );

  servoPolso.attach( pinPolso );
  servoPolso.write( gradoPolso );
}

void loop() {

  if ( angoloPollice <= differenza &&  firstLoop == true )  { angoloIndice = angoloMedio = angoloAnulare = angoloMignolo = angoloPolso = 0; }
  if ( angoloIndice <= differenza &&  firstLoop == true )   { angoloMedio = angoloAnulare = angoloMignolo = angoloPolso = 0; }
  if ( angoloMedio <= differenza &&  firstLoop == true )    { angoloAnulare = angoloMignolo = angoloPolso = 0; }
  if ( angoloAnulare <= differenza &&  firstLoop == true )  { angoloMignolo = angoloPolso = 0; }
  if ( angoloMignolo <= differenza &&  firstLoop == true )  { angoloPolso = 0; }

  if ( angoloPollice > limitAngolo )  { angoloPollice = 0; firstLoop = false; }
  if ( angoloIndice > limitAngolo )   { angoloIndice = 0; firstLoop = false; }
  if ( angoloMedio > limitAngolo )    { angoloMedio = 0; firstLoop = false; }
  if ( angoloAnulare > limitAngolo )  { angoloAnulare = 0; firstLoop = false; }
  if ( angoloMignolo > limitAngolo )  { angoloMignolo = 0; firstLoop = false; }
  if ( angoloPolso > limitAngolo )    { angoloPolso = 0; firstLoop = false; }

  gradoPollice  = (( sin( (angoloPollice/rad2grad) ) * 80 ) + 90 );
  gradoIndice   = (( sin( (angoloIndice/rad2grad) ) * 80 ) + 90 );
  gradoMedio    = (( sin( (angoloMedio/rad2grad) ) * 80 ) + 90 );
  gradoAnulare  = (( sin( (angoloAnulare/rad2grad) ) * 80 ) + 90 );
  gradoMignolo  = (( sin( (angoloMignolo/rad2grad) ) * 80 ) + 90 );
  gradoPolso    = (( sin( (angoloPolso/rad2grad) ) * 80 ) + 90 );

  Serial.print( "gradi: " );
  Serial.print( gradoPollice );
  Serial.print( "\t" );
  Serial.print( gradoIndice );
  Serial.print( "\t" );
  Serial.print( gradoMedio );
  Serial.print( "\t" );
  Serial.print( gradoAnulare );
  Serial.print( "\t" );
  Serial.print( gradoMignolo );
  Serial.print( "\t" );
  Serial.print( gradoPolso );
  Serial.print( "\n" );

  servoPollice.write( gradoPollice );
  servoIndice.write( gradoIndice );
  servoMedio.write( gradoMedio );
  servoAnulare.write( gradoAnulare );
  servoMignolo.write( gradoMignolo );
  servoPolso.write( gradoPolso );

  angoloPollice  += incremento;
  angoloIndice   += incremento;
  angoloMedio    += incremento;
  angoloAnulare  += incremento;
  angoloMignolo  += incremento;
  angoloPolso    += incremento;
}

come vedi nelle prime linee dello sketch ho definito sei variabili:

#define pinPollice 3
#define pinIndice  5
#define pinMedio   6
#define pinAnulare 9
#define pinMignolo 10
#define pinPolso   11

a ciascuna delle quali corrisponde il pin a cui è connesso il relativo servo della mano, meno male che la mano ha solo 5 dita ed un polso 🙂 i PWM di Arduino Uno mi sono finiti.

Derivando da queste linee ho definito allo stesso modo sei variabili per gli angoli ed i gradi che uso nella funzione loop():

float angoloPollice  = 0;
float angoloIndice  = 0;
float angoloMedio   = 0;
float angoloAnulare = 0;
float angoloMignolo = 0;
float angoloPolso   = 0;

float gradoPollice  = 0;
float gradoIndice   = 0;
float gradoMedio    = 0;
float gradoAnulare  = 0;
float gradoMignolo  = 0;
float gradoPolso    = 0;

e dopo ho definito 6 oggetti di tipo Servo, uno per ciascun dito del primo movimento della mano:

Servo servoPollice;
Servo servoIndice;
Servo servoMedio;
Servo servoAnulare;
Servo servoMignolo;
Servo servoPolso;

tutto il resto dello sketch è identico concettualmente a quello già visto a meno dei nomi delle variabili utilizzate che sono quelle definite sopra.

Il video del primo movimento della mano bio meccanica

ecco il video realizzato da Federico nel suo laboratorio:

Il progetto prosegue …

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/primo-movimento-della-mano.html

8 comments

Skip to comment form

    • Matteo on 20 maggio 2013 at 18:05
    • Reply

    Scusa se vi tarpo le ali 😀
    Ma il movimento delle dita umane non è un po’ diverso?

    1. Ciao Matteo,
      interessante osservazione, sapresti indicarmi come vedresti tu il movimento della mano?
      Potrei correggere il mio sketch per far eseguire alla mano un movimento più naturale.

      Mauro

    • Matteo on 24 maggio 2013 at 14:04
    • Reply

    Ciao Mauro, mi sembra che le varie parti delle dita si muovano contemporaneamente, mentre nella vostra la parte vicina alla mano si piega prima delle altre.
    Non so se mi spiego bene, ma non è così facile da descrivere 🙂
    P.S: mi potresti dire come avete realizzato il polso?

    1. Ciao Matteo,
      comeprendo quello che dici.
      Le dita della mano umana hanno maggiore grado di mobilità rispetto a quelle della riproduzione a cui stiamo lavorando.
      Puoi muovere le dita della mano anche una falange alla volta, ma per ottenere questo meccanicamente avremmo bisogno di troppi servo e controller, in questa prima fase ci siano dedicato al movimento armonico delle dita, come avrai letto nell’articolo.

      Il poso è per adesso un giunto controllato da un unico servo con mobilità lungo un solo asse.

      Mauro

    • Roberto on 2 giugno 2013 at 21:05
    • Reply

    Ciao Mauro ,
    potresti mostrarmi lo sketch per incrementare e decrementare il grado di un servomotore utilizzando 2 pulsanti connessi a pin digitali ?
    Ho già provato molte volte ma nessun risultato , anche seguendo la guida arduino .
    sarei veramente felice d riceve lo sketch .
    grazie mille.

    Roberto

    1. Ciao Roberto,
      se hai letto i miei tutorial e qualche commento sai che non scrivo sketch su richiesta, al più qualche progetto su commissione.

      Tendenzialmente mi piace che ci proviate e dispenso suggerimenti dove posso.

      Nel tuo caso il progetto é semplice e dovresti già trovare quello che ti occorre le blog, ance se per i pin analogici.
      Prova a consultarlo, comprenderne i concetti e poi trasformare il controllo dal pin analogico a quello digitale sarà questione di pochi minuti.

      Mauro

    • Antonio on 11 gennaio 2017 at 22:41
    • Reply

    ciao, ottimo progetto quasi come su quello che sto lavorando io….
    pero’ la strada da te intrapresa e’ senza fine non potrai mai emulare i movimenti umani.
    e poi con i servo non ci siamo serve qualcosa di mooooolto piu’ piccolo potente con velocita di attuazione molto ampia a basso rumore ecc…..
    cmq. ottimo l’inizio del lavoro e’ uguale al mio.
    A.

    1. Ciao Antonio,
      concordo con te, ma il progetto era solo uno studio accademico.
      Se svilupperai delle evoluzioni e ti andrà di condividerle sono a disposizione per farlo a tuo nome. W l’open-source

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.