Tải bản đầy đủ (.docx) (40 trang)

Thiết kế chế tạo robot scara song song(giao diện Python và sử dụng mạch arduino mega 2560+shield ramps 1.4)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.66 MB, 40 trang )

TRƯỜNG ĐẠI HỌC NHA TRANG
KHOA CƠ KHÍ


BÁO CÁO
ĐỒ ÁN KĨ THUẬT ROBOT
Nhóm 6:
Thành viên: Trần Chí Hiếu
Trần Lê Đức Thịnh
Nguyễn Đức Hùng

Nha Trang, Ngày……Tháng……Năm……

1


Mục lục
Mục lục..........................................................................................................................2
Chương I: Giới thiệu về Robot Scara............................................................................3
Chương II: Thiết kế, chế tạo Robot...............................................................................4
1. Cơ sở khoa học....................................................................................................4
2. Bản thiết kê (solid work)....................................................................................7
3. Liệt kê kinh kiện (cơ khí, điện tử, chi tiết in)...................................................9
4. Các bước chế tạo lắp ráp.................................................................................11
Chương III: Chương trình điều khiển và ứng dụng.....................................................12
1. Chương trình điều khiển bằng python...........................................................12
2. Phần đệm nạp cho mạch điều khiển...............................................................27
3. Hiệu chỉnh máy.................................................................................................34
4. Ứng dụng...........................................................................................................34
Chương IV: KẾT LUẬN..............................................................................................35


2


Chương I: Giới thiệu về Robot Scara
Lịch sử phát triển
Robot đã xuất hiện từ khá lâu. Năm 1921, nhà viết kịch Karelkapek đã viết 1 vở
kịch mô tả và cuộc nỗi loạn của những cỗ máy phục dịch (Rossums Universal Robot).
Từ Robot ở đây có nghĩa là những máy móc biết làm việc như con người. Có lẽ đó
cũng là 1 gợi ý cho những nha sáng chế kĩ thuật thực hiện các ước mơ về những cỗ
máy bắt chước được các thao tác lao động cơ bắp của con người. Những thời gian sau
đó nhiều Robot được ra đời, điển hình 1961người máy công nghiệp (IR – industrial
Robot)
Năm 1979, Robot Scara ra đời. Đây là 1 kiểu tay máy có cấu tạo đặc biệt được sử
dụng nhiều trong các công việc lắp ráp các tải trọng nhỏ theo phương thẳng đứng.
Robot Scara gồm 2 khớp nối và 2 cánh tay. Trên 2 khớp nối được gắn 2 động cơ để
cung cấ moment ζ 1, ζ 2 để điều khiển 2 cách tay l1 l2 như hình dưới

Hình 1: Mô hình động học của Robot Scara
Phương trình động học của Robot Scara như sau:
Trong đó q1, q2 là góc quay của động
cơ DC Θ1 Θ2 là góc quay của 2 khớp
xoay của Robot.

M(q)q + (q, q)q = ζ
Tín hiệu vào

: Moment ζ 1, ζ 2 của2 động cơ DC (hoặc điện áp).

Tín hiểu ra: Góc Θ1 Θ2 của 2 cánh tay Robot Scara.


3


Chương II: Thiết kế, chế tạo Robot.
1. Cơ sở khoa học.
Có 5 kiểu thiết kế Robot Scara như sau:

Thiết kế quy trình cho robot song song bao gồm việc xác định các thông số liên
kết và các quyền hạn thiết bị truyền động để đạt được hiệu suất mong muốn. Cụ thể,
có bốn tiêu chí thiết kế như sau:
4


Tiêu chí thiết kế 1: Tránh nhiễu giữa hai liên kết hoạt động.
Với lc < 2la, muốn robot xoay hoàn toàn mà không va chạm, 2 cánh tay la của robot
cần chênh lệch nhau về độ cao để có thể luồn qua nha.
Tiêu chí thiết kế 2: Loại bỏ điểm kỳ dị loại II và loại III
Kiểu số I luôn tồn tại và xuất hiện trong các ranh giới không gian làm việc. Tuy
nhiên, các kiểu số II và loại III có thể được loại bỏ với các giá trị thích hợp của độ dài
liên kết.
Tiêu chí thiết kế 3: Không gian làm việc bao quanh một hình chữ nhật
Không gian làm việc điển hình bao gồm hình chữ nhật mong muốn trong đó bốn đỉnh
nằm trên bốn đoạn của ranh giới không gian làm việc. Để thực hiện điều này, các điều
kiện sau phải được thỏa mãn:

Tiêu chí thiết kế 4: Chịu được tải trọng, tăng tốc lên 2 m / s trong 1 giây
Các liên kết phải đủ cứng để duy trì tải trọng.
Từ các tham số liên kết và hiệu suất mong muốn của hiệu ứng kết thúc, ta chọn
thời điểm cần thiết và tính toán công suất của động cơ.
*Vùng làm việc của Robot Scara:

Vùng làm việc được định nghĩa là vùng mà hiệu ứng cuối của robot có thể đạt
được. Robot song song này được phân tách thành hai cơ chế nối tiếp. Với chiều dài
của la, lb được đưa ra, mỗi chuỗi nối tiếp tạo ra một khu vực làm việc có hình dạng
như sau:

5


Hinh: Không gian làm việc được tạo ra
bởi 1 chuỗi nối tiếp

Hình: Không gian làm việc của
RobotScara

Robot Scara nhóm 6 bọn em làm kích thước là:
La: 155mm
Lb: 185mm
Lc: 180mm
Bộ kích thước trên phù hợp với công thức điều kiện:

Với điều kiện thiết kế trên thì cách tay Robot nhóm 6 sẽ có vùng hoạt động như
sau:

Tầm hoạt động của Robot Scara
Vùng hoạt động của Robot sẽ nằm trong khu vực (R – r), với:
6


R=la + lb = 155 + 185 = 340 (mm)
r = lb – la = 185 -155 = 30 (mm)

2. Bản thiết kê (solid work).

Hình 1: Bản thiết kế Robot Scara trên solid work

Hình 3: Đế trục truyền động

Hình 2: Đế động cơ
7


H
ình 4: Lb

Hình 5: La

Hình 6: Puly
3. Liệt kê kinh kiện (cơ khí, điện tử, chi tiết in).
8


Cơ khí:
Đế động cơ

Ván gỗ đế Robot

Bu lông M8: Ø8, L (số lượng: 3)

Ốc vít

Bu lông M8:Ø8, (số lượng: 2)


Lông đền

Đai ốc: Ø8

Dây đai (dây cu roa)

Ổ bi 608zz (số lượng: 8)
Chi tiết in:
Cánh tay la (số lượng: 2)
Cánh tay lb (số lượng: 2)
Đế trục truyền động (số lượng: 2)
Puly 60 răng (số lượng: 2)
Điện tử:
Arduino Mega 2560:

9


Động cơ bước Nema17:

Ramp 1.4:


Driver A4988:

4. Các bước chế tạo lắp ráp
Thiêt chi tiết các chi tiết tạo mô hình trên solid work.
Thiết kế các chi tiết và in sản phẩm.
Mua ốc, bulong, ổ bi, ván làm đế Robot.

Ráp động cơ vào đế động cơ.
Khoang và ráp động cơ vào đế Robot.
Ráp ổ bi vào trục quay.
Ráp trục quay vào đế Robot.
Ráp La, Lb theo như bản vẽ.
Hoàn thành phần cơ khí mô hình Robot Scara


Chương III: Chương trình điều khiển và ứng dụng.
1. Chương trình điều khiển bằng python.
Thiết kế giao diện:
Bước 1:khai báo các thư viện
import serial
import serial.tools.list_ports
import math
from tkinter import*
import time
from tkinter import ttk, Tk, Menu, Frame
import tkinter.messagebox as mbox
Bước 2: viết chương trình chính
if __name__=="__main__":
wd= Tk()
wd.wm_title("SCARA ROBOT CONTROL")
wd.geometry("750x550")
wd.config(bg ='gray')


t=Robotcontrol(wd)
t.pack()
wd.mainloop()

Bước 3: Viết giao diện của các khung chức năng:
1.kết nối:
class Robotcontrol(Frame):
def __init__(self,parent=None):
Frame.__init__(self,parent)
self.parent = parent
self.pack(expand=YES,fill=BOTH)
self.config(relief=RIDGE,border=2)
#=========CONNECT
self.arduino_port=None
arduino_ports=[
p.device for p in serial.tools.list_ports.comports()
if 'Arduino' in p.description]
if not arduino_ports:
arduino_ports=['COM Unknown']
fcon = LabelFrame(self,text="Kết Nối")
self.tet=Label(fcon,text='Cổng')
self.tet.grid(row=0,column=0,sticky=W)
self.COM=StringVar()
self.COM.set(arduino_ports[0])
w =OptionMenu(fcon,self.COM,*arduino_ports)
w.grid(row=0,column=1,padx=50)
self.tet1=Label(fcon,text='Tốc Độ Truyền')
self.tet1.grid(row=1,column=0,sticky=W)
self.baud=StringVar()
self.baud.set('115200')
w1=OptionMenu(fcon,self.baud,'9600','115200',)
w1.grid(row=1,column=1,padx=50)
self.ketnoi=Button(fcon,text="Kết Nối",command=self.connect)
self.ketnoi.grid(columnspan=2,row=2,column=0)

fcon.grid(column=1,row=0,sticky=W+N+E+S,padx=40,pady=5)
2. Tọa độ
#============Current
self.fcur=LabelFrame(self,text='Tọa độ')
self.ktX=Label(self.fcur,text='X:')


self.ktX.grid(column=0,row=0)
self.tdx=StringVar()
self.tdX=Label(self.fcur,textvariable=self.tdx)
self.tdX.grid(column=1,row=0,ipadx=58,ipady=11)
self.ktY=Label(self.fcur,text='Y:')
self.ktY.grid(column=12,row=0)
self.tdy=StringVar()
self.tdY=Label(self.fcur,textvariable=self.tdy)
self.tdY.grid(column=13,row=0,ipadx=58)
self.ktJ1=Label(self.fcur,text='J1:')
self.ktJ1.grid(column=0,row=1)
self.tdj1=StringVar()
self.tdJ1=Label(self.fcur,textvariable=self.tdj1)
self.tdJ1.grid(column=1,row=1,ipadx=58,ipady=11)
self.ktJ2=Label(self.fcur,text='J2:')
self.ktJ2.grid(column=12,row=1)
self.tdj2=StringVar()
self.tdJ2=Label(self.fcur,textvariable=self.tdj2)
self.tdJ2.grid(column=13,row=1,ipadx=58)
self.fcur.grid(column=0,row=0,sticky=W+N+E+S,padx=10,pady=5)

3.Động học thuận
#========move to angles

self.fma=LabelFrame(self,text='Động học thuận')
self.lJ1=Label(self.fma,text='J1:')
self.lJ1.grid(column=0,row=0,padx=10,pady=5)

self.varj1=StringVar()
self.eJ1=Entry(self.fma,textvariable=self.varj1)
self.eJ1.insert(0,'')
self.eJ1.grid(column=1,row=0,padx=59,pady=5)
self.eJ1.focus()


self.lJ2=Label(self.fma,text='J2:')
self.lJ2.grid(column=0,row=1,padx=10,pady=5)

self.varj2=StringVar()
self.eJ2=Entry(self.fma,textvariable=self.varj2)
self.eJ2.insert(0,'')
self.eJ2.grid(column=1,row=1,padx=59,pady=5)
self.eJ2.focus()

self.bma=Button(self.fma,text='Di chuyển',command=self.gocj)
self.bma.grid(column=1,row=2)
self.fma.grid(column=0,row=1,sticky=W+N+E+S,padx=10,pady=5)
4.Động học nghịch
#=======move to coordinate
self.fmc=LabelFrame(self,text='Động học nghịch')
self.lX=Label(self.fmc,text='X:')
self.lX.grid(column=0,row=0,padx=10,pady=5)
self.varX1=StringVar()
self.eX=Entry(self.fmc,textvariable=self.varX1)

self.eX.insert(0,'')
self.eX.grid(column=1,row=0,padx=60,pady=5)
self.eX.focus()
self.lY=Label(self.fmc,text='Y:')


self.lY.grid(column=0,row=1,padx=10,pady=5)
self.varY1=StringVar()
self.eY=Entry(self.fmc,textvariable=self.varY1)
self.eY.insert(0,'')
self.eY.grid(column=1,row=1,padx=60,pady=5)
self.eY.focus()
self.bmc=Button(self.fmc,text='Di chuyển',command=self.toadoxy)
self.bmc.grid(column=1,row=2)
self.fmc.grid(column=1,row=1,sticky=E+N+W+S,padx=40,pady=5)
5.Nam châm
self.fnc=LabelFrame(self,text='Nam châm')
self.varnc=StringVar()
self.varnc='Hút'
self.bnc=Button(self.fnc,text=self.varnc,command=self.namcham)
self.bnc.pack(expand=YES,fill=BOTH)
self.fnc.grid(column=0,row=2,sticky=W+N+E+S,padx=10,pady=5)
6.Di chuyển theo đơn vị
self.fmb=LabelFrame(self,text='Di chuyển theo đơn vị')
self.xl=Button(self.fmb,text='X-',command=self.XL)
self.xl.grid(column=0,row=1,padx=10,pady=5)
self.xr=Button(self.fmb,text='X+',command=self.XR)
self.xr.grid(column=3,row=1,padx=10,pady=5)
self.yu=Button(self.fmb,text='Y+',command=self.YU)
self.yu.grid(column=2,row=0,padx=10,pady=5)



self.yd=Button(self.fmb,text='Y-',command=self.YD)
self.yd.grid(column=2,row=2,padx=10,pady=5)
self.lu=Label(self.fmb,text='Đơn vị')
self.lu.grid(column=4,row=0)
self.unitb=StringVar()
self.entu=Entry(self.fmb,textvariable=self.unitb)
self.entu.insert(0,'')
self.entu.grid(column=4,row=1,padx=10)
self.entu.focus()
self.fmb.grid(column=1,row=2,sticky=W+N+E+S,padx=40,pady=5)
7.Chạy tự động
#=============chay tu dong
self.ftd=LabelFrame(self,text='Chế Độ Tự Động')
self.eslhn=Label(self.ftd,text='Số lần lặp')
self.eslhn.grid(column=0,row=2,sticky=W+E)

self.vsll=StringVar()
self.esll=Entry(self.ftd,textvariable=self.vsll)
self.esll.insert(0,'')
self.esll.grid(column=1,row=2,padx=47,pady=10)
self.esll.focus()
self.varhd=StringVar()
self.varhd='Nhập tọa độ'
self.bhd=Button(self.ftd,text=self.varhd,command=self.hoatdong)


self.bhd.grid(column=2,row=2,sticky=W+E,columnspan=2)


self.lgtx1=Label(self.ftd,text='X1:')
self.lgtx1.grid(column=0,row=0,padx=47,pady=10)

self.vgtx1=StringVar()
self.egtx1=Entry(self.ftd,textvariable=self.vgtx1)
self.egtx1.insert(0,'')
self.egtx1.grid(column=1,row=0,padx=47,pady=10)
self.egtx1.focus()

self.lgty1=Label(self.ftd,text='Y1:')
self.lgty1.grid(column=0,row=1,padx=47,pady=10)

self.vgty1=StringVar()
self.egty1=Entry(self.ftd,textvariable=self.vgty1)
self.egty1.insert(0,'')
self.egty1.grid(column=1,row=1,padx=47,pady=10)
self.egty1.focus()
self.lgtx2=Label(self.ftd,text='X2:')
self.lgtx2.grid(column=2,row=0,padx=47,pady=10)
self.vgtx2=StringVar()
self.egtx2=Entry(self.ftd,textvariable=self.vgtx2)
self.egtx2.insert(0,'')


self.egtx2.grid(column=3,row=0,padx=47,pady=10)
self.egtx2.focus()
self.lgty2=Label(self.ftd,text='Y2:')
self.lgty2.grid(column=2,row=1,padx=47,pady=10)
self.vgty2=StringVar()
self.egty2=Entry(self.ftd,textvariable=self.vgty2)

self.egty2.insert(0,'')
self.egty2.grid(column=3,row=1,padx=47,pady=10)
self.egty2.focus()
self.ftd.grid(column=0,row=3,sticky=W+N+S,padx=10,pady=5,columnspan=2)
8.Giao diện hoàn chỉnh


Bước 4 : viết chương trình cho các khung chức năng:
def hoatdong(self):
Xf=float(self.egtx1.get())
Yf=float(self.egty1.get())
XF=float(self.egtx2.get())
YF=float(self.egty2.get())
if ((0.00 <= Xf<= 180.00) and (170.00<= Yf <=270.00)) and((0.00 <= XF<=
180.00) and (170.00<= YF <=270.00)) :
if self.varhd=='Nhập tọa độ':
self.varhd='Hoạt Động'
self.bhd.config(text=self.varhd)
La=155
Lb=185
Lc=180
e1=-2*La*Xf
f1=-2*La*Yf
g1=(La*La)-(Lb*Lb)+(Xf*Xf)+(Yf*Yf)
E2=2*La*(-Xf+Lc)
F2=-2*La*Yf
G2=(Lc*Lc)+(La*La)-(Lb*Lb)+(Xf*Xf)+(Yf*Yf)-(2*Lc*Xf)
d1=2*math.atan(((-f1+math.sqrt((e1*e1)+(f1*f1)-(g1*g1)))/(g1-e1)))
d2=2*math.atan(((-F2+math.sqrt((E2*E2)+(F2*F2)-(G2*G2)))/(G2-E2)))
d1a=2*math.atan(((-f1-math.sqrt((e1*e1)+(f1*f1)-(g1*g1)))/(g1-e1)))



d2a=2*math.atan(((-F2-math.sqrt((E2*E2)+(F2*F2)-(G2*G2)))/(G2-E2)))
print('nghich')
gocd1=math.degrees(d1)
gocd2=math.degrees(d2a)

ee1=-2*La*XF
ff1=-2*La*YF
gg1=(La*La)-(Lb*Lb)+(XF*XF)+(YF*YF)
EE2=2*La*(-XF+Lc)
FF2=-2*La*YF
GG2=(Lc*Lc)+(La*La)-(Lb*Lb)+(XF*XF)+(YF*YF)-(2*Lc*XF)
D1=2*math.atan(((-ff1+math.sqrt((ee1*ee1)+(ff1*ff1)-(gg1*gg1)))/(gg1ee1)))
D2a=2*math.atan(((-FF2-math.sqrt((EE2*EE2)+(FF2*FF2)-(GG2*GG2)))/
(GG2-EE2)))
print('nghich')
Gocd1=math.degrees(D1)
Gocd2=math.degrees(D2a)
self.gx1=str('{0:.2f}'.format(float(gocd1)))
self.gy1=str('{0:.2f}'.format(float(gocd2)))
self.gx2=str('{0:.2f}'.format(float(Gocd1)))
self.gy2=str('{0:.2f}'.format(float(Gocd2)))
elif self.varhd=='Hoạt Động':
self.varhd='Nhập tọa độ'
self.bhd.config(text=self.varhd)


A=int(self.vsll.get())
i=0

for i in range(0,A):
print('guilenh')
print('@'+'T'+'A'+'X'+self.gx1+'Y'+self.gy1+'#')
self.arduino_port.write(bytes(str('@'+'T'+'A'+'X'+self.gx1+'Y'+self.gy1+'#'),'utf-8'))
time.sleep(3)
print('@'+'T'+'N'+'255'+'#')
self.arduino_port.write(bytes(str('@'+'T'+'N'+'255'+'#'),'utf-8'))
time.sleep(2)
print('@'+'T'+'A'+'X'+self.gx2+'Y'+self.gy2+'#')
self.arduino_port.write(bytes(str('@'+'T'+'A'+'X'+self.gx2+'Y'+self.gy2+'#'),'utf-8'))
time.sleep(3)
print('@'+'T'+'N'+'0'+'#')
self.arduino_port.write(bytes(str('@'+'T'+'N'+'0'+'#'),'utf-8'))
time.sleep(2)
i+=1
else:
mbox.showwarning("Lỗi", "Ngoài vùng làm việc hãy thử nhập lại!!!")

def toadoxy(self):
#dong hoc nghich
X=self.eX.get()


Y=self.eY.get()
Xf=float(self.eX.get())
Yf=float(self.eY.get())
La=155
Lb=185
Lc=180


e1=-2*La*Xf
f1=-2*La*Yf
g1=(La*La)-(Lb*Lb)+(Xf*Xf)+(Yf*Yf)
E2=2*La*(-Xf+Lc)
F2=-2*La*Yf
G2=(Lc*Lc)+(La*La)-(Lb*Lb)+(Xf*Xf)+(Yf*Yf)-(2*Lc*Xf)

d1=2*math.atan(((-f1+math.sqrt((e1*e1)+(f1*f1)-(g1*g1)))/(g1-e1)))
d2=2*math.atan(((-F2+math.sqrt((E2*E2)+(F2*F2)-(G2*G2)))/(G2-E2)))
d1a=2*math.atan(((-f1-math.sqrt((e1*e1)+(f1*f1)-(g1*g1)))/(g1-e1)))
d2a=2*math.atan(((-F2-math.sqrt((E2*E2)+(F2*F2)-(G2*G2)))/(G2-E2)))
print('nghich')
gocd1=math.degrees(d1)
gocd2=math.degrees(d2)
gocd1a=math.degrees(d1a)
gocd2a=math.degrees(d2a)
print(gocd1)


print(gocd2)
print(gocd1a)
print(gocd2a)
self.tdj1.set('{0:.2f}'.format(float(gocd1)))
self.tdj2.set('{0:.2f}'.format(float(gocd2a)))
self.varj1.set('{0:.2f}'.format(float(gocd1)))
self.varj2.set('{0:.2f}'.format(float(gocd2a)))
self.tdx.set(self.eX.get())
self.tdy.set(self.eY.get())
if (0.00 <= Xf<= 180.00) and (170.00<= Yf <=270.00) :
r1=str('{0:.2f}'.format(float(gocd1)))

r2=str('{0:.2f}'.format(float(gocd2a)))
self.arduino_port.write(bytes(str('@'+'T'+'A'+'X'+r1+'Y'+r2+'#'),'utf-8'))
else:
mbox.showwarning("Lỗi", "Ngoài vùng làm việc hãy thử nhập lại!!!")
def gocj(self):
#dong hoc thuan
j1=float(self.eJ1.get())
j2=float(self.eJ2.get())
self.arduino_port.write(bytes(str('@'+'T'+'A'+'X'+str(j1)+'Y'+str(j2)+'#'),'utf-8'))
self.tdj1.set('{0:.2f}'.format(float(j1)))
self.tdj2.set('{0:.2f}'.format(float(j2)))
goc1=float(self.eJ1.get())
goc2=float(self.eJ2.get())


J1=math.radians(goc1)
J2=math.radians(goc2)
La=155
Lb=185
Lc=180
E=2*Lb*(Lc+La*(math.cos(J2)-math.cos(J1)))
F=2*La*Lb*(math.sin(J2)-math.sin(J1))
G=Lc*Lc+2*La*La+2*Lc*La*math.cos(J2)-2*Lc*La*math.cos(J1)2*La*La*math.cos(J2-J1)

GTX=Lc+La*math.cos(J2)+Lb*math.cos(2*math.atan((+F+math.sqrt(E*E+F*FG*G))/(G-E)))
GTY=La*math.sin(J2)+Lb*math.sin(2*math.atan((-F+math.sqrt(E*E+F*FG*G))/(G-E)))
GTXa=Lc+La*math.cos(J2)+Lb*math.cos(2*math.atan((-Fmath.sqrt(E*E+F*F-G*G))/(G-E)))
GTYa=La*math.sin(J2)+Lb*math.sin(2*math.atan((-F-math.sqrt(E*E+F*FG*G))/(G-E)))
print('thuan')
print(GTX)

print(GTY)
print(GTXa)
print(GTYa)
self.varX1.set('{0:.2f}'.format(float(GTX)))
self.tdx.set('{0:.2f}'.format(float(GTX)))


×