La mano robot sevo e flex sensor è l’evoluzione degli articoli pubblicati nei giorni scorsi e fa parte di un progetto realizzato con la collaborazione dell’ITIS di Vorbano e degli allievi del prof. caruccio.
Per ralizzare il progetto abbiamo selezionato i componenti che puoi acquistare:
- n.1 arduino uno
- n.1 protoshield
- n.6 morsetti da scheda
- n.3 headers per la protoshield
- n.1 connettore maschio da 20 pin da scheda
- n.5 sensori di flessione
- n.5 resistenze da 10Kohm
- n.5 servomotori modellistici
- n.1 ponticello per pin da scheda
da robot-domestici ed ho provveduto alla realizzazione del circuito sulla protoshield.
I collegamenti su protoshield della mano robot servo flex sensor
I sensori di flessione hanno 2 contatti ciascuno e per poter essere collegato agli ingressi analogici di arduino è necessario aggiungere una resistenza da 10Kohm tra uno dei terminali del sensore e il polo positivo del circuito.
I servo puoi collegarli direttamente ai pin di tipo PWM di arduino avendo cura di alimentare tutti i servo attraverso una pila esterna in grado di erogare 5v e almeno 1000mA per evitare il tremolio o la cattiva risposta in velocità da parte dei servo.
I pin che ho scelto per il progetto sono 5,6,9,10,11 rispettivamente per mignolo, anulare, medio, indice e pollice.
La protoshield mano robot servo flex sensor
Puoi osservare la protoshield realizzata per il progetto sia dal lato alto:
lo sketch
#include <Servo.h>
/****************************************************/
#define sensPollice A5
#define sensIndice A4
#define sensMedio A3
#define sensAnulare A1
#define sensMignolo A2
/****************************************************/
#define pinPollice 11
#define pinIndice 10
#define pinMedio 9
#define pinAnulare 6
#define pinMignolo 5
/****************************************************/
Servo police;
Servo indice;
Servo medio;
Servo anulare;
Servo mignolo;
/****************************************************/
int valuePollice = 0;
int valueIndice = 0;
int valueMedio = 0;
int valueAnulare = 0;
int valueMignolo = 0;
/****************************************************/
int rangePollice[] = {130,270};
int rangeIndice[] = {130,270};
int rangeMedio[] = {130,270};
int rangeAnulare[] = {130,270};
int rangeMignolo[] = {130,270};
/****************************************************/
int gradiPollice[] = {0,180};
int gradiIndice[] = {0,180};
int gradiMedio[] = {0,180};
int gradiAnulare[] = {0,180};
int gradiMignolo[] = {0,180};
/****************************************************/
void setup() {
Serial.begin(9600);
pinMode( sensPollice,INPUT );
pinMode( sensIndice,INPUT );
pinMode( sensMedio,INPUT );
pinMode( sensAnulare,INPUT );
pinMode( sensMignolo,INPUT );
police.attach( pinPollice );
indice.attach( pinIndice );
medio.attach( pinMedio );
anulare.attach( pinAnulare );
mignolo.attach( pinMignolo );
police.write( gradiPollice[0] );
indice.write( gradiIndice[0] );
medio.write( gradiMedio[0] );
anulare.write( gradiAnulare[0] );
mignolo.write( gradiMignolo[0] );
}
/****************************************************/
void loop() {
valuePollice = map(analogRead(sensPollice), rangePollice[0], rangePollice[1], gradiPollice[0], gradiPollice[1]);
valueIndice = map(analogRead(sensIndice), rangeIndice[0], rangeIndice[1], gradiIndice[0], gradiIndice[1]);
valueMedio = map(analogRead(sensMedio), rangeMedio[0], rangeMedio[1], gradiMedio[0], gradiMedio[1]);
valueAnulare = map(analogRead(sensAnulare), rangeAnulare[0], rangeAnulare[1], gradiAnulare[0], gradiAnulare[1]);
valueMignolo = map(analogRead(sensMignolo), rangeMignolo[0], rangeMignolo[1], gradiMignolo[0], gradiMignolo[1]);
police.write( valuePollice );
indice.write( valueIndice );
medio.write( valueMedio );
anulare.write( valueAnulare );
mignolo.write( valueMignolo );
delay( 200 );
}
il principio di funzionamento della mano robot è semplice: ciascun sensore di flessione invia il segnale letto ad arduino a cui hai insegnato a riconoscere il valore a sensore disteso e piegato, in funzione di questo valore controlli la rotazione del servo dal grado minimo impostato al grado massimo, ecco nel dettaglio per ciascun dito:
linee 05-09: definisci i pin a cui hai collegato i sensori, un sensore per ciascun pin;
linee 13-17: definisci i pin a cui hai collegato i servo, seguendo lo schema sopra;
linee 21-25: definisci le istanze di tipo Servo per ciascun dito;
linee 29-33: imposta i valori di angolo iniziale dei servo;
linee 37-41: imposta il range di valori minimo e massimo che ciascun sensore può restituirti, come avrai notato sono distinti per ciascun sensore per consentirti di impostare i valori dettagliati;
linee 45-50: imposta i range di movimento per ciascun servo, in questo modo se un servo deve compiere un movimento inferiore alla massima escursione del servo puoi definirlo nella variabile corrispondente;
linee 55-71: inizializza i pin a cui sono connessi i sensori, i pin a cui sono attaccati i servo con il metodo attach() e posiziona i servo in posizione di partenza;
linee 79-88: leggi i valori analogici restituiti dai sensori e ricava con la funzione map() la corrispondenza tra valore minimo e massimo letto dal sensore e la rispettiva rotazione del servo in gradi;
linee 90-94: imposta il valore in gradi al servo che controlla il movimento del dito;
linea 96: attendi 200 millisecondi tra un movimento ed il successivo, puoi ridurre questo tempo fino al minimo tempo necessario dai tuoi servo a raggiungere la posizione desiderata.
Il video
Ecco il video della demo fatta prima di inviare tutto all’ITIS di Vorbano:



Il blog mauroalfieri.it ed i suoi contenuti sono distribuiti con Licenza