Professional Documents
Culture Documents
Luận văn đại học được bảo vệ tại Trường Đại học Kỹ thuật – Công nghệ Cần Thơ
ngày 22 tháng 07 năm 2020.
Thành phần Ban chấm đánh giá luận văn đại học gồm:
1. Trưởng ban: ..........................................................................................................
..................................................................................................................................
2. Uỷ viên phản biện: ...............................................................................................
..................................................................................................................................
3. Thư ký ban chấm: .................................................................................................
..................................................................................................................................
Xác nhận của Ban chấm đánh giá sau khi luận văn đã được sửa chữa (nếu có).
LỜI CẢM ƠN
Để hoàn thành đề tài luận văn và kết thúc khóa học, em xin bày tỏ lòng biết ơn
sâu sắc đến trường Đại học kỹ thuật – công nghệ Cần Thơ đã tạo điều kiện cho em
có môi trường học tập tốt trong suốt thời gian học tập và nghiên cứu tại trường. Đặc
biệt, em xin chân thành cảm ơn thầy Đường Khánh Sơn đã tận tình hướng dẫn và
giúp đỡ em trong quá trình hoàn thành luận văn. Đồng thời, em cũng gửi lời cảm ơn
chân thành đến các thầy cô trong khoa Kỹ thuật cơ khí, gia đình và bạn bè đã giúp đỡ
và tạo điều kiện tốt nhất cho em trong quá trình học tập cũng như trong quá trình hoàn
thành luận văn tốt nghiệp.
Em xin chân thành cảm ơn!
MỤC LỤC
LỜI CẢM ƠN ............................................................................................................ I
5.1.3 Kết quả chạy thực tế của mô hình Robot Scara ................................83
Hình 5.10: Kết quả nhận dạng màu sắc các vật hình tròn .........................................83
Hình 5.11: Quá trình phân loại màu sắc các vật hình tròn của Robot Scara ............84
Hình 5.12: Kết quả nhận dạng màu sắc các vật hình vuông .....................................84
Hình 5.13: Quá trình phân loại màu sắc các vật hình vuông của Robot Scara .........85
Hình 5.14: Kết quả nhận dạng hình dạng các vật màu đỏ ........................................85
Hình 5.15: Quá trình phân loại hình dạng các vật màu đỏ của Robot Scara ............86
Hình 5.16: Kết quả nhận dạng hình dạng các vật màu xanh lá .................................86
Hình 5.17: Quá trình phân loại hình dạng các vật màu xanh lá của Robot Scara.....87
Hình 5.18: Kết quả nhận dạng hình dạng các vật màu xanh dương .........................87
Hình 5.19: Quá trình phân loại hình dạng các vật màu xanh dương của Robot .......88
Hình 5.20: Kết quả nhận dạng màu sắc và hình dạng của tất cả các vật ..................88
Hình 5.21: Quá trình phân loại màu sắc và hình dạng của Robot Scara...................90
Từ những nhu cầu thực tế và niềm đam mê với Robot, cùng với sự góp ý và
hướng dẫn của thầy Đường Khánh Sơn. Em đã chọn đề tài “ROBOT SCARA ỨNG
DỤNG XỬ LÝ ẢNH PHÂN LOẠI SẢN PHẨM THEO MÀU SẮC VÀ HÌNH
DẠNG” cho luận văn tốt nghiệp của mình.
sắc và hình dạng từ đó điều khiển cánh tay Robot Scara thực hiện chuyển động gắp
và phân loại sản phẩm ở bất kỳ vị trí nào trong phạm vi hoạt động của nó.
Hình 1.3: Cánh tay Robot 5 bậc tự do của hãng YASKAWA MOTOMAN
1.2.1 Lịch sử hình thành và phát triển
Thuật ngữ Robot xuất hiện vào năm 1920 trong một tác phẩm văn học của nhà
văn tiệp khắc có tên là Karel Capek.
Thuật ngữ Inducstrial Robot (IR) xuất hiện đầu tiên ở Mỹ do công ty AMF
(Americal Machine and Foundry Company) quảng cáo mô phỏng một thiết bị mang
dáng dấp và có một số chức năng như tay người được điều khiển tự động thực hiện
một số thao tác để sản xuất thiết bị có tên gọi Versatran.
Quá trình phát triển của IR được tóm tắt như sau:
- Từ những năm 1950 ở Mỹ xuất hiện viện nghiên cứu đầu tiên.
- Vào đầu những năm 1960 xuất hiện sản phẩm đầu tiên có tên gọi là Versatran
của công ty AMF.
- Ở Anh người ta bắt đầu nghiên cứu và chế tạo IR theo bản quyền của Mỹ từ
những năm 1967.
- Ở các nước Tây Âu khác như: Đức, Ý, Pháp, Thuỵ Điển thì bắt đầu chế tạo IR
từ những năm 1970.
- Châu á có Nhật Bản bắt đầu nghiên cứu ứng dụng IR từ năm 1968.
- Nhất là vào những năm 1990 số lượng Robot công nghiệp đã gia tăng với nhiều
tính năng vượt bậc.
Ngày nay, trên thế giới có khoảng 200 công ty sản xuất IR, trong đó ở Nhật có
80, ở các nước Tây Âu có 90, ở Mỹ có 30. Nhờ áp dụng rộng rãi các tiến bộ khoa học
kỹ thuật về vi xử lý, tin học cũng như vật liệu mới nên số lượng Robot công nghiệp
đã tăng lên nhanh chóng, giá thành giảm đi rõ rệt, tính năng có nhiều cải tiến. Robot
công nghiệp phát huy thế mạnh ở các lĩnh vực như hàn hồ quang, đúc, lắp ráp, sơn
phủ và trong các hệ thống điều khiển liên hợp.
Một Robot công nghiệp thường bao gồm các thành phần chính như: cánh tay
Robot, nguồn động lực, dụng cụ gắn lên khâu chấp hành cuối, các cảm biến, bộ điều
khiển, thiết bị dạy học, máy tính,… các phần mềm lập trình cũng nên được coi là một
thành phần của hệ thống Robot.
Một bộ điều khiển có thể có các cổng vào-ra (I/O port) để làm việc với nhiều thiết bị
khác nhau như: các cảm biến (giúp Robot nhận biết trạng thái của bản thân, xác định
vị trí của đối tượng làm việc,…), điều khiển các băng tải hoặc cơ cấu cấp phôi hoạt
động phối hợp với Robot,…
1.2.2.3 Phân loại theo hình dạng hình học của không gian hoạt động
Robot được phân loại theo sự phối hợp giữa ba trục chuyển động cơ bản rồi sau
đó được bổ sung để mở rộng thêm bậc chuyển động nhằm tăng thêm độ linh hoạt.
Vùng giới hạn tầm hoạt động của Robot được gọi là không gian làm việc.
- Robot khớp bản lề (Articular Robot): Có ba bậc chuyển động cơ bản gồm ba
trục chuyển động quay.
- Robot toạ độ trụ (Cylindrical Robot): Có ba bậc chuyển động cơ bản gồm hai
trục chuyển động tịnh tiến và một chuyển động trục quay.
- Robot toạ độ cầu (Spherical Robot): Có ba bậc chuyển động cơ bản gồm một
trục chuyển động tịnh tiến và hai trục chuyển động quay.
- Robot Scara (Scara Robot): Có ba bậc chuyển động cơ bản gồm một trục
chuyển động tịnh tiến và hai trục chuyển động quay.
- Robot toạ độ vuông góc (Cartesian Robot): Có ba bậc chuyển động cơ bản
gồm ba chuyển động tịnh tiến dọc theo ba trục vuông góc.
Hình 1.6: Phân loại Robot theo hình dạng hình học của không gian hoạt động
- Robot dùng nguồn khí nén: Hệ thống cán được trang bị máy nén, bình chứa
khí và động cơ kéo máy nén. Robot loại này thường được sử dụng trong các ứng dụng
có tải trọng nhỏ có tay máy là các xy-lanh khí nén thực hiện chuyển động thẳng và
chuyển động quay. Do khí nén là lưu chất nén được nén Robot loại này thường sử
dụng trong các thao tác gắp đặt không cần độ chính xác cao.
- Dùng nguồn thuỷ lực: Nguồn thuỷ lực sử dụng lưu chất không nén được là
dầu ép. Hệ thống cần trang bị bơm để tạo áp lực dầu. Tay máy là các xy-lanh thuỷ
lực chuyển động thẳng và quay động cơ dầu. Robot loại này được sử dụng trong các
ứng dụng có tải trọng lớn.
Hình 1.9: Robot xếp các hàng thùng hàng lên pallet
- Robot dùng trong công nghệ ép phun nhựa: IRB 6650 của hãng ABB có thể
thao tác nhanh, dễ dàng lấy sản phẩm ra khỏi khuôn ở vị trí tách khuôn, giám sát, làm
sạch, điều khiển chất lượng dựa trên camera.
- Robot sơn và phun sơn: Được ứng dụng khá nhiều trong sơn gỗ, sơn thép.
- Robot hàn công nghiệp hay Robot hàn tự động: phục vụ cho ngành sản xuất ô
tô xe máy, với tỷ lệ hơn 70% số Robot đang hoạt động, phải kể đến là Robot hàn tự
động Panasonic.
a) b) c)
Hình 1.12: Ứng dụng của Robot trong một số lĩnh vực
a) Robot khai thác quặng đất hiếm của Nhật Bản
b) Robot phẩu thuật nội soi ở bệnh viện Chợ Rẫy (Việt Nam)
c) Robot thám hiểm mặt trăng của Audi
trượt, nhưng cả ba khớp đều có trục song song với nhau. Kết cấu này làm cho tay
máy cứng cáp hơn theo phương thẳng đứng nhưng kém vững hơn theo phương ngang.
Loại này dùng trong việc lắp ráp với tải trọng nhỏ theo phương đứng.
động quay như các động cơ điện, động cơ dầu ép, khí nén. Robot Scara có hai khớp
xoay song song với nhau cho phép thao tác trên mặt phẳng, được sử dụng để gắp và
nhả vật, lắp ráp hay cầm nắm máy công cụ.
Hình 1.15: Robot SCARA trong dây chuyền sản xuất linh hoạt
Ưu điểm:
- Mặc dù chiếm diện tích làm việc ít nhưng tầm vươn khá lớn, tỉ lệ kích thước/tầm
vươn được đánh giá cao .
- Về mặt hình học, cấu hình dạng khớp nối bản lề với ba trục quay bố trí theo
phương thẳng đứng là dạng đơn giản và có hiệu quả nhất trong trường hợp yêu cầu
gắp đặt và đặt chi tiết theo phương thẳng. Trong trường hợp này bài toán tọa độ hoặc
quỹ đạo chuyển động đối với Robot chỉ cần giải quyết ở hai phương x và y còn lại
bằng cách phối hợp ba chuyển động quay quanh ba trục song song với trục z.
Matlab là chữ viết tắt của hai từ Matrix và Laboratory thể hiện định hướng chính của
chương trình là các phép toán vector và ma trận. Phần cót lõi của chương trình bao
gồm các hàm toán học, các chức năng xuất nhập cũng như các khả năng điều khiển
chương trình.
(tức là một hàng và 3 cột) ta có thể thay đổi kích thước này bằng cách thay đổi giá trị
có trong ô kích thước size. Dùng cửa sổ này để lưu các biến ở dưới là dữ liệu của biến
b, ta có thể thay đổi chúng bằng cách thay đổi giá trị trong các ô đó. Tất cả các biến
đều được lưu trong Workspace trong đó thể hiện cả kích thước (size), số Bytes và
kiểu dữ liệu (class) (8 bytes cho mỗi phần tử dữ liệu kiểu double cụ thể là 24 bytes
dành cho b và 8 bytes dành cho a).
- Cửa sổ M-file: Là cửa sổ dùng để soạn thảo chương trình ứng dụng, để thực thi
chương trình viết trong M-file bằng cách gõ tên của file chứa chương trình đó trong
cửa sổ Commandwindow. Khi một chương trình viết trong M-file, thì tuỳ theo ứng
dụng cụ thể, tuỳ theo người lập trình mà chương trình có thể viết dưới dạng sau:
+ Dạng Script file: Tức là chương trình gồm tập hợp các câu lệnh viết dưới dạng
liệt kê, không có biến dữ liệu vào và biến lấy giá trị ra.
+ Dạng hàm function: Có biến dữ liệu vào và biến ra.
- Panel: Tạo ra một mảng nhóm các biểu tượng lại với nhau giúp ta dễ kiểm soát
và thao tác khi di chuyển.
- Button Group: Quản lí sự lựa chọn của nút Radio Button.
- Active Control: Quản lí một nhóm các bút hoặc các chương trình liên quan với
nhau trong Active.
2.2.2.3.1 Hộp thoại Inspector
Tất cả các hộp thoại bên trái vừa nêu trên để sử dụng, chúng ta nhấp chọn và
kéo thả vào vùng cần thiết kế, mỗi hộp thoại có các thông số chỉnh riêng, để chỉnh
các thông số liên quan đến hộp thoại nào ta nhấp đôi vào hộp thoại đó (hoặc click
chuột phải chọn Property Inspector) hộp thoại Inspector hiện ra, dùng thanh trượt kéo
xuống để xem hết chức năng:
- Phía bên trái của Menu Inspector là tên thuộc tính, có thể gọi thực thi các thuộc
tính này bằng các lệnh.
- Phía bên trái là giá trị của thuộc tính, giá trị này do người dùng đặt, có thể thay
đổi thông qua các lệnh gọi (callback), hoặc được thiết lập trước.
Định nghĩa: Độ phân giải (Resolution) của ảnh là một mật độ điểm ảnh được
ấn định trên một ảnh số được hiển thị.
Theo định nghĩa thì khoảng cách giữa các điểm ảnh phải được chọn sau cho mắt
người vẫn thấy được sự liên tục của ảnh. Việc lựa chọn khoảng cách thích hợp tạo
nên một mật độ phân bố, đó chính là độ phân giải và được phân bố theo trục x và y
trong không gian hai chiều.
Mức xám (Gray level)
Mức xám là kết quả sự mã hóa tương ứng một cường độ ánh sáng ở mỗi điểm
ảnh với một giá trị số - kết quả của quá trình lượng hóa. Cách mã hóa kinh điển
thường dùng là 16, 32, 64 mức. Phổ dụng nhất là mã hóa ở 256 mức, ở mức này mỗi
pixel sẽ được mã hóa bởi 8 bit.
Ảnh grayscale
Mỗi ảnh được biểu diễn bởi một ma trận hai chiều, trong đó giá trị của mỗi phần
tử cho biết độ sáng (hay mức xám) của điểm ảnh đó. Ma trận này có thể có một trong
các kiểu dữ liệu uint8, uint16 hoặc double. Ảnh biểu diễn theo kiểu này còn gọi là
ảnh “trắng đen”.
Ảnh RGB
Còn gọi là ảnh “truecolor” do tính trung thực của nó. Ảnh này được biểu diễn
bởi một ma trận ba chiều kích thước m x n x 3, với m x n là kích thước ảnh theo
pixels. Ma trận này định nghĩa các thành phần màu red, green, blue cho mỗi điểm
ảnh, các phần tử của nó có thể thuộc kiểu uint8, uint16 hoặc double.
Matlab cung cấp sẵn các hàm thực hiện chuyển kiểu cho các ma trận biểu diễn
ảnh, bao gồm : im2double, im2uint8 và im2uint16. Tuy nhiên, khi thực hiện chuyển
kiểu giữa các dữ liệu ảnh cần lưu ý một số điều sau:
- Khi chuyển từ một kiểu dữ liệu dùng nhiều bit sang một kiểu dữ liệu dùng ít bit
hơn thì một số thông tin chi tiết về bức ảnh ban đầu sẽ bị mất.
- Không phải lúc nào cũng có thể chuyển đổi kiểu dữ liệu đối với kiểu ảnh
indexed, vì các giá trị của ma trận ảnh xác định một địa chỉ trong bản đồ màu chứ
không phải là giá trị màu, do đó không thể lượng tử hóa được.
Chuyển đổi giữa các kiểu ảnh
- Dither: Tạo một ảnh nhị phân từ một ảnh cường độ đen trắng bằng cách trộn,
tạo một ảnh chỉ số từ một ảnh RGB bằng cách trộng (dither).
Cú pháp: dither(RGB,map); dither(I)
- Gray2id: Tạo một ảnh chỉ số từ một ảnh cường độ đen trắng.
Cú pháp: [X,Map] = gray2ind(I,N); [X,Map] = gray2ind(BW,N)
- Grayslice: Tạo một ảnh chỉ số từ một ảnh cường độ đen trắng bằng cách đặt
ngưỡng.
Cú pháp: x=grayslice(I,N); x=grayslice(I,V)
- Im2bw: Tạo một ảnh nhị phân từ một ảnh cường độ , ảnh chỉ số hay ảnh.
Cú pháp: bw=im2bw(I,level); bw=im2bw(x,map,level); bw=im2bw(rgb,level)
- Ind2gray: Tạo một ảnh cường độ đen trắng từ một ảnh chỉ số.
Cú pháp: i=ind2gray(x,map)
- Ind2rgb: Tạo một ảnh RGB từ một ảnh chỉ số.
Cú pháp: rgb=ind2rgb(x,map)
- Mat2gray: Tạo một ảnh cường độ đen trắng từ dữ liệu trong một ma trận bằng
cách lấy tỉ lệ giữ liệu.
Cú pháp: i=mat2gray(a,[amin amax])
- Rgb2gray: Tạo một ảnh cường độ đen trắng từ một ảnh RGB.
Cú pháp: i=rgb2gray(rgb)
- Rgb2ind: Tạo một ảnh chỉ số từ một ảnh RGB.
Cú pháp: i=rgb2gray(rgb); x=rgb2ind(rgb,map); [x,map]=rgb2ind(rgb,tol)
Ta cũng có thể thực hiện các phép chuyển đổi kiểu chỉ sử dụng cú pháp của
Matlab. Chẳng hạn, ta có thể convert một ảnh cường độ sang ảnh RGB bằng cách
ghép nối 3 phần copy của ma trận ảnh gốc giữa 3 chiều: RGB= cat (3,I,I,I). Ảnh
RGB thu được có các ma trận đồng nhất cho các mặt phẳng R,G,B vì vậy ảnh hiển
thị giống như bóng xám.
Để thực hiện phép quay ảnh, ta có thể sử dụng hàm imrotate. Ngoài hai thông
số cơ bản là ảnh gốc và góc quay, người sử dụng cũng có thể xác định phương pháp
nội suy sẽ dùng và kích thước của ảnh mới.
Cú pháp: b=imrotate(a,angle,method,Bbox)
Trích xuất ảnh
Khi cần trích xuất một phần ảnh gốc, ta dùng hàm imcrop.
- Xác định cụ thể vị trí của phần ảnh cần trích xuất (dưới dạng hình chữ nhật).
Cú pháp: x2=imcrop(x,map, [Xmin Ymin width height])
x2=imcrop(a, [Xmin Ymin width height])
- Sử dụng mouse để chọn phần ảnh cần trích xuất. Ta không cần cung cấp thông
số rect, khi thực hiện hàm này, con trỏ sẽ chuyển sang dạng chữ thập, người dùng sẽ
kéo chuột để chọn phần ảnh cần trích xuất sau đó thả chuột.
- Cho phép sử dụng thư viện các loại dây điện và cáp điện để chạy dây với bán
kính uốn phù hợp trong thiết kế điện (Cable &Wiring):.
- Mô phỏng động và động lực học của cơ cấu máy (Dynamic simulation).
- Phân tích ứng suất, tối ưu hóa thiết kế sản phẩm (Analysis Stress and Optimize).
- Thiết kế nhanh các sản phẩm nhựa (Inventor plastic & tooling).
- Có thư viện chi tiết đa dạng và chuẩn hóa (Content center).
- Liên kết được với nhiều phần mềm CAD khác.
2.2.4.2 Liên kết Inventor với công cụ simscape multibody của Matlab
Bước 1: Nhận tập tin cài đặt
- Vào trang tải xuống Simscape Multibody Link.
- Làm theo hướng dẫn trên trang tải xuống.
- Lưu tệp .zip và tệp Matlab trong thư mục thuận tiện.
Lưu ý: Chọn phiên bản khớp với số phát hành Matlab và kiến trúc hệ thống của
bạn. Không giải nén tệp lưu trữ zip.
Bước 2: Chạy chức năng cài đặt
- Chạy Matlab với quyền administrator.
- Thêm các tệp đã cài đặt vào đường dẫn Matlab.
- Tại dấu nhắc lệnh Matlab ta nhập “install_addon(‘zipname’)”.
Trong đó: “zipname” là tên của tệp lưu trữ zip.
Bước 3: Đăng ký Matlab làm máy chủ tự động
Mỗi khi ta xuất mô hình lắp ráp CAD thì Simscape Multibody Link sẽ cố gắng
kết nối với Matlab. Để kết nối được xảy ra thì bạn phải đăng ký Matlab làm máy chủ
tự động. Bạn có thể làm điều này theo hai cách sau:
- Trong cửa sổ Matlab đang chạy với quyền administrator thì tại dấu nhắc lệnh ta
nhập “regMatlabserver”.
- Trong cửa sổ MS-DOS đang chạy với quyền administrator thì tại dấu nhắc lệnh
ta nhập “Matlab-regserver”.
Bước 4: Kích hoạt Simscape Multibody Link
Trước khi ta có thể xuất một cụm thì ta cần phải kích hoạt Simscape Multibody
Link trên ứng dụng Invertor. Để làm điều này thì tại dấu nhắc lệnh ta nhập
“smlink_linkinv”. Khi đó trong lần đầu tiên ta mở Invertor thì menu Simscape
Multibody Link sẽ xuất hiện.
Bước 5: Xuất file Inventor sang Matlab
- Trong cửa sổ Inventor ta chọn Add-Ins sau đó chọn vào Export Simscape
Multibody First Generation(1G) để xuất ra file *.xml
- Trong cửa sổ Matlab đang chạy với quyền administrator
- Thêm file *.xml đã xuất vào đường dẫn của Matlab.
- Tại dấu nhắc lệnh ta nhập “smimport(‘xmlname’)”.
Trong đó: “xmlname” là tên của file *.xml
2.2.5 Arduino
2.2.5.1 Arduino là gì ?
Arduino là một bo mạch vi điều khiển do một nhóm giáo sư và sinh viên Ý thiết
kế và đưa ra đầu tiên vào năm 2005. Mạch Arduino được sử dụng để cảm nhận và
điều khiển nhiều đối tượng khác nhau. Nó có thể thực hiện nhiều nhiệm vụ từ lấy tín
hiệu từ cảm biến đến điều khiển đèn, động cơ, và nhiều đối tượng khác. Ngoài ra
mạch còn có khả năng liên kết với nhiều module khác nhau như module đọc thẻ từ,
ethernet shield, sim900A, ….để tăng khả ứng dụng của mạch.
Phần cứng bao gồm một board mạch nguồn mở được thiết kế trên nền tảng vi
xử lý AVR Atmel 8bit, hoặc ARM, Atmel 32-bit,… Hiện phần cứng của Arduino có
tất cả 6 phiên bản, tuy nhiên phiên bản thường được sử dụng nhiều nhất là Arduino
Uno và Arduino Mega. Arduino là vi điều khiển được sử dụng rộng rãi trên thế giới
với những ưu điểm như rẻ, tương thích được với nhiều hệ điều hành, chương trình
lập trình đơn giản, rõ ràng, dễ sử dụng, sử dụng mã nguồn mở và có thể kết hợp với
nhiều module khác nhau.
- Lập trình Robot: Arduino chính là một phần quan trọng trong trung tâm xử lý
giúp điều khiển được hoạt động của Robot.
- Lập trình máy bay không người lái. Có thể nói đây là ứng dụng có nhiều kì vọng
trong tương lai.
- Game tương tác: Chúng ta có thể dùng Arduino để tương tác với Joystick, màn
hình,... để chơi các trò như Tetrix, phá gạch, Mario,... và nhiều game rất sáng tạo nữa.
- Arduino cũng được ứng dụng trong máy in 3D và nhiều ứng dụng khác tùy
thuộc vào khả năng sáng tạo của người sử dụng.
Trong đề tài, sử dụng 1 board Arduino UNO R3 (Master) làm trung tâm truyền
tính hiệu điều khiển và 3 board Arduino Nano (Slave) làm nhiệm vụ điều khiển trực
tiếp 3 động cơ của tay máy. Có thể nói rằng Arduino đảm nhiệm vai trò là bộ xử lí
trung tâm cho toàn bộ Robot, vừa đảm nhiệm vai trò nhận tín hiệu điều khiển từ máy
tính vừa xử lí và xuất tín hiệu để động cơ hoạt động.
Giao diện của phần mềm Arduino IDE có nhiều phần, tuy nhiên chúng ta chú
ý đến những phần quan trọng như:
2.2.7 PID
Trong đó: e(t) là tín hiệu đầu vào; u(t) là tín hiệu đầu ra
KP là hệ số khuếch đại; TI là hằng số tích phân; TD là hằng số vi phân
Từ biểu thức toán học trên ta suy ra được hàm truyền đạt của bộ điều khiển PID:
1
𝑅(𝑠) = 𝐾𝑃 (1 + + 𝑇𝐷 𝑠) (2.2)
𝑇𝐼 𝑠
Chất lượng của hệ thống phụ thuộc vào các tham số KP, TI, TD. Muốn hệ thống
có được chất lượng như mong muốn thì phải phân tích đối tượng rồi trên cơ sở đó
chọn các tham số KP, TI, TD phù hợp. Hiện có khá nhiều phương pháp xác định tham
số KP, TI, TD cho bộ điều khiển PID. Sau đây là một số phương pháp thường được sử
dụng: Phương pháp tối ưu Môđun (phương pháp tối ưu đối xứng), Phương pháp của
Ziegler-Nichols, Phương pháp thực nghiệm, Phương pháp Reinisch.
Một điểm cần chú ý là trong nhiều trường hợp không cần xác định cả ba tham
số KP, TI, TD cho bộ điều khiển PID. Chẳng hạn như bản thân đối tượng đã có thành
phần tích phân thì trong bộ điều khiển ta không cần phải có thêm khâu tích phân mới
triệt tiêu được sai lệch tĩnh, tức là ta chỉ cần sử dụng bộ điều khiển PD là đủ. Nếu tín
hiệu trong hệ thống thay đổi tương đối chậm và bản thân bộ điều khiển không cần
phải có phản ứng thật nhanh với sự thay đổi của sai lệch e(t) thì ta chỉ cần sử dụng bộ
điều khiển PI.
PI 0.45KC 1.2KP/PC -
Khoảng giữa Start condition và Stop condition là khoảng bận của đường truyền.
Các Master khác không thể tác động vào đường truyền trong khoảng thời gian này.
Sau khi kết thúc truyền nhận mà Master không gửi Stop condition mà lại gửi thêm
Start condition gọi là Repeat Start: xảy ra khi Master muốn lấy liên tiếp dữ liệu từ
Slave. Sau khi thiết bị truyền gửi byte dữ liệu thì sẽ có tín hiệu đáp trả (Response)
của thiết bị nhận. Tín hiệu đáp trả đã nhận được gọi là ACK (thiết bị nhận kéo SDA
xuống 0) và ngược lại là NACK(SDA vẫn ở mức cao).
Nếu bit READ/WRITE=0 tức là Master muốn ghi dữ liệu vào Slave. Master bắt
đầu gửi dữ liệu đến Slave từng byte một (mất 8 clock/byte), clock thứ 9 Slave nhận
sẽ phát lại ACK(kéo SDA=0).
Nếu Slave phát tín hiệu NOT ACK (không tác động SDA ở xung thử 9)
(ACK=1) sau khi nhận dữ liệu thì Master sẽ kết thúc quá trình gửi bằng cách phát đi
Stop condition. Để kết thúc quá trình truyền khi mà Master truyền byte cuối nó cũng
sẽ tạo ra Stop condition.
Nếu bit READ/WRITE=1 tức là Master muốn đọc dữ liệu từ Slave thì Slave sẽ
gửi từng byte ra SDA. Master sẽ nhận từng byte dữ liệu và cũng trả về bit ACK =0
(kéo SDA xuống thấp ở clock 9) sau mỗi byte nhận. Nếu Master không muốn nhận
dữ liệu nữa nó sẽ gửi xung NOT‐ACK và tạo tín hiệu STOP.
Nếu Master gửi địa chỉ của Slave là 0 và bít READ/WRITE=0 thì tức là nó
muốn thực hiện một cuộc gọi chung tới tất cả các Slave. Slave đồng ý sẽ phát tín hiệu
ACK, không đồng ý sẽ phát tín hiệu NACK. Cuộc gọi chung thường xảy ra khi Master
muốn gửi dữ liệu chung đến các Slave. Cuộc gọi chung không có nghĩa khi phát địa
chỉ là 0 và đi sau là bit READ/WRITE=1 vì Master không thể nhận dữ liệu đồng thời
từ các Slave.
3.2.1 Cơ sở thiết kế
Robot Scara được cấu tạo gồm một khớp tịnh tiến và hai khớp xoay. Theo đề
tài yêu cầu là Robot gắp vật và phân loại sản phẩm thì theo dự tính ban đầu thì kích
thước của từng khâu sẽ là: khâu xoay thứ nhất 200x60(mm), khâu xoay thứ hai
120x50(mm) chưa tính chiều dài tay gắp, khâu tịnh tiến sẽ có hành trình khoảng từ
200 đến 300mm.
Trong đề tài “Thiết kế và chế tạo mô hình Robot Scara phân loại sản phẩm
theo màu sắc và hình dạng” em lựa chọn cơ cấu truyền động pully và dây đai cho
cả ba khớp của Robot với mục đích là thay đổi tốc độ đầu ra của hộp số động cơ từ
đó thay đổi được tốc độ đáp ứng của từng khớp như mong muốn. Riêng khâu tịnh
tiến ngoài bộ truyền pully và dây đai thì ta còn kết hợp bộ truyền vít-me đai ốc với
mục đích là tạo chuyển động tịnh tiến cho Robot.
Mô hình Robot Scara sắp chế tạo cần đạt được các tiêu chí như sau:
- Đáp ứng được yêu cầu thiết kế (Robot gồm một khớp trượt và hai khớp quay).
- Thiết kế đơn giản.
- Trường hoạt động lớn.
- Cơ khí chắc chắc.
- Hoạt động linh hoạt và chính xác.
- Chi phí chế tạo thấp.
Bản thiết kế chi tiết khâu tịnh tiến của Robot Scara
Bản thiết kế chi tiết khâu quay thứ nhất của Robot Scara
Bản thiết kế chi tiết khâu quay thứ hai của Robot Scara
Bản thiết kế chi tiết khâu tay gắp của Robot Scara
Trong quá trình thực hiện đề tài do động cơ M555 dùng để khiển khâu quay thứ
nhất có dấu hiệu bị rơ trục động cơ nên cần được thay thế. Nhận thấy động cơ thay
thế cần phải có momen lớn để có thể xoay được cả khối lượng nặng đồng thời phải
hạn chế được độ rơ của trục động cơ, từ đó em lựa chọn động cơ Planet. Ưu điểm của
động cơ Planet là công suất lớn, sử dụng bánh răng hành tinh nên giảm tiếng ồn cho
hộp số.
Ưu điểm
- Có khả năng truyền được động năng và cơ năng giữa các trục ở khá xa.
- Làm việc êm không gây tiếng ồn.
- Đai nhựa có khả năng giữ được an toàn cho các chi tiết máy khác khi quá tải.
- Hiệu suất truyền khá cao, cao hơn truyền đai bình thường.
- Không đòi hỏi bôi trơn.
- Tỷ số truyền ổn định.
Nhược điểm:
- Kích thước bộ truyền đai lớn so với một số bộ truyền khác.
- Tải trọng tác dụng lên trục và ổ lớn (thường gấp 2-3 lần so với bộ truyền bánh
răng) do phải có lực căng đai ban đầu (tạo áp lực pháp tuyến lên đai tạo lực ma sát).
- Tuổi thọ của bộ truyền thấp khi làm việc ở tốc động cao và tải trọng thay đổi.
- Dễ bị trượt đai, dãn dây đai khi làm việc dưới tải trọng lớn. Cần tiến hành căng
đai khi bộ truyền hoạt động lâu dài.
- Bộ thanh trượt, ray trượt và gối đỡ có công dụng là cố định cơ cấu trượt giúp
cho khâu tịnh tiến hoạt động dễ dàng hơn.
Hình 3.10: Bạc đạn đỡ trục KFL08 Hình 3.11: Vòng bi trục
- Khớp nối mặt bích cố định cùng để cố định trục quay với khâu quay.
- Các loại ốc vít được sử dụng trong mô hình chủ yếu là các loại bu lông đai ốc,
lục giác 4mm,5mm và 6mm.
Hình 3.12: Khớp nối mặt bích cố định Hình 3.13: Bulong đai ốc
Hình 3.15: Khâu tịnh tiến thực tế của mô hình Robot Scara
- Bước 3: Lắp động cơ và tay gắp vào hai khâu quay của Robot.
Hình 3.16: Hai khâu quay thực tế của mô hình Robot Scara
- Bước 4: Lắp ráp và hoàn thiện mô hình cơ khí cho Robot.
kế trên Matlab thì máy tính sẽ tiến hành xử lý ảnh đầu vào và đưa ra những kết luận
về thông số của sản phẩm bao gồm: vị trí, màu sắc và hình dạng. Cũng thông qua
giao diện người dùng thì máy tính sẽ gửi tín hiệu điều khiển xuống mạch điều khiển.
Một Arduino UNO R3 ( Master) sẽ nhận tín hiệu điều khiển thông qua giao tiếp cổng
COM và gửi xuống cho các Arduino Nano (Slave) thông qua chuẩn giao tiếp I2C.
Sau khi nhận tín hiệu điều khiển từ Master thì các Slave sẽ biên dịch chương trình và
điều khiển động cơ thông qua module điều khiển trung gian L298N, sau khi động cơ
quay thì bộ encoder sẽ bắt đầu đếm xung và trả về số xung đếm được cho các Slave,
lúc này các Slave sẽ so sánh số xung trả về với số xung đã đặt ban đầu nếu có sai lệch
thì bộ điều khiển PID sẽ tiến hành hiệu chỉnh sai lệch liên tục cho đến khi sai lệch
nhỏ nhất sẽ dừng lại.
- Chân Vin: Đây là điện áp đầu vào được cung cấp cho board mạch Arduino
Uno. Khác với chân 5V được cung cấp qua cổng USB. Chân này được sử dụng để
cung cấp điện áp toàn mạch thông qua jack nguồn, thông thường khoảng từ 7 đến
12VDC.
- Chân 5V: Chân này được sử dụng để cung cấp điện áp đầu ra. Arduino Uno
được cấp nguồn bằng ba cách đó là USB, chân Vin của board mạch hoặc jack nguồn.
- USB: Dùng để giao tiếp với máy tính thông qua cáp USB chúng ta có thể nạp
chương trình cho Arduino hoạt động. Ngoài ra, USB còn là nguồn cho Arduino nó
hỗ trợ điện áp khoảng 5 VDC trong khi Vin và jack nguồn hỗ trợ điện áp trong khoảng
từ 7V đến 20VDC.
- Chân GND: Chân mass chung cho toàn mạch Arduino.
- Chân Reset: Để thiết lập lại toàn bộ và đưa chương trình đang chạy trở về ban
đầu. Chân này rất hữu ích khi Arduino bị treo khi đang chạy chương trình.
- Các chân Digital: Có 14 chân Digital trên board mạch Arduino Uno được ký
hiệu từ 0 đến 13 với chức năng input và output sử dụng các hàm pinMode(),
digitalWrite(), digitalRead() để điều khiển các chân này.
- Chân PWM: Được cung cấp bởi các chân 3,5,6,9,10,11. Các chân này được
cấu hình để cung cấp PWM đầu ra 8 bit.
- Các chân Analog: Có 6 chân Analog trên board mạch Arduino Uno được ký
hiệu từ A0 đến A5. Được sử dụng để đo điện áp tương tự trong khoảng từ 0 đến 5V.
- Chân Rx, Tx: Dùng để thực hiện giao tiếp nối tiếp thông qua hai chân 0 (Rx)
và chân 1 (Tx).
- Chân LED: Arduino Uno tích hợp đèn LED kết nối với chân 13. Cung cấp
mức logic HIGH tương ứng ON và LOW tương ứng OFF.
- Chân AREF: Chân này được gọi là tham chiếu tương tự, được sử dụng để cung
cấp điện áp tham chiếu cho các đầu vào tương tự.
- Chân SPI: Được dùng để giao tiếp ngoại vi nối tiếp. Các chân 10 (SS), 11
(MOSI), 12 (MISO), 13 (SCK) cung cấp liên lạc SPI với sự trợ giúp của thư viện SPI.
- Chân ngắt ngoài: Chân 2 và 3 được sử dụng để cung cấp các ngắt ngoài.
- Chân I2C: Dùng để giao tiếp I2C với các thiết bị. Chân A4 (SDA)và A5 (SCL)
được sử dụng cho mục đích này.
Mỗi chân trên mạch Arduino Nano có chức năng cụ thể trên các chân đó. Chẳng
hạn như các chân Analog có thể sử dụng như một bộ chuyển đổi Analog sang Digital
trong đó các chân A4 và A5 cũng có thể được sử dụng cho vấn đề giao tiếp I2C.
Tương tự, có 14 chân Digital, trong đó có 6 chân được sử dụng để tạo ra xung PWM.
- Chân Vin: Đây là chân cung cấp điện áp đầu vào cho mạch Arduino Nano khi
sử dụng nguồn ngoài từ 7 đến 12 VDC.
- Chân 5V: Là mức điện áp cung cấp quy định của Arduino được sử dụng để cấp
nguồn nuôi cho vi điều khiển và các bộ phận linh kiện khác trên board Arduino.
- Chân 3,3V: Đây là một mức điện áp tối thiểu được tạo ra bởi bộ điều chỉnh
điện áp trên board (sử dụng Lm1117 - 3.3V).
- Chân GND: Chân mass cho Arduino, có nhiều chân GND trên board Arduino
cho mục đích dễ dàng kết nối với thiết bị ngoại vi sử dụng dây testboard.
- Chân Reset: Khi tác động nút nhấn reset, Arduino được trả về lại chương trình
ban đầu. Rất hữu ích khi chạy chương trình phức tạp và bị treo vi điều khiển
ATmega. Mức tích cực LOW được thiết lập sẽ reset lại Arduino Nano.
- Các chân PWM: Bao gồm 6 chân là chân 3,5,6,9,10,11 được sử dụng để cung
cấp đầu ra 8-bit xung PWM.
- Các chân Analog: Có 8 chân Analog trên board mạch Arduino Nano được ký
hiệu từ A0 đến A7. Được sử dụng để đo điện áp tương tự trong khoảng từ 0 đến 5V.
- Chân Rx, Tx: Được sử dụng cho giao tiếp nối tiếp trong đó chân 1 (Tx) là chân
truyền dữ liệu và chân 0 (Rx) là chân nhận dữ liệu.
- Chân LED: Chân 13 để thực hiện bật tắt LED trên board Arduino Nano, sử
dụng để quan sát, kiểm tra chương trình cần thiết.
- Chân AREF: Chân này được dùng lấy điện áp tham chiếu cho điện áp đầu vào.
- Chân SPI: Chân 10(SS), chân 11(MOSI), chân 12(MISO), chân 13(SCK) được
sử dụng cho SPI giao tiếp ngoại vi nối tiếp. SPI được sử dụng chủ yếu để truyền dữ
liệu giữa các bộ vi điều khiển và các thiết bị ngoại vi khác như cảm biến, thanh ghi
và thẻ nhớ SD.
- Chân ngắt ngoài: Chân 2 và 3 sử dụng làm ngắt ngoài được thiết lập trong
trường hợp khẩn cấp khi chúng ta cần dừng chương trình chính và tác động các cảnh
báo hướng dẫn tại thời điểm đó. Chương trình chính sẽ tiếp tục lại sau khi lệnh ngắt
được loại bỏ.
- Chân I2C: Giao tiếp I2C sử dụng các chân A4 (SDA) và chân A5 (SCL).
- Chân GND: Là chân GND của nguồn cấp cho động cơ.
- Chân ENA và chân ENB: Dùng để điều khiển mạch cầu H trong L298.
- Các chân Input: Gồm chân IN1, IN2, IN3,IN4.
- Các chân Output: Output A nối với động cơ A, output B nối với động cơ B.
4.1 Xử lý ảnh
phạm vi ảnh nhận được. Ví dụ: trong nhận dạng ký tự trên phong bì thư, chúng ta
miêu tả các đặc trưng của từng ký tự giúp phân biệt ký tự này với ký tự khác.
- Nhận dạng và nội suy ảnh (Image Recognition and Interpretation): Nhận
dạng ảnh là quá trình xác định ảnh. Quá trình này thường thu được bằng cách so sánh
với mẫu chuẩn đã được học (hoặc lưu) từ trước. Nội suy là phán đoán theo ý nghĩa
trên cơ sở nhận dạng. Có nhiều cách phân loại ảnh khác nhau về ảnh nhưng theo lý
thuyết về nhận dạng, các mô hình toán học về ảnh được phân theo hai loại nhận dạng
ảnh cơ bản là nhận dạng theo tham số hoặc nhận dạng theo cấu trúc.
- Cơ sở tri thức (Knowledge Base): Ảnh là một đối tượng khá phức tạp về đường
nét, độ sáng tối, dung lượng điểm ảnh, môi trường để thu ảnh cũng khá phong phú
kéo theo xuất hiện nhiễu. Trong nhiều khâu xử lý và phân tích ảnh thì ngoài việc làm
đơn giản hóa các phương pháp toán học để đảm bảo tiện lợi cho xử lý, người ta còn
mong muốn bắt chước quy trình tiếp nhận và xử lý ảnh theo cách của con người.
Trong các bước xử lý đó, nhiều khâu hiện nay đã xử lý theo các phương pháp trí tuệ
con người. Vì vậy, ở đây các cơ sở tri thức được phát huy.
- Kết quả: Cuối cùng sau khi nhận diện sẽ đưa ra những thông số cần thiết về sản
phẩm như: vị trí, màu sắc và hình dạng.
Hình 4.6:Ảnh quá trình xác định vùng hoạt động của Robot
Hình 4.7: Sơ đồ quá trình tìm vùng hoạt động của Robot
Kết quả:
Hình 4.12: Ảnh kết quả của quá trình phân vùng
Hình 4.13: Giải thuật quá trình nhận dạng màu sắc
Hình 4.15: Ảnh kết quả của quá trình nhận dạng màu sắc
Hình 4.16: Giải thuật quá trình nhận dạng hình dạng
Kết quả:
Hình 4.17: Ảnh kết quả của quá trình nhận dạng hình dạng
Hình 4.18: Ảnh kết quả của quá trình nhận dạng màu sắc và hình dạng
+ Nút RESET: Cho Robot trở về vị trí ban đầu (d1 = 0; theta2 = 0; theta3 = 0).
- Nhóm các nút thiết lập:
+ Nút ON CAM: Dùng để bật camera.
+ Nút OFF CAM: Dùng để tắt camera
+ Nút SET CAM: Dùng để tìm và thiết lập vùng hoạt động của Robot.
+ Nút RED: Bật và tắt phân loại màu đỏ.
+ Nút GREEN: Bật và tắt phân loại màu xanh lá.
+ Nút BLUE: Bật và tắt phân loại màu xanh dương.
+ Nút CIRCLE: Bật và tắt phân loại hình tròn.
+ Nút SQUARE: Bật và tắt phân loại hình vuông.
+ Nút OK: Xác nhận thiết lập thuộc tính.
Hình 4.19: Giao diện người dùng điều khiển Robot Scara
- Nút RGB1, RGB2, RGB3: Là 3 chế độ hoạt động của Robot.
+ RGB1: Gắp và phân loại tất cả các sản phẩm trong vùng hoạt động.
+ RGB2: Gắp và phân loại các sản phẩm trong vùng hoạt động theo một thuộc
tính hoặc là màu sắc hoặc là hình dạng được chọn.
+ RGB3: Gắp và phân loại các sản phẩm trong vùng hoạt động theo hai thuộc tính
màu sắc và hình dạng được chọn
Hình 5.3: Kết quả chạy thực nghiệm PID trên khớp 1
Nhận xét: Kết quả đạt được không sai lệch quá nhiều so với giá trị đặt, số
mm thu được sau khi hoàn tất quá trình là 64,04 mm so với giá trị đặt ban đầu là
64mm , tốc độ đáp ứng của động cơ tương đối nhanh và ổn định.
Khớp 2: Thông số PID được hiệu chỉnh qua thực nghiệm như sau:
KP =7.5; KI=0.17; KD = 0.04
Hình 5.4: Kết quả chạy thực nghiệm PID trên khớp 2
Nhận xét: Kết quả đạt được không sai lệch quá nhiều so với giá trị đặt, số
độ thu được sau khi hoàn tất quá trình là 45,36 độ so với giá trị đặt ban đầu là
45 độ, tốc độ đáp ứng của động cơ tương đối nhanh và ổn định.
Khớp 3: Thông số PID được hiệu chỉnh qua thực nghiệm như sau:
KP =7.5; KI=0.18; KD = 0.045
Hình 5.5: Kết quả chạy thực nghiệm PID trên khâu 3
Nhận xét: Kết quả đạt được không sai lệch quá nhiều so với giá trị đặt, số
độ thu được sau khi hoàn tất quá trình là 45,29 độ so với giá trị đặt ban đầu là
45 độ, tốc độ đáp ứng của động cơ tương đối nhanh và ổn định.
Hình 5.6: Tay gắp thực hiện gắp vật Hình 5.7: Tay gắp thực hiện thả vật
Hình 5.8: Kết quả chạy thực tế động học thuận của Robot Scara
Động học ngược
Nhập các thông số ban đầu như sau: PX = 300; PY = 100; PZ = 50.
Hình 5.9: Kết quả chạy thực tế động học ngược của Robot Scara
Nhận xét: Thông qua việc chạy thực tế động học thuận và động học ngược
nhiều lần trên mô hình thì em nhận thấy rằng: mô hình hoạt động tương đối ổn định,
tốc độ đáp ứng của động cơ nhanh, các giá trị thông số khớp và vị trí của tay gắp đạt
đúng giá trị đã đặt ban đầu.
5.1.3 Kết quả chạy thực tế của mô hình Robot Scara phân loại sản phẩm
Hình 5.10: Kết quả nhận dạng màu sắc các vật hình tròn
Hình 5.11: Quá trình phân loại màu sắc các vật hình tròn của Robot Scara
Trường hợp các vật đều là hình vuông
Hình 5.12: Kết quả nhận dạng màu sắc các vật hình vuông
Hình 5.13: Quá trình phân loại màu sắc các vật hình vuông của Robot Scara
Hình 5.14: Kết quả nhận dạng hình dạng các vật màu đỏ
Hình 5.15: Quá trình phân loại hình dạng các vật màu đỏ của Robot Scara
Trường hợp các vật đều là màu xanh lá
Hình 5.16: Kết quả nhận dạng hình dạng các vật màu xanh lá
Hình 5.17: Quá trình phân loại hình dạng các vật màu xanh lá của Robot Scara
Hình 5.18: Kết quả nhận dạng hình dạng các vật màu xanh dương
Hình 5.19: Quá trình phân loại hình dạng các vật màu xanh dương của Robot Scara
5.1.3.3 Phân loại sản phẩm theo màu sắc và hình dạng
Hình 5.20: Kết quả nhận dạng màu sắc và hình dạng của tất cả các vật
Hình 5.21: Quá trình phân loại màu sắc và hình dạng của Robot Scara
khỏi nhiều thiếu sót, xảy ra các vấn đề chưa giải quyết như: quá trình xử lý ảnh còn
phụ thuộc vào độ sáng môi trường, nhiễu sáng, dẫn đến kết quả phân tích còn sai sót.
- Sử dụng các bộ điều khiển thông minh như: điều khiển trượt, điều khiển luật
mờ, điều khiển động lực học ngược, trí thông minh nhân tạo,… để tạo ra cánh tay di
chuyển có độ chính xác cao, tối ưu hóa năng lượng, tuyến tính hóa tính phi tuyến của
cánh tay.
- Ứng dụng xử lý ảnh, nhận dạng xác định tọa độ đối tượng từ đó ra lệnh điều
khiển cánh tay bám theo đối tượng.
- Nghiên cứu các giải thuật về xử lý ảnh sâu hơn, để lọc và khử các nhiễu nâng
cao độ chính xác trong xử lý ảnh với camera chất lượng thấp, thuận tiện cho việc
nghiên cứu.
- Kết hợp thêm Robot di chuyển đa hướng dưới đế Robot nhằm nâng cao khả
năng cơ động, ứng dụng hơn nữa trong nhiều lĩnh vực khác nhau.
PHỤ LỤC
Code Master
#include <Servo.h>
#include <Wire.h>
#define SERVO_PIN 9
Servo gServo;
int servoAVal servoBVal servoCVal;
void setup() {
gServo.attach(SERVO_PIN);
Wire.begin();
Serial.begin(9600); //initialize serial comunication
}
void loop() {
while (Serial.available () > 2) { //Check if the serial data is available.
delay(20);
char serialRead = Serial.read ();
if (serialRead == 'a') {
servoAVal = Serial.parseInt ();
Serial.print(servoAVal);
int16_t bigNum = servoAVal;
byte myArray[2];
myArray[0] = (bigNum >> 8) &0xFF;
myArray[1] = bigNum &0xFF;
Wire.beginTransmission(2); // Transmit to device #8
Wire.write(myArray, 2);
Wire.endTransmission(); // Stop transmitting
}
if (serialRead == 'b') {
servoBVal = Serial.parseInt ();
Serial.print(servoBVal);
digitalWrite(MotFwd, HIGH);
digitalWrite(MotRev, LOW);
}
else { // if REV < encoderValue motor move in reverse direction.
analogWrite(MotEnable, abs(out));
digitalWrite(MotFwd, LOW);
digitalWrite(MotRev, HIGH);
}
}
void updateEncoder(){
int MSB = digitalRead(encoderPin1); //MSB = most significant bit
int LSB = digitalRead(encoderPin2); //LSB = least significant bit
int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011)
encoderValue ++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000)
encoderValue --;
lastEncoded = encoded; //store this value for next time
}
Code Matlab GUIDE
function varargout = GUIDE_LV(varargin)
%GUIDE_LV MATLAB code file for GUIDE_LV.fig
% GUIDE_LV, by itself, creates a new GUIDE_LV or raises the existing
% singleton*.
% H = GUIDE_LV returns the handle to a new GUIDE_LV or the handle to
% the existing singleton*.
% GUIDE_LV('Property','Value',...) creates a new GUIDE_LV using the
% given property value pairs. Unrecognized properties are passed via
% varargin to GUIDE_LV_OpeningFcn. This calling syntax produces a
% --- Outputs from this function are returned to the command line.
function varargout = GUIDE_LV_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
port = portList(portIndex,:);
set (s,'Port',char(port));
fopen (s);
else if connect == 1
connect = 0;
set(handles.Connect,'String','CONNECT');
set(handles.Connect,'BackgroundColor','[1 0 0]');
set(handles.pumPorts,'Enable','on');
try
fclose(s);
catch
portList = get(handles.pumPorts,'String');
portIndex = get(handles.pumPorts,'Value');
port = portList(portIndex,:);
fclose (s);
end end end
set(hObject,'BackgroundColor','white');
end
fprintf(s , 'ff');
fprintf(s , 'a'); fprintf(s , num2str(d1)); pause(2)
fprintf(s , 'b'); fprintf(s , num2str(theta2));
fprintf(s , 'c'); fprintf(s , num2str(theta3));
set(handles.d1,'String',num2str(round(d1,2)));
set(handles.theta2,'String',num2str(round(theta2,2)));
set(handles.theta3,'String',num2str(round(theta3,2)));
Y(i) = L(n).Centroid(2);
end end end end
imshow(rgb);
hold on
delete(findall(gcf,'Type', 'Rectangle'));
rectangle('Position',[X(1) Y(1) X(length(X))-X(1) Y(length(Y))-
Y(1)],'EdgeColor','w','LineWidth',2);
rectangle('Position',[X(1)+(X(length(X))-X(1))/2-20 Y(1) 40 Y(length(Y))-
Y(1)],'EdgeColor','w','LineWidth',2);
hold off
num2str(round(cY(i)))),'Color','g');
text(cX(i)+25, cY(i)+12, strcat('Y: ',
num2str(round(cX(i)-290))),'Color','g');
if (length(c) > 0) || (T > 0.9 && T < 1.1)
Color(i) = 'G';
Shape(i) = 'O';
viscircles([cX(i) cY(i)],r,'EdgeColor','g');
end
if ((T > 0.65 && T < 0.85) || (vat(n).Extent > 0.7)) && (length(c) == 0)
Color(i) = 'G';
Shape(i) = 'X';
rectangle('Position',vat(n).BoundingBox,'EdgeColor','g','LineWidth',2);
end
end
if WBlue > BBlue
plot(cX(i),cY(i),'b+');
text(cX(i)+25, cY(i)-12, strcat('X: ', num2str(round(cY(i)))),'Color','b');
text(cX(i)+25, cY(i)+12, strcat('Y: ',
num2str(round(cX(i)-290))),'Color','b');
if (length(c) > 0) || (T > 0.9 && T < 1.1)
Color(i) = 'B';
Shape(i) = 'O';
viscircles([cX(i) cY(i)],r,'EdgeColor','b');
end
if ((T > 0.65 && T < 0.85) || (vat(n).Extent > 0.7)) && (length(c) == 0)
Color(i) = 'B';
Shape(i) = 'X';
rectangle('Position',vat(n).BoundingBox,'EdgeColor','b','LineWidth',2);
end end end end end end
hold off
fprintf(s , 'ff');
fprintf(s , 'a'); fprintf(s , '70'); pause(2)
for j = 1:i
px = cY(j)-l3; py = cX(j)-290; pz = 0; d1 = pz;
c3 = (px^2+py^2-l1^2-l2^2)/(2*l1*l2); s3 = sqrt(1-(c3)^2);
theta3 = atan2d(s3,c3);
denta = px^2+py^2;
denta1 = l1*px+l2*(px*c3+py*s3);
denta2 = l1*py+l2*(py*c3-px*s3);
c2 = denta1/denta; s2 = denta2/denta;
theta2 = atan2d(s2,c2);
set(handles.d1,'String',num2str(round(d1,2)));
set(handles.theta2,'String',num2str(round(theta2,2)));
set(handles.theta3,'String',num2str(round(theta3,2)));
set(handles.px,'String',num2str(round(cY(j),2)));
set(handles.py,'String',num2str(round(py,2)));
set(handles.pz,'String',num2str(round(pz,2)));
if Color(j) == 'R' && Shape(j) == 'O'
fprintf(s , 'b'); fprintf(s , num2str(theta2));
fprintf(s , 'c'); fprintf(s , num2str(theta3)); pause(3)
fprintf(s , 'a'); fprintf(s , '0'); pause(2)
fprintf(s , 'oo'); pause(1)
fprintf(s , 'a'); fprintf(s , '70'); pause(2)
fprintf(s , 'b'); fprintf(s , '40');
fprintf(s , 'c'); fprintf(s , '30'); pause(3)
fprintf(s , 'ff'); pause(1)
end
if Color(j) == 'G' && Shape(j) == 'O'
fprintf(s , 'b'); fprintf(s , num2str(theta2));
fprintf(s , 'c'); fprintf(s , num2str(theta3)); pause(3)