Appendice A Il sistema meccanico (a) ERIII. (b) ERIV. (c) ERV. Figura A.1: Scorbot nel laboratorio di Robotica. Il Robot “SCORBOT-ER”, visibile in Figura A.1, è un manipolatore antropomorfo a cinque gradi di libertà fornito di una pinza motorizzata come strumento di presa. I cinque giunti che collegano i link che lo compongono, vengono individuati con i nomi sotto indicati, assegnati a partire dal giunto più vicino al piano di lavoro: “BASE”, “SHOULDER”, “ELBOW”, “PITCH” (Wrist), “ROLL” (Wrist) (Figura A.2). I movimenti dei giunti sono ottenuti con “MOTORI IN CC” (corrente continua) dotati di rapporti di riduzioni diversi per ogni giunto. Da notare che nell’involucro 1 Cap. A Il sistema meccanico Figura A.2: Nomenclatura e relative rotazioni dei giunti. meccanico del motore è gia presente un rapporto di riduzione. L’informazione relativa alla posizione angolare del giunto è invece ottenuta mediante “ENCODERS” di tipo incrementale, montati in asse con l’albero di ogni singolo motore (Figura A.3a). I giunti di “BASE”, “SHOULDER” e “ELBOW” sono gestiti da singoli motori mentre (a) Particolare Motore-Encoder. (b) Sistema differenziale. Figura A.3: Motori. i giunti di “PITCH” e “ROLL” sono gestiti da due motori montati in un sistema differenziale (Figura A.3b). Essendo gli assi dei motori posti uno verso l’altro, con l’applicazione ad essi di tensioni uguali e con lo stesso segno si ottiene il movimento di “ROLL” mentre con segno opposto si ottiene il movimento di “PITCH”. Poichè gli encoder sono di tipo incrementale, i giunti necessitano di un riferimento 2 Cap. A Il sistema meccanico che permetta di convertire gli incrementi forniti in posizioni assolute nello spazio di lavoro. Per questo motivo su ogni link è presente un microinterruttore ed una camma di azionamento che lo chiude quando l’angolo del giunto relativo è in una posizione nota (Figura A.4). Riferendo i valori ottenuti dagli encoder all’angolo nel quale è stato “trovato” il Figura A.4: Posizione dei microinterruttori e delle camme. microinterruttore, si ottengono valori “assoluti”, ovvero relativi al piano di lavoro. Pertanto l’operazione preliminare, che prende il nome di “Ricerca della HOME ”, all’utilizzo del sistema robotico è quella di ricerca, per ogni link, del micro interruttore di riferimento. Quando tutti i microinterruttori sono stati individuati il robot è nella sua posizione di “HOME”. Gli encoders applicati sui motori dello “SCORBOT-ER” sono trasduttori di posizione ottici e permettono di gestire dal punto di vista logico un motore in corrente continua come un motore passo passo (Figura A.5a). Gli encoders generano due onde quadre, sfasate di 90 gradi, di frequenza proporzionale alla velocità del motore. Contando il numero di fronti si ricava lo spostamento. Dalla analisi delle successioni nelle combinazioni dei fronti delle due onde, si ricava 3 Cap. A Il sistema meccanico (a) Esploso dell’encoder. (b) Onde quadre. Figura A.5: Encoder. l’informazione relativa alla direzione del movimento (Figura A.5b). Il primo problema da affrontare nello sviluppo di un sistema di gestione dello “SCORBOT-ER” è il calcolo dei fattori di conversione tra passi encoder ed angoli di giunto. Per convertire i passi encoder in angoli è necessario tenere conto della risoluzione dell’encoder e dei rapporti di riduzione nel sistema di trasmissione tra motore e giunto (Figura A.6). Figura A.6: Sistema di trasmissione. 4 Appendice B Start Up B.1 Operazioni Preliminari Dopo la creazione del nuovo account (lo si fa con il docente) effettuare la login: • Login: nome del gruppo • Password: password scelta Per modificare successivamente la password digitando da terminale il comando passwd: • Inserire la vecchia password • Inserire la nuova password • Confermare la nuova password Una volta effettuata la login avremo davanti l’interfaccia grafica di ubuntu Per entrare nella cartella di lavoro, da terminale digitate cd <nome_cartella>: cd robot2009/admin_script In questa cartella vi sono gli script per la creazione di un ambiente di lavoro controllato, in modo da non danneggiare il sistema. I file principali sono tre: 5 Cap. B Start Up §B.2 Informazioni Aggiuntive • aggiungi_utente.sh: serve a creare un nuovo utente con caratteristiche speciali in modo da poter essere sfruttato senza preoccuparsi di rovinare il sistema; • backup_new_release.sh: serve a creare il backup del sistema che verrà poi usato dal precedente script (da usare solo se sono state apportate modifiche ai file della cartella robot, si consiglia comunque di effettuare un back-up dell’intera cartella in caso di errori); • rimuovi_utente.sh: serve a cancellare l’utente creato con il primo script in caso di malfunzionamenti o errori di programmazione. Per prima cosa creiamo un nuovo utente che abbia al suo interno tutto il necessario ad utilizzare il robot digitando sudo sh aggiungi_utente.sh <nome utente> e seguendo le istruzioni fornite a schermo. Se tutto e’ andato a buon fine, avremo ora il nostro ambiente di lavoro che può essere usato senza preoccupazioni. B.2 Informazioni Aggiuntive Alcuni comandi utili in fase di lavorazione con Linux: • cd : tasto di cambio directory, usato per entrare nelle varie directory; • cd ..: fa tornare alla directory precedente; • CTRL+ALT+F1 : passa dall’interfaccia grafica a quella di terminale; • CTRL+ALT+F7 : passa dal terminale all’interfaccia grafica; 6 Cap. B Start Up §B.2 Informazioni Aggiuntive • CTRL+ALT+F2 : apre una nuova finestra di terminale su cui effettuare di nuovo la login, senza chiudere la finestra di compilazione su F1; 7 Appendice C La Demo C.1 Eseguire la Demo Una volta creato il nuovo utente, possiamo iniziare ad utilizzare il sistema. Entriamo con la login e la password dell’utente appena creato, apriamo la cartella di lavoro ( /robot2009/robot) e diamo un primo sguardo alla Demo, un piccolo programma che permette di famigliarizzare con il robot e il software. Compiliamo la demo tramite il comando make demo e facciamo partire il programma con il comando ./run demo Avremo ora di fronte il programma base con cui muovere il robot e il cui utilizzo, specificato all’interno dello stesso, verrà esposto nel prossimo capitolo. C.2 Descrizione della Demo Lanciata la Demo avremo a schermo la schermata visibile in Figura C.1. Come si può notare, i comandi utili al funzionamento del programma sono visibili a schermo: 8 Cap. C La Demo §C.2 Descrizione della Demo Figura C.1: Schermata Principale della Demo. • 0;1;...,7 : seleziona i motori da 0 a 7, il movimento del robot avviene tramite l’ausilio dei tasti “PageUp” e “PageDown”; • O,o: Open, apertura dell’effettore; • C,c: Close, chiusura dell’effettore; • H,h,tasto Home,Home: porta il robot in posizione di home; • Enter : azzera i passi Encoder (utile per le misurazioni); • +,-: aumenta o diminuisce il passo; • ESC : esce dalla Demo. Andiamo ora a esplicitare le varie parti della schermata (Figura C.1). • Interrupt: indica il numero di cicli di clock effettuati dal programma dall’inizio della sua esecuzione; • RealTimeClock : indica il tempo, in ms, che intercorre tra due cicli di clock; 9 Cap. C La Demo §C.3 Creazione di un progetto personale • Passo: indica di quanto, in encoder, il motore selezionato si muoverà ad ogni pressione dei tasti “PageUp” o “PageDown”; • Kp: indica il guadagno del controllo applicato ai motori; • mVolt: indica il numero di milli volt che stiamo dando al robot durante il movimento; • Stato: indica lo stato dei motori del Robot; • Encoder : indica di quanto si è spostato, in encoder, il motore rispetto alla posizione iniziale; • Errore: indica l’errore di posizione, in encoder, tra la posizione desiderata e quella raggiunta; • Home: indica, se è stata compiuta la procedura di Home, se sul singolo motore è andata a buon fine, “#”, o no “−”; • Switch: indica lo stato dello switch del motore, ossia se è attivo, “#”, o meno, “−”. Questi sono i comandi base per utilizzare la demo ed interpretare ciò che appare a schermo. C.3 Creazione di un progetto personale Dalla cartella di lavoro ( /robot2009/robot) copiare nella cartella dei sorgenti dell’utente (user_src) il file della demo e rinominarlo a piacimento (es. gruppox.c) cp ./scorb/sbdemo.c ./user\textunderscore src/gruppox.c 10 Cap. C La Demo §C.3 Creazione di un progetto personale Per leggere e modificare il file appena copiato usare, per esempio, l’editor grafico “gedit” gedit ./user_src/gruppox.c Sullo schermo comparirà il listato del sorgente gruppox.c appena copiato che può essere modificato come un normale file di testo. Una volta modificato e salvato il file gruppox.c questo va compilato. La compilazione va effettuata dalla cartella di lavoro ( /robot2009/robot) con il seguente comando make bin PROG=gruppox Per avviare il programma, infine, sempre dalla cartella di lavoro, digitare: ./run gruppox Se nessuna modifica è stata apportata con gedit, verrà aperta una Demo del tutto analoga a quella vista in precedenza. 11 Appendice D Il Software Il software di base necessario per lo sviluppo di applicazioni sul sistema robotico è stato sviluppato utilizzando il linguaggio “ANSI C” e viene fornito come punto di partenza per il lavoro da svolgere durante l’esercitazione. Esso è stato concepito come mera interfaccia ai dispositivi hardware dei quali opera vari livelli di astrazione, nascondendo all’utilizzatore i dettagli della loro programmazione e gestione, ma non ha una evoluta conoscenza del sistema che gestisce. Il Robot è considerato poco più di 6 motori indipendenti tra di loro. Il software implementa anche un semplice sistema Real-Time con il quale viene gestito il controllo del Robot interamente dal Personal Computer. Questa caratteristica permette l’implementazione, con estrema facilità, delle più varie leggi di controllo. Nel sistema Real-Time implementato, una “funzione” del programma viene mandata in esecuzione ad intervalli di tempo periodici in completa asincronia rispetto al flusso del programma. L’effetto di questa funzionalità è che, in qualsiasi punto sia l’esecuzione del programma, ogni intervallo di Real-Time viene sospesa l’esecuzione del flusso ed eseguita la funzione legata al Real-Time stesso. Il sistema Real-Time è stato implementato grazie all’ausilio del progetto RTAI che permette l’esecuzioni di certi task, appunto, in real time. 12 Cap. D Il Software Nel software è presente quindi una funzione di gestione dell’interrupt di Real-Time che viene chiamata con un periodo configurabile1 . Quando viene chiamata, la funzione aggiorna le strutture dati che contengono lo stato del Robot (tra le altre cose la posizione angolare dei motori espressa in impulsi rispetto ad una posizione di riferimento). Una volta registrato lo stato del Robot, viene invocata la funzione di controllo dello stesso. La libreria prevede una funzione di controllo di default che potrà comunque essere sostituita da una fornita dall’utilizzatore della libreria. La funzione di controllo pertanto non necessita e non deve essere chiamata direttamente (in modo esplicito) ma verrà periodicamente chiamata, al verificarsi dell’interrupt di Real-Time-Clock. Nel caso del sistema in oggetto, per funzione di controllo si intende una funzione che permetta al Robot di raggiungere posizioni arbitrarie nel suo spazio di lavoro e nella quale sia possibile agire sulla “modalità” dello spostamento finalizzato all’annullamento della differenza tra la posizione del Robot in un dato momento e quella da raggiungere. Nella funzione di controllo, utilizzando le altre funzioni di libreria, è possibile leggere la posizione dei motori e lo stato del robot (input del controllo), effettuare controlli, calcoli e richiedere che venga applicata una certa tensione ai motori (output del controllo). Quest’ultima richiesta verrà soddisfatta dal software al termine della funzione di controllo. B Attenzione D.0.1. `E necessario tenere conto che la funzione viene automaticamente chiamata alla frequenza scelta per il Real-Time-Clock e quindi la complessità computazionale della stessa deve essere tale che la funzione possa essere interamente eseguita in un lasso di tempo minore al periodo di Real-Time-Clock. 1 Il periodo di Real-Time-Clock si sceglie in funzione del sistema che si deve controllare. Normalmente per il sistema in discussione sono accettabili valori tra i 5 e 30 ms come compromesso tra necessità del sistema e capacità dell’elaboratore. 13 Cap. D Il Software §D.1 La struttura dati “ROBOTMotor” Il software fornito e’ composto da vari moduli scritti in linguaggio C/C++. I moduli e le loro funzioni sono i seguenti: Modulo Descrizione mctype.h rtc.c rtc.h dda06-16-lxrt.c dda06-16-lxrt.h pu.c pu.h Scorb.c Scorb.h Definizione di tipi di dati e macro semplificative Gestione del Real Time Clock Prototipi delle funzioni di “rtc.c” Gestione della scheda PCI-DDA06/16 Prototipi delle funzioni di “dda6.c” Gestione dell’Unità di Potenza Prototipi delle funzioni di “pu.c” Gestione a livello superiore del sistema robotico Prototipi delle funzioni di “scorb.c” Tutte le funzioni necessarie per lo sviluppo dell’applicazione finale sono contenute in “Scorb.c”. Queste a loro volta, quando necessario, utilizzano le funzioni degli altri moduli. Nonostante sia possibile farlo, non dovrebbe risultare necessario chiamare, dall’applicazione, le funzioni definite in moduli diversi da “Scorb.c”. Tutti i valori necessari per implementare un controllo vengono aggiornati automaticamente ad ogni ciclo di Real-Time-Clock e registrati in una struttura dati interna di gestione (ROBOTMotor), disponibile al programmatore per “vedere” lo stato del sistema (encoder, home, errori), e per impostare i valori di modifica dello stato stesso (tensione ai motori). D.1 La struttura dati “ROBOTMotor” Questa struttura dati consiste in una array di record di sei elementi chiamato “ROBOT_MAX_MOTOR (6)”. Il singolo elemento dell’array contiene informazioni relative ad un motore del robot. L’assegnazione inizia con l’elemento di indice 0 associato al motore BASE fino all’elemento di indice 5 associato al motore del GRIPPER (pinza). I campi del record ad uso esterno sono di seguito descritti: 14 Cap. D Il Software §D.1 La struttura dati “ROBOTMotor” encoder Posizione del motore in impulsi letta dai contatori all’interno della “Unità di Potenza” associati agli encoders del robot. Questo dato costituisce un ingresso per il controllo. Uso: sola lettura. oldEncoder È la posizione precedente del motore, utile per determinare situazioni come movimento richiesto ma non eseguito (fine corsa oppure ostacolo). Uso: interno. state È lo stato del motore, costituisce un ingresso per il controllo e può contenere uno dei valori sotto indicati. Uso: sola lettura. • ROBOT_STATE_READY: Il robot è pronto a muoversi, il precedente movimento è terminato; • ROBOT_STATE_MOVING: Il robot è in movimento, il valore del campo ’encoder’ cambia nel tempo; • ROBOT_STATE_ERROR: Il robot ha raggiunto i fine cosa o il movimento richiesto non e’ stato eseguito completamente per fine corsa oppure ostacoli; • ROBOT_STATE_STOPPED: Il movimento del robot è stato interrotto dall’operatore. mVolt Tensione in millivolt da applicare all’ingresso dell’amplificatore di potenza interno alla ’Unità di Potenza’. Il range è −5000/5000 mVolt. Questo dato costituisce l’uscita del controllo. Uso: Scrittura/Lettura. 15 Cap. D Il Software §D.2 Variabili di configurazione del sistema homeOK Esito della procedura di Home effettuata sul singolo asse (TRUE/FALSE). Se la HOME del singolo LINK non e mai stata trovata questo campo contiene FALSE altrimenti TRUE. Uso: Lettura/Scrittura home Stato del micropulsante di riferimento univoco dell’angolo di movimento del link. Uso: Sola Lettura D.2 Variabili di configurazione del sistema Le variabili sotto descritte comunicano alla libreria le caratteristiche di parti del sistema gestito. Queste dovrebbero essere utilizzate in sola lettura. word dda_IOAddr Contiene l’indirizzo della porta nell’ I/O-Bus della scheda PCI-DDA06/16. const long ROBOTMaxmVoltValue Contiene il valore in mVolt massimo applicabile al campo “mVolt” di ROBOTMotor. (5000) int ROBOTUserBreakKey Corrisponde al codice del tasto utilizzato come USER BREAK nelle procedure di movimento. Per default corrisponde a 98 = ALT-B. enum ROBOTGripperStatus Può assumere i valori di CLOSE e OPEN, ed indica lo stato attuale della pinza. int ROBOTGripperGap Contiene l’apertura attuale della pinza in millimetri. Il suo valore è restituito dalle funzioni ’ROBOTGripperOpen’ e ’ROBOTGripperClose’ ed aggiornato ad ogni loro chiamata. 16 Cap. D Il Software §D.3 Variabili di utilità const char *ROBOTMotorStateString[ ] Stringhe descrittive dello stato dei motori. L’indice da passare deve esser il valore del campo ’ROBOTMotor[x].state’. const char *ROBOTMotorLinkString[ ] Stringhe descrittive dei link del robot. L’indice prevede valori da 0 (BASE) a 5 (GRIPPER). int ROBOTHomePulse[ ] Si tratta di un array di cinque numeri che corrispondo al numero massimo di impulsi che ogni motore deve compiere nella ricerca della “Home”. Può essere settato in base alla capacità e alla precisione, in encoder, del robot utilizzato per migliorare la ricerca della “Home”. D.3 Variabili di utilità volatile long ROBOTRealTimeCounter Conta il numero di periodi di real-time-clock completati dall’attivazione dello stesso con la funzione “ROBOTControlStart”. bool ROBOTAutoPowerCtrl Questa variabile è legata al sistema di controllo dell’alimentazione agli amplificatori di potenza. Se FALSE (valore di default) l’utente deve esplicitamente gestire il controllo con le funzioni “ROBOTPowerON”, “ROBOTPowerOFF”, ’ROBOTPowerIsON’. Se TRUE l’alimentazione viene rispettivamente fornita e tolta con le chiamate alle funzioni: “ROBOTControlStart” e “ROBOTControlStop”. 17 Cap. D Il Software D.4 §D.4 Variabili usate dal controllo di default previsto dalla libreria Variabili usate dal controllo di default previsto dalla libreria La libreria a scopo semplificativo e dimostrativo fornisce una funzione di controllo del robot riferita come “Controllo di Default”. Questi è un controllo di tipo proporzionale gestito dalle variabili sotto indicate. int ROBOTDefCtrlPosReq[ROBOT_MAX_MOTOR] Posizione desiderata in passi per ogni motore. long ROBOTDefCtrlPosError[ROBOT_MAX_MOTOR] Errore di posizione di ogni motore. int ROBOTDefCtrlKP Guadagno del controllo applicato su tutti i motori. int ROBOTDefCtrlErrorTol Delta di tolleranza dell’errore in impulsi. word ROBOTDefErrorCheckRate Periodo di chiamata della procedura di controllo dello stato dei motori, espressa in periodi di real-time-clock. D.5 Macro ROBOT_MAX_MOTOR Numero complessivo di motori del robot. Comoda per i casi in cui sia necessario implementare cicli di scansione dei motori. Es: for(i = 0; i <ROBOT_MAX_MOTOR; i++) ROBOT_MAX_LINK Numero complessivo di link del robot. Comoda per i casi in cui sia necessario imple- 18 Cap. D Il Software §D.6 Funzioni di gestione generale del robot mentare cicli di scansione dei Link. Ex: for(i = 0; i <ROBOT_MAX_LINK; i++) BASE, SHOULDER, ELBOW, PITCH, ROLL, GRIPPER Identificano i vari motori/links del robot. Si possono usare come indici della struttura dati principale “ROBOTMotor” e come argomenti delle funzioni di libreria. ROBOT_STATE_READY Motore pronto al movimento. Da usare per confrontare lo stato del robot. ROBOT_STATE_ERROR Motore in errore per raggiungimento di fine corsa oppure ostacoli. Da usare per confrontare lo stato del robot. ROBOT_STATE_MOVING Motore in movimento. Da usare per confrontare lo stato del robot. ROBOT_STATE_STOPPED Motore bloccato dall’operatore con la funzione “ROBOTMotorStop” oppure “ROBOTStop” HOME_SWITCH_STATE(nMotor) Restituisce lo stato del micro pulsante di HOME del singolo motore/link. D.6 Funzioni di gestione generale del robot bool ROBOTInit(void (*UserControlFunc)(void), void (*UserErrorCheckFunc)(void), void (*UserBreakMsgFunc)(void) ); Inizializza le strutture di gestione dell’hardware e registra le funzioni rispettivamente di Controllo, Gestione Errori e Messaggi. Con NULL si abilita l’uso di quelle presenti nella libreria. Ritorna l’esito dell’inizializzazione letto direttamente dalla Unità di 19 Cap. D Il Software §D.6 Funzioni di gestione generale del robot Potenza. B Attenzione D.6.1. Questa funzione deve essere chiamata prima di chiamare altre funzioni della libreria. UserControlFunc Viene chiamata ad ogni ciclo di controllo e dovrebbe contenere l’algoritmo di controllo stesso. UserErrorCheckFunc Viene chiamata con un periodo multiplo a quello del controllo che può essere impostato dall’utente ed esplica il controllo su eventuali stati di anormalità del sistema, in particolare dei motori, (ad esempio dovrebbero muoversi perchè il relativo DAC stà fornendo tensione ma non lo fanno perchè a fine corsa o contro un ostacolo). Si consiglia di non sostituire questa procedura a meno che non sia strettamente necessario (il che non dovrebbe capitare). UserBreakMsgFunc Viene chiamata quando l’utente richiede una interruzione della procedura in corso tramite la pressione del tasto abilitato (normalmente ALT-B). Questa dovrebbe essere una funzione di informazione all’utente dell’avvenuto break nelle modalità di output del particolare sistema di interfaccia utente utilizzato. bool ROBOTPowerON(void) Fornisce l’alimentazione agli amplificatori dei motori. È la condizione software comunicata con le porte di I/O della DDA per “Chiudere” il relè interno all’Unità di Potenza per alimentare gli amplificatori. Il valore di ritorno è lo stato del relè letto sempre attraverso le porte di I/O della DDA. 20 Cap. D Il Software §D.6 Funzioni di gestione generale del robot bool ROBOTPowerOFF(void) Toglie l’alimentazione agli amplificatori di potenza. Ritorna lo stato del relè letto direttamente dopo l’operazione. bool ROBOTPowerIsON(void) Restituisce lo stato del relè di gestione controllo alimentazione potenza, ritorna TRUE se gli amplificatori sono alimentati, FALSE in caso contrario. bool ROBOTControlStart(double ms) Imposta il Real Time Clock al periodo richiesto con il parametro “ms” in millisecondi (<55) e gestisce il controllo del Robot con la funzione di Controllo e Controllo Errori fornite con “ROBOTInit()” ’. Restituisce TRUE se ha impostato il controllo FALSE in caso contrario. B Attenzione D.6.2. Il tempo di campionamento desiderato non deve essere inferiore al tempo necessario per l’esecuzione del codice della Funzione di Controllo più tempi di gestione. Per sicurezza si consiglia di utilizzare tempi da 1 a 55 ms sperimentati su PC con processore 386DX. (55 ms è il limite del contatore utilizzato per il RealTimeClock) void ROBOTControlStop(void) Blocca il Real Time Clock e lascia il Robot senza controllo. void ROBOTReset(void) Azzera tutti i contatori encoder e pone tutti i campi della struttura “ROBOTMotor” al loro valore di default sovrascrivendo tutte le impostazioni effettuate. La struttura dati viene poi ricaricata con lo stato del robot. void ROBOTResetEncoders(void) Imposta a zero i valori di tutti i contatori associati degli encoder. void ROBOTResetMotorError(int nMotor) Effettua le operazioni di pulizia necessarie dopo un errore sul motore (fine corsa oppure 21 Cap. D Il Software §D.7 Funzioni per la gestione diretta della struttura “ROBOTMotor” ostacoli). bool ROBOTUserBreak(void) Restituisce TRUE se è stato premuto il tasto di blocco del robot (normalmente ALT_B). void ROBOTStop(void) Blocca tutti i motori del Robot e pone lo stato a ROBOT_STATE_STOPPED. void ROBOTMotorStop(nMotor) Blocca tutti il motore “nMotor” e pone lo stato a ROBOT_STATE_STOPPED. int ROBOTGripperOpen(void) Apre la pinza del Robot e restituisce l’ampiezza raggiunta in millimetri (normalmente quella massima). (Vedere anche in VARIABILI: “ROBOTGripperGap”); int ROBOTGripperClose(void) Chiude la pinza del Robot e restituisce la grandezza dell’oggetto stretto in millimetri. (Vedere anche in VARIABILI: ’ROBOTGripperGap’) D.7 Funzioni per la gestione diretta della struttura “ROBOTMotor” int ROBOTGetMotorEncoder(int nMotor) Legge il conteggio del contatore encoder (POSIZIONE) associato al motore ’nMotor’. Accesso a ’ROBOTMotor[nMotor].encoder’. int ROBOTGetMotorState(int nMotor) Legge lo stato del motor “nMotor”. Accesso a ’ROBOTMotor[nMotor].state’. void ROBOTSetMotorState(int nMotor, int state) Imposta lo stato del motor “nMotor”. Accesso a ’ROBOTMotor[nMotor].encoder’. 22 Cap. D Il Software §D.7 Funzioni per la gestione diretta della struttura “ROBOTMotor” void ROBOTSetMotorOutput(int nMotor, long mVolt) Prepara il motore “nMotor” per un movimento con una tenzione di “mVolt” millivolt (range -5000 / 5000). Accesso a “ROBOTMotor[nMotor].mVolt”. void ROBOTSetMotorBound( int nMotor, int nPulses_maxP, int nPulses_maxN) Non è utilizzata dalla libreria, ma può essere utilizzata per registrare i valori di escursione massima positiva e negativa (in impulsi) dei singoli link. Può risultare utile per gestire più agevolmente controlli che tengano conto anche di tali grandezze. void ROBOTHomeLinkSetOutput(int nMotor, long mVolt) Prepara il movimento del motore “nMotor” con una tensione di “mVolt” millivolt per la ricerca della home. B Attenzione D.7.1. Questa funzione deve essere chiamata con il Real-Time-Clock attivo ma senza algoritmo di controllo del robot. bool ROBOTHomeMotorSearch(int nMotor, int nPulses) Muove il motore “nMotor” nella direzione relativa al segno di “nPulses” finchè non viene premuto il micro pulsante di home per un massimo di “nPulses” 2 impulsi. B Attenzione D.7.2. Questa funzione deve essere chiamata con il Real-Time-Clock attivo ma senza algoritmo di controllo del robot. bool ROBOTHomeMotor(int nMotor, int nPulses) Esegue l’algoritmo di home sul motore “nMotor” per un massimo di “nPulse” 2 impulsi. B Attenzione D.7.3. Questa funzione deve essere chiamata con il Real-Time-Clock attivo ma senza algoritmo di controllo del robot. 2 Il numero di impulsi “nPulses” per ogni motore è registrato in un array modificabile dall’utente. Vedi Sezione D.2 alla voce int ROBOTHomePulse[]. 23 Cap. D Il Software §D.7 Funzioni per la gestione diretta della struttura “ROBOTMotor” bool ROBOTHome(void) Esegue un algoritmo molto semplificato di ricerca home del Robot: iniziando dal link BASE fino al link ROLL e test apertura/chiusura della pinza (GRIPPER). Restituisce TRUE se home completata FALSE in caso contrario. 24 Appendice E La scheda PCI-DDA06/16 Figura E.1: La scheda di acquisizione dati PCI-DDA06/16. Fondamentalmente la scheda visibile in Figura E.1, il cui schema è mostrato in Figura E.2, è composta da due parti con un PCI controller che le coordina: la prima si occupa dei segnali di I/O digitali e l’altra si occupa di quelli analogici. La parte digitale, chiamata “8255” e gestita dal modulo 8255.ko in precedenza caricato dagli script eseguiti all’avvio, è utilizza per l’I/O di tre porte da 8 bit A, B e C, dove quest’ultima è a sua volta divisa in due sottoporte da 4 bit. La seconda parte, chiamata “pcimdda” ed interfacciata dal modulo cb pcimdda.ko, gestisce segnali di I/O analogici attraverso 6 DAC (Digital Analog Converter) indiriz- 25 Cap. E La scheda PCI-DDA06/16 zabili da 0 a 5. I Gain Switch che si vedono in Figura E.2 servono a definire manualmente il range di voltaggio dell’output analogico in base a questa configurazione: +10,-10 : D,U,D,U,D +5,-5 : D,U,D,D,U 0,+10 : U,D,U,U,D 0,+5 : U,D,U,D,U la configurazione che concerne la scheda in esame è la seconda, ma non occorre preoccuparsi di ciò , perchè tale configurazione viene impostata automaticamente dal codice di interfaccia grazie a dei jumper. Figura E.2: Schema della scheda di acquisizione dati PCI-DDA06/16. 26