Figliola Elio relazione robotica 2011-12

RELAZIONE DI ROBOTICA SUL BRACCIO MECCANICO
Figliola Elio
classe 5 TA
13/12/2011
La seguente relazione illustra il funzionamento e i teoremi applicati nell’ utilizzo del braccio
robotico nelle lezioni di robotica negli anni scolastici 2010/2011 e 2011/2012.
MATERIALI:
1- BRACCIO ROBOTICO “AL5C-KT”: Il braccio robotica consente di effettuare i seguenti
movimenti: rotazione della base, del dorso, del gomito e del polso. Il Braccio Robotico e' realizzato
in Alluminio anodizzato, ci sono inoltre componenti in plastica, realizzati appositamente. La
struttura del braccio si muove su cuscinetti, per un movimento privo di frizione che minimizza lo
sforzo e aumenta l'affidabilità del sistema. Il linguaggio di programmazione da noi utilizzato per
controllare il braccio è Visual Basic 2008.
2-SERVOMOTORI: Il servomotore è un particolare tipo di motore (può essere elettrico,
pneumatico, idraulico) generalmente di piccola potenza; deve acquisire con la massima rapidità e
precisione la posizione comandata. I servomotori trovano applicazione nei controlli di posizione,
sistemi automatici di regolazione e nelle periferiche di sistema, come stampanti e plotter.
Il braccio robotico è composto da 5 servomotori.
HS-475HB: servomotore applicato alla base del braccio.
HS-755HB: servomotore applicato al primo link collegato alla base
HS-645MG: servomotore applicato tra gomito e polso del braccio robotica
HS-475HB: servomotore applicato al polso del braccio robotica
HS-422: servomotore dell end-effector
3- INTERFACCIA, “SSC32": E' un piccolo controller seriale per servomotori, preassemblato, con
alcune eccezionali caratteristiche, Ha una elevata risoluzione (1μS) per un posizionamento accurato
e dei movimenti fluidi. Il range e' da 0.75μS a 2.25μS per una escursione di 170°. Il controllo del
movimento può essere di vari tipi: risposta immediata, controllata in velocità, temporizzata, o una
combinazione. Ogni uscita puo' essere utilizzata anche come uscita TTL. Il controller dispone di 4
porte di Input che possono funzionare anche in modalità Latched, sono presenti inoltre 3 connettori
per l'alimentazione, un connettore per la connessione diretta alla porta del PC e uno zoccolo per una
EEPROM 24LC32P.
4- LINK: Vengono definiti link di un robot i collegamenti fra due attuatori o sevomotori che
formano il “corpo” del robot. Nel nostro caso come in un braccio umano ci sono tre link che
rappresentano braccio, avambraccio e polso. Il polso cioè l'ultimo link è chiamato end-effector ed è
utilizzato dal robot per interagire con l'ambiente esterno.
5- CAVO SERIALE: La trasmissione seriale è una modalità di comunicazione nella quale le
informazioni sono comunicate una di seguito all'altra e giungono in sequenza al ricevente nello
stesso ordine in cui le ha trasmesse il mittente.La serie di bit inviati è preceduta da un bit che
segnala l'inizio della trasmissione ed è seguita da un bit che segnala la fine della trasmissione.
6- FILI DI COLLEGAMENTO: I fili giallo, rosso e nero servono per comandare i servomotori ed
è tramite questi che i vari servomotori sono collegati alla board. Il filo GIALLO serve a mandare i
comandi (gli impulsi) al servomotore, il filo ROSSO è l'alimentazione positiva rispetto al NERO
che è la massa.
CINEMATICA INVERSA
La prova è finalizzata all'apprendimento della cinematica inversa che consiste nel riuscire a far
raggiungere la posizione corretta al braccio robotico conoscendo solo la posizione dell'oggetto da
recuperare, per riuscire in questo dobbiamo utilizzare le formule del teorema di carnot.
TEOREMA APPLICATO
teorema del coseno correla la lunghezza dei lati di un triangolo al coseno di uno dei suoi angoli. Può
essere considerato una generalizzazione del teorema di Pitagora al caso di triangoli scaleni. Questo
teorema è noto anche come teorema di Carnot, dal nome del matematico francese Lazare Carnot.
Essendo interessati a trovare la lunghezza di un lato di un qualsiasi triangolo, essendo note le
lunghezze degli altri due lati e l'ampiezza dell'angolo tra essi compreso. Si ha:
Con riferimento alla figura, applicando il teorema di Pitagora al triangolo rettangolo AHB, si ha:
Risolvendo il triangolo rettangolo AHC abbiamo anche:
Vale inoltre
Sostituendo nella prima uguaglianza si ottiene:
.
Per la relazione fondamentale sin²γ+cos²γ=1, questa equazione può essere semplificata in:
Nel caso di un triangolo rettangolo, ovvero con γ=90°, il quarto termine è nullo e ritroviamo il
teorema di Pitagora, mentre se il triangolo è ottusangolo la dimostrazione procede allo stesso modo,
con la principale differenza che in questo caso:
PROGRAMMA
Elementi presenti nel form:
-1 textbox per indicare il motore da muovere.
-1 textbox per indicare la posizione (in gradi).
-1 textbox per impostare la velocità impiegata dal braccio per muovere il motore.
-1 textbox per impostare le coordinate x alle quali si trova l'oggetto da afferrare.
-1 textbox per impostare le coordinate y alle quali si trova l'oggetto da afferrare.
-1 bottone (“btnVIA”) che sposta un solo motore nella posizione selezionata ad una determinata
velocità.
-1 bottone (“btnPRENDI”) che sposta il braccetto alle coordinate x,y
-1 menù a tendina dove è presente l'istruzione per riportare il braccio nella posizione di riposo.
Public Class Form1
Dim imp(4, 2), ang(4, 2), motore As Integer
Dim m(4), ImpFinale, AngFinale As Integer
Dim comando As String
Private Sub BtnVia_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnVia.Click
Dim comando As String
motore = Convert.ToInt32(TxtMotore.Text)
'SETTAGGIO
' Angoli
ang(0, 1) = -90
ang(0, 2) = 90
ang(1, 1) = 90
ang(1, 2) = 0
ang(2, 1) = 90
ang(2, 2) = 180
ang(3, 1) = 90
ang(3, 2) = 0
ang(4, 1) = 0
ang(4, 2) = 180
' Impulsi
imp(0, 1) = 620
imp(0, 2) = 2450
imp(1, 1) = 1495
imp(1, 2) = 750
imp(2, 1) = 1440
imp(2, 2) = 665
imp(3, 1) = 860
imp(3, 2) = 1750
imp(4, 1) = 500
imp(4, 2) = 2500
'COMANDO CON ANGOLO
m(motore) = (imp(motore, 2) - imp(motore, 1)) / (ang(motore, 2) - ang(motore, 1))
'ANGOLO
AngFinale = Convert.ToInt32(TxtPosizione.Text)
'IMPULSO
ImpFinale = imp(motore, 1) + m(motore) * (AngFinale - ang(motore, 1))
'COMANDO
Porta1.Open()
comando = "#" & TxtMotore.Text & " P" & ImpFinale & " T" & TxtVelocità.Text & vbCr
Porta1.Write(comando)
Porta1.Close()
End Sub
Private Sub PosizioneDiRiposoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles PosizioneDiRiposoToolStripMenuItem.Click
Porta1.Open()
comando = "#0 P1500 T1000" & vbCr
Porta1.Write(comando)
Porta1.Close()
Porta1.Open()
comando = "#1 P1700 T1000" & vbCr
Porta1.Write(comando)
Porta1.Close()
Porta1.Open()
comando = "#2 P2500 T1000" & vbCr
Porta1.Write(comando)
Porta1.Close()
Porta1.Open()
comando = "#3 P2250 T1000" & vbCr
Porta1.Write(comando)
Porta1.Close()
Porta1.Open()
comando = "#4 P1800 T1000" & vbCr
Porta1.Write(comando)
Porta1.Close()
End Sub
Private Sub BtnPrendi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BtnPrendi.Click
Const d As Single = 9.6
Const AB As Double = 15.5
Const AC As Double = 15.5
Const DF As Double = 6.9 'distanza dal foglio
Const CD As Double = 1 'DELTA pinza
'Var Carnot
Dim BC, BD, beta, alfa, gamma, cosB, cosA, cosG As Double
Dim beta1, gamma1, beta1_deg, gamma1_deg As Double
Dim Beta_tot, Gamma_tot As Double
Dim tg, inv_tg, y, x As Single
'Var Deg
Dim beta_deg, alfa_deg, gamma_deg, tg_deg As Single
y = Convert.ToSingle(Txt_Y.Text)
x = Convert.ToSingle(Txt_X.Text)
'd = distanza tra la base e il centro degli assi
If y <= 21 And x < 29 And x > -29 Then
'BD
BD = Math.Sqrt((DF + y) ^ 2 + x ^ 2)
'BC
BC = Math.Sqrt(CD ^ 2 + BD ^ 2)
'TANGENTE (delta)
tg = x / (y + d)
inv_tg = Math.Atan(tg)
tg_deg = (180 * inv_tg) / 3.14
'BETA
cosB = (BC ^ 2 + AB ^ 2 - AC ^ 2) / (2
beta = Math.Acos(cosB)
beta_deg = (180 * beta) / 3.14
'ALFA
cosA = (AC ^ 2 + AB ^ 2 - BC ^ 2) / (2
alfa = Math.Acos(cosA)
alfa_deg = (180 * alfa) / 3.14
'GAMMA
cosG = (AC ^ 2 + BC ^ 2 - AB ^ 2) / (2
gamma = Math.Acos(cosG)
gamma_deg = (180 * gamma) / 3.14
'BETA1
beta1 = Math.Atan(CD / BD)
beta1_deg = (180 * beta1) / 3.14
'GAMMA1
gamma1 = Math.Atan(BD / CD)
gamma1_deg = (180 * gamma1) / 3.14
'blocca l'overflow
* AB * BC)
* AB * AC)
* BC * AC)
'BETA TOT
Beta_tot = beta_deg + beta1_deg
'GAMMA TOT
Gamma_tot = gamma_deg + gamma1_deg
TxtAlfaBeta.Text = "ALFA " & CInt(alfa_deg) & "° ; BETA " & CInt(beta_deg) & "°"
settaggio()
'MUOVO LA BASE
Porta1.Open()
'traduzione in impulsi
m(0) = (imp(0, 2) - imp(0, 1)) / (ang(0, 2) - ang(0, 1))
ImpFinale = imp(0, 1) + m(0) * (tg_deg - ang(0, 1))
'invio comando
omando = "#0 " & "P" & ImpFinale & " T1000" & vbCr
Porta1.Write(comando)
'MUOVO IL GOMITO
'traduzione in impulsi
m(2) = (imp(2, 2) - imp(2, 1)) / (ang(2, 2) - ang(2, 1))
ImpFinale = imp(2, 1) + m(2) * (alfa_deg - ang(2, 1))
'invio comando
comando = "#2 " & "P" & ImpFinale & " T1000" & vbCr
Porta1.Write(comando)
'MUOVO LA SPALLA
'traduzione in impulsi
m(1) = (imp(1, 2) - imp(1, 1)) / (ang(1, 2) - ang(1, 1))
ImpFinale = imp(1, 1) + m(1) * (Beta_tot - ang(1, 1))
'invio comando
comando = "#1 " & "P" & ImpFinale & " T1000" & vbCr
Porta1.Write(comando)
'MUOVO IL POLSO
'traduzione in impulsi
m(3) = (imp(3, 2) - imp(3, 1)) / (ang(3, 2) - ang(3, 1))
ImpFinale = imp(3, 1) + m(3) * ((Gamma_tot + 170) - ang(3, 1))
'invio comando
comando = "#3 " & "P" & ImpFinale & " T1000" & vbCr
Porta1.Write(comando)
Porta1.Close()
End If End Sub
End Class
Il programma è diviso in tre parti: nella prima facciamo si che ,tramite un bottone che legge le
nostre indicazioni dalle textbox, il braccio muova un solo motore a un angolo ben preciso e in un
tempo determinato, nella seconda semplicemente diamo dei comandi a ogni singolo motore affinché
il braccio si sistemi nella posizione di riposo ed infine nella terza facciamo si che il braccio robotico
si sposti nella posizione desiderata, muovendo i motori 0-1-2-3, solo tramite le coordinate x e y.
1) Nel codice presente nell'evento “Click” del bottone “BtnVia” per prima cosa settiamo gli angoli
salvando in due array (“imp” e “ang”) i valori dell'angolo e il corrispondente valore di durata
dell'impulso (in microsecondi), successivamente, con le formule appropriate, abbiamo tradotto
l'angolo, da noi inserito nella textbox, da gradi a durata dell'impulso. Una volta calcolata la durata
dell'impulso la inviamo, tramite cavo seriale, alla board del braccio robotico.
Per inviare il comando è necessario, per prima cosa, aprire la porta seriale con il comando
PORTA1.OPEN, scrivere il comando composto da: # N° motore P durata dell'impulso in μs T tempo
in ms in una variabile chiamata “comando” ed inviarla alla board con il comando
PORTA1.WRITE(comando), infine è necessario chiudere la porta PORTA1.CLOSE .
2) Il codice della voce “Posizione Di Riposo” serve a portare tutti i link del braccio in una posizione
preimpostata, chiamata posizione di riposo; questo è realizzato “aprendo” la porta ogni volta e
impostando ogni motore alla posizione desiderata.
3) Il codice dell'evento “Click” del bottone “BtnPrendi” è impostato in modo da calcolare le
incognite con le formule del teorema di Carnot.
Per prima cosa definiamo delle costanti che sono la lunghezza dei link (che rappresentano i lati del
triangolo) e la distanza del centro della base del “motore 0” dal punto di origine delle coordinate x e
y. Successivamente mediante la formula del coseno calcoliamo le posizioni angolari di ogni motore,
trasformandole in gradi e per finire otteniamo la durata dell'impulso necessaria a posizionare il
motore all'angolo desiderato. Aggiungiamo, ai calcoli effettuati, gli angoli BetaTot e GammaTot che
rappresentano la somma degli angoli Beta e Beta2, e Gamma e Gamma2. Questi angoli permettono
al braccio robotico di posizionarsi in modo da tenere il polso (pinza) verso il basso, nella posizione
corretta per afferrare un oggetto posto sul piano. Con le stesse istruzioni utilizzate al punto1
inviamo al controller i dati di ogni singolo motore.
CONCLUSIONE
L’ obiettivo finale e quello di effettuare il movimento da noi desiderato del braccio robotico a
seconda delle coordinate da noi assegnate mantenendo sempre la stessa distanza tra polso e piano.
L’ obiettivo proposto entro la fine dell’ anno consiste nel movimento da parte del braccio robotico
tramite la sua visione artificiale con l’ utilizzo di una webcam posta di fronte ad esso.