DC: Direct Current
3.3 Lưu đồ giải thuật
XLV
CHƯƠNG 4. THI CÔNG HỆ THỐNG 4.1 Giao diện chính hệ thống
XLVI
Hình 4.1 Giao diện hệ thống
XLVII
Hình 4.2 Thi công băng chuyền, cảm biến, servo
XLVIII
Hình 4.3 Thi công Arduino
4.4 Thi công Module quét mã GM65
Hình 4.4 Thi công Module GM65
XLIX
Hình 4.5 Thi công mô hình hoàn chỉnh
CHƯƠNG 5. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 5.1 Kết quả đạt được
- Hoàn thành cơ bản mô hình phân loại sản phẩm theo QR code. - Mô hình hoạt động tương đối ổn định.
L
5.2 Những mặt còn hạn chế
- Công suất động cơ quá nhỏ nên không thể phân loại được những sản phẩm có khối lượng lớn.
- Do kinh nghiệm còn hạn chế nên chưa hoàn thành tốt hết công dụng của mô hình.
- Phân loại sản phẩm không liên tục, đợi sản phẩm phân loại xong mới đến phân loại sản phẩm khác.
- Tốc độ phân loại còn thấp nên không phân loại được nhiều sản phẩm. - Phải có mã QR vừa đủ kích thước thì module mới có thể đọc được. - Giao thức UART có khoảng cách truyền ngắn.
5.3 Hướng phát triển
- Kết hợp thêm cánh tay robot để vận chuyển sản phẩm.
- Kết hợp thêm cơ sở dữ liệu thêm, xóa, sửa sản phẩm cần phân loại. - Phân loại được liên tục các sản phẩm.
- Thiết kế và nghiên cứu để đọc được tất cả các kích thước của mã QR.
TÀI LIỆU KHAM KHẢO Tiếng việt:
[1] Nguyễn Hoàng Hà - Nguyễn Văn Trung.Giáo trình Visual
Studio. Huế. 2008.
[2] Phạm Quang Huy – Phạm Quang Hiển – Vũ Trọng Luật. Lập trình với
C#. NXB Thanh Niên. Websites:
[3] Tài liệu Visual Studio: http://visualcpp.net/visual-studio-la-gi-gioi-
thieu-phan- mem-visual-studio
LI
[5] Website: Mã QR – Wikipedia
[6] Website: Module quét mã 1D 2D QR GM65 [7] Website: Ardino IDE – Wikipedia
[8] Website: Cảm biến tiệm cận – Wikipedia [9] Website: Arduino Mega – Wikipedia
Trang 52
PHỤ LỤC Phụ lục I Mã nguồn cho chương trình
Chương trình Arduino: #include <Servo.h> Servo myservo_1; Servo myservo_2; Servo myservo_3; #define servoPin_1 9 #define servoPin_2 8 #define servoPin_3 10 #define BANGCHUYEN 22 #define CB_1 2 #define CB_2 3 #define CB_3 4
Trang 53 void setup() { Serial.begin(9600); Serial3.begin(9600); myservo_1.attach(servoPin_1); myservo_2.attach(servoPin_2); myservo_3.attach(servoPin_3); pinMode(BANGCHUYEN, OUTPUT); pinMode(CB_1, INPUT); pinMode(CB_2, INPUT); pinMode(CB_3, INPUT); myservo_1.write(0); myservo_2.write(0); myservo_3.write(0); } bool HLoai1 = 0; bool HLoai2 = 0; bool HLoai3 = 0;
Trang 54
String S; int dem = 0; void loop() { if (Serial3.available()) { char c = Serial3.read(); S += c; dem++; if (dem >= 9) {
if (HLoai1 == 0 && HLoai2 == 0 && HLoai3 == 0) { Serial.println(S); } S = ""; dem = 0; } } if (Serial.available()) {
Trang 55 char c = Serial.read(); if (c == '1') { HLoai1 = 1; } if (c == '2') { HLoai2 = 1; } if (c == '3') { HLoai3 = 1; } if (c == 'K') { digitalWrite(BANGCHUYEN, 1); } if ( c == 'D') { digitalWrite(BANGCHUYEN, 0); } } if (HLoai1 == 1) {
Trang 56
if (digitalRead(CB_1) == 0)
{
delay(300); // ??
for (int i = 0; i < 90; i++) { myservo_1.write(i); delay(3);
}
for (int i = 90; i > 0; i--) { myservo_1.write(i); delay(3); } HLoai1 = 0; } } if (HLoai2 == 1) { if (digitalRead(CB_2) == 0) {
Trang 57
delay(300);
for (int i = 0; i < 90; i++) { myservo_2.write(i); delay(3);
}
for (int i = 90; i > 0; i--) { myservo_2.write(i); delay(3); } HLoai2 = 0; } } if (HLoai3 == 1) { if (digitalRead(CB_3) == 0) { delay(300);
for (int i = 0; i < 90; i++) { myservo_3.write(i);
Trang 58
delay(3);
}
for (int i = 90; i > 0; i--) { myservo_3.write(i); delay(3); } HLoai3 = 0; } } }
Chương trình cho Visual:
InitializeComponent();
serialPort1.DataReceived += SerialPort1_DataReceived; // khai báo kết nối công COM
string[] BaudRate = { "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200" }; // dang sách tốc độ đường truyền
comboBox2.Items.AddRange(BaudRate); // add danh sách tốc độ đường truyền vào comboBox
comboBox2.SelectedIndex = 3; // chon vị tri ban đâu using System;
Trang 59 using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.IO.Ports; using System.Xml; namespace PHAN_LOAI_SANG_PHAM_QRCODE {
public partial class Form1 : Form
{
public Form1() {
}
private void SerialPort1_DataReceived(object sender,
System.IO.Ports.SerialDataReceivedEventArgs e) // đọc data vdk gưi lên
Trang 60
{
string line = serialPort1.ReadLine(); // đọc 1 chuỗi (string) từ vdk gửi lên
this.BeginInvoke(new LineReceivedEvent(xuly), line); // chưa hiểu
}
private void Form1_Load(object sender, EventArgs e) {
comboBox1.DataSource = SerialPort.GetPortNames(); // quét tất cả cổng COM của máy tính đang kết nối đổ vào comboBox
}
private delegate void LineReceivedEvent(string line); // chưa hiểu
int l1 = 0, l2 = 0, l3 = 0;
private void xuly(string line) // xữ ly data được gưi lên
{
tb_data.Text = line.TrimEnd(); // chưa hiểu TrimEnd
if (line.TrimEnd() == "12345678") // nêu là "12345678" thì gưi lại VDK là sô "1" và công thêm hiên thi số lương
Trang 61
serialPort1.Write("1"); // truyen số 1 xuống lại arduino ?? hỏi lại
l1++; // cộng dồn số lượng sản phẩm
txt_l1.Text = l1.ToString(); // hiển thị số 1
Invoke(new MethodInvoker(() =>
lxt_l1.Items.Add(DateTime.Now.ToLongTimeString()))); // hiển thị thời gian thực datetime
}
if (line.TrimEnd() == "ABCDEFGH") // nêu là
"ABCDEFGH" thì gưi lại VDK là sô "2" và công thêm hiên thi số lương { serialPort1.Write("2"); l2++; txt_l2.Text = l2.ToString(); Invoke(new MethodInvoker(() =>
lxt_l2.Items.Add(DateTime.Now.ToLongTimeString()))); }
if (line.TrimEnd() == "TTTTTTTT") // nêu là "TTTTTTTT" thì gưi lại VDK là sô "3" và công thêm hiên thi số lương
{
serialPort1.Write("3"); l3++;
txt_l3.Text = l3.ToString();
Trang 62
lxt_l3.Items.Add(DateTime.Now.ToLongTimeString()))); }
}
private void timer1_Tick(object sender, EventArgs e) // chưa hiểu sao phải ghi ở timer1 mà k phải ở chỗ button
{
if (!serialPort1.IsOpen) // nếu chưa kết nối hiên thi "Chưa kết nối" và ẩn nút ngắt kết nối
{
button1.Enabled = true; button2.Enabled = false; label2.Text = ("Chưa kết nối"); label2.ForeColor = Color.Red; }
else if (serialPort1.IsOpen) // nếu đã kết nối hiên thi "Đã kết nối" và ẩn nút kết nối
{
button1.Enabled = false; button2.Enabled = true; label2.Text = ("Đã kết nối"); label2.ForeColor = Color.Blue; }
Trang 63
}
private void Form1_FormClosing(object sender,
FormClosingEventArgs e) // chưa hiểu hàm này
{ if(serialPort1.IsOpen) { serialPort1.Write("D"); } }
private void groupBox2_Enter(object sender, EventArgs e) {
}
private void comboBox1_SelectedIndexChanged(object sender,
EventArgs e)
{
}
Trang 64
{
}
private void button1_Click(object sender, EventArgs e) {
if (!serialPort1.IsOpen) // kiêm tra kết nối công com chưa nêu chưa thí tiến hành kết nối cổng COM đã chon
{
serialPort1.PortName = comboBox1.Text; serialPort1.BaudRate =
Convert.ToInt32(comboBox2.Text);
serialPort1.Open();
serialPort1.Write("K"); // truyền tín hiệu K xuống vdk
} }
private void button2_Click(object sender, EventArgs e) {
serialPort1.Write("D");
serialPort1.Close(); // ngắt kết nối với cổng COM
} }
Trang 65