Servo con movimento armonico e pulsanti

Gli esperimenti dedicati alla mano bio meccanica mi hanno portato a ragionare sul servo con movimento armonico e pulsanti per impartire ai servo controllati da arduino un movimento più simile a quello del corpo umano.

servo con movimento armonico

Se hai seguito i precedenti articoli sai di cosa sto parlando: l’idea di avvicinare il movimento di una mano robot a quello di una mano umana.

Sai inoltre che il progetto puoi deguirlo sul sito realizzato con Federico.

Nell’ultima telefonata di confronto avuta con Federico ci siamo confrontati sulla necessità di ottenere che il servo con movimento armonico potesse avvenire non solo con l’estensione massima ( 0-180° ) del servo ma anche con angoli inferiori.

In fondo la nostra mano non compie solo movimenti completi, dito chiuso o a massima estensione, in modo armonico.

Anche quando stai per afferrare un oggetto la cui dimensione non ti costringe a chiudere completamente la mano noti che in prossimità dell’oggetto il tuo movimento rallenta poco prima di stringere l’oggetto, questo tradotto in robotica significa avvicinarsi all’oggetto con un movimento armonico la cui accellerazione diminuisce progressivamente in prossimità dell’oggetto.

Collegamento del servo con movimento armonico e dei pulsanti

Teoria a parte ecco cosa mi sono inventato, ho collegato ad arduino un servo, replicarlo per 6 servo sarà il prossimo passo, al pin 3 il segnale ed ai pin +5v e Gnd l’alimentazione:

servo con movimento armonico

e 6 pulsanti agli ingressi analogici, per ciascun pulsante ho utilizzato una resistenza di pull-down di 330ohm:

servo con movimento armonico

in modo da poter impartire ad arduino dei comandi.

In particolare alla pressione di ciascun pulsante chiedi al servo di raggiungere un angolo pre-impostato con un movimento armonico, sia esso l’angolo di escursione massima o minima impostato.

Lo sketch del servo con movimento armonico e pulsanti

Lo sketch che puoi utilizzare per ripetere il mio esperimento è il seguente:

#include <Servo.h>

#define pinServo 3
#define rad2grad 57.295779513
#define limitAngolo 360
#define incremento 8

#define inputA A0
#define inputB A1
#define inputC A2
#define inputD A3
#define inputE A4
#define inputF A5

float angolo = 0;
float grado  = 0;
int angEnd = 90;

Servo servoA;

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

  servoA.attach( pinServo );
  servoA.write( grado );
}

void loop() {

  Serial.print( analogRead( inputA ) );

  if ( analogRead( inputA ) > 1000 ) { angEnd = 90; }
  if ( analogRead( inputB ) > 1000 ) { angEnd = 75; }
  if ( analogRead( inputC ) > 1000 ) { angEnd = 60; }
  if ( analogRead( inputD ) > 1000 ) { angEnd = 45; }
  if ( analogRead( inputE ) > 1000 ) { angEnd = 30; }
  if ( analogRead( inputF ) > 1000 ) { angEnd = 15; } 

  if ( angolo > limitAngolo ) { angolo = 0; }

  grado = (( sin( (angolo/rad2grad) ) * angEnd ) + 90 );

  Serial.println( grado );

  servoA.write( grado );
  delay(40);
  angolo = (angolo + incremento );
}

la base del movimento armonico non è cambiata, le definizioni dei valori, la libreria Servo.h e la costante di conversione gradi/radianti è la medesima di cui ha già letto nei precedenti articoli dedicati al servo con movimento armonico.

Mi soffermo quindi nella spiegazione delle sole parti in cui lo sketch differisce:

linee 08-13: definisci le costanti a cui sono collegati i pulsanti quindi i pin A0-A5;

linee 33-38: imposta dei controlli ad ogni loop() in cui verifichi la pressione di uno dei 6 pulsanti ed in funzione del pulsante premuto imposti il valore dell’angolo finale a cui vuoi che il servo con movimento armonico si posizioni;

linea 40: esegui un controllo sull’angolo massimo da passare alla funzione sin() di arduino, in pratica sai che il sin(9 di un qualsiasi angolo, anche superiore a 360°, oscilla sempre tra -1 ed 1;

linea 41: calcola il sin(9 dell’angolo che hai ottenuto, convertendolo in radianti, e moltiplicalo per il valore di angolo da raggiungere. Siccome sin(X) varia tra -1 ed 1 la moltiplicazione per l’angolo definitivo varierà tra -angolo e +angolo. Ad esempio se l’angolo finale che vuoi raggiungere è 75° il valore di questa prima parte di formula varierà tra -75° e +75°. A questo aggiungi 90, essendo 90° il punto centrale o 0 del movimento otterrai una oscillazione del servo da 15° a 165°;

linea 46: applica l’angolo, in gradi, calcolato al servo;

linea 47: attendi un tempo pari a 40 millisecondi prima di eseguire il loop() successivo, per consentire al servo di compiere il suo moto.

Il video del servo con movimento armonico e pulsanti

Ho realizzato un video in cui la pressione di ciascun pulsante varia l’angolo eseguito dal servo, noterai che il movimento è sempre veloce nella parte centrale dell’escursione e rallenta in prossimità delle estremità, ossia quando raggiunge il punto di inversione:

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/servo-con-movimento-armonico-e-pulsanti.html

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

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