Thiết kế mạch điều khiển

Một phần của tài liệu Điều khiển cánh tay robot phân loại sản phẩm theo màu sắc dùng xử lý ảnh (Trang 51)

Chƣơng 4 : ỨNG DỤNG XỬ LÝ ẢNH ĐIỀU KHIỂN CÁNH TAY ROBOT

4.3 Thiết kế mạch điều khiển

4.3.1 Bộ điều khiển

Hình 4.1 Arduino Uno R3

4.3.1.1 Giới thiệu về Aduino

4.3.1.2 Giới thiệu bo mạch Arduino Uno R3 SMD - Một số thông tin về Arduino Uno - Một số thông tin về Arduino Uno

Hình 4.2 Board Arduino mặt trước và mặt sau

Arduino Uno là sử dụng chip Atmega328. Nó có 14 chân digital I/O, 6 chân đầu vào (input) analog, thạch anh dao động 16Mhz. Một số thông số kỹ thuật như sau :

Bảng 4.1. Thông số cơ bản của Arduino Uno Vi điều khiển ATmega328 (họ 8bit)

Điện áp hoạt động 5V – DC Tần số hoạt động 16 MHz Dòng tiêu thụ 30mA Điện áp vào khuyên

dùng 7-12V – DC

Điện áp vào giới hạn 6-20V – DC Số chân Digital I/O 14 (6 chân PWM) Số chân Analog 6 (độ phân giải 10bit) Dòng tối đa trên mỗi

chân I/O 30 mA

Dòng ra tối đa (5V) 500 mA Dòng ra tối đa (3.3V) 50 mA

Bộ nhớ flash 32 KB (ATmega328) với 0.5KB dùng bởi bootloader

SRAM 2 KB (ATmega328)

EEPROM 1 KB (ATmega328)

- Sơ đồ chân

-Sơ đồ nguyên lí

Hình 4.4 Sơ đồ mạch nguyên lý

- Sơ đồ mạch in

4.3.1.3 Mạch Rơ le

Hình 4.6 Sơ đồ các chân mạch rơle

Module 1 Relay với opto cách ly nhỏ gọn, có opto và transistor cách ly giúp cho việc sử dụng trở nên an toàn với board mạch chính, mạch được sử dụng để đóng ngắt nguồn điện công suất cao AC hoặc DC, có thể chọn đóng khi kích mức cao hoặc mức thấp bằng Jumper.

Tiếp điểm đóng ngắt gồm 3 tiếp điểm NC (thường đóng), NO(thường mở) và COM(chân chung) được cách ly hoàn toàn với board mạch chính, ở trạng thái bình thường chưa kích NC sẽ nối với COM, khi có trạng thái kích COM sẽ chuyển sang nối với NO và mất kết nối với NC.

Thông số kỹ thuật:

Sử dụng điện áp nuôi DC 5V.

Relay mỗi Relay tiêu thụ dòng khoảng 80mA.

Điện thế đóng ngắt tối đa: AC250V ~ 10A hoặc DC30V ~ 10A. Có đèn báo đóng ngắt trên mỗi Relay.

Có thể chọn mức tín hiệu kích 0 hoặc 1 qua jumper.

4.3.2 Nguồn sử dụng trong mô hình

Nguồn nuôi cho động cơ servo của cánh tay robot là thiết bị trong mô hình có điện áp đầu vào là 110~240 V AC. Đầu ra 5V DC và có dòng là 6A

Hình 4.8 Nguồn dùng cho động cơ servo của cánh tay

Nguồn cho động cơ băng tải là AC/DC Adaptor có ngõ vào là AC 100~240V tần số 50~60Hz, ngõ ra là 9V DC với dòng 1A

- Chuyển đổi ảnh về đen trắng

Để chuyển một ảnh về đen trắng ta chuyển chỉ số pixel theo công thức 299 * c.R + 587 * c.G + 114 * c.B

public Bitmap DenTrang(Image anh) {

Bitmap kq = new Bitmap(anh.Width, anh.Height); Bitmap anhtam = new Bitmap(anh);

Color c; Byte rgb;

for (int cot = 0; cot < anhtam.Width; cot++)

for (int hang = 0; hang < anhtam.Height; hang++) {

c = anhtam.GetPixel(cot, hang);

rgb = (byte)(.299 * c.R + .587 * c.G + .114 * c.B); kq.SetPixel(cot, hang, Color.FromArgb(rgb, rgb, rgb)); }

return kq; }

Hình 4.10 Chuyển đổi ảnh về đen trắng

- Chuyển đổi về ảnh âm bản

+ Để chuyển đổi về ảnh âm bản ta lấy 255 trừ đi từng chỉ số (làm màu từng pixel ngược lại)

public Bitmap AmBan(Image anh) {

Bitmap kq = new Bitmap(anh.Width, anh.Height); Bitmap anhtam = new Bitmap(anh);

Color c;

for (int cot = 0; cot < anhtam.Width; cot++)

for (int hang = 0; hang < anhtam.Height; hang++) {

c = anhtam.GetPixel(cot, hang);

kq.SetPixel(cot, hang, Color.FromArgb(255 - c.R, 255 - c.G, 255 - c.B));

}

return kq; }

Hình 4.11 Chuyển đổi về ảnh âm bản

- Lọc màu

+ Để lọc màu (cụ thể 3 màu chính là đỏ, xanh lá cây, xanh lam)

Màu đỏ sẽ tự dữ nguyên màu đỏ và đảo ngược hai màu kia (lấy 255 trừ đi chỉ số G và B). Tương tự với xanh lá cây và xanh lam.

public Bitmap ChenMau(Image anh, int mau) {

//1 = do; 2 = xanh Green); 3 = xanh (blue) Bitmap kq = new Bitmap(anh.Width, anh.Height); Bitmap anhtam = new Bitmap(anh);

Color c;

int g = 0, r = 0 , b = 0;

for (int cot = 0; cot < anhtam.Width; cot++)

for (int hang = 0; hang < anhtam.Height; hang++) { c = anhtam.GetPixel(cot, hang); switch (mau) { case 1: r = c.R; g = c.G - 255; b = c.B - 255; break; case 2: r = c.R - 255; g = c.G; b = c.B - 255;

case 3: r = c.R - 255; g = c.G - 255; b = c.B; break; } r = Math.Max(r, 0); b = Math.Max(b, 0); g = Math.Max(g, 0);

kq.SetPixel(cot, hang, Color.FromArgb(r,g,b)); }

return kq; }

Hình 4.12 Lọc màu

4.6 Code chƣơng trình điều khiển * Created by SharpDevelop. * Created by SharpDevelop. * User: Bullshit * Date: 5/6/2018 * Time: 6:30 PM *

* To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.IO.Ports; using System.Windows.Forms; using Emgu.CV; using System.Net; using Emgu.CV.CvEnum; using Emgu.CV.Structure; using Emgu.CV.Util; using System.Threading; namespace ArmController {

public partial class MainForm : Form {

VideoCapture camera; Mat frame = new Mat();

private object lockObject = new object(); Mat hsv = new Mat();

Mat mask = new Mat();

const string HOME_POSITION = "1=90;2=90;3=60;"; const string GRIP_POSITION = "1=180;2=60;3=155;"; const string POSITION_1 = "1=70;2=105;3=160;"; const string POSITION_2 = "1=80;2=45;3=90;"; const string POSITION_3 = "1=100;2=45;3=90;";

string[] POSITIONS = new string[]{ "", POSITION_1, POSITION_2, POSITION_3 };

const string START_SCROLLER = "7=0;"; const string STOP_SCROLLER = "7=1;"; const string OPEN_GRIP = "4=40;"; const string CLOSE_GRIP = "4=80;"; const float W_SELECT_BOX = 3f / 8; const float H_SELECT_BOX = 1f / 8; const int WIDTH = 640;

const int HEIGHT = 480;

int product_number = -1; bool detect = false; bool done = true; bool isTaking = false;

Rectangle selectBox = new Rectangle((int)(WIDTH / 2 - WIDTH * W_SELECT_BOX), (int)(HEIGHT / 2 - HEIGHT * H_SELECT_BOX + 30), (int)(WIDTH * W_SELECT_BOX * 2), (int)(HEIGHT * H_SELECT_BOX * 2));

ScalarArray[][] ALL_COLORS = new ScalarArray[][] { new ScalarArray[] {

new ScalarArray(new MCvScalar(225 / 2, 40 * 2.55, 20 * 2.55)),

new ScalarArray(new MCvScalar(290 / 2, 255, 255)) }, new ScalarArray[] {

new ScalarArray(new MCvScalar(90 / 2, 40 * 2.55, 10 * 2.55)),

}, new ScalarArray[] {

new ScalarArray(new MCvScalar(40 / 2, 50 * 2.55, 40 * 2.55)),

new ScalarArray(new MCvScalar(70 / 2, 255, 255))

}, }; public MainForm() { InitializeComponent();

foreach (string port in SerialPort.GetPortNames()) { arduinoPortCB.Items.Add(port);

}

serialPort1.DataReceived += port_DataReceived;

}

private void ProcessFrame(object sender, EventArgs arg)

{

camera.Retrieve(frame); //nh?n khung h?nh

CvInvoke.CvtColor(frame, hsv, ColorConversion.Bgr2Hsv); for (int i = 0; i < ALL_COLORS.Length; i++) {

ScalarArray lowerColor = ALL_COLORS[i][0]; ScalarArray upperColor = ALL_COLORS[i][1];

CvInvoke.InRange(hsv, lowerColor, upperColor, mask);

var element =

CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(30, 30), new Point(-1, -1));

CvInvoke.Erode(mask, mask, element, new Point(-1, -1), 1, BorderType.Reflect, default(MCvScalar));

CvInvoke.Dilate(mask, mask, element, new Point(-1, -1), 1, BorderType.Reflect, default(MCvScalar));

var contours = new VectorOfVectorOfPoint(); var hierarchy = new Mat();

CvInvoke.FindContours( mask, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxSimple );

CvInvoke.DrawContours(frame, contours, -1, new MCvScalar(255, 255, 0));

for (int j = 0; j < contours.Size; j++) {

var c = contours[j];

var rect = CvInvoke.MinAreaRect(c); bao l?y biên

var p = new Point();

p.X = (int)rect.Center.X;

p.Y = (int)rect.Center.Y;

if (selectBox.Contains(p)) {

product_number = i + 1;

CvInvoke.PutText(frame, "San pham " + product_number, p, FontFace.HersheySimplex, 1.0, new MCvScalar(255, 255, 0), 2, LineType.AntiAlias);

if (!isTaking) {

if (done && detect && autoCheckBox1.Checked && serialPort1.IsOpen) {

print("Take product " + product_number); new Thread(() => { sendToArduinoAndWait(STOP_SCROLLER); sendToArduinoAndWait(HOME_POSITION); sendToArduinoAndWait(OPEN_GRIP); sendToArduinoAndWait(GRIP_POSITION); sendToArduinoAndWait(CLOSE_GRIP); sendToArduinoAndWait(HOME_POSITION); sendToArduinoAndWait(POSITIONS[product_number]); sendToArduinoAndWait(OPEN_GRIP); sendToArduinoAndWait(HOME_POSITION); sendToArduinoAndWait(START_SCROLLER); isTaking = false; }).Start(); } } } } }

CvInvoke.Rectangle(frame, selectBox, new MCvScalar(255, 0, 255));

lock (lockObject) { pictureBox1.Image = frame.Bitmap; } } void waitDone() { while (!done) { Thread.Sleep(10); } }

void ComboBox1SelectedIndexChanged(object sender, EventArgs e)

{

}

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)

{

while (serialPort1.BytesToRead > 0) { var data = serialPort1.ReadTo(";"); print("Receive: " + data);

if (data.Equals("done")) {

done = true;

} else if (data.Equals("detect")) {

detect = true;

} else if (data.Equals("not detect")) {

detect = false; } } } void print(String s) { System.Diagnostics.Debug.WriteLine(s);

void GroupBox1Enter(object sender, EventArgs e)

{

}

void OpenCameraClick(object sender, EventArgs e)

{

camera = new VideoCapture(cameraAddressTB.Text + "/video"); camera.ImageGrabbed += ProcessFrame;

camera.Start();

}

void ConnectCOMClick(object sender, EventArgs e)

{ done = true; if (serialPort1.IsOpen) { serialPort1.Close(); connectCOM.Text = "K?t n?i"; } else { connectCOM.Text = "Ng?t k?t n?i"; serialPort1.PortName = "" + arduinoPortCB.SelectedItem; serialPort1.Open(); // done = true; } }

void Button3Click(object sender, EventArgs e)

{

sendToArduino(POSITION_1);

}

void Button1Click(object sender, EventArgs e)

{

sendToArduino(START_SCROLLER);

}

void Button2Click(object sender, EventArgs e)

{

}

void Button4Click(object sender, EventArgs e)

{

sendToArduino(HOME_POSITION);

}

void Button5Click(object sender, EventArgs e)

{

sendToArduino(GRIP_POSITION);

}

void FocusClick(object sender, EventArgs e)

{

new Thread(() => new

WebClient().DownloadString(cameraAddressTB.Text + "/focus")).Start(); } void sendToArduino(String s) { serialPort1.Write(s); done = false; print("Sent command: " + s); } void sendToArduinoAndWait(String s) { sendToArduino(s); waitDone(); }

void Button6Click(object sender, EventArgs e)

{

sendToArduino(POSITION_2);

}

void Button7Click(object sender, EventArgs e)

{

void Button8Click(object sender, EventArgs e)

{

sendToArduino(OPEN_GRIP);

}

void Button9Click(object sender, EventArgs e)

{

sendToArduino(CLOSE_GRIP);

}

}

Giao diện điều khiển cánh tay robot

Chƣơng 5: KẾT LUẬN HƢỚNG PHÁT TRIỂN ĐỀ TÀI 5.1. Kết quả 5.1. Kết quả

- Sau 3 tháng tìm hiểu, nghiên cứu và chế tạo thì cánh tay robot đã thực hiện được yêu cầu cơ bản là nhận dạng được màu sắc các vật và thực hiện gắp thả vật theo màu sắc đúng với vị trí đặt ra.

- Mô hình chế tạo gọn gàng và khá đẹp mắt. - Các khớp của cánh tay hoạt động khá trơn tru.

5.2 Ƣu điểm

- Hệ thống nổi bật là ứng dụng xử lý ảnh để điều khiển cánh tay robot, có thể nhận dạng được tất cả các vật, xử lý nhanh

- Có độ chính xác cao

5.3 Các hạn chế của cánh tay Robot.

- Cánh tay khi hoạt động còn rung, giật do kết cấu cơ khí chưa vững chắc. - Không thể gắp được các vật có khối lượng nặng

- Cánh tay được thiết kế chỉ hoạt động từng khớp một nên chưa linh hoạt lắm.

- Động cơ phía băng tải khi hoạt động còn gây tiếng ồn

5.4 Hƣớng phát triển đề tài

Sau khi thực hiện đề tài, với một số thiếu sót giới hạn về phía người thực hiện cũng như về yếu tố kỹ thuật của thiết bị. Để đề tài có thể thực hiện tốt hơn đem lại kết quả cao thì cần phát triển một số những vấn đề sau:

-Cải tiến kỹ thuật đối với phần cứng nâng cao chất lượng thu nhận ảnh dùng các thiết bị có độ phân giải cao.

-Nhận dạng vật thể nhiều hình dạng phức tạp và đa màu sắc.

- Điều khiển linh hoạt các khớp cùng 1 lúc, phát triển lên 5, 6 bậc tự do. 5.5 Ý nghĩ của ứng dụng xử lý ảnh để điều khiển robot phân loại sản phẩm

Tôi tìm hiểu và nghiên cứu ứng dụng xử lý ảnh trong điều khiển cánh tay robot là kết quả trong quá trình học tập của tôi. Tôi mong muốn khai thác và sử dụng mô hình cánh tay robot một cách thật hiệu quả. Những vấn đề được trình bày trong đồ án tôi hi vọng mọi người tiếp tục tìm hiểu và nghiên cứu để cánh tay robot hoàn thiện hơn và tìm ra được nhiều ứng dụng hiệu quả trong việc áp dụng xử lý ảnh. Điều này sẽ

giúp cho sự phát triển của khoa học công nghệ áp dụng vào đời sống sản xuất, giảm sức lao động con người.

5.6 Kiến nghị, đề xuất.

Dù đã hết sức cố gắng nhưng do thời gian có hạn và kiến thức còn hạn chế nên việc thực hiện đề tài còn gặp nhiều thiết sót. Tôi hy vọng đề tài sẽ phát triển hoàn thiện hơn để ứng dụng vào trong sản xuất. Và sau đây là một vài đề nghị của tôi:

- Đề tài cần được tiếp tục nghiên cứu và chế tạo hoàn thiện để áp dụng vào thực tế sản xuất. Có thể mở rộng phạm vi nghiên cứu ứng dụng vào những mục đích khác.

- Lắp đặt thêm cảm biến và camera xử lý hình ảnh tốt để xử lý ảnh có thể thực hiện các nhiệm vụ phức tạp và khó khăn hơn như xử lý nhận dạng mặt người, biển số hoặc phát hiện sản phẩm lỗi chứ không đơn thuần là nhận dạng màu sắc.

Trên đây là những vấn đề mà hiện nay đề tài nghiên cứu của tôi chưa thực hiện được rất mong được sự đóng góp ý kiến từ các thầy cô giáo và các bạn để đề tài được hoàn thiện hơn.

TÀI LIỆU THAM KHẢO

1. Đỗ Văn Chuyên. Ứng dụng xử lý ảnh trong điều khiển cánh tay robot công nghiệp. Luận văn thạc sĩ khoa khoa học máy tính. 2013

2. PGS. TS. Đỗ Năng Toàn, TS. Phạm Viết Bình. Xử Lý Ảnh. 2007

3. PGS.TS Nguyễn Quang Hoan. Giáo trình xử lý ảnh. Học viện Công Nghệ Bưu Chính Viễn Thông Hà Nội. 2006

4. TS.Nguyễn Mạnh Tiến. Điều khiển Robot công nghiệp. NXB Khoa học và kỹ thuật. 2007.

5. Cộng đồng Arduino Viêt Nam. arduino.vn

6. Lương Mạnh Bá, Nguyễn Thanh Thủy. Nhập môn xử lý ảnh số. NXB Khoa học và kỹ thuật. 2002.

LỜI CẢM ƠN

Để có được thành công, bên cạnh việc nổ lực cố gắng không ngừng của bản thân thì đều gắn liền với sự giúp đỡ, hỗ trợ của mọi người xung quanh, dù ít hay nhiều, dù trực tiếp hay gián tiếp hoặc về mặt tinh thần hay vật chất. Từ khi nhận được đề tài và bắt đầu công việc làm đồ án cho đến khi hoàn thành. Tôi đã nhận được sự quan tâm, giúp đỡ, chỉ bảo của thầy cô, gia đình và bạn bè xung quanh.

“Ăn quả nhớ kẻ trồng cây”, bằng sự biết ơn đó em xin gửi lời cảm ơn chân thành nhất đến quý thầy cô của Trường đại học công nghiệp TP.HCM đã dùng những tri thức và tâm huyết của mình để có thể truyền đạt cho tôi vốn kiến thức quý báu suốt khoảng thời gian học tập 4 năm tại trường.

Đặc biệt em xin chân thành cảm ơn thầy giáo ThS.Nguyễn Ngọc Anh Tuấn đã tận tâm chỉ bảo hướng dẫn em qua từng buổi nói chuyện, thảo luận về đề tài nghiên cứu. Nhờ có những lời hướng dẫn, dạy bảo chỉ dẫn nhiệt tình của thầy, khóa luận này của tôi đã hoàn thành một cách tốt nhất. Một lần nữa, em xin gửi lời cảm ơn chân thành đến thầy.

Với sự tìm tòi, học hỏi, nghiên cứu trong khoảng thời gian 4 tháng và kiến thức còn hạn hẹp nên không thể tránh khỏi những sai sót, hạn chế. Tôi rất mong nhận được

những ý kiến đóng góp của quý thầy cô và các bạn để khóa luận dần được hoàn thiện

hơn. Tôi xin chân thành cảm ơn!

Cuối cùng tôi xin chúc quý thầy cô cùng các bạn mạnh khỏe, hạnh phúc và thành công!

Một phần của tài liệu Điều khiển cánh tay robot phân loại sản phẩm theo màu sắc dùng xử lý ảnh (Trang 51)

Tải bản đầy đủ (PDF)

(72 trang)