Solci Riccardo
Classe 5 TA
06/06/2012
RELAZIONE PROGRAMMAZIONE BRACCIO ROBOTICO
-Materiali:
Il braccio robotico “AL5C” della Lynxmotion e' realizzato in alluminio anodizzato, con componenti in plastica. permette il
movimento di cinque servomotori: della base, della spalla, del gomito, del polso e della pinza. Questi servomotori
lavorano su cuscinetti che diminuiscono lo sforzo del sistema, permettendo movimenti precisi.
Il braccio robotico può essere utilizzato con il software RIOS (Robotic arm Interactive Operating System) tramite il servo
controller SSC-32. Questo programma, utilizza gli ingressi digitali e analogici per progetti che prevedono un controllo ad
anello chiuso. Vengono supportati in Basic i cicli If-then, for-next e do-while;
Per la nostra prova abbiamo utilizzato Visual Basic per la realizzazione del programma; tramite il cavo seriale abbiamo
immesso il programma creato nella scheda SSC-32, la quale fornisce le istruzioni da eseguire al braccio robotico.
Grazie al motore per la cinematica inversa, il braccio raggiunge facilmente l’obiettivo prestabilito.
-Board di controllo:
La scheda SSC-32, e' un controller seriale per servomotori, con alcune eccezionali caratteristiche, Ha una elevata
risoluzione (1uS) per un posizionamento accurato e dei movimenti fluidi. Il range e' da 0.75uS a 2.25uS per una
escursione di ben 170°. Il controllo del movimento puo' essere: risposta immediata, controllata in velocita', temporizzata,
o una combinazione. Una delle principali caratteristiche e' il 'Group Move' permette di comandare un gruppo di servi in
modo
sincronizzato,
anche
se
questi
servi
devono
muoversi
per
distanze
differenti.
Ogni uscita puo' essere utilizzata anche come uscita TTL. Ci sono 4 porte di Input che possono funzionare anche in
modalita' Latched, quindi non c'e' il rischio di perdere un evento di breve durata. Ci sono 3 connettori per l'alimentazione,
un connettore DB9F per la connessione diretta alla porta del PC.
-Interfaccia seriale:
L’interfaccia seriale EIA RS-232 asincrona è utilizzata per lo scambio di dati tra dispositivi digitali a bassa velocità.
Collegando due apparecchiature elettroniche con porta RS-232 è possibile realizzare delle comunicazioni tra di loro.
Il termine seriale significa che i bit che costituiscono l’informazione sono trasmessi uno alla volta su di un solo filo. Al
contrario della trasmissione in parallelo, dove i dati sono trasmessi nello stesso istante su più fili.
La velocità della trasmissione dei dati dipende dalle tecnologie adottate: per esempio in una fibra ottica, in un
cavo ethernet o USB i dati viaggiano a velocità elevate. Asincrono significa che i dati sono trasmessi un byte alla volta
anche non consecutivamente e senza un segnale per la sincronizzazione della trasmissione con la ricezione. Per
interpretare i dati, sia il trasmettitore sia il ricevitore devono avere un segnale di clock sincronizzato alla prima transizione
della linea dati.
-Obiettivi della prova:
1) Lo scopo principale della prima parte della prova è quello di far raggiungere al braccio robotico un punto stabilito,
indicando, mediante il programma scritto in Basic, le coordinate X, Y del punto stesso, senza però, modificare la
posizione della pinza.
Per fare ciò è necessario essere a conoscenza di due teoremi:
-Il teorema di Pitagora:
-In ogni triangolo rettangolo, l'area del quadrato costruito sull'ipotenusa è equivalente alla somma delle aree dei quadrati
costruiti sui cateti.
-Il teorema di Carnot:
-In un triangolo qualunque, il quadrato della misura di un lato è uguale alla somma dei quadrati degli altri due diminuita
del doppio prodotto di questi due per il coseno dell'angolo opposto al primo lato.
Questi teoremi vengono applicati nel seguente modo:
Il teorema di pitagora serve per calcolare la distanza dell’oggetto dal centro della struttura, cioè dal punto 0.
Il teorema di Carnot permette di trovare gli angoli tra i lati che formano la struttura, conoscendo le misure dei lati stessi.
L’angolo alfa è l’angolo presente tra L1 e il piano; l’angolo beta è l’angolo tra L1 e L2; l’angolo gamma è l’angolo tra L3 e
il piano che, però, non viene calcolato perché inutile per raggiungere il punto indicato.
Bisogna, inoltre, calcolare l’angolo che si formerà rispetto l’asse Y, quando il braccio raggiungerà le coordinate indicate.
Questo angolo indica la rotazione che deve effettuare la base per raggiungere il punto stabilito.
2) Lo scopo della seconda parte della prova, invece, è quello di far sì che, modificando il programma scritto seguendo gli
obiettivi della prima parte, il braccio si disponga in modo tale da lasciare lo spazio dal piano di appoggio affinché la pinza
abbia la possibilità di muoversi liberamente per afferrare un eventuale oggetto.
3) Nell’ultima parte della prova si giunge al reale scopo dell’intera esercitazione: cioè l’acquisizione e il riposizionamento
di uno o più oggetti. Questo obiettivo consiste nell’utilizzare una webcam che acquisisce l’immagine del piano d’appoggio
e degli oggetti da riposizionare, dopodiché l’immagine ricavata viene immessa nel Form attraverso l’utilizzo di una
PictureBox; a questo punto il programma, seguendo le istruzioni che gli abbiamo dato, esegue un controllo di ogni pixel
dell’immagine, riuscendo a riconoscere il colore degli oggetti da afferrare e quindi a riposizionarli nell’apposita locazione.
-Schema del braccio:
-Tramite il Teorema di Pitagora si possono calcolare i valori di d e d1;
-i valori di Gamma1, beta e alfa sono ricavati applicando il teorema di Carnot (Vedi sopra);
-il valore di Gamma2 si ottiene utilizzando le formule trigonometriche.
-Cinematica inversa:
Tramite la cinematica inversa si può raggiungere un punto stabilito, solo in base al posizionamento delle estremità. È
molto importante in robotica, dove le braccia meccaniche vengono controllate tramite angoli delle articolazioni, senza
guidare manualmente ogni articolazione del robot.
Un braccio robotico è formato da una serie di segmenti rigidi connessi tra loro per mezzo di articolazioni. Al variare degli
angoli delle articolazioni si ottengono diverse configurazioni. Il problema principale sta nel trovare gli angoli giusti per
ottenere l'impostazione che si desidera dare al robot.
.
-Struttura sistema:
Il braccio è formato da cinque servomotori che servono per muovere le sue cinque parti mobili, che sono:

Base

Spalla

Gomito

Polso

Pinza
I servomotori sono dispositivi che si muovono grazie ad un segnale PWM (Pulse Width Modulation), cioè ruotano di n
gradi in base alla lunghezza dell’impulso, espresso in mS. La taratura effettuata durante la prima parte della prova è
servita, appunto, per conoscere la lunghezza dell’impulso in base al quale il servomotore si posiziona ad una certa
angolazione.
I collegamenti tra le varie parti mobili ( chiamati link), sono lunghi 15 cm. Di fronte al braccio è posto, ad una distanza di
9 cm dal centro della base, un foglio sul quale vi è disegnata una scacchiera, utile a verificare se le coordinate che ha
raggiunto il braccio durante l’esecuzione del programma, sono uguali a quelle immesse nel Form.
Il Form del programma creato è composto da tre pulsanti e cinque Textbox:

Per la prima parte di programma vengono utilizzati due pulsanti, uno per eseguire il movimento, e l’altro per far
tornare il braccio alla posizione di riposo, e tre Textbox, uno in cui verrà indicato il motore da muovere, uno per
indicare il numero di impulsi che occorrono per muovere il motore e l’ultimo per indicare il tempo di esecuzione
del programma.

Per la seconda parte del programma viene, invece utilizzato un solo pulsante, per eseguire il movimento e due
Textbox, uno per indicare la coordinata X e l’altro per indicare la coordinata Y.
Infine, per immettere il programma nella Board del braccio robotico, viene utilizzato un cavo seriale che collega il
computer al braccio e nel Form viene impostata la velocità della Porta a 115200.
-Braccio robotico AL5C
-Descrizione del programma:
Public Class Form1
Dim angolo01, angolo02, impulso01,
Dim angolo11, angolo12, impulso11,
Dim angolo21, angolo22, impulso21,
Dim angolo31, angolo32, impulso31,
Dim M0 As Integer
Dim AB, BC, AC As Integer
Dim impulso As Integer
Dim Fi As Single
Dim angolo As Integer
impulso02
impulso12
impulso22
impulso32
As
As
As
As
Integer
Integer
Integer ‘Dichiarazione dei valori usati
Integer
Private Sub Btnmuovi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Btnmuovi.Click
Dim comando As String
angolo01 = -90
angolo02 = 90
impulso01 = 2465
impulso02 = 670
angolo11 = 0
angolo12 = 90
impulso11 = 640
impulso12 = 1480
‘Valori della taratura, cioè il numero di impulsi necessari
affinchè il motore selezionato si sposti, per esempio, di 90
gradi
angolo21 = 90
angolo22 = 180
impulso21 = 1540
impulso22 = 600
angolo31 = -90
angolo32 = 90
impulso31 = 2410
impulso32 = 643
angolo = Convert.ToInt32(txtangolo.Text)
If txtmotore.Text = "0" Then
M0 = (impulso02 - impulso01) / (angolo02 - angolo01)
impulso = impulso01 + M0 * (angolo - angolo01)
End If
If txtmotore.Text = "1" Then
M0 = (impulso12 - impulso11) / (angolo12 - angolo11)
impulso = impulso11 + M0 * (angolo - angolo11)
End If
‘In base al motore selezionato e
numero di impulsi immesso, il
braccio si sposta in base alle
tarature.
If txtmotore.Text = "2" Then
M0 = (impulso22 - impulso21) / (angolo22 - angolo21)
impulso = impulso21 + M0 * (angolo - angolo21)
End If
If txtmotore.Text = "3" Then
M0 = (impulso32 - impulso31) / (angolo32 - angolo31)
impulso = impulso31 + M0 * (angolo - angolo31)
End If
Porta.Open() ‘Apre la porta per la scrittura del programma
comando = "#" & txtmotore.Text & "P" & Convert.ToString(impulso) & " T1000" & vbCr
‘Comando da eseguire
Porta.Write(comando) ‘Scrittura del programma sulla porta
Porta.Close()
‘Chiusura dela porta
End Sub
Private Sub btnriposo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnriposo.Click
Dim comando As String
Porta.Open()
comando = "#0 P1560 T1000" & vbCr
Porta.Write(comando)
comando = "#1 P1500 T1000" & vbCr
Porta.Write(comando)
comando = "#2 P2000 T1000" & vbCr
Porta.Write(comando)
comando = "#3 P2100 T1000" & vbCr
Porta.Write(comando)
comando = "#4 P2600 T1000" & vbCr
Porta.Write(comando)
Porta.Close()
End Sub
‘Istruzioni che portano il braccio alla posizione
di riposo
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
angolo01 = -90
angolo02 = 90
impulso01 = 2465
impulso02 = 670
angolo11 = 0
angolo12 = 90
impulso11 = 640
impulso12 = 1480
angolo21 = 90
angolo22 = 180
impulso21 = 1540
impulso22 = 600
angolo31 = -90
angolo32 = 90
impulso31 = 2410
impulso32 = 643
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button3.Click
Dim comando As String
Dim cosa, cosb As Single
Dim alfa, beta As Single
Dim x, y As Single
Dim disfoglio As Single
Dim alfadeg, betadeg, fideg As Single
AB = 15
BC = 15
disfoglio = 9
‘Lunghezza dei bracci AB e BC, e distanza del foglio dalla base
y = Convert.ToSingle(txty.Text)
x = Convert.ToSingle(txtx.Text)
AC = Math.Sqrt((y + disfoglio) ^ 2 + x ^ 2)
cosa = ((BC) ^ 2 - (AC) ^ 2 - (AB) ^ 2) / (-2 * (AB) * (AC))
cosb = ((AC) ^ 2 - (BC) ^ 2 - (AB) ^ 2) / (-2 * (AB) * (BC))
‘Applicazione del teorema
di Carnot
Fi = Math.Tan(x / (y + disfoglio))
Fi = Math.Atan(Fi)
alfa = Math.Acos(cosa)
beta = Math.Acos(cosb)
alfadeg = 360 * alfa / 6.28
betadeg = 360 * beta / 6.28
fideg = 360 * Fi / 6.28
Porta.Open()
'angolo della spalla
'angolo del gomito
‘Conversione degli angoli in gradi
‘Apertura della porta per la scrittura del programma
M0 = (impulso02 - impulso01) / (angolo02 - angolo01) ‘Istruzioni per il movimento della
impulso = impulso01 + M0 * (fideg - angolo01)
base
comando = "#" & "0" & "P" & Convert.ToString(impulso) & " T1000" & vbCr
Porta.Write(comando) ‘scrittura sulla porta del programma da eseguire
M0 = (impulso12 - impulso11) / (angolo12 - angolo11) ‘Istruzioni per il movimento della
impulso = impulso11 + M0 * (alfadeg - angolo11)
spalla
comando = "#" & "1" & "P" & Convert.ToString(impulso) & " T1000" & vbCr
Porta.Write(comando)
M0 = (impulso22 - impulso21) / (angolo22 - angolo21) ‘Istruzioni per il movimento del
impulso = impulso21 + M0 * (betadeg - angolo21)
gomito
comando = "#" & "2" & "P" & Convert.ToString(impulso) & " T1000" & vbCr
Porta.Write(comando)
Porta.Close() ‘Chiusura della porta
End Sub
‘Termine delle istruzioni del programma scritto
‘Tramite la precedente serie di istruzioni si riesce a posizionare il braccio in modo che
corrisponda alle coordinate x e y immesse nei TextBox del Form
‘In seguito vengono dichiarate le variabili per l’acquisizione delle immagini
Const
Const
Const
Const
WM_CAP As Short = &H400S
WM_CAP_DRIVER_CONNECT As Integer = WM_CAP + 10
WM_CAP_DRIVER_DISCONNECT As Integer = WM_CAP + 11
WM_CAP_EDIT_COPY As Integer = WM_CAP + 30
Const
Const
Const
Const
Const
Const
Const
Const
Const
WM_CAP_SET_PREVIEW As Integer = WM_CAP + 50
WM_CAP_SET_PREVIEWRATE As Integer = WM_CAP + 52
WM_CAP_SET_SCALE As Integer = WM_CAP + 53
WS_CHILD As Integer = &H40000000
WS_VISIBLE As Integer = &H10000000
SWP_NOMOVE As Short = &H2S
SWP_NOSIZE As Short = 1
SWP_NOZORDER As Short = &H4S
HWND_BOTTOM As Short = 1
Dim iDevice As Integer = 0
Dim hHwnd As Integer
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer,
ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Object) As Integer
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As
Integer, ByVal hWndInsertAfter As Integer, ByVal x As Integer, ByVal y As Integer, ByVal
cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer) As Integer
Declare Function DestroyWindow Lib "user32" (ByVal hndw As Integer) As Boolean
Declare Function capCreateCaptureWindowA Lib "avicap32.dll" (ByVal lpszWindowName As
String, ByVal dwStyle As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As
Integer, ByVal nHeight As Short, ByVal hWndParent As Integer, ByVal nID As Integer) As
Integer
Declare Function capGetDriverDescriptionA Lib "avicap32.dll" (ByVal wDriver As Short,
ByVal lpszName As String, ByVal cbName As Integer, ByVal lpszVer As String, ByVal cbVer
As Integer) As Boolean
Private Sub LoadDeviceList()
Dim strName As String = Space(100)
Dim strVer As String = Space(100)
Dim bReturn As Boolean
Dim x As Integer = 0
Do
bReturn = capGetDriverDescriptionA(x, strName, 100, strVer, 100)
If bReturn Then lstDevices.Items.Add(strName.Trim)
x += 1
Loop Until bReturn = False
End Sub
‘Tramite le seguenti istruzioni si effettua l’acquisizione dell’immagine
Private Sub OpenPreviewWindow()
Dim iHeight As Integer = PicCapture.Height
Dim iWidth As Integer = PicCapture.Width
hHwnd = capCreateCaptureWindowA(iDevice, WS_VISIBLE Or WS_CHILD, 0, 0, 640, 480,
PicCapture.Handle.ToInt32, 0)
If SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, iDevice, 0) Then
SendMessage(hHwnd, WM_CAP_SET_SCALE, False, 0)
SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 66, 0)
SendMessage(hHwnd, WM_CAP_SET_PREVIEW, True, 0)
SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, PicCapture.Width, PicCapture.Height,
SWP_NOMOVE Or SWP_NOZORDER)
Else
DestroyWindow(hHwnd)
End If
Private Sub PicCopia_MouseMove(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles PicCopia.MouseMove
On Error GoTo errore
Dim nomevar As New Bitmap(PicCopia.Image)
Dim colore As Color
Dim rosso As Integer
Dim verde As Integer
Dim blu As Integer
colore = (nomevar.GetPixel(e.X, e.Y))
rosso = colore.R
verde = colore.G
blu = colore.B
LblR.Text = rosso
LblG.Text = verde
LblB.Text = blu
‘L’immagine viene acquisita e posizionata
in due PictureBox, una rappresenta l’immagine
in tempo reale, mentre l’altra proietta
l’immagine aggiornata ogni secondo.
Dall’immagine nelle PictureBox,
il programma controlla il
colore di ogni pixel.
lblMouseX.Text = e.X
lblMouseY.Text = e.Y
Exit Sub
Resume uscita
End Sub
Private Sub btnDisegna1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs)
Dim PennaRossa As New Pen(Color.Red, 1)
Dim g As Graphics
g = PicCopia.CreateGraphics
g.FillRectangle(Brushes.Blue, 10, 10, 100, 100)
End Sub
End Class
‘Indica il termine di tutte le istruzioni, quindi del programma.
-Conclusioni:
Grazie a questa prova siamo riusciti a capire meglio il funzionamento del braccio robotico e cosa si può ottenere da esso
con la giusta programmazione. Inoltre abbiamo raggiunto le basi per realizzare in futuro programmi più complessi e
raggiungere obiettivi più importanti.
Durante la realizzazione dell’esperienza ci sono state alcune difficoltà, superate, comunque, senza grandi problemi.