Braccio Iron Man, progettazione dei controlli

Il modello per i movimenti prevede l’uso di servomotori elettrici posti nelle giunzioni articolari che trasferiscono la coppia ad una struttura sottoscocca vincolata al braccio dell’utilizzatore. I servo sono controllati da una scheda Arduino. Ho elaborato 2 modelli e 2 programmi per la gestione del meccanismo, che differiscono per il tipo di sensore di input utilizzato, e nulla vieta che ce ne saranno altri (finchè non raggiungeremo un modello che ci da un adeguato livello di feedback non smetteremo di progettare). Questi modelli sono stati elaborati con i temi economicità e semplicità considerati prioritari su tutto il resto. Ricordo per completezza che la soluzione ottimale sarebbe utilizzare dei biosensori EMG, come già intuito anche da altri utenti che seguono il progetto. Purtroppo questi sensori costano molto, ma vorrei provare ad autocostruirne uno rudimentale con materiali facilmente reperibili. Presto mi occuperò di questo progetto, ma ora passiamo ai modelli attualmente in sviluppo.

MODELLO 1: L’input di movimento e di posizione assoluta viene fornito da un potenziometro coassiale al pignone del servo (asse passante per il gomito, perpendicolare alla lunghezza del braccio) e elaborato secondo tale programma:

// includo la libreria servo
#include <Servo.h>

// creo un oggetto servo
Servo servoAvanbraccio;

// dichiaro il pin analogico usato per connettere il potenz
int const pinPotenziometro = A0;
// la variabile dove verrà conservato il valore analogico
int valorePotenziometro;
// la variable per conservare l'angolo per il servomotore
int angolo;

void setup() {
// collego il servo sul pin 9 all'oggetto servo
servoAvanbraccio.attach(9);
}

void loop() {
// legge il valore del potenziometro
valorePotenziometro = analogRead(pinPotenziometro);

// scala l'output del potenziometro
angolo = map(valorePotenziometro, 0, 1023, 0, 179);

// imposta la posizione del servomotore
servoAvanbraccio.write(angolo);

// piccolo ritardo per eliminare il rumore
delay(10);
}

In pratica in questo programma il servo si posiziona di volta in volta nella stessa posizione del potenziometro. Per muovere in anticipo il potenziometro rispetto al braccio (e evitare quindi di incontrare la resistenza del servomotore e di romperlo) verrà utilizzato un meccanismo “salva servo” in stile automobile rc tra il servo e lo scheletro [il salva servo è in pratica un piccolo meccanismo elastico che lavora a torsione che sui modellini rc serve ad evitare che le asperità della strada che incontrano le gomme arrivino al servo, rompendolo].
Con un programma così strutturato il servo si limiterà a seguire i movimenti del braccio e bisogna testare, prototipo alla mano xD, quanto questo sia utile e a cosa. Non ho ancora terminato il prototipo e quindi non l’ho testato, ma ipoteticamente così strutturato dovrebbe ridurre la fatica del trasporto dell’armatura e forse del trasporto di materiali (la riduzione potrebbe diventare azzeramento, dipende dalla coppia del servo), mentre per l’aumento di forza secondo me non ci aiuterà.

Se le mie ipotesi sono corrette avremo quindi bisogno di qualcos’altro che ci permetta di potenziare i movimenti. Ho quindi elaborato un secondo codice che sfrutta il potenziometro come sensore di velocità (angolare) oltre che di posizione.  Questa misura di velocità verrà utilizzata per capire in che verso sta ruotando il braccio e con questo dato si potrà prevedere un “maggioramento” della posizione del servo rispetto a quella del potenziometro al fine di aumentare il fattore forza. È molto più difficile spiegarlo a parole che leggerlo dal codice. Posto il secondo codice, questa volta non tutto commentato:

#include <Servo.h>
Servo servoAvanbraccio;

int const pinPotenziometro = A0;
int valorePotenziometro1;// primo valore letto
int valorePotenziometro2;// secondo valore letto
int angolo;

void setup() {
servoAvanbraccio.attach(9);
}

void loop() {
valorePotenziometro1 = analogRead(pinPotenziometro);
delay(15);
valorePotenziometro2 = analogRead(pinPotenziometro);
angolo = map(valorePotenziometro2, 0, 1023, 1, 178);

if((valorePotenziometro2-valorePotenziometro1)>11){
/* 11= circa 2 gradi, da valutare in fase di testing */
servoAvanbraccio.write(angolo+1);
/* oppure .write (179), sempre da testare */
}
else{
  if((valorePotenziometro2-valorePotenziometro1)> -11 &&
  (valorePotenziometro2-valorePotenziometro1)<11){
  //braccio fermo o oscillazioni involontarie
  servoAvanbraccio.write(angolo);
  }
  else{//(valorePotenziometro2-valorePotenziometro1)<-11
  servoAvanbraccio.write(angolo-1);
  /* oppure .write (0), sempre da testare */
  }
}

delay(10);
}

In pratica per movimenti lenti il codice è praticamente lo stesso di quello sopra, quindi il supporto allo sforzo dovrebbe rimanere lì, ma in più qui abbiamo che per movimenti veloci (più veloci di 2 gradi/15ms, per ora valore puramente indicativo) come per esempio un pugno, il servo “spinge” il braccio, aggiungendo forza e magari velocità al colpo.

Per un corretto feedback bisogna anche valutare il valore di rigidezza del salva servo.

MODELLO 2: I sensori utilizzati sono delle fotoresistenze, associate a dei led interni al braccio. In pratica questo modello prevede un leggero gioco del braccio dell’utilizzatore all’interno della struttura che, a seconda della direzione del movimento, oscurerà uno dei led posti all’interno della scocca, oscuramento che verrà captato dalla fotoresistenza ad esso associata. All’oscuramento corrisponde il movimento del servo.
Sto attualmente scrivendo il programma associato a questo modello, lo aggiungerò a questo post appena completo:

WORK IN PROGRESS

Ci sarebbe ancora una terza opzione, fondere i due modelli per ottenerne uno che forse potrebbe funzionare meglio per gli sforzi senza movimento, come per esempio reggere un peso.
La mia idea è eliminare il gioco del secondo modello e porre le fotoresistenze e i led in corrispondenza dei muscoli o dei tendini che durante questo tipo di sforzi  si contraggono (in posizioni ben precise). Così facendo questa contrazione potrebbe essere rilevata dalla fotoresistenza e, registrando un array di valori da essa provenienti ad ogni ciclo, con un “if” a monte del programma si potrebbe implementare l’opzione che “se la contrazione dura più di tot millisecondi (cicli) subentra la modalità di funzionamento sforzo isometrico”. Per sforzi brevi il braccio è controllato come in precedenza dal potenziometro.

Il programma da scrivere a questo punto sta diventando complesso, ma chissà che non sia la soluzione al nostro problema.

Chiudo il post e vi rimando alla lettura del nuovo “Aggiornamento Generale” in pubblicazione stasera.

Annunci

5 risposte a “Braccio Iron Man, progettazione dei controlli

  1. Vorrei anche consigliare il possibile uso di un accelerometro, molto più preciso e compatto di un potenziometro (potrei aver detto una scemenza) e sensibile nelle tre direzioni, quindi anche utile alla gestione dell’intero braccio in una futura struttura completa… si spera….

  2. Ho dato un occhiata ai biosensori EMG, e anche se molto probabilmente lo avrá giá notato, c’è in commercio il kit bitalino a 149 € senza spese di spedizione.
    A quanto ho potuto capire (ben poco, visto il poco letto) dovrebbe davvero fare al caso nostro, e in fasi avanzate potrebbe essere la soluzione.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...