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.