Servo con movimento armonico con arduino

Il progetto della mano biomeccanica, come hai letto, fa uso di servo con movimento armonico, è una delle caratteristiche del progetto.

Servo con movimento armonico

Per ottenere i servo con movimento armonico puoi partire dalla teoria descritta in questo articolo e proseguire la lettura di questo articolo in cui oltre ad un singolo servo ne aggiungi 4, so che le dita della mano biomeccanica sono 5 e che sommando anche il servo del polso sono 6.

La teoria che applichi a 4 servo con movimento armonico potrai replicarla facilmente a 6 servo, ad oggi non ho a disposizione i 6 servo che impiegheremo nel progetto, non sono ancora stati consegnati.

Connetti 4 servo con movimento Armonico

i 4 servo con movimento armonico puoi collegarli ad arduino in modo diretto utilizzando per ciascun servo uno sei pin PWM di Arduino Uno, essendo 6 i pin PWM non avrai difficoltà ad espandere il progetto da quattro a sei servo.

Quattro servo con movimento armonico

Io mi sono costruito un semplice circuito su basetta millefori il cui scopo è da un lato permettermi di collegare fino a 8 servo su un unico connettore con alimentazione comune e dall’altro alimentare i servo con una fonte separata, in queso esempio 4 pile di tipo AA da 1,5v ( 6v totali ):

Servo con movimento armonico

ricorda che per far funzionare i servo con movimento armonico devi collegare il polo negativo ( Gnd ) e SOLO tale polo ad dell’alimentazione al Gnd di Arduino.

Ecco come collegare i servo lato arduino

Connetti Servo con movimento armonico

avrai 5 cavi, uno per ciascun servo e la massa o comune (Gnd)

Lo sketch dei servo con movimento armonico

lo sketch che ho utilizzato è il seguente:

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

#include <Servo.h>

#define pinServoA 9
#define pinServoB 10
#define pinServoC 11
#define pinServoD 3

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

float angoloA = 0;
float angoloB = 0;
float angoloC = 0;
float angoloD = 0;

float gradoA  = 0;
float gradoB  = 0;
float gradoC  = 0;
float gradoD  = 0;

Servo servoA;
Servo servoB;
Servo servoC;
Servo servoD;

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

  servoA.attach( pinServoA );
  servoA.write( gradoA );

  servoB.attach( pinServoB );
  servoB.write( gradoB );

  servoC.attach( pinServoC );
  servoC.write( gradoC );

  servoD.attach( pinServoD );
  servoD.write( gradoD );
}

void loop() {

  if ( angoloA <= differenza ) { angoloB = angoloC = angoloD = 0; }
  if ( angoloB <= differenza ) { angoloC = angoloD = 0; }
  if ( angoloC <= differenza ) { angoloD = 0; }

  Serial.print( "angoli: " );
  Serial.print( angoloA );
  Serial.print( " " );
  Serial.print( angoloB );
  Serial.print( " " );
  Serial.print( angoloC );
  Serial.print( " " );
  Serial.print( angoloD );
  Serial.print( "\n" );

  gradoA = (( sin( (angoloA/rad2grad) ) * 80 ) + 90 );
  gradoB = (( sin( (angoloB/rad2grad) ) * 80 ) + 90 );
  gradoC = (( sin( (angoloC/rad2grad) ) * 80 ) + 90 );
  gradoD = (( sin( (angoloD/rad2grad) ) * 80 ) + 90 );

  Serial.print( " gradi: " );
  Serial.print( gradoA );
  Serial.print( " " );
  Serial.print( gradoB );
  Serial.print( " " );
  Serial.print( gradoC );
  Serial.print( " " );
  Serial.print( gradoD );
  Serial.print( "\n" );

  servoA.write( gradoA );
  servoB.write( gradoB );
  servoC.write( gradoC );
  servoD.write( gradoD );

  angoloA = (angoloA + incremento );
  angoloB = (angoloB + incremento );
  angoloC = (angoloC + incremento );
  angoloD = (angoloD + incremento );
}

rispetto a quello che si occupava della gestione di un solo servo con movimento armonico questo differisce di poco, ho innanzitutto eliminato il potenziometro il cui scopo era variare il valore di incremento ad ogni ciclo, in questo sketch ho fissato tale valore alla linea 21, procedi con ordine:

linea 13: includi la classe servo necessaria al controllo dei servo con movimento armonico;

linee 15-18: definisci i pin, di tipo PWM,  cui collegherai i servo;

linea 20: impsta la costante di conversione gradi -> radianti;

linea 21: imposta il valore di incremento dell’angolo ad ogni ciclo di loop();

linea 22: imposta il valore di ritardo, o differenza, per la partenza dei servo. Hai un unico valore di ritardo tra ciascun server, quindi la differenza tra il primo ed il secondo servo sarà di 30 gradi, tra il primo ed il terzo di 60, tra il primo ed il quarto di 120;

linee 24-27: definisci delle variabili di tipo float in cui memorizzerai i valori angolari di ciascun servo;

linee 29-32: imposta l’angolo di partenza di ciascun servo;

linee 34-37: definisci le istanze della classe Servo per ciascun servo;

linee 43-53: lega ciascun servo alla propria istanza Servo e impostalo al valore in gradi iniziale 0;

linea 58: è la linea che regola il ritardo tra il primo servo e gli altri, fino a quando il valore di angolo del primo servo è inferiore alla differenza impostata alla linea 22 gli altri servo sono mantenuti a 0 gradi;

linea 59: è simile alla precedente, fino a quando il valore dell’angoloB è inferiore alla differenza impostata ( 30° ) il valore dei successivi resta a 0;

linea 60: è simile alle due precedenti ma lavora sul valore di angoloC;

Con le linee precedenti ti sei assicurato che i servo partano sfalsati l’uno dagli altri di 30°;

linea 72: per ciascun valore dell’angoloA calcilli il valore in radianti dividendolo per l costante di conversione, ne calcoli il sen( rad ) e lo moltiplichi per 80. Infine gli sommi 90 ossia il valore dell’angolo a metà della corsa del servo;

linee 73-75: sono identiche alla linea 72 a meno dei valori calcolati sugli angoli B,C e D;

linee 87-90: scrivi il valore di ogni angolo calcolato sulla relativa istanza Servo creata;

linee 92-95: calcola l’incremento dell’angolo per ciascuno dei valori A,B,C e D;

Il video dei servo con movimento armonico

per mostrati il risultato dello sketch ho realizzato questo video:

Buon divertimento !!!

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/servo-con-movimento-armonico-con-arduino.html

1 ping

  1. […] in un grado da applicare al servo corrispondente. Se hai letto gli articoli precedenti sul movimento armonico dei servo sai già come viene calcolato questo valore e perchè, se non lo hai fatto ti consiglio […]

Lascia un commento

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.