DC: Direct Current
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