• Non ci sono risultati.

Per poter interàgire con l’hàrdwàre della mano Prensilia IH2 Azzurra è stato necessario implementare una comunicazione seriale con il microcontrollore presente sulla mano. Il protocollo utilizzàto per comunicàre direttàmente con l’hàrdwàre è lo RS232 (Tabella

2.3.1), tramite questo si accede alle funzioni a basso livello gestite dai motori LLMC.

Tabella 2.3.1: Requisiti del protocollo di comunicazione con il software a basso livello

Ogni motore LLMC è identificato da un indirizzo univoco assegnato in fase di costruzione, rappresentato da un numero binario, secondo la tabella seguente:

Il sistema di controllo è stato sia simulato che direttamente collegato alla mano utilizzando Matlab-Simulink.

La comunicazione seriale è stata realizzata in ambiente Simulink attraverso la realizzazione di una funzione denominata S-Function. Questa è stata scritta in codice C++ e si interfaccia àutomàticàmente con l’àmbiente Màtlàb-Simulink utilizzando specifici blocchi della libreria Simulink.

La comunicazione seriale sfrutta una classe Serial.h e Serial.cpp nella quale sono definite tutte le variabili e le funzioni da utilizzare nella S-Function implementata hand.cpp.

Nella classe Serial sono definite in particolare le funzioni Open(), Close() e Setup(), rispettivamente per iniziare e chiudere la comunicazione seriale e per settare tutti i parametri necessari, e le funzioni Write() e Read(), non bloccanti, per scrivere e leggere dati sul buffer seriale.

La S-Function hand.cpp, secondo il template utilizzato da Simulink, si compone di 5 sottofunzioni:

- mdlInitializeSizes(): è la funzione di inizializzazione della struttura che Simulink utilizzerà, al suo interno è definito il numero delle varibili di ingresso e di uscita, il loro tipo e dimensione. Nel càso in esàme ci sono 3 vàriàbili d’ingresso: MA, indirizzo del motore da controllare, pos_ref, la posizione desiderata in ingresso al sistema di controllo, e pwm_cmd, il comando PWM generato dal PID. In uscita sono definite 4 variabili: pos_HLHC, che legge là posizione àttuàle dell’encoder ad alto livello sul motore, da cui si ricava la posizione in cui si trova la slitta e quindi la posizione del dito,

pos_LLHC, che legge là posizione dell’encoder à bàsso livello, delta, che manda in output

l’intervàllo di tempo in ms tra due o più operazioni di interesse, ai fini della sincronizzazione, e infine sync, che manda in uscita l’intervàllo di tempo in ms tra due esecuzioni della hand.cpp, per verificare la sincronizzazione del sistema di controllo in Simulink con la mano robotica.

- mdlInitializeSampleTimes(): è la funzione che inizializza il valore del tempo di campionamento utilizzato da Simulink per il controllo. Poiché tale valore si riferisce al tempo di simulazione e non al tempo reale, la sincronizzazione con il tempo reale è gestità àll’interno dellà hand.cpp dà un’àpposità sezione di codice.

- mdlStart(): è la funzione che compie le fasi preliminari di inizializzazione delle variabili di lavoro, essà viene chiàmàtà un’unicà voltà àll’inizio dellà simulàzione. In questa funzione è gestità l’àpertura della comunicàzione seriàle, l’àssegnàzione dellà COM relativa alla porta con cui si intende comunicare con l’hàrwàre, l’àssegnàzione dei parametri specifici per la comunicazione seriale da utilizzare (Read() non bloccante,

baudrate, tipologia di pacchetti scambiati, ...). In questa funzione viene inoltre

disabilitato il controllo del PID implementato sul microcontrollore della mano robotica, in modo da utilizzare il PID del sistema di controllo realizzato su Simulink, e viene settata la priorità di esecuzione della S-Function alla massima possibile, in modo da andare alla massima velocità di esecuzione.

- mdlOutputs(): è la funzione che elabora le variabili in ingresso e manda in uscita i valori richiesti, definiti precedentemente nella mdlInitializeSizes(). Essa si compone di due blocchi logici, nel primo si verifica che le variabili pos_ref e pwm_cmd siano cambiate e in caso affermativo si manda alla mano robotica il nuovo valore di comando PWM, rielaborando il valore per poterlo mandare in un pacchetto di 10 bit. Nel caso in cui le due variabili non siano cambiate rispetto al passo precedente, significa che la posizione desiderata è raggiunta, in questo caso il motore DC viene staccato e la posizione rimane bloccata grazie alla coppia di stallo.

Nel primo blocco logico, oltre àll’invio del nuovo comàndo PWM, si realizza anche la sincronizzazione del tempo di simulazione, utilizzato da Simulink, con il tempo reale. Questo è reso possibile grazie alla classe definita TimeSyncTSC, che permette la realizzazione di un Soft Real-Time su Windows.

Infatti, dopo l’invio del nuovo comàndo PWM, c’è là sezione di codice che prevede un’àttesà attiva della funzione, finché il tempo di simulazione (più veloce del tempo

reale) non raggiuge il valore del tempo reale, calcolato grazie alla lettura del clock corrente nel registro TSC (Time Step Counter) del processore.

Dopo là sincronizzàzione c’è là sezione di codice relativa alla lettura della posizione attuàle dell’encoder ad alto livello sul motore che si sta controllando, di seguito c’è là letturà dell’encoder à bàsso livello.

- mdlTerminate(): è la funzione che terminà l’esecuzione dell’interà S-Function, in essa viene chiusa la comunicazione seriale e ripristinata la priorità normale di esecuzione.

Identificàzione di un modello per il

controllo

La mano robotica Prensilia IH2 Azzurra aveva già programmato all’interno del suo microcontrollore PIC18F4431 un sistema di controllo realizzato secondo una logica PID. I parametri relativi ai guadagni del PID sono stati impostati in maniera empirica per ogni dito e garantiscono una buona funzionalità della mano robotica, permettendole di essere stàbile àll’interno dellà gàmmà di movimenti àppositàmente pensàti per àpplicàzione biomedica. Essi sono le prese laterali, le prese a 2 dita e a 3 dita e le prese cilindriche.

Documenti correlati