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 …

Prima di inserire un commento, per favore, leggi il regolamento

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

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.