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
Scarica

Appendice della tesi di Danilo Felicioli, con molte indicazioni utili