I worked on this project for a Real Time Systems class. It is basically a pointing device, based on a gyroscopic helmet controlling a little robotic arm. The hardware consists of Evidence FLEX boards running a Real-Time OS called Erika Enterprise (Open Source RTOS for single- and multi-core applications)
P-Systems for approximating NP-Complete optimization problems
Teleoperating a robotic arm through a gyroscopic helmet
1. Helmet & robotic arm
Progetto per il modulo di Sistemi Real Time
Docente: Prof. G. C. Buttazzo
Corso di Sistemi Operativi, Programmazione Concorrente e Distribuita
Corso di Laurea Magistrale in Ingegneria Informatica
Università di Pisa
Francesco Corucci, Alessandro Biondi
a.a 2010-11
1
3. 1 Introduzione
Scopo del progetto è realizzare un sistema di puntamento basato su un casco giroscopico ed un
braccio robotico a sei gradi di libertà. La posizione della testa viene acquisita mediante il casco, e la
posizione del braccio è comandata di conseguenza, in modo che quest'ultimo segua le rotazioni del
casco sull'asse verticale e orizzontale.
2 Hardware utilizzato
L'hardware principale utilizzato consiste in:
– Evidence FLEX Demo Board
– casco giroscopico Union Reality UR-F98
– braccio robotico a sei gradi di libertà
3
Figura 1: Parte del setup
4. 3 Acquisizione dei dati dal casco
PIN UTILIZZATI DAL CASCO
1 +5V
3 X-axis
4 GROUND
6 Y-axis
Non utilizzati ai fini del progetto
2 Joystick back button
13 Joystick slider
Tabella 1: Pinout della Game Port e del casco giroscopico
Come da standard game port, le uscite vanno acquisite come segnali analogici (tensione massima
+5V). In particolare, sui piedini X-axis e Y-axis viene offerta una resistenza variabile (max 100KΩ):
è dunque necessario utilizzare tale resistenza in un partitore di tensione, in modo da ricavare una
tensione analogica da poter acquisire con un ADC.
4
Figura 2: Il casco giroscopico
5. 4 Elettronica di interfaccia alla FLEX
Gli ADC della FLEX prendono in ingresso tensioni tra 0 e 3.3V: è dunque necessario adattare le
tensioni in uscita dal casco (0-5V) per evitare la saturazione dell'ADC. Per riportare le tensioni in
uscita dal casco nel range di acquisizione dell'ADC, è stato necessario realizzare un semplice
partitore di tensione; tuttavia, per problemi di impedenza in ingresso all'ADC, è stato necessario
introdurre un buffer (inseguitore di tensione). In questo modo l'ADC vede (teoricamente) una
resistenza in ingresso infinita.
Questo circuito di interfaccia è stato replicato sulle uscite della game port etichettate col nome di
X-axis e Y-axis: l'uscita è stata mandata agli ADC della FLEX, sui piedini AN19 e AN21 (pin 9 e 20
di CON8).
5
Figura 3: Schematizzazione
dell'interfaccia game port
Figura 4: Elettronica di interfaccia
verso l'ADC
6. 5 Controllo del braccio
Il braccio robotico utilizzato dispone di sei gradi di libertà, come illustrato nella figura seguente.
La spalla, molto sollecitata in alcune posizioni particolarmente sbilanciate, dispone di due motori
gemelli da pilotare con un solo segnale.
Ai fini del progetto, sono stati utilizzati soltanto i giunti relativi a base, spalla, gomito e polso.
I giunti sono attuati mediante servomotori da controllare in PWM. I servomotori integrano:
– motore
– riduttore
– elettronica di controllo
6
Figura 6: Servomotore
7. Il segnale PWM è tradotto dall'elettronica di controllo dei servomotori in un angolo. I motori del
braccio non sono tarati tutti allo stesso modo, e possono fare escursioni diverse a seconda dei
vincoli costruttivi del braccio stesso: è stato pertanto necessario effettuare una calibrazione ad hoc
per ogni motore, i cui risultati sono riassunti nella tabella sottostante.
GIUNTO
BOUND SUPERIORE BOUND INFERIORE
duty cycle (μs) angolo (deg) duty cycle (μs) angolo (deg)
Base 2500 90 700 -90
Spalla 600 90 2400 -90
Gomito 5200 180 1800 0
Polso 1400 90 4800 -90
Tabella 2: Corrispondenze tra angoli e duty cycle PWM per i giunti utilizzati
Per fornire la corrente necessaria ai servomotori è stato utilizzato un alimentatore esterno dedicato
(12V stabilizzato): è stato inoltre realizzato un circuito basato su regolatori di tensione a 5V per
fornire le linee di potenza ai servomotori.
Come si vede in figura, sono stati utilizzati tre regolatori 7805, distribuendo tra di essi
l'assorbimento di corrente dei vari giunti.
7
Figura 7: Circuito di potenza
8. 5.1 Controllo a cinematica inversa
Il controllo del braccio sfrutta la cinematica inversa. I dati di ingresso al controllo consistono nella
posizione finale della pinza (inclinazione rispetto al piano, e posizione della punta nello spazio xyz),
quelli di output sono gli angoli a cui portare i vari giunti per ottenere la posizione voluta. Tale
controllo fa sì che tutti i giunti contribuiscano sinergicamente allo spostamento del braccio durante
il tracciamento del casco.
6 Software
Il software di controllo eseguito sulla FLEX è costituito da un unico task periodico (TaskPWM), che
ogni 20 ms (cioè con frequenza pari a 50Hz) esegue le seguenti operazioni:
Per acquisire i segnali analogici provenienti dal casco abbiamo utilizzato due ADC della FLEX. Per
quanto riguarda il controllo, le normali uscite PWM (OC3 ed OC8) non erano sufficienti per
8
Figura 8: Circuito di potenza
Figura 9: Flow chart del
task di controllo
Lettura posizione casco
Calcolo della
cinematica inversa
Comando PWM dei
servomotori
9. controllare i quattro servomotori del braccio: di conseguenza abbiamo dovuto sfruttare due uscite di
tipo PWMout (utilizzando solo le uscite dirette della coppia), normalmente impiegate per il
controllo di motori a ponte-H.
7 Allegati
Di seguito una breve descrizione dei files sorgenti allegati alla relazione.
– cinematica.h, cinematica.c: funzioni per il calcolo della cinematica del braccio;
– dc_motor.h: strato di libreria che consente di sfruttare i piedini PWMout;
– code.c: file principale del progetto: operazioni di inizializzazione e definizione del task di
controllo.
9