MỤC LỤC
GIỚI THIỆU:
1. Nhận xét của giáo viên hướng dẫn.
2. Nhận xét của giáo viên phản biện.
3. Mục lục.
PHẦN A: MỞ ĐẦU 1
PHẦN B: NỘI DUNG 3
Chương 1: Cở sở lý thuyết . 4.
1.1 Lý thuyết PLC S7-200 . 4
1.1.1 Giới thiệu PLC S7-200 4
1.1.2 Bộ nhớ PLC S7-200 . 6
1.1.3 Bộ điều rộng xung (PTO/PWM) . 7
1.1.4 Bộ đếm xung tốc độ cao 11
1.2 Tổng quan về Robot 18
1.2.1 Lịch sử phát triển 18
1.2.2 Hệ thống Robot 20
1.2.3 Phân loại Robot 20
1.2.4 Các khái niệm cơ bản . 22
1.3 Khảo sát tay máy 3 bậc tự do 29
1.3.1 Quy tắc Denavit-Hartenberg 29
1.3.2 Động học và động lực học thuận 30
1.3.3 Động học ngược . 39
1.4 Ứng dụng MATLAB 41
1.4.1 Xử lý ảnh trong MATLAB 41
1.4.2 OPC Toolbox . 50
1.5 Sơ lược các bộ truyền động 55
1.5.1 Bộ truyền động bánh răng thẳng . 55
1.5.2 Bộ truyền động bánh vít 56
1.6 Động cơ DC 57
1.6.1 Cấu tạo 57
1.6.2 Nguyên tắc hoạt động 58
1.6.3 Các phương pháp điều khiển . 58
1.7 Rotary Encoder . 59
1.7.1 Cấu tạo . 59
1.7.2 Nguyên tắc hoạt động 60
1.8 Van khí nén . 61
1.9 Xi lanh khí nén . 62
Chương 2: Thiết kế và thi công phần cứng 63
2.1 Thiết kế mạch . 63
2.1.1 Mạch nguồn 63
2.1.2 Mạch chuyển đổi áp . 64
2.1.3 Mạch công suất . 64
2.1.4 Mạch đảo chiều động cơ 65
2.1.5 Mạch lấy tín hiệu xung Encoder . 65
2.1.6 Relay đóng mở van khí 66
2.2 Thông số khâu, khớp của tay máy 68
2.2.1 Thông số khâu 68
2.2.2 Góc ban đầu 68
2.2.3 Thông số encoder . 68
2.2.4 Cách tính xung từ góc của khớp . 68
2.3 Thi công 69
2.3.1 Mạch điều khiển . 69
2.3.2 Hộp điều khiển . 70
2.3.3 Không gian làm việc 70
2.3.4 Tay máy . 71
Chương 3: Xây dựng phần mềm 72
3.1 Lưu đồ giải thuật cho toàn hệ thống . 72
3.2 Lưu đồ giải thuật cho xử lý ảnh 73
3.3 Lưu đồ giải thuật cho chương trình PLC 74
3.3.1 Lưu đồ giải thuật cho chương trình chính 74
3.3.2 Lưu đồ giải thuật cho chương trình con . 75
3.4 Giao diện điều khiển bằng MATLAB 77
PHẦN C: ĐÁNH GIÁ VÀ KẾT LUẬN . 78
Phụ lục . 80
Tài liệu tham khảo . 110
T
rong thời đại ngày nay, ngành công nghiệp đóng vai trò quan trọng trong nền kinh tế. Từ những ngành như sản xuất, chế biến lương thực thực phẩm, nước uống cho đến các ngành công nghệ chế tạo máy, công nghệ chế tạo ôtô, các ngành công nghệ cao v.v Tất cả những ngành đó có được hiệu quả kinh tế cao không ít nhờ vào các hệ thống sản xuất tự động, những Robot tự động, những tay máy công nghiệp, chúng đã thay thế sức lao động con người một cách hiệu quả nhất. Robot được sử dụng rộng rãi từ những nơi mà môi trường có tính độc hại, nguy hiểm, độ chính xác cao trong công nghiệp cho đến các công việc hằng ngày. Do vậy Robot có tầm quan trọng rất lớn và là một trong những lĩnh vực nghiên cứu hàng đầu trong thời đại ngày nay.
Là sinh viên chuyên ngành điện tử tự động, để bổ sung những kiến thức đã học cũng như nghiên cứu những vấn đề mới trong lĩnh vực điều khiển nên chúng em quyết định chọn đề tài “Điều khiển tay máy 3 bậc tự do dùng thị giác máy tính”. Thông qua luận văn chúng em sẽ khảo sát, nghiên cứu và điều khiển tay máy 3 bậc tự do để gắp vật cố định trên mặt phẳng nhờ sự trợ giúp bởi Camera xác định tọa độ vật.
Để điều khiển tay máy có thể dùng vi xử lý, vi điều khiển hoặc PLC kết hợp với mạch công suất, mạch cảm biến . Song thực tế cho thấy nếu xử lý ảnh dùng Camera số bằng vi điều khiển hoặc PLC thì rất khó thực hiện, tốc độ xử ảnh chậm và giá thành cao. Chúng em đã chọn phương pháp dùng máy tính để xử lý ảnh và điều khiển tay máy thông qua PLC. Mọi việc dễ dàng hơn nhiều và MATLAB trở thành phần mềm hữu hiệu để thực hiện theo cách trên. MATLAB tích hợp nhiều công cụ cho nhiều lĩnh vực trong đó có hai Toolbox cần thiết là: Image Processing Toolbox cho việc xử lý ảnh và OPC Toolbox cho việc kết nối PLC.
Mặc dù đã cố gắng hoàn thành luận văn đúng thời hạn nhưng trong quá trình thực hiện không tránh khỏi những thiếu sót. Chúng em rất mong nhận được sự đóng góp ý kiến từ quý Thầy cô và các bạn để đề tài của chúng em ngày càng hoàn thiện hơn.
111 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 2973 | Lượt tải: 5
Bạn đang xem trước 20 trang tài liệu Điều khiển tay máy ba bậc tự do dùng thị giác máy tính, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
atlab OPC Client chúng ta cần phải chọn Server, sau đó click chuột phải vào menu Create Client. Kết quả như hình dưới đây:
Để tương tác với PLC thông qua các biến, trước hết ta phải tạo trong PC Access các biến cần sử dụng. Sau đó OPC Toolbox sẽ liên kết các biến đó thông qua PC Access.
Các biến đã được Add vào Client thì có thể truy cập với bit nhớ, ô nhớ hay thanh ghi trong PLC. Ta có thể ghi, đọc hoặc thu thập dữ liệu thông qua các biến đó. Tuy nhiên thông thường các chương trình điều khiển bằng MATLAB đều có giao diện để giao tiếp dễ dàng. Các giao diện này có thể tạo bằng M – file hoặc GUI của MATLAB. Do vậy ta vẫn có thể sử dụng OPC Toolbox thông qua các hàm đặc trưng, các biến trong MATLAB điều có thể tương tác với các biến trong OPC Toolbox. Việc này giúp cho việc tạo giao diện điều khiển thiết bị dùng PLC bằng MTALAB trở nên dễ dàng.
Các hàm cơ bản của OPC Toolbox :
* Tạo một Object kết nối với Server
Object name = opcda( ‘locallhost’, ‘OPC Client Name’)
VD: da = opcda(‘locallhost’, ‘S7200.OPCServer’)
* Kết nối với Server:
Connect( Object name)
VD: Connect(da)
* Ngừng kết nối với server:
Disconnect( Object name)
VD: Disconnect( da)
* Tạo một nhóm để quản lý các biến:
grp1 =addgroup( Object name)
VD: grp1 =addgroup(da)
* Tạo biến trong một nhóm :
Tên biến = additm( Group name, ‘biến truy cập trên Server’)
VD: itm1 = additm(grp1,McroWin.s7200.Start)
* Xóa một Object:
Delete ( object name)
VD: Delete ( da)
* Lưu một Object vào Workspace của Matlab:
Save myopc “Oblect name”
* Tải lên một Object:
Load myopc
* Ghi dữ liệu vào một biến:
Write ( tên biến, giá trị của biến)
* Đọc dữ liệu một biến:
Read ( tên biến)
* Ghi dữ liệu vào một biến:
Writeasync ( tên biến, giá trị của biến)
* Đọc dữ liệu bất đồng bộ một biến:
Readasync ( tên biến)
1.5 Sơ lược các bộ truyền động:
1.5.1 Bộ truyền động bánh răng:
1.5.1.1 Công dụng:
Bộ truyền bánh răng thẳng dùng để truyền chuyển động quay giữa hai trục song song. Qua bộ truyền bánh răng thẳng momen quay của trục tác động sẽ được tăng lên hoặc giảm xuống tùy thuộc vào tỷ số truyền của bánh răng.
Hình 1.27: Bộ truyền động bánh răng.
1.5.1.2 Ưu điểm – Nhược điểm:
Ưu điểm:
- Kích thước nhỏ, khả năng tải lớn.
- Tỷ số truyền không đổi do hiện tượng trơn trợt.
- Hiệu suất cao có thể đạt 0,97 đến 0,99.
- Làm việc với vận tốc lớn.
- Tuổi thọ cao.
Nhược điểm:
- Chế tạo tương đối phức tạp.
- Đòi hỏi độ chính xác cao.
- Phát ra nhiều tiếng ồn khi hoạt động.
1.5.1.3 Tỷ số truyền:
Trong hệ thống truyền động dùng bánh răng thì tỷ số truyền của bộ bánh răng là quan trọng nhất vì nó quyết định đến tốc độ quay, momen quay của bánh răng thứ cấp. Sau đây là công thức tính tỷ số truyền:
Trong đó: n1,n2 là tốc độ của bánh răng 1 và 2.
z1,z2 là số răng của bánh răng 1 và 2.
1.5.2 Bộ truyền động trục vít bánh vít:
1.5.2.1 Công dụng:
Bộ truyền trục vít – bánh vít gọi tắt là bộ truyền trục vít được xếp vào loại răng và vít. Bộ truyền trục vít dùng để truyền chuyển động và công suất cho hai trục chéo nhau. Thông thường hai trục lệch nhau 900. Đặc điểm quan trọng là bộ truyền trục vít có khả năng tự hãm.
Bánh vít
Trục vít
Hình 1.28: Bộ truyền động trục vít – bánh vít.
Phân loại trục vít theo dạng mặt chia có hai loại: trục vít trụ ( mặt chia trục vít là mặt trụ) và trục vít Globoid (mặt chia lõm). Phân loại theo trục ren thì chia thành 3 loại: trục vít Archimede, trục vít Convolute và trục vít thân khai. Đối với bộ truyền trục vít truyền động thì số mối ren z = 1,2,4. Số mối ren càng ít thì khả năng tự hãm càng cao.
1.5.2.2 Ưu điểm – Nhược điểm:
Ưu điểm: tỷ số truyền lớn, làm việc êm, không ồn, có khả năng tự hãm và có chính xác động học cao.
Nhược điểm:
- Hiệu suất thấp, sinh nhiệt nhiều do vận tốc trược lớn.
- Vật liệu chế tạo bánh vít làm bằng kim loại màu nên đắt tiền.
- Phát ra nhiều tiếng ồn khi hoạt động.
1.5..2.3 Tỷ số truyền:
Khi trục vít quay một vòng thì bánh vít sẽ quay một góc bằng z1 lần của góc 2π/z2. Để bánh vít quay một vòng thì trục vít phải quay 2π/(2πz1/z2) = z2/z1 vòng, nên:
Với: z1: số đầu mối của trục vít.
z2 : số răng của bánh vít.
1.6 Động cơ DC:
1.6.1 Cấu tạo:
Động cơ DC là động cơ điện hoạt động với dòng điện một chiều. Động cơ điện DC ứng dụng rộng rãi trong đời sống cũng như công nghiệp bởi lý do dễ điều khiển, hiệu suất cao, “momen” lớn. Trong công nghiệp, động cơ điện một chiều được sử dụng ở những nơi yêu cầu “momen” mở máy lớn hoặc yêu cầu thay đổi tốc độ trong phạm vi rộng.
Hình 1.29: Động cơ DC
Một động cơ DC có 6 phần cơ bản:
1. Phần ứng hay Rotor (Armature).
2. Cổ góp (Commutat).
3. Nam châm tạo từ trường hay Stator (field magnet).
4. Chổi than (Brushes).
5. Trục motor (Axle).
6. Bộ phận cung cấp dòng điện DC.
1.6.2 Nguyên tắc hoạt động:
Hình dưới mô tả nguyên tắc hoạt động của động cơ DC. Dòng điện chạy qua khung dây sinh ra từ trường. Theo nguyên tắc bàn tay trái lực từ làm cho khung dây quay một góc 900. Khi roto quay được một góc 900 thì lực từ không còn tác dụng là “momen” quay nữa, nhưng do quán tính làm cho roto quay thêm một góc nhỏ nữa. Roto liên tục và đúng chiều là do bộ cổ góp điện sẽ làm chuyển mạch dòng điện sau mỗi vị trí ứng với 1/2 chu kỳ.
Trong các máy điện một chiều lớn, người ta có nhiều cuộn dây nối ra nhiều phiến góp khác nhau trên cổ góp. Nhờ vậy dòng điện và lực quay được liên tục và hầu như không bị thay đổi theo các vị trí khác nhau của Roto.
Hình 1.29: Nguyên lý hoạt động của đông cơ DC
1.6.3 Các phương pháp điều khiển:
Có nhiều cácnh để điều khiển tốc độ động cơ DC như bằng phương pháp thay đổi điện áp, thay đổi từ thông hoặc phương pháp điều chỉnh độ rộng xung (PWM). Trong cánh tay máy thì chúng em chọn phương pháp điều khiển bằng cách thay đổi độ rộng xung. Chọn phương pháp này vì chúng dễ thực hiện, mạch cấu tạo đơn giản.
Vhi
Vlo
b
a
t
Hình 1.30: Điều khiển động cơ bằng PWM
Khi tỷ lệ thời gian "on" trên thời gian "off" thay đổi sẽ làm thay đổi điện áp trung bình (VAVG). Tỷ lệ phần trăm thời gian "on" trong một chu kỳ chuyển mạch nhân với điện áp cấp nguồn sẽ cho điện áp trung bình đặt vào động cơ. Như vậy với điện áp nguồn cung cấp là 100V, và tỷ lệ thời gian ON là 25% thì điện áp trung bình là 25V. VAV thay đổi từ VL đến VH tùy theo các độ rộng Ton và Toff
1.7 Rotary Encoder:
1.7.1 Cấu tạo:
Một Encoder thông thường gồm 1 hay nhiều bộ phát và thu nhận ánh sáng. Phần thu thường là photodiotde hoặc phototransistor, một đĩa chắn quang có khoét lỗ gắn trên trục quay đặt giữa bộ phát và thu, thông thường trục quay này sẽ được gắn với trục quay của đối tượng cần đo tốc độ. Encoder thường có các dây sau:
– Dây cấp nguồn cho encoder, thường là +5V DC.
– Dây nối đất (GND).
– Dây pha A – tín hiệu ra theo độ phân giải.
– Dây pha B – tín hiệu ra theo độ phân giải. Hai pha A và B lệch pha nhau 1 góc 90 độ. Do đó có thể xác định chiều quay của Encoder thông sự trễ sớm pha của hai pha lẫn nhau
Hình 1.31: Cấu tạo cơ bản của Encoder.
1.7.2 Nguyên tắc hoạt động:
Nguyên tắc hoạt động của Encoder dựa vào tín hiệu có hoặc không của ánh sáng tại phần thu (phototransistor). Khi Encoder quay, ánh sáng luân phiên chiếu qua các rãnh trên đĩa Encoder. Khi ánh sáng qua rãnh, phototransistor được tích cực, khi đến vị trí bị chắn ánh sáng phototransistor thụ động trở lại. Quá trình này tạo ra xung tại chân ra của phototransistor. Xung này chưa vuông, người ta phải thông qua mạch nắn tạo ra xung vuông như ý muốn. Hai pha A và B đặt lệch nhau 90 độ. Khi quay theo chiều này thì pha A sớm pha hơn pha B. Nhưng khi quay chiều ngược lại thì pha B sớm hơn pha A. Thông qua sự sớm và trễ pha ta có thể xác định chiều quay của Enocder.
A
B
900
* Trường hợp quay thuận: pha B sớm pha hơn pha A
A
B
*Trường hợp quay nghịch: pha A sớm pha hơn pha B
A
B
1.8 Van khí nén:
Van khí nén dùng trong tay máy có nhiệm vụ thay đổi dòng khí vào xi lanh của tay kẹp. Van sử dụng là van đảo chiều. Có nhiều loại van đảo chiều như: van 2/2, van 3/2, van 4/2, van 5/2, 4/3, van 5/3. Tuy nhiên do cơ cấu xi lanh tay kẹp đơn giản nên chúng em dùng van đảo chiều 5/2. Trong loại van này thì cửa P là cửa cung cấp năng lượng, cửa A lắp vào bên trái của cơ cấu chấp hành, cửa B lắp vào bên phải của cơ cấu chấp hành. Cửa T và cửa R là cửa xả năng lượng. Khi con trược van di chuyển qua cửa phải, cửa P thông với cửa A, cửa B thông với cửa T. Khi con trược di chuyển qua cửa trái, cửa P thông với cửa B, cửa A thông với cửa R.
Hình 1.32 : Cấu tạo van đảo chiều 5/2.
Hình 1.33: Van đảo chiều trong thực tế.
1.9 Xi lanh khí nén:
Xi lanh dùng trong tay kẹp là loại xi lanh 2 chiều. Cấu tạo của xi lanh 2 chiều được thể hiện như hình dưới:
Hình 1.34: Cấu tạo và nguyên tắc hoạt động của xi lanh hai chiều.
Nguyên tắc hoạt động của xi lanh 2 chiều:
- Không cho khí vào xi lanh thì pitton có thể ở vị trí bất kỳ.
- Khí vào 1 ra 2: pitton bị đẩy ra.
- Khí vào 2 ra 1: pitton bị đẩy vào.
Hình1.10 : Xi lanh 2 chiều trong thực tế
CHƯƠNG 2: THIẾT KẾ VÀ THI CÔNG PHẦN CỨNG
2.1 Thiết kế mạch:
2.1.1 Mạch nguồn:
Khối nguồn phải đáp ứng các yêu cầu sau:
- 5V cấp cho encoder hoạt động với điện áp DC ổn định.
- 12V cấp cho việc khiển relay và bộ phận kích dẫn FET(IRF540) để khiển motor hoạt động.
- 24V cấp nguồn cho PLC và cấp cho động cơ, van khí.
Sơ đồ nguyên lí của khối nguồn:
Hình 2.1: Sơ đồ nguyên lý mạch nguồn.
Trong đó:
J1 là ngõ vào 24V (DC).
J2, J3 là các ngõ ra. J2 là ngõ ra áp 12V và 24V. J3 là ngõ ra áp 12V và 5V(VCC).
2.1.2 Mạch chuyển đổi điện áp :
PLC hoạt động ở điện áp 24V DC nhưng mạch công suất hoạt động ở 12V DC và Encoder đọc tín hiệu xung hoạt động ở 5V DC. DO vậy để giao tiếp giữa chúng với nhau cần phải có mạch chuyển áp. Linh kiện cơ bản của mạch là Opto quang.
Sơ đồ nguyên lí:
Hình 2.2 : Sơ đồ mạch chuyển áp.
2.1.3 Mạch công suất:
Hình 2.3: Sơ đồ mạch công suất.
Đây là một phần mạch công suất tiếp nhận tín hiệu từ PLC để khiển motor. Có thể hoạt động theo ON/OFF hoặc điều xung. Đảo chiều động cơ nhờ role.
Chế độ ON/OFF: khi PLC cấp 24V ở PWM1 thì opto dẫn làm cho P1 là 12Và D468 dẫnà tín hiệu IRF1 là 12V làm cho IRF540 dẫn và ngõ ra motor có áp là 24V.
24V
0
Ton
Toff
T
Chế độ điều xung: xung ngõ ra PLC đưa vào tín hiệu PWM1:
Xung ngõ ra ở tín hiệu P1:
12V
0
Xung ngõ ra ở motor:
24V
0
2.1.4 Mạch đảo chiều động cơ:
Cấu tạo bên trong của ULN 2803:
ULN2803 được cấu tạo bên trong giống như một transistor NPN darlington có Emiter nối GND, Colector là ngõ ra, và Base là ngõ vào. Chỉ có tác dụng đảo mức 1 thành 0. Còn muốn đảo mức 0 thành 1 thì phải có điện trở kéo lên bên ngoài.
Hình 2.4: Cấu tạo ULN 2803
Khi PLC cấp 24V vào tín hiệu ROLE1, opto sẽ dẫnà tín hiệu RL1 là 12V, qua ULN2803 đảo thành 0V, làm role dẫn, và điện áp của động cơ sẽ được đảo ngược à động cơ đảo chiều.
2.1.5 Mạch lấy tín hiệu xung từ encoder đưa vào PLC:
Sơ đồ mạch:
Hình 2.5: Sơ đồ mạch lấy tín hiệu xung Encoder.
Vì encoder có áp sử dụng là 5V, nên ngõ ra là tín hiệu xung 5V. Ta dùng opto để chuyển tín hiệu xung 5V của encoder thành tín hiệu xung 24V cấp cho PLC.
Khi xung encoder mức 0(0V) làm cho opto dẫn, và tín hiệu EN1 ngõ ra là 24V, và ngược lại khi xung encoder mức 1(5V) thì opto không dẫn, EN1 sẽ là 0V. EN1 là tín hiệu đưa vào PLC.
2.1.6 Relay đóng mở van khí:
Công tắc van khí sử dụng áp là 24V. Nên ta dùng một role để khiển. Khi role đóng tác động van khí và tay kẹp sẽ gắp vật, còn khi role không dẫn tác động van khí và tay kẹp sẽ nhả vật.
Tóm tắt kết nối phần cứng: Kết nối từ PLC đến encoder, mạch công suất:
J2, J3, J5, J6 là các jumper 4 kết nối tới các encoder. Và J7 là ngõ ra sau khi chuyển đổi tín hiệu xung 5V của encoder thành 24V nhờ opto và đưa vào PLC theo các chân:
I0.0, I0.1 cho HSC0 encoder của khâu đế
I0.3, I0.4 cho HSC4 encoder của khâu 1
I0.6, I0.7 cho HSC1 encoder của khâu 2
I1.2, I1.3 cho HSC2 encoder của khâu 3( mở rộng cho cánh tay 4 khâu).
J4 là jumper 10 kết nối tới ngõ ra của PLC. Lần lượt là:
PWM1 chân Q0.0
PWM2 chân Q0.1
PWM3 chân Q0.2
PWM4 chân Q0.3
ROLE1 chân Q0.4
ROLE2 chân Q0.5
ROLE3 chân Q0.6
ROLE4 chân Q0.7
VAN chân Q1.0
J8 là jumper 10 kết nối tới mạch công suất để khiển motor và van khí.
2.2 Thông số khâu, khớp của tay máy
2.2.1 Thông số tay máy:
Khâu 1: L1 = 12.5 cm
Khâu 2: L2 = 20 cm
Khâu 3: L3 = 33 cm
2.2.2 Góc ban đầu của các khâu:
Góc 1 : 0 độ
Góc 2 : 178 độ
Góc 3 : 27 độ
2.2.3 Thông số xung encoder của các khớp:
Encoder khớp 1 : 200 xung
Encoder khớp 2 : 100 xung
Encoder khớp 3 : 100 xung
2.2.4 Cách tính xung từ các góc của khớp:
Vì PLC sử dụng đếm counter ở chế độ 4x nên encoder 200 xung sẽ trở thành encoder 800 xung.
Ta có:
800 xung ứng với 360 độ.
Nên khi có góc thì ứng với số xung là: số xung =
Tương tự với encoder 100 xung thì: số xung =
2.3 Thi công:
2.3.1 Mạch điều khiển:
Hình 2.6: Layout mạch điều khiển.
Hình 2.7: Mạch điều khiển.
2.3.2 Hộp điều khiển:
Hình 2.7:Hộp điều khiển.
2.3.3 Không gian làm việc:
Hình 2.8 : Không gian làm việc của tay máy.
2.3.4 Tay máy:
Hình 2.9 : Hình tay máy.
CHƯƠNG 3: XÂY DỰNG PHẦN MỀM.
3.1 Lưu đồ giải thuật cho toàn hệ thống:
START
Xác định tâm của vật cần gắp.
Xác định tọa độ của vật trong hệ quy chiếu.
Giải động học ngược
Truyền dữ liệu cho PLC
Thực hiện gắp vật
Thực hiện đặt vật
Trở về vị trí ban đầu
END
3.2 Lưu đồ giải thuật cho xử lý ảnh:
START
Lấy ảnh từ Camera
Chuyển từ ảnh màu sang ảnh xám
Loại bỏ những điểm trắng nhỏ
Chuyển từ ảnh xám sang ảnh nhị phân
Lấp đầy lỗ trống
Lấy biên vật.
Lấy tâm vật dựa vào biên đã xác định.
RUN = 1?
END
Y
N
Hiển thị kết quả.
Chương trình xử lý ảnh dùng để tìm tâm vật cần gắp, từ đó lấy tọa độ tâm của vật cần gắp trong khung ảnh. Sau khi lấy tọa độ tâm vật ta chuyển tọa độ đó thành tọa độ so với tay máy.
3.3 Lưu đồ giải thuật cho chương trình PLC:
3.3.1 Lưu đồ giải thuật cho chương trình chính:
START
KHỞI TẠO COUNTER
KHỞI TẠO ĐIỂU XUNG
NẠP GIÁ TRỊ BAN ĐẦU CHO BIẾN,BIT
LOAD GIÁ TRỊ ĐIỀU XUNG
LẤY GIÁ TRỊ COUNTER
CHUYỂN ĐỔI CÁC GIÁ TRỊ
START=1?
Y
N
MANUAL=0?
Y
N
ĐIỀU KHIỂN BẰNG TAY
END
CONTROL=10?
Y
RESET COUNTER
CONTROL=11?
N
Y
VITRI_BANDAU
N
CHẠY GẮP VẬT
3.3.2 Lưu đồ giải thuật cho chương trình con
3.3.2.1 Chương trình con quay về vị trí ban đầu:
START
CÔNG TẮC 1=1?
+
-
TẮT MOTOR1, ROLE1
BẬT MOTOR1, ROLE1
CÔNG TẮC 2=1?
+
-
TẮT MOTOR2, ROLE2
BẬT MOTOR2, ROLE2
CÔNG TẮC 3=1?
+
-
TẮT MOTOR3, ROLE3
BẬT MOTOR3, ROLE3
END
3.3.2.2 Chương trình con khởi tạo Motor:
START
KHỞI TẠO ĐIỀU XUNG Q0.0
KHỞI TẠO ĐIỀU XUNG Q0.1
END
3.3.2.3 Chương trình con Reset các Byte sử dụng:
START
END
CHO CÁC BYTE LƯU GIÁ TRỊ HSC =0.
CHO CÁC BYTE LƯU GIÁ TRỊ GẮP VẬT CỦA KHÂU 1,2,3 =0.
CHO CÁC BYTE LƯU GIÁ TRỊ ĐẬT VẬT CỦA KHÂU 1,2,3 =0.
CHO CÁC BYTE LƯU GIÁ TRỊ NĂNG =0.
CHO CÁC BYTE LƯU GIÁ TRỊ ĐIỀU KHIỂN =0.
3.3.2.4 Chương trình con reset Counter:
START
END
KHỞI TẠO LẠI COUNTER 1 (ĐẾM ENCODER KHÂU 3)
KHỞI TẠO LẠI COUNTER 4 (ĐẾM ENCODER KHÂU 2)
KHỞI TẠO LẠI COUNTER 0 (ĐẾM ENCODER KHÂU 1)
3.3.2.5 Chương trình con dừng Motor:
START
END
XÓA BIT MOTOR, RELAY
XÓA BIT CHẠY TRONG CHƯƠNG TRÌNH
XÓA BIT ĐIỀU XUNG
3.4 Giao diện điều khiển bằng MATLAB:
PHẦN C
1. Đánh giá:
- Luận văn hoàn thành đúng thời hạn và đạt được yêu cầu đặt ra.
- Thi công phần cứng gọn gàng, mạch hoạt động ổn định đáp ứng yêu cầu của luận văn. Khi tay máy hoạt động mặc dù vấn đề điều khiển vẫn chưa thực sự tối ưu nhưng tay máy vẫn gắp được vật.
2. Kết luận:
Đề tài này không phải là một đề tài dễ, vì có nhiều bài toán cần phải giải quyết trong một thời gian ngắn. Với kết quả đạt được thì có thể xem như cơ bản giải quyết các vấn đề cốt lõi, nhưng cần phát triển hơn nữa.
Sau khi hoàn thành luận văn, chúng em đã học tập được rất nhiều nhiều kiến thức về PLC, lý thuyết về tay máy robot, về xử lý ảnh v.v… Chúng sẽ là hành trang quý báu cho chúng em ra trường và công việc sau nay.
3. Hướng phát triển đề tài:
Mặc dù luận văn hoàn thành mục tiêu đề ra nhưng để ứng dụng thực tế thì còn khoảng cách rất lớn, do vậy cần phải phát triển các vấn đề sau:
- Điều khiển tối ưu lộ trình của tay máy.
- Sử dụng cảm biến góc với độ phân giải cao hơn và kết cấu cơ khí tốt hơn để táy máy khi hoạt động ít bị sai số góc.
- Thiết kế và điều khiển tay máy với số bậc tự do lớn 3 bậc, bởi vì với 3 bậc tự do tay máy không đáp ứng được yêu cầu thực tế cho nhiều ứng dụng.
- Xử lý ảnh cần phải tốt hơn, loại bỏ được nhiễu do ánh sáng và màu nền gây ra.
PHỤ LỤC
1. Code chương trình MATLAB:
function varargout = arm(varargin)
% ARM M-file for arm.fig
% ARM, by itself, creates a new ARM or raises the existing
% singleton*.
%
% H = ARM returns the handle to a new ARM or the handle to
% the existing singleton*.
%
% ARM('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in ARM.M with the given input arguments.
%
% ARM('Property','Value',...) creates a new ARM or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before arm_OpeningFunction gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to arm_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help arm
% Last Modified by GUIDE v2.5 08-Jul-2009 19:01:33
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;0
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @arm_OpeningFcn, ...
'gui_OutputFcn', @arm_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before arm is made visible.
function arm_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to arm (see VARARGIN)
% Choose default command line output for arm
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes arm wait for user response (see UIRESUME)
% uiwait(handles.figure1);
global val_bright run isconnect l1 l2 l3 x_cen y_cen
global goc1 goc2 goc3 tam1 tam2 tam3 byte_control
global chieu1 byte_cao_ic1 byte_thap_ic1
global chieu2 byte_cao_ic2 byte_thap_ic2
global chieu3 byte_cao_ic3 byte_thap_ic3
global byte_1 byte_2 byte_3 bit_manual
set(handles.Brightness,'Value',0.3);
set(handles.Threshold,'Value', 0.7);
val_bright = get(handles.Brightness,'Value');
set(handles.axes1,'Visible','off');
run = 1 ;
isconnect = 0
l1=13
l2=20
l3=34
goc1=0
goc2=180
goc3=90
tam1=0;
tam2=0;
tam3=0;
bit_manual=0;
byte_control=1;
byte_1=0
byte_2=0
byte_3=0
chieu1=0;
byte_cao_ic1=0;
byte_thap_ic1=0;
%---------------
chieu2=0;
byte_cao_ic2=0;
byte_thap_ic2=0;
%---------------
chieu3=0;
byte_cao_ic3=0;
byte_thap_ic3=0;
%---------------
%save data ;
% --- Outputs from this function are returned to the command line.
function varargout = arm_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
%==================================================
function stringPopup = get_stringPopup(hObject,handles)
val = get(hObject,'Value');
string_list = get(hObject,'String');
stringPopup = string_list{val}; % convert from cell array
% to string
% Function to
function doublePopup = get_doublePopup(hObject,handles)
val = get(hObject,'Value');
string_list = get(hObject,'String');
selected_string = string_list{val}; % convert from cell array
% to string
doublePopup = str2double(selected_string);
% --- Executes on button press in button_ClearTX.
function Brightness_Callback(hObject, eventdata, handles)
global val_bright;
val_bright = get(handles.Brightness,'Value');
% --- Executes during object creation, after setting all properties.
function Brightness_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
% --- Executes on slider movement.
function Threshold_Callback(hObject, eventdata, handles)
function Threshold_CreateFcn(hObject, eventdata, handles)
if isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor',[.9 .9 .9]);
end
function Start_camera_Callback(hObject, eventdata, handles)
global val_bright vidobj run x_cen y_cen
vidobj = videoinput('winvideo');
preview(vidobj);
triggerconfig(vidobj, 'manual');
x = 1;
while (run == 1 )
rad =0;
len =0;
rai =0;
radi =0;
RGB = getsnapshot(vidobj);
I = rgb2gray(RGB);
bw = im2bw(I,val_bright);
bw = bwareaopen(bw,200);
se = strel('disk',1);
bw = imclose(bw,se);
bw = imfill(bw,'holes');
[B,L] = bwboundaries(bw,'noholes');
imshow(label2rgb(L, @jet, [.5 .5 .5]))
hold on;
for k = 1:length(B)
boundary = B{k};
plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
%x=length(B);
end ;
stats = regionprops(L,'Area','Centroid');
%center_obj = stats.Centroid;
for k = 1:length(B)
boundary = B{k};
delta_sq = diff(boundary).^2;
perimeter = sum(sqrt(sum(delta_sq,2)));
area = stats(k).Area;
metric = 4*pi*area/perimeter^2;
if metric > 0.7
imshow(RGB);
centroid = stats(k).Centroid;
plot(centroid(1),centroid(2),'ok','LineWidth',1,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',5);
len =length(boundary);
for count = 1:len
rad(count) = sqrt((boundary(count,1)-centroid(2))^2 + (boundary(count,2)-centroid(1))^2);
end ;
rai =sum(rad );
radi=rai/len;
% set(txt5,'String',radi);
plot(boundary(:,2),boundary(:,1),'g','LineWidth',2);
%rad_string = sprintf('%2.2f',radi);
%metric_string = sprintf('%2.2f',metric);
center_obj = stats.Centroid;
y_cen = center_obj(:,1);
x_cen = center_obj(:,2);
z = center_obj ;
y_cen = round((y_cen - 22)/5.9)-25
x_cen = round((x_cen - 22)/5.9)+17
x_string =sprintf('%2.0f',x_cen);
y_string =sprintf('%2.0f',y_cen);
text(boundary(1,2)-10,boundary(1,1)+35,x_string,'Color','r',...
'FontSize',12,'FontWeight','bold');
text(boundary(1,2)-35,boundary(1,1)+10,y_string,'Color','y',...
'FontSize',12,'FontWeight','bold');
title('ARM ROBOT');
end;
end;
hold off;
pause(0.1e-200);
end ;
% --- Executes on button press in Stop.
function Stop_Callback(hObject, eventdata, handles)
global val_bright vidobj run
run = 0 ;
val_bright1 = num2str(val_bright);
set(handles.edit_y,'String',val_bright1);
stop(vidobj);
delete(vidobj);
% --- Executes on button press in Reset.
function Reset_Callback(hObject, eventdata, handles)
global val_bright
val_bright1 = num2str(val_bright);
set(handles.edit_y,'String',val_bright1);
% --- Executes on button press in Exit.
function Exit_Callback(hObject, eventdata, handles)
close all
function edit_z_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in But_send.
function But_send_Callback(hObject, eventdata, handles)
global s byte_control
global theta1 theta2 theta3 x1 y1 z1 l l1 l2 l3 anpha1 anpha2
global goc1 goc2 goc3 x_cen y_cen run
global chieu1 byte_cao_ic1 byte_thap_ic1
global chieu2 byte_cao_ic2 byte_thap_ic2
global chieu3 byte_cao_ic3 byte_thap_ic3
run = 0 ;
x1=get(handles.edit_x,'string')
y1=get(handles.edit_y,'string')
z1=get(handles.edit_z,'string')
x1=str2num(x1)
y1=str2num(y1)
z1=str2num(z1)
x1 = x_cen;
y1 = y_cen;
z1 = 5;
if((x1^2+y1^2)>0)
%-----------------
theta1=acos(y1/sqrt(x1^2+y1^2))
theta1=theta1*180/pi
theta1=180-theta1
%------------------
l=sqrt(x1^2+y1^2+(l1-z1)^2)
anpha1=acos((l2^2+l^2-l3^2)/(2*l2*l))
anpha2=acos(sqrt(x1^2+y1^2)/l)
anpha1=anpha1*180/pi
anpha2=anpha2*180/pi
if (z1>l1)
theta2=90+anpha1+anpha2
elseif (z1==l1)
theta2=90+anpha1
else
theta2=90+anpha1-anpha2
end
theta3=acos((l2^2+l3^2-l^2)/(2*l2*l3))
theta3=theta3*180/pi
theta1=round(theta1)
theta2=round(theta2)
theta3=round(theta3)
tam1=abs(goc1-theta1)
tam2=abs(goc2-theta2)
tam3=abs(goc3-theta3)
% chuyen goc sang xung
% ti le banh rang khau de : 162/71
% ti le banh rang khau 1:162/71
% ti le banh rang khau 2:7.2
tam1=tam1*200*71/165%19/46;%*200*19/48.5;
tam2=tam2*400*71/162%19/55;% 400*19/ 60
tam3=tam3*100/7.2%11.5; % 100/13
tam1=round(tam1);
tam2=round(tam2);
tam3=round(tam3);
%-------xac dinh chieu--------------
if (theta1>goc1)
chieu1=0;
else
chieu1=1;
end
%------------
if (theta2>goc2)
chieu2=0;
else
chieu2=1;
end
%------------
if (theta3>goc3)
chieu3=0;
else
chieu3=1;
end
%------------------tinh byte cao-thap
byte_thap_ic1=mod(tam1,255);
byte_cao_ic1=(tam1-byte_thap_ic1)/255;
byte_thap_ic2=mod(tam2,255);
byte_cao_ic2=(tam2-byte_thap_ic2)/255;
byte_thap_ic3=mod(tam3,255);
byte_cao_ic3=(tam3-byte_thap_ic3)/255;
%----------------------------------------
goc1=theta1
goc2=theta2
goc3=theta3
set(handles.edit_theta1,'string',theta1)
set(handles.edit_theta2,'string',theta2)
set(handles.edit_theta3,'string',theta3)
set(handles.edit_ic1,'string',chieu1)
set(handles.edit_ic2,'string',chieu2)
set(handles.edit_ic3,'string',chieu3)
set(handles.edit_ic11,'string',byte_cao_ic1)
set(handles.edit_ic22,'string',byte_cao_ic2)
set(handles.edit_ic33,'string',byte_cao_ic3)
set(handles.edit_ic111,'string',byte_thap_ic1)
set(handles.edit_ic222,'string',byte_thap_ic2)
set(handles.edit_ic333,'string',byte_thap_ic3)
fwrite(s,99);
fwrite(s,byte_control);
fwrite(s,chieu1);
fwrite(s,byte_cao_ic1);
fwrite(s,byte_thap_ic1);
fwrite(s,chieu2);
fwrite(s,byte_cao_ic2);
fwrite(s,byte_thap_ic2);
fwrite(s,chieu3);
fwrite(s,byte_cao_ic3);
fwrite(s,byte_thap_ic3);
%fwrite(s,99);
%fwrite(s,00);
%fwrite(s,1);
%fwrite(s,1);
%fwrite(s,23);
%fwrite(s,1);
%fwrite(s,2);
%fwrite(s,34);
%fwrite(s,1);
%fwrite(s,3);
%fwrite(s,45);
else
end
% --- Executes during object deletion, before destroying properties.
function figure1_DeleteFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global isconnect s
%load data;
if(isconnect==1)
isconnect = 0
record(s,'off')
fclose(s);
get(s)
delete(s);
clear s;
end
%save data
% --- Executes during object creation, after setting all properties.
function figure1_CreateFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
function edit_theta1_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_theta1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_theta2_Callback(hObject, eventdata, handles)
function edit_theta2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_theta3_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_theta3_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function X_Callback(hObject, eventdata, handles)
function edit_y_Callback(hObject, eventdata, handles)
function edit_z_Callback(hObject, eventdata, handles)
function text1_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function text1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_text_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_text_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_ic11_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_ic11_CreateFcn(hObject, eventdata, handles)
on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_ic22_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_ic22_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_ic33_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_ic33_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_ic1_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_ic1_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_ic2_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_ic2_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_ic3_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_ic3_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_ic111_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_ic111_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_ic222_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_ic222_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_ic333_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_ic333_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in cmd_quaylai.
function cmd_quaylai_Callback(hObject, eventdata, handles)
% hObject handle to cmd_quaylai (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global s byte_control
global goc1 goc2 goc3 tam1 tam2 tam3
global chieu1 byte_cao_ic1 byte_thap_ic1
global chieu2 byte_cao_ic2 byte_thap_ic2
global chieu3 byte_cao_ic3 byte_thap_ic3
fwrite(s,99);
fwrite(s,2);
fwrite(s,abs(1-chieu1));
fwrite(s,byte_cao_ic1);
fwrite(s,byte_thap_ic1);
fwrite(s,abs(1-chieu2));
fwrite(s,byte_cao_ic2);
fwrite(s,byte_thap_ic2);
fwrite(s,abs(1-chieu3));
fwrite(s,byte_cao_ic3);
fwrite(s,byte_thap_ic3);
goc1=0
goc2=135
goc3=55
tam1=0;
tam2=0;
tam3=0;
byte_control=1;
function edit_cmd_start_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_cmd_start_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in cmd_start.
function cmd_start_Callback(hObject, eventdata, handles)
% hObject handle to cmd_start (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global start
writeasync(start,1)
% --- Executes on button press in con_plc.
function con_plc_Callback(hObject, eventdata, handles)
% hObject handle to con_plc (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global da grp1 hsc0 hsc1 hsc4 manual start control toi1 toi2 toi3 lui1 lui2 lui3
global dat1 dat2 dat3 nang van_khi dung
da = opcda('localhost','S7200.OPCServer')
connect(da)
grp1 = addgroup(da)
start = additem(grp1,'MicroWin.s7.start')
hsc0 = additem(grp1,'MicroWin.s7.hsc0')
hsc1 = additem(grp1,'MicroWin.s7.hsc1')
%hsc2 = additem(grp1,'MicroWin.s7.hsc2')
hsc4 = additem(grp1,'MicroWin.s7.hsc4')
manual = additem(grp1,'MicroWin.s7.manual')
control = additem(grp1,'MicroWin.s7.control')
toi1 = additem(grp1,'MicroWin.s7.toi1')
toi2 = additem(grp1,'MicroWin.s7.toi2')
toi3 = additem(grp1,'MicroWin.s7.toi3')
lui1 = additem(grp1,'MicroWin.s7.lui1')
lui2 = additem(grp1,'MicroWin.s7.lui2')
lui3 = additem(grp1,'MicroWin.s7.lui3')
dat1=additem(grp1,'MicroWin.s7.dat1')
dat2=additem(grp1,'MicroWin.s7.dat2')
dat3=additem(grp1,'MicroWin.s7.dat3')
nang=additem(grp1,'MicroWin.s7.nang')
van_khi=additem(grp1,'MicroWin.s7.van_khi')
dung=additem(grp1,'MicroWin.s7.dung')
% --- Executes on button press in Stop_plc.
function Stop_plc_Callback(hObject, eventdata, handles)
% hObject handle to Stop_plc (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global start control
writeasync(start,0)
writeasync(control,10)
% --- Executes on button press in cmd_send.
function cmd_send_Callback(hObject, eventdata, handles)
% hObject handle to cmd_send (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global hsc0 hsc1 hsc2 hsc4 control dat1 dat2 dat3 nang
global theta1 theta2 theta3 x1 y1 z1 l l1 l2 l3 anpha1 anpha2
global goc1 goc2 goc3 byte_1 byte_2 byte_3 byte_11 byte_22 byte_33 byte_nang
global tam run y_cen x_cen
run = 0 ;
writeasync(control,10)
pause(0.05)
writeasync(control,100)
x1=get(handles.edit_nhap1,'string')
y1=get(handles.edit_nhap2,'string')
z1=get(handles.edit_nhap3,'string')
x1=str2num(x1)
y1=str2num(y1)
z1=str2num(z1)
x1 = x_cen;
y1 = y_cen;
z1 = 3;
if((x1^2+y1^2)>0)
%-----------------
theta1=acos(y1/sqrt(x1^2+y1^2))
theta1=theta1*180/pi
theta1=180-theta1
%------------------
l=sqrt(x1^2+y1^2+(l1-z1)^2)
anpha1=acos((l2^2+l^2-l3^2)/(2*l2*l))
anpha2=acos(sqrt(x1^2+y1^2)/l)
anpha1=anpha1*180/pi
anpha2=anpha2*180/pi
if (z1>l1)
theta2=90+anpha1+anpha2
elseif (z1==l1)
theta2=90+anpha1
else
theta2=90+anpha1-anpha2
end
theta3=acos((l2^2+l3^2-l^2)/(2*l2*l3))
theta3=theta3*180/pi
theta1=round(theta1)
theta2=round(theta2)
theta3=round(theta3)
byte_1=goc1-theta1
byte_2=goc2-theta2
byte_3=goc3-theta3
set(handles.edit_1,'string',byte_1)
set(handles.edit_2,'string',byte_2)
set(handles.edit_3,'string',byte_3)
goc1=theta1
goc2=theta2
goc3=theta3
byte_1=byte_1*75.3/36;
byte_2=byte_2*40/36;
byte_3=byte_3*40/36;
byte_1=round(byte_1)
byte_2=round(byte_2)
byte_3=round(byte_3)
%-----------------------
tam=180-goc2-5
if tam>0
byte_nang=0-tam;
byte_nang=byte_nang*40/36;
byte_nang=round(byte_nang);
goc2=goc2+tam;
end
x1=get(handles.edit_dat1,'string')
y1=get(handles.edit_dat2,'string')
z1=get(handles.edit_dat3,'string')
x1=str2num(x1)
y1=str2num(y1)
z1=str2num(z1)
%-----------------
theta1=acos(y1/sqrt(x1^2+y1^2))
theta1=theta1*180/pi
theta1=180-theta1
%------------------
l=sqrt(x1^2+y1^2+(l1-z1)^2)
anpha1=acos((l2^2+l^2-l3^2)/(2*l2*l))
anpha2=acos(sqrt(x1^2+y1^2)/l)
anpha1=anpha1*180/pi
anpha2=anpha2*180/pi
if (z1>l1)
theta2=90+anpha1+anpha2
elseif (z1==l1)
theta2=90+anpha1
else
theta2=90+anpha1-anpha2
end
theta3=acos((l2^2+l3^2-l^2)/(2*l2*l3))
theta3=theta3*180/pi
theta1=round(theta1)
theta2=round(theta2)
theta3=round(theta3)
byte_11=goc1-theta1
byte_22=goc2-theta2
byte_33=goc3-theta3
set(handles.edit_d1,'string',byte_11)
set(handles.edit_d2,'string',byte_22)
set(handles.edit_d3,'string',byte_33)
goc1=theta1
goc2=theta2
goc3=theta3
byte_11=byte_11*79/36;
byte_22=byte_22*40/36;
byte_33=byte_33*40/36;
byte_11=round(byte_11)
byte_22=round(byte_22)
byte_33=round(byte_33)
%-------------------------
writeasync(hsc0,byte_1)
writeasync(hsc4,byte_2)
writeasync(hsc1,byte_3)
writeasync(dat1,byte_11)
writeasync(dat2,byte_22)
writeasync(dat3,byte_33)
writeasync(nang,byte_nang)
writeasync(control,1)
end
function edit_nhap1_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_nhap1_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes during object creation, after setting all properties.
function edit_hsc0_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_nhap2_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_nhap2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_nhap3_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_nhap3_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in cmd_toi1.
function cmd_toi1_Callback(hObject, eventdata, handles)
% hObject handle to cmd_toi1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global toi1
writeasync(toi1,1)
%pause(0.2);
%writeasync(toi1,0)
% --- Executes on button press in cmd_lui1.
function cmd_lui1_Callback(hObject, eventdata, handles)
% hObject handle to cmd_lui1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global lui1
writeasync(lui1,1)
%pause(0.2);
%writeasync(lui1,0)
% --- Executes on button press in cmd_toi2.
function cmd_toi2_Callback(hObject, eventdata, handles)
% hObject handle to cmd_toi2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global toi2
writeasync(toi2,1)
%pause(0.2);
%writeasync(toi2,0)
% --- Executes on button press in cmd_lui2.
function cmd_lui2_Callback(hObject, eventdata, handles)
% hObject handle to cmd_lui2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global lui2
writeasync(lui2,1)
pause(0.2);
writeasync(lui2,0)
% --- Executes on button press in cmd_toi3.
function cmd_toi3_Callback(hObject, eventdata, handles)
% hObject handle to cmd_toi3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global toi3
writeasync(toi3,1)
%pause(0.2);
%writeasync(toi3,0)
% --- Executes on button press in cmd_lui3.
function cmd_lui3_Callback(hObject, eventdata, handles)
% hObject handle to cmd_lui3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global lui3
writeasync(lui3,1)
%pause(0.2);
%writeasync(lui3,0)
function edit_1_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_1_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_2_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_3_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_3_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_dat1_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_dat1_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_dat2_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_dat2_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit_dat2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_dat3_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_dat3_CreateFcn(hObject, eventdata, handles)
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_d1_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_d1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit_d1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_d2_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_d2_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit_d3_Callback(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function edit_d3_CreateFcn(hObject, eventdata, handles)
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in cmd_manual.
function cmd_manual_Callback(hObject, eventdata, handles)
% hObject handle to cmd_manual (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global bit_manual manual
if bit_manual==1
bit_manual=0
writeasync(manual,0)
set(handles.text_manual,'string','Automatic')
else
bit_manual=1
writeasync(manual,1)
set(handles.text_manual,'string','Manual')
end
% --- Executes on button press in cmd_kep.
function cmd_kep_Callback(hObject, eventdata, handles)
% hObject handle to cmd_kep (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global van_khi
writeasync(van_khi,1)
% --- Executes on button press in cmd_tha.
function cmd_tha_Callback(hObject, eventdata, handles)
% hObject handle to cmd_tha (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global van_khi
writeasync(van_khi,0)
% --- Executes on button press in cmd_dung.
function cmd_dung_Callback(hObject, eventdata, handles)
% hObject handle to cmd_dung (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global dung
writeasync(dung,1)
writeasync(dung,0)
% --- Executes on button press in cmd_reset.
function cmd_reset_Callback(hObject, eventdata, handles)
% hObject handle to cmd_reset (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global goc1 goc2 goc3
% GOC BAN DAU
goc1=0%12
goc2=180%130;
goc3=90%49
% --- Executes on button press in cmd_stop.
function cmd_stop_Callback(hObject, eventdata, handles)
% hObject handle to cmd_stop (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global start control
writeasync(start,0)
writeasync(control,10)
% --- Executes on button press in exit.
function exit_Callback(hObject, eventdata, handles)
% hObject handle to exit (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global run
run = 0;
close all
% --- Executes on button press in cmd_begin.
function cmd_begin_Callback(hObject, eventdata, handles)
% hObject handle to cmd_begin (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global control start
writeasync(start,0)
writeasync(control,11)
2.Code chương trình PLC:
Đặt tên cho Bit:
2.1 Chương trình MAIN:
2.2 Chương trình con khởi tạo chế độ điều xung cho Q00,Q01:
2.3 Chương trình con Reser Counter:
2.4 Chương trình con khởi tạo motor:
2.5 Chương trình con về vị trí ban đầu:
TÀI LIỆU THAM KHẢO
[1]. Nguyễn Đức Thành, MATLAB và ứng dụng trong điều khiển, nhà xuất bản: Đại Học Quốc Gia TP.Hồ Chí Minh.
[2]. Trần Thế San biên dịch, Cở sở nghiên cứu và sáng tạo ROBOT, nhà xuất bản Thống Kê.
[3]. Nguyễn Đức Thành, Đo lường và điều khiển bằng máy tính, nhà xuất bản: Đại Học Quốc Gia TP.Hồ Chí Minh.
[4]. Lương Mạnh Bá, Nguyễn Thanh Thủy, Nhập môn xử lý ảnh số, nhà xuất bản Khoa học và Kỹ thuật.
[5]. Nguyễn Hữu Lộc, Cơ sở thiết kế máy, nhà xuất bản: Đại học quốc gia Tp. Hồ Chí Minh.
[1]. Nguyễn Đức Thành, MATLAB và ứng dụng trong điều khiển, nhà xuất bản: Đại Học Quốc Gia TP.Hồ Chí Minh.
[2]. Trần Thế San biên dịch, Cở sở nghiên cứu và sáng tạo ROBOT, nhà xuất bản Thống Kê.
[3]. Nguyễn Đức Thành, Đo lường và điều khiển bằng máy tính, nhà xuất bản: Đại Học Quốc Gia TP.Hồ Chí Minh.
[4]. Lương Mạnh Bá, Nguyễn Thanh Thủy, Nhập môn xử lý ảnh số, nhà xuất bản Khoa học và Kỹ thuật.
[5]. Nguyễn Hữu Lộc, Cơ sở thiết kế máy, nhà xuất bản: Đại học quốc gia Tp. Hồ Chí Minh.
[6].
[7].
[8].
[9].
[10].
[11].