(123doc) - Nghien-Cuu-Thiet-Ke-Robot-3-Bac-Tu-Do-Toa-Do-Cau
(123doc) - Nghien-Cuu-Thiet-Ke-Robot-3-Bac-Tu-Do-Toa-Do-Cau
NG I
GIỚI THIỆU CHUNG
1
kiện môi trường thay đổi, trong robot phải có hệ thống điều khiển. Xây dựng các hệ
thống điều khiển thuộc phạm vi điện tử, kỹ thuật điều khiển và công nghệ thông tin.
2
Trong một hệ thống cơ điện tử, phương pháp thiết kế có ý nghĩa rất quan trọng,
mang tính tổng quát, tiên phong. Để hoàn thành đề tài, nhiều kiến thức chuyên ngành
cơ điện tử và kiến thức liên ngành đã được áp dụng trong các hệ thống cơ khí, điện tử,
công nghệ thông tin, điều khiển hệ thống.
Đồ án sử dụng các phương pháp:
- Nghiên cứu cơ sở lý thuyết các mô hình, hệ thống thực tế, thiết bị có sẵn
3
CHƯƠNG II
TỔNG QUAN VỀ ROBOT CÔNG NGHIỆP
4
Robot có cứng vững hay không, có tải trọng lớn hay không, có làm việc chính
xác hay không phụ thuộc phần lớn kết cấu của tay máy tobot công nghiệp.
Môi trường:
5
của robot là robot kiểu toạn độ Đề các, tọa độ trụ, tọa độ cầu, robot kiểu SCARA, hệ
tọa độ góc (phỏng sinh)…
2.2.2 Phân loại robot công nghiệp
a) Phân loại hình dạng hình học và không gian hoạt động
6
Hình 2.5 Robot kiểu SCARA
b) Phân loại theo phương pháp điều khiển
Theo phương pháp điều khiển robot công nghiệp được phân ra làm 2 loại: điều
khiển theo mạch hở và điều khiển theo vòng kín.
- Điều khiển theo mạch hở:
Khác với phương pháp điều khiển theo mạch hở, ở phương pháp điều khiển theo
vòng kín có phản hồi về trạng thái làm việc của tay máy cũng như môi trường mà tay
máy tương tác. Do đó, điều khiển tay máy robot công nghiệp sẽ chính xác hơn. So với
phương pháp điều khiển theo mạch hở, phương pháp này phức tạp hơn do phải trang
bị hệ thống cảm biến để đo các giá trị trạng thái của tay máy như: vị trí, vận tốc, gia
tốc, momen… và các thông số môi trường làm việc.
Với ưu điểm như vậy nên phương pháp điều khiển theo vòng kín ngày càng
được sử dụng nhiều trên các tay máy robot công nghiệp.
7
c) Phân loại theo ứng dụng
Robot được phân loại tùy theo ứng dụng trong nhiều chuyên ngành công nghiệp
như: robot hàn, robot sơn, robot lắp ráp, robot trong ngành luyện kim…
2.3 Cơ sở lý thuyết
2.3.1 Động học tay máy
a) Động học thuận
Bài toán động học thuận sử dụng phương pháp do Denavit-Hartenberg đề xuất.
Phương pháp đó được sử dụng để biểu thị mối quan hệ giữa 2 khâu với nhau:
Khâ
u
1
2
…
N
Bảng 2.1 Bảng thông số Denavit – Hartenberg
8
Các bước thiết lập phương trình động học Robot bằng phương pháp Denavit –
Hartenberg:
Bước 1: Đặt hệ trục tọa độ theo quy tắc D - H
Bước 2: Lập bảng thông số động học D – H.
Bước 3: Từ bảng thông số động học D – H thay vào công thức tính được các ma
trận biến đổi thuần nhất tương ứng.
Bước 4: Nhân các ma trận biến đổi thuần nhất này với nhau theo đúng thứ tự
được phương trình động học Robot công nghiệp. =....
Khi các trục khớp cắt nhau nên di chuyển các trục tọa độ có gốc trùng nhau.
b) Động học ngược
Khái niệm: Động học ngược tay máy là việc giải phương trình động học robot
công nghiệp để tìm ra các giá trị của biến khớp khi cần di chuyển khâu công tác tới vị
trí xác định và hướng xác định.
Mục đích của việc giải phương trình động học robot công nghiệp: để điều khiển
tay máy của robot công nghiệp tới vị trí làm việc và có một hướng xác định thì chúng
ta phải tính toán giá trị các biến khớp đã quay hoặc tịnh tiến một lượng là bao nhiêu.
Động học ngược tay máy là cơ sở cho việc điều khiển robot.
Các phương pháp giải bài toán động học ngược :
- Phương pháp số.
- Phương pháp giải tích.
2.3.2 Động lực học tay máy
a) Khái niệm
Bài toán động lực học tay máy là bài toán nghiên cứu mối quan hệ giữa chuyển
động của tay máy và nguyên nhân gây ra các chuyển động đó.
b) Mục đích nghiên cứu bài toán động học tay máy
- Thiết kế bộ điều khiển robot công nghiệp.
- Tính toán chọn động cơ.
c) Phân loại bài toán động lực học tay máy
- Bài toán động lực học thuận: Cho trước lực và momen tác dụng ở mỗi khớp
lực và momen tác dụng vào các khớp của tay máy.
d) Các phương pháp giải quyết bài toán động lực học tay máy
- Phương pháp sử dụng định lý động năng.
9
- Phương pháp sử dụng phương trình Lagarange II.
- Phương pháp Newton-Euler.
Hệ thống truyền dẫn cơ khí trên tay máy robot công nghiệp có tác dụng truyền
chuyển động và momen từ các động cơ tới các khớp và bộ phận công tác của robot.
Các loại truyền dẫn cơ khí:
- Cơ cấu trục vít bánh vít.
- Cơ cấu vít me đai ốc.
- Truyền động xích.
- Gắn trực tiếp rotor của động cơ tuyến tính lên trục của khớp.
- Truyền động đai răng.
10
Truyền động đai răng được sử dụng rộng rãi trên robot công nghiệp, chúng có ưu
điểm hạn chế trượt, khối lượng nhỏ, truyền được chuyển động, momen giữa các trục
tương đối xa.
b) Động cơ
Động cơ là nguồn tạo động lực chuyển động cho các khớp.
Yêu cầu động cơ trên robot công nghiệp:
Quán tính nhỏ, dải tốc độ làm việc rộng, độ chính xác định vị cao, có thể làm việc
trơn tru ở vận tốc thấp.
Các loại động cơ sử dụng trên robot công nghiệp:
-Động cơ khí nén.
-Động cơ điện một chiều, xoay chiều thông dụng.
-Động cơ Servo.
-Động cơ bước.
-Động cơ thủy lực.
c) Khuếch đại công suất
Biến đổi trạng thái năng lượng của nguồn cung cấp cho phù hợp với yêu cầu của
động cơ.
d) Nguồn cung cấp chính
Nhiệm vụ của nguồn cung cấp chính là cung cấp năng lượng tới đầu vào của bộ
biến đổi.
2.4.2 Hệ thống cảm biến
Cảm biến là thiết bị dùng để nhận giá trị của đại lượng vật lý cần đo và biến đổi
nó thành tín hiệu mà thiết bị đo hay điều khiển có thể xử lý được. Dạng và tín hiệu
xuất ra được chuẩn hóa để dễ ghép nối vào các mạch xử lý.
Cảm biến trong:
- Cảm biến vị trí.
- Cảm biến vận tốc.
12
CHƯƠNG III
MÔ HÌNH HÓA VÀ MÔ PHỎNG HỆ THỐNG
3.1 Mô hình vật lý
a) Mô hình robot
Hình 3.2 Cấu hình và các hệ trục tọa độ gắn trên robot cầu RRR
Khối lượng toàn bộ canh tay: 11,1 kg (tính theo solidworks)
13
Hình 3.3 Thân dưới.
Khối lượng thân dưới (khâu 1) là: 9295,54 g (tính theo solidworks)
14
Hình 3.5 Khâu 3
Khối lượng khâu thứ 3: 216,05 g (tính toán theo solidworks)
3.2 Bài toán động học thuận
Quy tắc đặt hệ trục tọa độ theo D – H :
- Trục zi trùng hướng với hướng của trục zi+1.
- Trục xi cùng phương với phương pháp tuyến chung của trục z i-1 và trục zi.
- Gốc tọa độ trên khâu là được xác định bởi giao điểm của trục z và trục x
đã xác định của khâu đó. Hướng của trục y được chọn theo hướng của
trục z, x theo quy tắc bàn tay phải.
Với hệ tọa độ đặt cho khâu công tác sẽ chọn hệ tọa độ sao cho gần giống nhất với hệ
tọa độ gần nó. Hệ tọa độ gốc chọn trục x bất kì:
Khâu
1
2
…
n
Bảng 3.1 Bảng thông số Denavit – Hartenberg
Phép rời trục tọa độ:
Bản chất của quy tắc D – H là việc rời hệ tọa độ theo quy tắc nhất định để 2 hệ trục
tọa độ trùng khớp nhau. Thứ tự rời như sau:
- Tịnh tiến một đoạn di theo trục zi-1 để xi-1 nằm trên mặt phẳng pháp tuyến của z i-1
chứa xi.
- Quay một góc θ1 quanh trục zi-1 để xi-1 cùng phương với xi.
- Tịnh tiến một đoạn ai theo trục xi-1 để xi-1 trùng với xi.
- Quay một góc αi quanh trục xi-1(≡xi) để zi-1≡zi.
(d)(θ)(a)(α)
Ma trận biến đổi thuần nhất theo quy tắc D – H:
= (d)(θ)(a)(α)
15
Các bước thiết lập phương trình động học Robot bằng phương pháp Denavit –
Hartenberg:
- Bước 1: Đặt hệ trục tọa độ theo quy tắc D - H
- Bước 2: Lập bảng thông số động học D – H.
- Bước 3 : Từ bảng thông số dộng học D – H thay vào công thức chung ta
sẽ tính được các ma trận biến đổi thuần nhất tương ứng.
- Bước 4 : Nhân các ma trận biến đổi thuần nhất này với nhau theo đúng
thứ tự ta sẽ được phương trình động học Robot công nghiệp.
=....
Khi các trục khớp cắt nhau ta nên di chuyển các trục tọa độ có gốc trùng nhau.
Áp dụng đối với robot RRR ta có:
Bảng D-H:
Khâu Di θi ai
Bảng 3.2 Bảng 1 L1 0 90 thông số D-H
2 0 L2 0
Hình 3.6 Kết cấu tay máy robot
3 0 L3 0
tọa độ cầu RRR
Ma trận tổng quát:
Ta có:
Ta có:
16
=
=
=
3.3 Bài toán động học ngược
Khái niệm: động học ngược tay máy là việc giải phương trình động học robot
công nghiệp để tìm ra các giá trị của biến khớp khi cần di chuyển khâu công tác tới vị
trí xác định và hướng xác định.
Mục đích của việc giải phương trình động học robot công nghiệp: để điều khiển
tay máy của robot công nghiệp tới vị trí làm việc và có một hướng xác định thì chúng
ta phải tính toán giá trị các biến khớp đã quay hoặc tịnh tiến một lượng là bao nhiêu.
Động học ngược tay máy là cơ sở cho việc điều khiển robot
Các phương pháp giải bài toán động học ngược :
- Phương pháp số.
- Phương pháp giải tích.
Đối với robot cầu RRR:
=
=
=
Bình phương phương trình , sau đó cộng theo vế ta được:
2 2
= + 2 (1)
Ta có:
=
Bình phương phương trình sau đó cộng với phương trình (1) theo vế ta được:
l32+l22+2.l2.l3.cos=2+ 2+ (2
=cos-1()
bằng cách vẽ hình và mô tả góc quay, ta xác định được các thông số yêu cầu của bài
toán.
17
Hình 3.7 Phân tích cơ cấu các khâu
Ta tính được :
lực và momen tác dụng vào các khớp của tay máy.
d) Các phương pháp giải quyết bài toán động lực học tay máy:
- Phương pháp sử dụng định lý động năng.
- Phương pháp sử dụng phương trình Lagrange II.
18
- Phương pháp newton-euler.
Sử dụng phương pháp Lagrange II đối với robot tọa độ cầu RRR:
Phương trình Lagrange II có dạng như sau:
Mđc
Trong đó:
K là động năng của hệ, gồm:
K=K1+K2(chuyển động song phẳng)
K=K1 (chuyển động quay) K1=
K=K2 (chuyển động tịnh tiến) K2=
Hình 3.8 Kết cấu tay máy robot tọa độ cầu RRR
Với khâu 1 được coi là đĩa đồng chất, bán kính r=40mm=0,04m, khối lượng :
kg
K1=0,00066
• Khâu 2: vì khâu chuyển động quay và tịnh tiến nên ta có
K2=K21+K22
Trong đó K21 là động năng tịnh tiến
K21=
19
Trong đó là tọa độ khối tâm của vật so với gốc .
Dựa vào công thức quan hệ giữa các hệ tọa độ trên tay máy công nghiệp
Trong đó:
là tọa độ điểm xc2 so với gốc O0
là tọa độ điểm xc2 so với gốc O1
=>
=>
=>
=
K21= =
K22=
K22=
K2=+
• Khâu 3: vì khâu 3 chuyển động quay và tịnh tiến nên ta có:
K3=K31+K32
Trong đó:
K31 là động năng tịnh tiến
K32 là động năng quay
K31=
+
20
K31={
K32=
J3=
K32=
K3={
Động năng của tay máy: K=K1+K2+K3
K=0,00066+++{
=
Tính thế năng
P=mgh=P1+P2+P3
Trong đó:
P1=
P2= )
P3=
P= )+
1 L1 0 90
2 0 L2 0
3 0 L3 0
Bảng 3.3 Thông số động học D-H
Thiết kế giao diện của bài toán động học thuận và ngược được viết trong chương 4,
dưới đây là giao diện đã thiết kế.
a) Bài toán động học thuận
Nhập các góc của các khâu robot trong bảng điều khiển, nhấn “Tăng hoặc Giảm” để
điều chỉnh sau đó nhấn “Dịch chuyển” ta được tọa độ vị trí công tác.
22
Hình 3.9 Giao diện động học thuận
b) Bài toán động học ngược
Nhập tọa độ của vị công tác, nhấn “Tăng hoặc Giảm” để điều chỉnh sau đó nhấn “Dịch
chuyển” ta được các góc tại các khâu.
23
3.6 Mô hình hóa hệ thống điều khiển
3.6.1 Hệ thống mạch điều khiển
Khối nguồn
Động cơ
ROBOT
Yêu cầu hệ thống điều khiển trung tâm là đáp ứng nhanh do đó đòi hỏi một loại
vi điều khiển mạnh, có tốc độ xử lý nhanh, có khả năng ghép nối với nhiều thiết bị như
RF, cảm biến góc và gia tốc, và có thể tích hợp thêm các modul khác nữa.
Các dòng chip trên thị trường rất đa dạng và nhiều chủng loại như chip PIC,
Atmel, Arm… Mỗi loại lại có một ưu điểm riêng song chip Atmel nổi tiếng là một
dòng chip mạnh với tốc độ xử lí khá cao, phù hợp với yêu cầu đề tài. Còn chip ARM
là loại rất mạnh nhưng giá thành cao nếu sử dụng loại này sẽ gây lãng phí.
24
Vi điều khiển AVR do hãng Atmel sản xuất được giới thiệu lần đầu năm 1996,
AVR có rất nhiều dòng khác nhau bao gồm dòng Tiny AVR ( như AT tiny13, AT tiny
22…) có kích thước bộ nhớ nhỏ, ít bộ phận ngoaiij vi, rồi đến dòng AVR ( chẳng hạn
AT90S8535, AT90S8515,…) có kích thước bộ nhớ vào loại trung vình và mạnh hơn là
dòng Mega ( Atmega16, Atmega32, Atmega128,…) với bộ nhớ có kích thước vài
Kbyte đến vài trăm Kb cùng với các bộ ngoại vi đa dạng được tích hợp trên chip, cũng
có dòng tích hợp cả bộ LCD trên chip (dòng LCD AVR)). Tốc độ của dòng Mega
cũng cao hơn so với các dòng khác, sự khác nhau cơ bản giữa các dòng chính là cấu
trúc ngoại vi, còn nhân thì vẫn như nhau. Đặc biệt, năm 2008, Atmel lại tiếp tục cho ra
đời dòng AVR mới là XmegaAVR, với những tính năng mạnh mẽ chưa từng có ở các
dòng AVR trước đó. Có thể nói XmegaAVR là dòng MCU 8 bít mạnh mẽ nhất hiện
nay.
giây.
- Bộ định thời gian thực (RTC) với bộ dao động và chế độ đếm
tách biệt.
- 2 bộ Timer 8 bit và 1 bộ Timer 16 bit với chế độ so sánh và chia
26
Hình 3.14 Hoạt động của mạch Driver công suất
27
- Truyền thông nối tiếp đồng bộ : Để chỉ sự báo trước trong quá trình truyền,
cách truyền này đòi hỏi it nhất 2 đường truyền cho 1 quá trình: 1 đường dữ
liệu và 1 đường xung nhịp
- Truyền thông nối tiếp không đồng bộ: Chỉ cần 1 đường truyền cho quá trình
truyền hoặc nhận, “Khung dữ liệu” được chuẩn hóa bởi các thiết bị nên không
cần đường xung nhịp báo trước dữ liệu đến. Để quá trình truyền thành công thì
việc tuân thủ các tiêu chuẩn truyền là hết sức quan trọng.
VD: 2 thiết bị đang giao tiếp với nhau theo phương pháp này. Chúng thỏa thuận
với nhau cứ 1ms sẽ có 1 bit dữ liệu truyền đến, thiết bị nhận chỉ cần kiểm tra
hoặc đọc đường truyền theo chu kì đã đặt trước.
thấy rằng, để việc truyền và nhận không đồng bộ diễn ra thành công thì các
thiết bị tham gia phải “Thống nhất” với nhau về 1 khoảng thời gian dành cho
1 bít truyền. Hay tốc độ truyền phải được cài đặt như nhau trước, tốc độ này
gọi là tốc độ Baud. Vậy tốc độ Baud là số bít truyền trong 1s. Ví dụ nếu tốc độ
baud được đặt 19200 thì thời gian dành cho 1 bít truyền là 1/19200~ 52,083us.
- Frame (khung truyền): Do truyền thông nối tiếp không đồng bộ nên rất dễ gặp
phải hiện tượng mất hoặc sai lệch dữ liệu. Do vậy trong quá trình truyền thông
phải tuân theo một số quy cách nhất định, bên cạnh tốc độ Baud thì khung
truyền đóng một vai trò quan trọng tạo nên sự thành công cho việc truyền
nhận. Đó là sự quy định về số bít trong mỗi lần truyền, các bít bắt đầu, kết
thúc, kiểm tra chẵn lẻ, dữ liệu…v..v… Đều được quy định bởi khung truyền.
- Start bit: Start là bit đầu tiên được truyền trong một frame truyền, bit này có
chức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền
tới. Ở module USART trong AVR, đường truyền luôn ở trạng thái cao khi
nghỉ (Idle), nếu một chip AVR muốn thực hiện việc truyền dữ liệu nó sẽ gởi
một bit start bằng cách “kéo” đường truyền xuống mức 0. Như vậy, với AVR
bit start là mang giá trị 0 và có giá trị điện áp 0V (với chuẩn RS232 giá trị điện
áp của bit start là ngược lại). Start là bit bắt buộc phải có trong khung truyền.
- Parity bit: Parity là bit dùng kiểm tra dữ liệu truyền đúng không (một cách
tương đối). Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd
parity). Parity chẵn nghĩa là số lượng số 1 trong dữ liệu bao gồm bit parity
luôn là số chẵn. Ngược lại tổng số lượng các số 1 trong parity lẻ luôn là số lẻ.
Ví dụ, nếu dữ liệu của bạn là 10111011 nhị phân, có tất cả 6 số 1 trong dữ liệu
này, nếu parity chẵn được dùng, bit parity sẽ mang giá trị 0 để đảm bảo tổng
các số 1 là số chẵn (6 số 1). Nếu parity lẻ được yêu cầu thì giá trị của parity bit
là 1. Hình 1 mô tả ví dụ này với parity chẵn được sử dụng. Parity bit không
phải là bit bắt buộc và vì thế chúng ta có thể loại bit này khỏi khung truyền
(các ví dụ trong bài này tôi không dùng bit parity).
- Stop bit: Stop bit là một hoặc các bit báo cho thiết bị nhận rằng một gói dữ
liệu đã được gởi xong. Sau khi nhận được stop bits, thiết bị nhận sẽ tiến hành
kiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu. Stop bit là các
bit bắt buộc xuất hiện trong khung truyền, trong AVR USART có thể là 1
29
hoặc 2 bit (Trong các thiết bị khác Stop bit có thể là 2.5 bit). Trong ví dụ ở
hình 1, có 2 stop bit được dùng cho khung truyền.Giá trị của stop bit luôn là
giá trị nghỉ (Idle) và là ngược với giá trị của start bit, giá trị stop bit trong
AVR luôn là mức cao (5V).
31
CHƯƠNG IV
THIẾT KẾ VÀ THI CÔNG HỆ THỐNG
4.1 Thiết kế phần mềm
4.1.1 Trình tự thiết kế trong giao diện Guide
Giới thiệu lập trình Guide trong Winform của Visual Studio:
Giao diện trong Winform của Visual Studio tương đối giống với các chương trình lập
trình giao diện như Visual Basic, C++ hay Matlab,…
Visual studio là một môi trường phát triển tích hợp (IDE). Nó được sử dụng làm
nền tảng phát triển các phần mềm như : Windows API, Windows Form, …
Winform được sử dụng trên nền Visual Studio. Với sự tích hợp đa dạng nhiều ngôn
ngữ lập trình khác nhau: C C++, C# … Giúp người lập trình có thể tiếp cận lập trình
nhanh hơn.
Tổ chức bộ nhớ để lưu trữ các mảng rất tốt, các tính toán trên mảng được thực
hiện khá nhanh.
32
Việc kiểm tra kết quả được nhanh chóng, dễ dàng kiểm tra chương trình. Đa số
các ngôn ngữ kahcs cần phải biên dịch cả một chương trình. Đa số các ngôn ngữ khác
cần phải biên dịch cả một chương trình không có lỗi rồi mới chạy,.
4.1.2 sử dụng lập trình Guide trong Winform để mô phỏng
Mở phần mềm Visual Studio>> Tạo 1 New Project mới :
33
Hình 4.3 Giao diện thiết kế
Giao diện khá giống với các giao diện như : Matlab, Visual C++, … Di chuột qua
bên hộp Toolbox với các biểu tượng ở bên trái sẽ thấy tên của các điều khiển. Một số
nút điều khiển hay dùng.
Button: Là nút Command Button trong Win Form, có thể là các nút Ok , Yes hay
Cancel, … mà ta vẫn hay dung
Label : Đánh tên nhãn hay đối tượng
CheckBox
ListBox
ComboBox
Edit Text
Text box
Picture Box
Button Group
…
Ta sẽ kéo thử vào trong giao diện một vài đối tượng điều khiển: TextBox , Label và
Button.
34
Hình 4.4 Lấy các đối tượng
Để thay đổi các thuộc tính của các điều khiển:
Ta quan sát bên phải có cửa sổ các thuộc tính của điều khiển. Có thể sắp xếp théo chức
năng hoặc theo thứ tự A-Z của tên thuộc tính bằng nút hiện ở gõ bên trái.
35
Hình 4.1 Giao diện bài toán động học ngược
Thực hiện nhập độ dài các khâu, tọa độ vị trí công tác và nhấn nút “Dịch chuyển”. Kết
quả được thể hiện bằng “Góc”.
4.1.4 Thiết kế phần mềm điều khiển
Tạo giao diện điều khiển
36
Hình 4.8 Bảng nhập dữ liệu
Bảng điều khiển thực hiện kết nối và ngắt kết nối với máy tính, cài đặt vị trí ban đầu
cho cánh tay, thực hiện di chuyển cánh tay từ vị trí hiện tại với vị trí được khai báo
trong bảng “Theo góc” hoặc “Tọa độ”.
- Bảng 4.11:
37
Hình 4.10 Thông báo chương trình chạy của robot
4.2 Thiết kế hệ thống cơ khí
4.2.1 Tính chọn động cơ
Giả sử bán kính trục thiết kế có Rtr=5 mm
- Loại động cơ: Bước
- Fms=0.05*P*d/Rtr
- k=0.01÷0.05: hệ số ma sát của ổ lăn
- Rtr=0.005: bán kính trục (m)
- d=l2+l3 =0.23+0.245= 0.475 (m)
- P=(m2+m3)*g=(1.5949+0.21605)*9.8=17.74(N)
- Fms=0.05*P*d/Rtr = 0.05*17.74*0.475 /0.05= 8.4 (N)
- Ptr= (M x 2pi x n)/60 = (8.4*0.01*2*3.14*3000)/60= 26.5(W)
Chọn động cơ: PITTMAN DC GEAR MOTOR 24 VDC 65.5:1 RATIO MODEL
GM9434E470.
4.2.2 Thiết kế trục
Tính toán trục
Trục 1 (trục tại khớp 3)
Xác định momen lớn nhất tác dụng lên trục:
Giả sử cánh tay nâng vật nặng 100(g), khâu thứ 3 nặng 216,05(g) được thay thế bằng
lực tương đương tại trọng tâm.
38
Hình 4.11 Khớp 3
Ta có tổng momen tác dụng lên trục 1:
M = 0.21605 75 + 0.1 150 = 305.8 (Nmm)
Gọi: +) M1 là momen canh tay tác dụng lên trục: M1 = M/2 = 152.9 (Nmm)
+) M2 là momen động cơ cần thiết tác dụng lên trục M2 = M1
Trục chịu lực cắt lớn nhất khi cánh tay ở vị trí cao nhất, khi đó lực cắt:
P= ( 0.21605 + 0.1 ) 9.8 = 3 (N)
Gọi: +) N3, N4 là hai lực cắt cánh tay tác dụng: N3 = N4 = P/2 =1,5 (N)
Khi đó
+) N1, N2 là hai phản lực: N1 = 1,8 (N), N2 =1,2 (N)
Biều đồ momen:
40
Hình 4.14 Biểu đồ nội lực
Dựa vào biểu đồ nội lực ta thấy điểm đặt lực N 4 là điểm nguy hiểm, ta có momen
tương đương tại điểm này:
Mtd = = 122.6 (Nmm)
Chọn vật liệu: thép C45 => [σ] = 80
Đường kính cần thiết:
d = = = 2.5 (mm)
41
Hình 4.16 Biểu đồ nội lực
Dựa vào biểu đồ nội lực ta thấy điểm đặt momen M z2 là điểm nguy hiểm, ta có
momen tương đương tại điểm này:
Mtd = = 225.1 (Nmm)
Chọn vật liệu: thép C45 => [σ] = 80
Đường kính cần thiết:
d = = = 3.1 (mm)
4.2.3 Thiết kế khung cho robot cầu RRR
Khung đế phải được thiết kế gọn nhẹ,đủ độ cứng,đứng vững chịu được tải trọng của
toàn bộ robot. Phần đế được làm bằng thép d=3mm, đủ nặng để giữ robot không bị lật
về phía trước. Các phần khung robot được làm bằng nhôm tấm dày 3mm.
42
Hình 4.17 Khung robot
4.2.4 Thiết kế cánh tay robot:
a) Cánh tay 1
Cánh tay gồm 2 tấm có trọng lượng nhẹ,thẩm mĩ, đơn giản dễ gia công và tháo lắp.
Vật liệu nhôm A1050. Bề dày d=2mm
43
Hình 4.19 Cánh tay 2
c) Thiết kế động cơ khoan
Động cơ khoan có khả năng khoan được các vật liệu như gỗ, tường…Thiết kế điều
khiển bằng nguồn 5V: d=35mm, l=60mm
45
Thiết kế bánh đai theo tiêu chuẩn với phần mềm hỗ trợ GEARTRAX.
Tiến hành chọn:
Bước răng: Belt Pitch=3mm
Độ rộng đai: Belt Width=0.313in belt width (= 9mm)
Số lượng răng của bánh đai: Number of Teeth=16
Chọn tấm chắn cho bánh đai: Flange Creation
Chọn độ rộng của pulley: 12mm
Sau khi hoàn tất, ấn Create để xác nhận:
46
Ta làm tương tự với bánh đai lớn:
47
Số răng bánh đai lớn: No of teeth in large pulley =50
Khoảng cách 2 trục: d=200mm
Bước răng: Pitch=3mm
Tiến hành chọn loại đai phù hợp theo thông số đã tính toán . Lựa chọn sao cho số răng
ăn khớp: Number of teeth in mesh>=6
48
Tên chi Vật liệu Phương án
STT Hình ảnh
tiết phôi gia công
-Dập tạo
hình dạng
Gá động -cắt dây tạo
3 Thép
cơ số 1 rãnh
-Khoan lỗ
và taro
49
Tiện
5 Trục số 1 Thép Ø35 Khoan lỗ và
taro
50
Cắt dây
Nhôm tấm
9 Thân số 1 Máy dập
D = 3mm
Khoan lỗ
Tiện
10 Ca bi 1 Nhựa cứng
Khoan lỗ
Cắt dây
Nhôm tấm Máy cắt tay
11 Tay số 2
d = 2 mm Khoan
Máy tiện
Pulley Cắt dây
13 Nhôm
nhỏ Khoan
và taro
51
Máy tiện
Pulley số Cắt dây
14 Nhôm
2 Khoan
và taro
Máy tiện
Pulley
15 Nhôm Cắt dây
số 3
Khoan lỗ
Máy tiện
Pulley Cắt dây
16 Nhôm
số 4 Khoan lỗ và
taro
Tiện
Pulley Cắt dây
17 Nhôm
Số 5 Khoan lỗ và
taro
Tiện
Pulley
18 Nhôm Cắt dây
Số 6
Khoan lỗ
52
Miếng ốp Nhôm tấm Dập và
19
thân 1 d = 1,5mm khoan
Dập và
Miếng ốp Nhôm tấm
20 khoan
thân 1.1 d = 1,5mm
lỗ
Dập và
Miếng ốp Nhôm tấm
21 khoan
thân 2.1 D = 1,5mm
lỗ
Dập và
Miếng ốp Nhôm tấm
22 khoan
thân 2.1 D = 1,5mm
lỗ
Dập và
Miếng ốp Nhôm tấm
23 khoan
thân 3.1 S = 1,5mm
lỗ
53
Miếng ốp Nhôm tấm Dập và
24
thân 3.2 D = 1,5mm khoan tạo lỗ
- Khối nguồn:
54
Hình 4.28 Khối nguồn
- Khối cảm biến - hiển thị:
55
Hình 4.30 Khối driver điều khiển động cơ
- Mạch nguyên lí tổng :
56
Hình 4.32 Mạch in
CHƯƠNG V
KẾT QUẢ VÀ ĐÁNH GIÁ
5.1 Kết quả
Sau quá trình nghiên cứu, mô hình robot tọa độ cầu đã được mô phỏng thành công,
đáp ứng được yêu cầu của đề tài đặt ra. Ưu điểm, nhược điểm của mô hình:
Ưu điểm:
- Việc điều khiển dễ dàng theo góc, vị trí.
- Độ chính xác các khâu công tác (1mm).
- Tính thẩm mỹ cao, kích thước gọn.
- Dễ tháo lắp các khâu.
- Có thể điều khiển được từng khớp riêng biệt và 3 khớp kết hợp.
- Điều khiển được theo phương pháp dạy học.
Nhược điểm:
- Trục chính rung lắc nhẹ khi robot làm việc.
- Sử dụng công tắc hành trình để xác định vị trí ban đầu của robot nên có sự sai
lệch vị trí.
- Động cơ chưa có giảm tốc
57
Hình 5.1 Sản Phẩm hoàn thiện
5.2 Nguyên nhân và biện pháp khắc phục
Trong quá trình mô phỏng, robot tọa độ cầu có xuất hiện một số lỗi khiến việc hoạt
động chưa đạt độ chính xác tuyệt đối.
Từ đó ta có biện pháp khắc phục như sau:
- Sử dụng ổ bi có đường kính lớn hơn để trục chính chống rung lắc, hoặc có thể
58
TÀI LIỆU THAM KHẢO
59
PHỤ LỤC I
/*************Transmite USART*************************/
#ifndef RXB8
#define RXB8 1
#endif
#ifndef TXB8
#define TXB8 0
#endif
#ifndef UPE
#define UPE 2
#endif
#ifndef DOR
#define DOR 3
#endif
#ifndef FE
#define FE 4
#endif
60
#ifndef UDRE
#define UDRE 5
#endif
#ifndef RXC
#define RXC 7
#endif
61
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index++]=data;
#if RX_BUFFER_SIZE == 256
// special case for receiver buffer size=256
if (++rx_counter == 0)
{
#else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
#endif
rx_buffer_overflow=1;
}
}
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index++];
#if RX_BUFFER_SIZE != 256
if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#endif
62
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// Step DC2
#define EN2 PORTA.3
#define DIR2 PORTA.4
#define CLK2 PORTA.5
// Step DC3
#define EN3 PORTB.0
#define DIR3 PORTB.1
#define CLK3 PORTB.2
/*************************************************************/
// Dinh nghia chan chieu cua step motor
#define nguoc1 0
#define thuan1 1
#define nguoc2 1
#define thuan2 0
#define nguoc3 0
#define thuan3 1
63
/************************************************************/
#define CB1 PIND.3
#define CB2 PIND.4
#define CB3 PIND.5
#define CB4 PIND.6
/***********************************************************/
// bien phan biet dau'
char k,j;
//bien cac phan tram, chuc, donvi
unsigned char hu1,do1,un1,hu2,do2,un2,hu3,do3,un3;
// bien khop
int rotate1=0,rotate2=0,rotate3=0;
//bien phan biet dau' tung goc
char a,b,c;
// luu so sanh gia tri goc duong
int r_r1=0,r_r2=0,r_r3=118;
// luu so sanh gia tri goc am
int rr_r1=0,rr_r2=0,rr_r3=0;
/********************************************************/
void display(unsigned int num,char x,char y)
// Reset robot before working
void reset_robot();
// Test Robot
void test_robot();
// Read rotate from Computer.
void read_rotate();
void control_rotate(int ro1,int ro2,int ro3);
/***************************************************/
void main(void)
64
{
// Declare your local variables here
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x07;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x0f;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
65
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
66
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
67
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
68
delay_ms(500);
lcd_clear();
while (1)
{
read_rotate();
control_rotate(rotate1,rotate2,rotate3);
// printf("chao cau chu\n");
// delay_ms(700);
// test_robot();
}
}
void read_rotate()
{
//Goc anfa
j=getchar();
while(RX_COMPLETE==1);
if(j==':')
{
k=getchar();
hu1=getchar()-48;
do1=getchar()-48;
un1=getchar()-48;
rotate1=hu1*100+do1*10+un1;
if(k=='-')
{
lcd_gotoxy(0,0);
lcd_puts("-");
display(rotate1,1,0);
a=0;
}
69
else
if(k=='+')
{
lcd_gotoxy(0,0);
lcd_puts("+");
display(rotate1,1,0);
a=1;
}
}
do
{
j=getchar();
while(RX_COMPLETE==1);
}
while(j!=',');
// Goc Beta
if(j==',')
{
k=getchar();
hu2=getchar()-48;
do2=getchar()-48;
un2=getchar()-48;
rotate2=hu2*100+do2*10+un2;
if(k=='-')
{
lcd_gotoxy(5,0);
lcd_puts("-");
display(rotate2,6,0);
b=0;
}
else
if(k=='+')
70
{
lcd_gotoxy(5,0);
lcd_puts("+");
display(rotate2,6,0);
b=1;
}
}
do
{
j=getchar();
while(RX_COMPLETE==1);
}
while(j!=',');
//Goc ga ma
if(j==',')
{
k=getchar();
hu3=getchar()-48;
do3=getchar()-48;
un3=getchar()-48;
rotate3=hu3*100+do3*10+un3;
if(k=='-')
{
lcd_gotoxy(0,1);
lcd_puts("-");
display(rotate3,1,1);
c=0;
}
else
if(k=='+')
{
lcd_gotoxy(0,1);
71
lcd_puts("+");
display(rotate3,1,1);
c=1;
}
}
do
{
j=getchar();
while(RX_COMPLETE==1);
}
while(j!='.');
}
//read rotate to control
// xu li du~ lieu chuyen thanh goc quay cho motor
void control_rotate(int ro1,int ro2,int ro3)
{
int r1=0,r2=0,r3=0,i,j,k;
r1=ro1;
r2=ro2;
r3=ro3;
72
if(r3<r_r3) // goc nhap nho hon goc dang chay
{
r3=r_r3-r3;
i=(r3*200)/360;
run_step3(i+115,thuan3); // quay thuan3
r_r3=r_r3-r3;
}
else
if(r3>r_r3) // Goc nhap lon hon goc dang chay
{
r3=r3-r_r3;
i=(r3*200)/360;
run_step3(i+115,nguoc3); // Quay nguoc
r_r3=r_r3+r3;
}
}
else
if((r3>118)||(r3==r_r3)) // neu dat goc1 quay lon hon 118 hoac bang goc cu~
brake_motor3(); // Dung dong co1
}
else // Nguoc lai goc 3 quay thuan
if(c==1)
{
if(r_r3!=0)
{
i=(r_r3*200)/360;
run_step3(i+115,thuan3);
r_r3=0;
}
if((r3>=0)&&(r3<=90)&&(r3!=rr_r3))
{
if(r3<rr_r3)
73
{
r3=rr_r3-r3;
i=(r3*200)/360;
run_step3(i+115,nguoc3);
rr_r3=rr_r3-r3;
}
else
if(r3>rr_r3)
{
r3=r3-rr_r3;
i=(r3*200)/360;
run_step3(i+115,thuan3);
rr_r3=rr_r3+r3;
}
}
}
else
if((r3>90)||(r3==rr_r3)) // neu dat goc quay lon hon 60
brake_motor3(); //dung dong co 1
74
rr_r2=0;
}
}
}
else // Nguoc lai goc 2 quay thuan
if(b==0)
{
if((r2>=0)&&(r2<=90)&&(r2!=rr_r2))
{
if(r2<rr_r2)
{
r2=rr_r2-r2;
j=(r2*200)/360;
run_step2(j+100,nguoc2);
rr_r2=rr_r2-r2;
}
else
if(r2>rr_r2)
{
r2=r2-rr_r2;
j=(r2*200)/360;
run_step2(j+100,thuan2);
rr_r2=rr_r2+r2;
}
}
else
if((r2>90)||(r2==rr_r2)) // neu dat goc quay lon hon 90
brake_motor2(); //dung dong co 1
}
//Goc 1 gui? duong - quay nguoc
if(a==1)
{
75
if(rr_r1!=0) //Neu dang ben goc thuan thi quay het goc thuan ve goc'
{
k=(rr_r1*200)/360; // chia % tinh ra buoc
run_step1(k+25,nguoc1);
rr_r1=0; //reset bien nho goc nguoc
}
if((r1>=0)&&(r1<=45)&&(r1!=r_r1)) // goc r1 nho hon 40 do
{
if(r1<r_r1) // goc nhap nho hon goc dang chay
{
r1=r_r1-r1;
k=(r1*200)/360;
run_step1(k+25,thuan1); // quay thuan1
r_r1=r_r1-r1; // luu goc' doc duoc tu may tinh
}
else
if(r1>r_r1) // Goc nhap lon hon goc dang chay
{
r1=r1-r_r1;
k=(r1*200)/360;
run_step1(k+25,nguoc1); // Quay nguoc
r_r1=r_r1+r1; // Luu goc doc duoc tu may tinh
}
}
else
if((r1>45)||(r1==r_r1)) // neu dat goc1 quay lon hon 40 hoac bang goc cu~
brake_motor1(); // Dung dong co1
}
else // Nguoc lai goc 1 quay thuan
if(a==0)
{
if(r_r1!=0)
76
{
k=(r_r1*200)/360;
run_step1(k+25,thuan1); // Neu dang ben goc nguoc thi quay het goc' nguoc
ve gôc
r_r1=0; //reset goc nguoc ve 0
}
if((r1>=0)&&(r1<=45)&&(r1!=rr_r1)) // neu goc 1 < 40 do va khong bi trung goc'
truoc' do'
{
if(r1<rr_r1)
{
r1=rr_r1-r1;
k=(r1*200)/360;
run_step1(k+25,nguoc1);
rr_r1=rr_r1-r1;
}
else
if(r1>rr_r1)
{
r1=r1-rr_r1;
k=(r1*200)/360;
run_step1(k+25,thuan1);
rr_r1=rr_r1+r1;
}
}
}
else
if((r1>45)||(r1==rr_r1)) // neu dat goc quay lon hon 40
brake_motor1(); //dung dong co 1
}
void reset_robot()
77
{
// dua motor1 ve vi tri ban dau
do
{
run1(nguoc1);
}
while(CB1!=0);
brake_motor1();
// dua motor2 ve vi tri ban dau
do
{
run2(nguoc2);
}
while(CB2!=0);
brake_motor2();
// dua motor3 ve vi tri ban dau
do
{
run3(nguoc3);
}
while(CB3!=0);
brake_motor3();
}
void test_robot()
{
run_step2(60,0); // di len
// run_step2(60,0); // di xuong
// run_step1(60,0); // quay thuan
delay_ms(500);
run_step3(60,1); //
// run_step2(60,1);
78
// run_step1(60,1);
delay_ms(500);
}
/************Define some functions for step Motor*********/
// Brake Step Motor1
void brake_motor1()
{
EN1=0;
CLK1=0;
}
79
}
80
}
step1=0;
}
81
}
step3=0;
}
/*************calculator function**************/
void display(unsigned int num,char x,char y)
{
char num1,num2,num3;
num1=num/100;
num2=num%100/10;
num3=num%100%10;
lcd_gotoxy(x,y);
lcd_putchar(num1 + 48);
lcd_putchar(num2 + 48);
lcd_putchar(num3 + 48);
}
I.2 Code lập trình giao diện và giải toán
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
namespace VD1
{
public partial class Form1 : Form
{
string RxString, TxString;
82
int number1, number2, number3;
double X = 0, Y = 0, Z = 0;
double goc1=0, goc2=0, goc3=-118;
double L1 = 240, L2 = 260, L3 = 170;
string selectedAngle;
public Form1()
{
InitializeComponent();
//int index=1;
//List<KeyValuePair<string, string>> data = new List<KeyValuePair<string,
string>>();
comboBox1.DataSource = null;
comboBox1.Items.Clear();
foreach (string s in SerialPort.GetPortNames())
{
Com.BaudRate = 9600;
Com.PortName = s;
}
comboBox1.Sorted = true;
if (comboBox1.Items.Count > 0)
comboBox1.SelectedIndex = 0;
// Bind the combobox
//comboBox1.DataSource = new BindingSource(data, null);
//comboBox1.DisplayMember = "Value";
//comboBox1.ValueMember = "Key";
83
comboBox2.SelectedIndex = comboBox2.Items.Count - 1;
txt_Goc1.ReadOnly = true;
txt_Goc2.ReadOnly = true;
txt_Goc3.ReadOnly = true;
txt_L1.Text = L1.ToString();
txt_L2.Text = L2.ToString();
txt_L3.Text = L3.ToString();
//Nhap Cac khau
listView1.View = View.Details;
listView1.GridLines = true;
listView1.FullRowSelect = true;
rd_Goc1.Select();
selectedAngle = "GOC1";
goc1 = goc2 = 0;
84
goc3 = -118;
txt_Goc1.Text = goc1.ToString();
txt_Goc2.Text = goc2.ToString();
txt_Goc3.Text = goc3.ToString();
GocSangToado();
}
}
else
{
if (!GocSangToado()) return;
}
if (Com.IsOpen == true)
{
truyenCom();
}
else
{
MessageBox.Show("Kết nối với cổng Com trước khi truyền lệnh!");
}
}
85
private void btn_Conect_Click(object sender, EventArgs e)
{
if (btn_Conect.Text == "Connect")
{
Com.BaudRate = 9600;
if (comboBox1.Text.ToString() == "")
return;
Com.PortName = comboBox1.Text.ToString();
try
{
Com.Open();
}
catch (Exception)
{
};
if (Com.IsOpen == true)
{
btn_Conect.Text = "Disconect";
if (Com.IsOpen == false)
{
86
{
try
{
Com.Close();
}
catch (Exception)
{
MessageBox.Show("Error Close.");
};
}
if (Com.IsOpen == false)
{
btn_Conect.Text = "Connect";
}
}
}
87
try
{
X = Convert.ToInt32(txt_X.Text);
}
catch (FormatException)
{
MessageBox.Show("Hãy tọa độ X");
return false;
}
try
{
Y = Convert.ToInt32(txt_Y.Text);
}
catch (FormatException)
{
MessageBox.Show("Hãy tọa độ Y");
return false;
}
try
{
Z = Convert.ToInt32(txt_Z.Text);
}
catch (FormatException)
{
MessageBox.Show("Hãy tọa độ Z");
return false;
}
88
if (X > 0 && Y >= 0)
{
goc1 = (int)(Math.Atan(Y / X) * 180 / Math.PI);
}
else if (X <= 0 && Y > 0)
{
goc1 = (int)(Math.Atan(Math.Abs(X) / Math.Abs(Y)) * 180 / Math.PI) + 90;
}
else if (X <= 0 && Y < 0)
{
goc1 = (int)(-Math.Atan(Math.Abs(X) / Math.Abs(Y)) * 180 / Math.PI) - 90;
}
else if (X > 0 && Y <= 0)
{
goc1 = (int)(-Math.Atan(Math.Abs(Y) / Math.Abs(X)) * 180 / Math.PI);
}
89
//Tinh goc phi 3
tmpB = Math.Pow(L2, 2) + Math.Pow(L3, 2) - Math.Pow(L1 - Z, 2) -
Math.Pow(x1, 2);
tmpC = 2 * L2 * L3;
goc3 = (int)((Math.Acos(tmpB / tmpC) * 180 / Math.PI)) - 180;
if (L1 < Z)
goc3 = -goc3;
txt_Goc2.Text = goc2.ToString();
txt_Goc1.Text = goc1.ToString();
txt_Goc3.Text = goc3.ToString();
return true;
}
try
{
goc1 = Int32.Parse(txt_Goc1.Text) * Math.PI / 180;
}
90
catch (FormatException)
{
MessageBox.Show("Hãy nhập góc 1");
return false;
}
try
{
goc2 = Int32.Parse(txt_Goc2.Text) * Math.PI / 180;
}
catch (FormatException)
{
MessageBox.Show("Hãy nhập góc 2");
return false;
}
try
{
goc3 = (Int32.Parse(txt_Goc3.Text)) * Math.PI / 180;
}
catch (FormatException)
{
MessageBox.Show("Hãy nhập góc 3");
return false;
}
91
X = (int)(Math.Cos(goc1) * (L3 * Math.Cos(goc2 + goc3) + L2 *
Math.Cos(goc2)));
Y = (int)(Math.Sin(goc1) * (L3 * Math.Cos(goc2 + goc3) + L2 *
Math.Cos(goc2)));
Z = (int)(L3 * Math.Sin(goc2 + goc3) + L2 * Math.Sin(goc2) + L1);
txt_X.Text = ((int)X).ToString();
txt_Y.Text = ((int)Y).ToString();
txt_Z.Text = ((int)Z).ToString();
goc1 = Int32.Parse(txt_Goc1.Text);
goc2 = Int32.Parse(txt_Goc2.Text);
goc3 = Int32.Parse(txt_Goc3.Text);
return true;
}
txt_Goc1.ReadOnly = true;
txt_Goc2.ReadOnly = true;
txt_Goc3.ReadOnly = true;
}
else
{
txt_X.ReadOnly = true;
92
txt_Y.ReadOnly = true;
txt_Z.ReadOnly = true;
txt_Goc1.ReadOnly = false;
txt_Goc2.ReadOnly = false;
txt_Goc3.ReadOnly = false;
}
}
93
else if (selectedAngle == "GOC2")
{
if (Math.Abs(goc2) < 180)
goc2++;
}
else if (selectedAngle == "GOC3")
{
if (Math.Abs(goc3) < 180)
goc3++;
}
txt_Goc1.Text = goc1.ToString();
txt_Goc2.Text = goc2.ToString();
txt_Goc3.Text = goc3.ToString();
}
94
txt_Goc1.Text = goc1.ToString();
txt_Goc2.Text = goc2.ToString();
txt_Goc3.Text = goc3.ToString();
}
if (!GocSangToado()) return;
}
private void btn_Reset_Click(object sender, EventArgs e)
{
goc1 = goc2 = 0;
goc3 = -118;
txt_Goc1.Text = goc1.ToString();
txt_Goc2.Text = goc2.ToString();
95
txt_Goc3.Text = goc3.ToString();
}
else
{
if (!GocSangToado()) return;
}
if (Com.IsOpen == true)
{
truyenCom();
}
}
}
else
Com.Write("+");
Com.Write(Math.Abs(goc1).ToString().PadLeft(3, '0'));
96
System.Threading.Thread.Sleep(100);
Com.Write(",");
System.Threading.Thread.Sleep(100);
if (goc2 < 0)
{
Com.Write("-");
}
else
Com.Write("+");
Com.Write(Math.Abs(goc2).ToString().PadLeft(3, '0'));
System.Threading.Thread.Sleep(100);
Com.Write(",");
System.Threading.Thread.Sleep(100);
if (goc3 < 0)
{
Com.Write("-");
}
else
Com.Write("+");
Com.Write(Math.Abs(goc3).ToString().PadLeft(3, '0'));
System.Threading.Thread.Sleep(100);
Com.Write(".");
}
97
{
if(Com.IsOpen==true)
{
goc1 = (int)Int32.Parse(listView1.Items[i].SubItems[1].Text);
goc2 = (int)Int32.Parse(listView1.Items[i].SubItems[2].Text);
goc3 = (int)Int32.Parse(listView1.Items[i].SubItems[3].Text);
truyenCom();
System.Threading.Thread.Sleep(3000);//delay 3S
}
else
{
MessageBox.Show("Kết nối với cổng Com trước khi truyền lệnh!");
}
}
}
}
}
98
}
}
}
99