Università degli Studi di Cagliari
Ing. Elettronica
Robotica Industriale
Tesina sperimentale di laboratorio
Robot “Geeno”
Angelo Mocci,
matr 37052
Bruno Pinna
matr 37083
•
•
INDICE
Scopo del Progetto
pag 3
Materiale utilizzato
pag 3
Montaggio e prove
pag 4
Struttura logica e di controllo
pag 5
Alimentazione,
pag 6
Sviluppo del Software
pag 8
Funzioni Matlab
pag 9
Cinematica Diretta
pag 10
Cinematica Inversa
pag 11
Programmazione del processore Basic Atom pro 28
pag 14
Alcune fotografie su strada
pag 22
Conclusioni
pag
•
Scopo del Progetto
Il progetto consiste nel realizzare un braccio robotico che abbia la possibilità di muoversi
attraverso il controllo di una struttura cingolata, raccogliere un oggetto e portarlo a
destinazione. Il controllo avviene a ciclo aperto, ma data l'adattabilità dell'elettronica
utilizzata, il sistema è altamente ampliabile con sensoristica di varia natura.
•
Materiale utilizzato:
•
•
Lynx 5 Arm Kit
4 Standard Size Servo HS-422
•
Lynx A Gripper Kit
•
Micro Size Servo HS-81
•
Base Rotate Kit BR-NS
•
•
Standard Size Servo HS-422
Tri-Track Chassis Kit (no electronics)
•
•
2 Geared Motor 12V
2 Condensatori per filtrare le oscillazioni
•
SSC-32 Servo Controller
•
Sabertooth 2x5
•
•
Bot Board II
•
Basic Atom Pro 28
•
Morsettiera da 12
2 Batterie Lynxmotion NiMh 7.2V 2800mA
•
•
•
Pila 9V
Convertitore USB-Seriale
Cavo Seriale (per supplire alla poca affidabilità dovuta alla conversione usb-seriale)
•
Generatori di tensione da 18V e 9V per i test
•
•
•
•
Saldatore
Multimetro
Cavetteria varia
Viti e bulloneria di fissaggio
Montaggio e prove
Seguendo le istruzioni dal sito della LynxMotion ( http://www.lynxmotion.com ) si monta il
Lynx 5 Arm Kit, successivamente la mano con la pinza ( Lynx A Gripper Kit ).
In seguito anche la base rotante ( Base Rotate Kit BR-NS ) il tutto su il chassis con i cingoli (
Tri-Track Chassis Kit).
Gripper
Mano
Avambraccio
Spalla
Base
Per minimizzare le oscillazioni dei due motori in DC si può saldare sui motori un condensatore
(fornito nel kit di assemblaggio del tri-track)
Inizialmente si è proceduto all'azzeramento delle posizioni dei servo-motori, manipolando
l'offset meccanico di montaggio dei servo mottori sulle strutture statiche del braccio, in modo
da poter avere una posizione ad attuatori centrati, corrispondente al braccio disteso
frontalmente a gripper aperto.
Logica di Controllo
La struttura logica di controllo e generazione è costituita dall'inter-connessione di 3 schede:
•
Bot-Board II, ha il compito di alloggiare il microcontrollore, nel nostro caso il Basic Atom
Pro 28, può fungere anche da attuatore dei servomotori ma non nel nostro caso
•
SSC32, scheda per il controllo Live dei servo-motori, possiede un set di istruzioni embedded
ampiamente documentato nel materiale fornito dalla Lynxmotion. Nel nostro progetto funge
da attuatore, in configurazione Master-Slave con la scheda Bot-Board II, il processore Atom
assume il ruolo di Master nella comunicazione con l'SSC32 la quale assume il ruolo di slave.
Al fine dell'attuazione della programmazione la comunicazione è stata scelta come unilaterale
Master (BB2) → Slave (SSC32).
•
Sabertooth 2x5, Driver di potenza, collegando gli ingressi S0 e S1 alle uscite per
Servomotori della SSC32, la scheda, impostata attraverso il banco Jumper per la
comunicazione remota ad impulsi, come descritto nella documentazione fornita, la scheda
esegue la traduzione del segnale impulsivo in segnale continuo adatto a controllare i motori
DC.
Alimentazione
L'alimentazione nominale è così descritta:
- Logica, 9V da batteria a transistor
- Servo, 7,2V nominali da singolo pacco batterie ( con controllo on-off tramite switch
verticale)
- Motori DC, 16,2V da doppio pacco batterie serie (con controllo on-off tramite switch
orrizzontale)
Le interconnessioni, al fine di agevolare l'intervento sulla circuiteria sono state realizzate
attraverso una morsettiera posta sul retro del rover in posizione verticale, mentre i pacchi
batteria possono essere sganciati attraverso delle connessioni faston ad aggancio rapido.
La comunicazione con la logica avviene completamente attraverso il protocollo seriale RS232, è
anche possibile utilizzare adattatori del tipo USB-RS232.
N.B questo approccio è sconsigliato a causa della bassa compatibilità di molti adattatori con la
scheda BBII, se si decide di utilizzare quest'ultimo approccio è necessario che il cavo utilizzi
una conversione basata su chipset FDTI.
Il Driver di potenza ha lo scopo di gestire la generazione del segnale di potenza a tensione
variabile al fine di poter controllare il movimento orario-antiorario dei motori. Questi,
utilizzando una corretta impostazione del banco jumper presente sulla scheda Sabertooth,
utilizzando le modalità descritte nella quick start guide della stessa, possono essere controllati
come se si trattasse di veri e propri motori passo passo. Il range di funzionamento tuttavia non
è il medesimo poiché il controllo è interpretato e non diretto.
Il periodo dell'onda quadra del treno di impulsi và da 1,0ms a 2,0ms, al valore 1000 vi è
l'inversione di marcia (indietro tutta) per valori crescenti si passerà a velocità sempre
minori, fino a 1,5ms ossia valore 1500 per il quale avviene la fermata totale del motore. Per
valori crescenti vi è l'accelerazione del motore fino a 2,0ms(2000) che corrisponde alla
massima velocità raggiungibile (avanti tutta).
N.B. E' da notare che la potenza dei motori, i quali hanno tensione nominale di esercizio 12V, è
direttamente proporzionale alla tensione di alimentazione della scheda Sabertooth 2x5.
I motori DC funzionaranno fintanto che l'ingresso sarà compreso nel range 6-20V, a tal fine
per poter avere la massima coppia possibile si è optato per la coppia maggiore ottenibile senza
dover sacrificare l'autonomia del rover, realizzando attraverso la serie di 2 pacchi batterie da
7,2V nominali (alla massima carica pari a 8,2V) una tensione di alimentazione nominale del
driver di potenza di 16 V.
Inizialmente si era progettato un sistema a partitore di tensione tale da poter ottenere dall'unico
pacco-batterie da 16V sia la tensione di alimentazione dei motori DC sia la tensione di
alimentazione dei servomotori del braccio robotizzato (max 7V), tuttavia in fase di
simulazione si è osservato che allo scaricarsi del pacco batterie il sistema si sarebbe
destabilizato portando a pericolose oscillazioni di tensione che avrebbero potuto danneggiare
la struttura del braccio, soprattutto del servo motore del gripper che essendo un micro-servo
sarebbe incorso a danneggiamenti irreparabili.
Il sistema è stato quindi ri-progettato inserendo un 3° pacco batterie, anch'esso alloggiato
nell'intercapedine di chassis del rover.
Una volta attuate le interconnessioni delle strutture logiche, e delle strutture di potenza, si può
procedere allo sviluppo del controllo cinematico e dinamico del robot.
Sviluppo del Software
Dopo aver collegato tutti i servo alla SSC-32 si procede a fare dei test ON-LINE, collegando il
cavo seriale all'SSC32, utilizzando il programma fornito con il Lynx 5 Arm per testare il
funzionamento dei vari servomotori, nel contempo su MATLAB si scrive e ricava la
cinematica diretta ed inversa del braccio con la mano.
I servomotori rispondono ad una determinata stringa di impulsi:
#(num_pin)P(posizione)T(T tempo in millisecondi, S velocita)
per esempio: #1P550T1000 (fai muovere il servo collegato al pin 1 alla posizione 550 in 1
secondo).
La struttura sintattica del controllo Live dei servo motori è ampiamente descritta nella
documentazione relativa alla scheda SSC32.
Anche tramite MATLAB è possibile inviare queste stringhe. Si può realizzare un programma che
utilizzando la cinematica diretta e inversa ed il collegamento con il pc posizioni i servomotori
nella posizione desiderata dopo che MATLAB si è calcolato gli impulsi da mandare ai vari
servomotori.
La metodica di comunicazione di matlab è sviluppata attraverso la generazione di un oggetto
Seriale attraverso la seguente sintassi (iniz_com)
%inizializzazione delle porte come per il controllo del robot
S=serial('COM13', 'BaudRate', 38400,'Terminator','CR/LF');
fopen(S)
La porta seriale(S), viene avviata sulla porta COM13 ( questo valore và adattato in base alla porta
COM assegnata dal S.O.) alla velocità di 38.4K, con terminatore e metodo Carriage Return &
Line Feed, come descritto per i sistemi Windows.
Una volta avviata la porta comunicazione seriale è stato necessario sviluppare una funzione che
creasse la stringa di controllo dei servomotori in funzione dei valori voluti:
function robot(S,chan,var)
%robot(S,chan,var)
%esegue sull'oggetto serial S, il canale chan e la posizione var l'invio
%seriale
temp=sprintf('#%dP%dS500',chan,var);
fprintf(S,temp);
nella variabile temp viene generata la stringa secondo la sintassi precedentemente descritta, e
attraverso il comando fprintf viene inviata la stringa attraverso la porta seriale.
Questo comando permette il controllo Live dei vari servo.
Un primo test consiste nel richiamare il comando robot_rip che invia in maniera sequenziale un
controllo a tutti i motori del braccio per poterne testare il corretto funzionamento
fprintf(S,'#1p550S100')
pause(0.5)
robot(S,3,1500)
pause(0.2)
robot(S,0,1500)
pause(0.5)
robot(S,2,1500)
pause(0.5)
robot(S,3,1500)
pause(0.5)
robot(S,4,1400)
pause(0.5)
N.B. Il controllo Live, può avvenire unicamente collegando la porta seriale alla scheda ssc32 e
sostituendo il cavo di interconnessione della Bot Board 2 alla SSC32 con i jumper sulla scheda
SSC32 secondo le modalità descritte nel manuale di riferimento della scheda SSC32
Se vi è riscontro con le posizioni descritte, è possibile passare alla descrizione della dinamica.
La cinematica Diretta è stata sviluppata secondo le modalità di Denavit-Hartenberg:
function [pos]=direct_kin(t1,t2,t3,t4)
%matrice di calcolo della cinematica diretta
d1=8;
a1=15.89;
a2=10;
a3=10;
a4=12;
c1=cos(t1);
c2=cos(t2);
c3=cos(t3);
c4=cos(t4);
s1=sin(t1);
s2=sin(t2);
s3=sin(t3);
s4=sin(t4);
px=-a4*s4*(c1*c2*s3+c1*c3*s2)+a4*c4*(c1*c2*c3-c1*s2*s3)+a3*c1*c2*c3-a3*c1*s2*s3+a2*c1*c2;
py=-a4*s2*(c2*s1*s3+c3*s1*s2)+a4*c4*(c2*c3*s1-s1*s2*s3)+a3*c2*c3*s1-a3*s1*s2*s3+a2*c2*s1;
pz=a4*c4*(c2*s3+c3*s3)+a4*s4(c2*c3-s2*s3)+a3*c2*s3+a3*c3*s2+a2*s2+d1;
pos=[px,py,pz];
L'inversione di questa matrice ci permette di determinare gli angoli di giunto fornendo le variabili
spaziali di posizione, poiché occorre determinare 5 variabili di giunto date 3 variabilidi
posizione, il problema non è ovvio poiché si presentano 4 combinazioni possibili per la stessa
posizione, si è scelto quindi di imporre che la posizione della mano sia sempre parallela al
suolo, per facilitare la funzione del gripper e semplificare il problema di inversione cinematica.
Il calcolo della cinematica inversa è affidato a MATLAB utilizzando la funzione
ikine2(x,y,z,ang)
%% ikine2(x,y,z,ang)
%%La funzione ha il compito di svolgere i calcoli e la conversione atti a
%%generare gli angoli della cinematica inversa ed effettuare la conversione
%%degli angoli in impulsi tali da poter controllare i servomotori.
% x= distanza laterale del gripper, con riferimento al centro della base
% rotante e asse positivo rivolto alla sx del rover
% y= distanza frontale del gripper, con riferimento al centro della base
% rotante ed asse positivo rivolto frontalmente al rover
%
% z= quota della mano rispetto al piano sfalsato rispetto al suolo
function usc=ikine2(x,y,z,ang)
h=12;
a1=10;
a2=a1;
a3=12;
px=sqrt(x^2+y^2);
if ang<-10 %se la mano ha angolazione minore di 0 (gripper puntato verso il suolo, viene
compensata la lunghezza della mano per evitare che questa urti
py=z+12;
else py=z-10;
end
%calcolo della cinematica
c2=(px^2+py^2-a1^2-a2^2)/(2*a1*a2); %calcolo della cinematica
s2=-sqrt(1-c2^2);
t2=atan2(s2,c2)*180/pi;
s1=((a1+a2*c2)*py-a2*s2*px)/(px^2+py^2);
c1=((a1+a2*c2)*px+a2*s2*py)/(px^2+py^2);
t1=atan2(s1,c1)*180/pi;
t3=ang-t1-t2;
t0=atan2(y,x)*180/pi;
%t0 angolo giunto base rotante
%t1 angolo giunto di spalla
%t2 angolo giunto di braccio
%t3 angolo giunto di polso
% vettore contenente gli angoli
display('Angoli dei giunti')
angles=[t0 t1 t2 t3]
%%esecuzione della conversione in impulsi nel range 500-2500 per associare i
%%180° possibili attuabili dai servo
t0_i=(2000/180)*t0+500%%esegue la conversione degli angoli in impulsi
e1=(t1)/10;
t1=t1-e1;
t1_i=((2000/180)*t1)+500;
t2_n=(-t2)+39;
e2=t2_n/10;
t2_n=t2_n-e2;
t2_i=((2000/180)*t2_n)+500;
e3=t3/10;
t3=t3-e3;
t3_i=((2000/180)*(t3+100))+500;
%i cicli if limitano gli errori dovuti a posizionamenti scorretti,
%limitando i valori impulsivi di uscita nel range 550-2500
if t0_i<550
t0_i=550;
end
if t0_i>2500
t0_i=2500
end
if t1_i<550
t1_i=550;
end
if t1_i>2500
t1_i=2500
end
if t2_i<550
t2_i=550;
end
if t2_i>2500
t2_i=2500
end
if t3_i<550
t3_i=550;
end
if t3_i>2500
t3_i=2500
end
usc=[t0_i,t1_i,t2_i,t3_i] %valori impulsivi dei servomotori
Ottenuti i valori impulsivi delle variabili di giunto è stato possibile procedere alla programmazione
del microcontrollore basic atom pro 28, questi possiede un ambiente di sviluppo e
compilazione integrato, ed un proprio linguaggio alquanto similare alla programmazione
in C.
Abbiamo utilizzato un microprocessore Basic Atom Pro 28:
•
32K of Program Space
•
•
•
•
•
•
•
•
32K of EEPROM Storage
2000 Bytes (2K) of User / System RAM
Up to 8 A/D pins
100,000 Plus Instructions Per Second
Code and Pin compatible to the BasicATOM
Hardware-based 32 bit math
More built-in hardware than the BasicATOM
Based on the Hitachi 3664
Una volta inserito il microprocessore nell'alloggio da 28 pin previsto sulla scheda Bot Board 2
(facendo partticolare attenzione alla posizione in cui và inserito, si può notare che vi è mezzo
cerchio sul bordo del Atom, che dovrà corrispondere al taglietto frontale del socket.
L'ambiente di sviluppo è molto semplificato, seguendo le procedure illustrate nela quick start
guide dell'atom è possibile giungere agevolmente ad una corretta programmazione.
Utilizzando la cinematica inversa per calcolare la posizione del gripper rispetto alla terna di
riferimento posta al centro della base rotante, e inserendo l'angolo del gripper rispetto al suolo è
stato possibile ottenere una serie di stringhe da poter utilizzare in fase di programmazione.
Tutti i segnali dei servo-motori vengono generati dal processore Atom, che svlge il ruolo di
controllore, la scheda Bot-Board II, utilizzando la corretta sintassi, invia le stringhe contenute
nella programmazione attraverso il canale 8, che nel nostro caso è connesso direttamente al pin
Rx della scheda SSC32 che riceve il segnale e si occupa di decodificare la stringa ricevuta per
poter “attuare” la posizione richiesta nel tempo e velocità richiesti, sul canale desiderato.
Programmazione del processore Atom 28
Il codice della programazione del microcontrollore è quanto segue:
' Tesina di robotica industriale di Angelo Mocci e Bruno Pinna, Codice di controllo del
microcontrollore Atom 28 su Bot Board 2 +SSC32
servo0pwa var word 'Servomotore della base
servo0pwb var word 'Servomotore del braccio
servo0pwc var word 'Servomotore dell avanbraccio
servo0pwd var word 'Servomotore della mano
servo0pwe var word 'Servomotore della pinza
servo0pwf var word 'Cingolo di sinistra
servo0pwg var word 'Cingolo di destra
movetime var word 'Variabile per il tempo degli impulsi per i motori
nn var byte
ledA var bit
ledB var bit
ledC var bit
butA var bit
butB var bit
butC var bit
prev_butA var bit
prev_butB var bit
prev_butC var bit
temp
var
word
BUTTON_DOWN con 0
BUTTON_UP
con 1
ledA = 0
ledB = 0
ledC = 0
butA = 0
butB = 0
butC = 0
nn = 0
'impostazione della posizione iniziale
servo0pwa = 1500 'Base estremi: 550-2500 (550 a sinistra -> 2500 a destra)
servo0pwb = 1400 'Braccio estremi: 550-1400 (550 dritto -> 1400 verso il basso)
servo0pwc = 890 'Avanbraccio estremi: 550-2500 (550 tutto indietro -> 2500 tutto avanti)
servo0pwd = 1611 'Mano estremi: 550-2500 (2500 tutto indietro -> 550 tutto avanti)
servo0pwe = 1400 'Pinza estremi: 740-1400 (740 chiusa -> 1400 aperta)
servo0pwf = 1500 'Motore destro 1000 tutta retro, 1500 stop, 2000 avanti tutta
servo0pwg = 1500 'Motore destro 1000 tutta retro, 1500 stop, 2000 avanti tutta
start:
'posizione iniziale
movetime=1000
serout p8,i38400,["#0P",DEC servo0pwa,"S",DEC 100,13] 'Posizionamento base
serout p8,i38400,["#1P",DEC servo0pwb,"S",DEC 200,13] 'Posizionamento braccio
serout p8,i38400,["#2P",DEC servo0pwc,"S",DEC 400,13] 'Posizionamento avanbraccio
serout p8,i38400,["#3P",DEC servo0pwd,"S",DEC 300,13] 'Posizionamento mano
serout p8,i38400,["#4P",DEC servo0pwe,"S",DEC 80,13] 'Apertura/chiusura pinza
if (butA = BUTTON_DOWN) AND (prev_butA = BUTTON_UP) then 'programma A
sound P9,[100\2000]
'prende l'oggetto davanti a se
servo0pwa = 1500
servo0pwb = 550
servo0pwc = 1550
servo0pwd = 2204
servo0pwe = 900
servo0pwf = 1500
servo0pwg = 1500
serout p8,i38400,["#0P",DEC servo0pwa,"S",DEC 100,13]
serout p8,i38400,["#1P",DEC servo0pwb,"S",DEC 200,13]
serout p8,i38400,["#2P",DEC servo0pwc,"S",DEC 400,13]
serout p8,i38400,["#3P",DEC servo0pwd,"S",DEC 300,13]
serout p8,i38400,["#4P",DEC servo0pwe,"S",DEC 80,13]
sound P9,[1000\500]
pause 10000
'posizione per il trasporto
servo0pwa = 1500
servo0pwb = 934
servo0pwc = 890
servo0pwd = 550
servo0pwe = 900
serout p8,i38400,["#0P",DEC servo0pwa,"S",DEC 100,13]
serout p8,i38400,["#1P",DEC servo0pwb,"S",DEC 200,13]
serout p8,i38400,["#2P",DEC servo0pwc,"S",DEC 300,13]
serout p8,i38400,["#3P",DEC servo0pwd,"S",DEC 200,13]
serout p8,i38400,["#4P",DEC servo0pwe,"S",DEC 100,13]
pause 10000
pause 760
' avanti tutta per 3 secondi
servo0pwf = 2000
servo0pwg = 2000
serout p8,i38400,["#10P",DEC servo0pwf,"S",DEC movetime,13]
serout p8,i38400,["#11P",DEC servo0pwg,"S",DEC movetime,13]
pause 3000 'rotazione oraria
servo0pwf = 1000
servo0pwg = 2000
serout p8,i38400,["#10P",DEC servo0pwf,"S",DEC movetime,13]
serout p8,i38400,["#11P",DEC servo0pwg,"S",DEC movetime,13]
pause 1700 'avanti tutta per 2 secondi
servo0pwf = 2000
servo0pwg = 2000
serout p8,i38400,["#10P",DEC servo0pwf,"S",DEC movetime,13]
serout p8,i38400,["#11P",DEC servo0pwg,"S",DEC movetime,13]
pause 2000 'ferma i motori
servo0pwf = 1500
servo0pwg = 1500
serout p8,i38400,["#10P",DEC servo0pwf,"S",DEC movetime,13]
serout p8,i38400,["#11P",DEC servo0pwg,"S",DEC movetime,13]
sound P9,[1000\10000,500\6000,500\7000]
pause 500
servo0pwe = 1300 'apertura mano
serout p8,i38400,["#4P",DEC servo0pwe,"S",DEC 100,13]
endif
if (butB = BUTTON_DOWN) AND (prev_butB = BUTTON_UP) then 'programma B
'presa avanti a se
sound P9,[100\2000]
servo0pwa = 1500
servo0pwb = 550
servo0pwc = 1550
servo0pwd = 2204
servo0pwe = 900
servo0pwf = 1500
servo0pwg = 1500
serout p8,i38400,["#0P",DEC servo0pwa,"S",DEC 100,13]
serout p8,i38400,["#1P",DEC servo0pwb,"S",DEC 200,13]
serout p8,i38400,["#2P",DEC servo0pwc,"S",DEC 400,13]
serout p8,i38400,["#3P",DEC servo0pwd,"S",DEC 300,13]
serout p8,i38400,["#4P",DEC servo0pwe,"S",DEC 80,13]
sound P9,[1000\500]
pause 10000
'posizione per evitare che il braccio sbatta sui cingoli
servo0pwa = 1500
servo0pwb = 934
servo0pwc = 890
servo0pwd = 550
servo0pwe = 900
serout p8,i38400,["#0P",DEC servo0pwa,"S",DEC 100,13]
serout p8,i38400,["#1P",DEC servo0pwb,"S",DEC 200,13]
serout p8,i38400,["#2P",DEC servo0pwc,"S",DEC 300,13]
serout p8,i38400,["#3P",DEC servo0pwd,"S",DEC 200,13]
serout p8,i38400,["#4P",DEC servo0pwe,"S",DEC 100,13]
pause 10000
'posizione per il rilascio
servo0pwa = 2500
servo0pwb = 1080
servo0pwc = 1612
servo0pwd = 1754
serout p8,i38400,["#0P",DEC servo0pwa,"S",DEC 100,13]
serout p8,i38400,["#1P",DEC servo0pwb,"S",DEC 200,13]
serout p8,i38400,["#2P",DEC servo0pwc,"S",DEC 300,13]
serout p8,i38400,["#3P",DEC servo0pwd,"S",DEC 200,13]
serout p8,i38400,["#4P",DEC servo0pwe,"S",DEC 100,13]
pause 11000
servo0pwe = 1300 ' apertura pinza
serout p8,i38400,["#4P",DEC servo0pwe,"S",DEC 100,13]
endif
' da qui in giu è un controllo per i tasti premuti
ledA = nn.BIT0
ledB = nn.BIT1
ledC = nn.BIT2
if ( nn.BIT0 = 1 ) then
high p0
high p8
high p4
else
low p0
low p8
low p4
endif
if ( nn.BIT1 = 1 ) then
high p1
high p5
else
low p1
low p5
endif
if ( nn.BIT2 = 1 ) then
high p2
high p10
high p6
else
low p2
low p10
low p6
endif
if ( nn.BIT3 = 1 ) then
high p3
high p7
high p11
else
low p3
low p7
low p11
endif
pause 50
prev_butA = butA
prev_butB = butB
prev_butC = butC
gosub button_led_control
goto start
'Subroutine che legge e controlla i valori dei LED
'I pulsanti sono le variabili butA, butB e butC, gli stati dei led
'vengono letti dalle variabili ledA, ledB, ledC.
button_led_control:
'Lettura dei valori e spegnimento dei led
input p12
input p13
input p14
butA = IN12
butB = IN13
butC = IN14
'Accensione dei led
if ledA = 1 then
low p12
endif
if ledB = 1 then
low p13
endif
if ledC = 1 then
low p14
endif
return
Alcune fotografie su strada
Conclusioni
L'attività di sperimentazione robotica che ha portato alla
costruzione, sviluppo e programmazione di questo sistema
robotizzato, prodotto dalla Lynxmotion (www.lynxmotion.com)
è stata un'attività lunga, che ha dato non pochi problemi, sia dal
punto di vista della compatibilità nei sistemi di comunicazione
seriale, sia in fase di progettazione dei movimenti. Riteniamo
comunque positiva tutta l'attività che ci ha permesso di
sperimentare sul campo quanto si è appreso nelle lezioni
teoriche e al calcolatore di Robotica Industriale.
Tutte le attività sono state svolte presso i laboratori di Automatica negli edifici del Dipartimento di
Ingegneria Elettrica ed Elettronica, pertanto ci sembra doveroso ringraziare tutti coloro che per
necessità sicuramente più importanti delle nostre, si trovavano lì ed hanno sopportato il
baylamme che spesso si creava nella nostra postazione di lavoro.
La struttura di Geeno permette a chiunque sia sufficientemente volenteroso di implementare passi
successivi della programmazione robotica, quali la sensoristica, la richiusura di loop di
controllo per una migliore gestione del sistema, la ricalibrazione elettronica al fine di
stabilizzare le oscillazioni dei servomotori, il controllo in tempo reale via Controller PS2/PC e
in remoto tramite sistemi radio WIFI o FM. Le Possibilità, come spesso accade, sono illimitate.
Scarica

Università degli Studi di Cagliari Ing. Elettronica Robotica Industriale