TỔNG QUAN VỀ CÔNG NGHỆ THIẾT KẾ ĐỀ BÀI: Xây đựng giao diện và CSDL cho hệ thống dếm sản phẩm và phân loại sản phẩm theo chiều cao Ý tưởng thực hiện + Xây dựng giao diện điều khiển thiết bị trên WinForm sử dụng phần mền Visual Studio 2010 + Viết chương trình nhận lệnh và thực thi lệnh cho arduino + Xây dựng mạch mô phỏng thông qua phần mền Proteus + Sử dụng vi điều khiển arduino uno để điều khiển hệ thống + Xây dựng cơ sở dữ liệu trên SQL Sever 2008 + Viết chương trình điều khiển và lưu dữ liệu điều khiển vào SQL + Hoàn thành hệ thống Phần cứng sử dụng Hệ thống gồm có : + 01 Vi điều khiển arduino uno R3 + 03 Cảm biến hồng ngoại + 01 Động cơ DC + 02 Động cơ Servo
BÁO CÁO ĐỀ TÀI Xây đựng giao diện Cơ Sở Dữ Liệu cho hệ thống dếm sản phẩm phân loại sản phẩm theo chiều cao LỜI CẢM ƠN Đầu tiên xin gửi lời cảm ơn sâu sắc đến Thầy Đặng Văn Ngọc - cương vị giảng viên hướng dẫn đề tài nhiệt tình bảo, hướng dẫn, giảng giải tận tình vướng mắc trình tìm hiểu đề tài Cảm ơn thầy chủ nhiệm giảng viên môn cung cấp, bổ sung mặt kiến thức; góp phần nâng cao vốn hiểu biết ngành học tạo tiền đề để thực đề tài thuận lợi Xin cảm ơn bạn khóa, khoa động viên, khích lệ, ủng hộ nhiều mặt góp phần làm nên thành công đề tài XIN CHÂN THÀNH CẢM ƠN! TỔNG QUAN VỀ CÔNG NGHỆ THIẾT KẾ ĐỀ BÀI: Xây đựng giao diện CSDL cho hệ thống dếm sản phẩm phân loại sản phẩm theo chiều cao Ý tưởng thực + Xây dựng giao diện điều khiển thiết bị WinForm sử dụng phần mền Visual Studio 2010 + Viết chương trình nhận lệnh thực thi lệnh cho arduino + Xây dựng mạch mô thông qua phần mền Proteus + Sử dụng vi điều khiển arduino uno để điều khiển hệ thống + Xây dựng sở liệu SQL Sever 2008 + Viết chương trình điều khiển lưu liệu điều khiển vào SQL + Hoàn thành hệ thống Phần cứng sử dụng Hệ thống gồm có : + 01 Vi điều khiển arduino uno R3 + 03 Cảm biến hồng ngoại + 01 Động DC + 02 Động Servo Chương 1: CƠ SỞ LÝ THUYẾT 1.1 Tổng quan ArduinoUno R3 1.1.1 Giới thiệu Arduino khởi động vào năm 2005 dự án dành cho sinh viên trại Interaction Design Institute Ivrea (Viện thiết kế tương tác Ivrea) Ivrea, Italy Cái tên "Arduino" đến từ quán bar Ivrea, nơi vài nhà sáng lập dự án thường xuyên gặp mặt Các thiết bị dựa tảng Arduino lập trình ngơn ngữ riêng Ngơn ngữ dựa ngôn ngữ Wiring viết cho phần cứng nói chung mơi trường phát triển tích hợp (IDE) chạy máy tính cá nhân Và Wiring lại biến thể C/C++ Một số người gọi Wiring, số khác gọi C hay C/C++ Sau tảng Wiring hoàn thành, nhà nghiên cứu làm việc với để giúp nhẹ hơn, rẻ hơn, khả dụng cộng đồng mã nguồn mở số nhà nghiên cứu David Cuarlielles, phổ biến ý tưởng Những nhà thiết kế Arduino cố gắng mang đến phương thức dễ dàng, không tốn cho người yêu thích, sinh viên giới chuyên nghiệp để tạo thiết bị có khả tương tác với môi trường thông qua cảm biến cấu chấp hành Thông tin thiết kế phần cứng cung cấp công khai để muốn tự làm mạch Arduino tay tự thực (mã nguồn mở) Người ta ước tính khoảng năm 2011 có 300 ngàn mạch Arduino thức sản xuất thương mại, vào năm 2013 có khoảng 700 ngàn mạch thức đưa tới tay người dùng Phần cứng Arduino gốc sản xuất công ty Italy tên Smart Projects Một vài board dẫn xuất từ Arduino thiết kế công ty Mỹ tên SparkFun Electronics Nhiều phiên Arduino sản xuất phù hợp cho nhiều mục đích sử dụng: Hình 2.1: Những phiên Arduino 1.1.2 Uno "Uno" có nghĩa tiếng Ý đặt tên để đánh dấu việc phát hành tới Arduino 1.0 Uno phiên 1.0 phiên tài liệu tham khảo Arduino Uno loại board Arduino, mơ hình tham chiếu cho tảng Arduino Arduino Uno “hội đồng quản trị” dựa ATmega328 Nó có 14 số chân đầu vào / đầu ra, đầu vào analog, 16 MHz cộng hưởng gốm, kết nối USB, jack cắm điện, tiêu đề ICSP, nút reset Nó chứa tất thứ cần thiết để hỗ trợ vi điều khiển; cần kết nối với máy tính cáp USB cấp điện cho để bắt đầu Hình 1.2: Arduino Uno Uno khác với tất phiên trước chỗ khơng sử dụng FTDI chip điều khiển USB-to-serial Thay vào đó, có tính Atmega 16U2 lập trình cơng cụ chuyển đổi USB-to-serial Phiên (R2) Uno sử dụng Atmega8U2 có điện trở kéo dịng 8U2 HWB xuống đất, làm cho dễ dàng để đưa vào chế độ DFU Phiên (R3) Uno có tính sau đây: Thêm SDA SCL gần với pin Aref hai chân đặt gần với pin RESET, IOREF cho phép thích ứng với điện áp cung cấp Đặt lại mạch khỏe mạnh Atmega 16U2 thay 8U2 1.1.3 Cấu trúc, thông số Bảng 1.1: Một vài thông số Arduino UNO R3 a Vi điều khiển & nhớ Arduino UNO sử dụng vi điều khiển họ 8bit AVR ATmega8, ATmega168, ATmega328 Bộ não xử lí tác vụ đơn giản điều khiển đèn LED nhấp nháy, xử lí tín hiệu cho xe điều khiển từ xa, làm trạm đo nhiệt độ - độ ẩm hiển thị lên hình LCD,… Hình 1.3: Vi điều khiển Atmega328 tiêu chuẩn 32KB nhớ Flash: đoạn lệnh lập trình lưu trữ nhớ Flash vi điều khiển Thường có khoảng vài KB số dùng cho bootloader đừng lo, cần 20KB nhớ 2KB cho SRAM (Static Random Access Memory): giá trị biến khai báo lập trình lưu Khai báo nhiều biến cần nhiều nhớ RAM Tuy vậy, thực nhớ RAM lại trở thành thứ phải bận tâm Khi điện, liệu SRAM bị 1Kb cho EEPROM (Electrically Eraseble Programmable Read Only Memory): giống ổ cứng mini – nơi đọc ghi liệu vào mà lo bị cúp điện giống liệu SRAM b Cấu tạo Hình 1.4: Arduino đời đầu Một board Arduino đời đầu gồm cổng giao tiếp RS-232 (góc phía trênbên trái) chip Atmel ATmega8 (màu đen, nằm góc phải-phía dưới); 14 chân I/O số nằm phía chân analog đầu vào phía đáy Board Arduino đưa hầu hết chân I/O vi điều khiển để sử dụng cho mạch Diecimila, Duemilanove, Uno đưa 14 chân I/O kỹ thuật số, số tạo xung PWM (điều chế độ rộng xung) chân input analog, sử dụng chân I/O số Những chân thiết kế nằm phía mặt board, thông qua header 0.10-inch (2.5 mm) Các board Arduino Nano, Arduino-compatible Bare Bones Board Boarduino cung cấp chân header đực mặt board dùng để cắm vào breadboard Chiều dài tối đa chiều rộng Uno PCB 2,7 2,1 inch tương ứng, với kết nối USB jack điện mở rộng vượt ngồi khơng gian cũ Bốn lỗ vít cho phép gắn vào bề mặt khác: Hình 1.5: Các lỗ vít giúp cố định vị trí Arduino c Vị trí & chức chân Nếu khơng có sẵn nguồn từ cổng USB, cấp nguồn cho Arduino UNO từ chuyển đổi AC→DC pin Các chuyển đổi kết nối plug-2.1mm trung tâm tích cực vào jack cắm điện Trường hợp cấp nguồn ngưỡng làm hỏng Arduino UNO Các chân lượng: GND (Ground): cực âm nguồn điện cấp cho Arduino UNO Khi dùng thiết bị sử dụng nguồn điện riêng biệt chân phải nối với 5V: cấp điện áp 5V đầu Dòng tối đa cho phép chân 500mA 3.3V: cấp điện áp 3.3V đầu Dòng tối đa chân 50mA Vin (Voltage Input): để cấp nguồn cho Arduino UNO, ta nối cực dương nguồn với chân cực âm với chân GND IOREF: điện áp hoạt động vi điều khiển Arduino UNO đo chân Và dĩ nhiên ln 5V Mặc dù không lấy nguồn 5V từ chân để sử dụng chức khơng phải cấp nguồn RESET: việc nhấn nút Reset board để reset vi điều khiển tương đương với việc chân RESET nối với GND qua điện trở 10KΩ Các chân Input/Output: Hình 1.6: Các ngõ vào/ngõ Arduino Arduino UNO có 14 chân digital dùng để đọc xuất tín hiệu Chúng có mức điện áp 0V 5V với dòng tối đa chân 40mA Một số chân digital có chức đặc biệt sau: chân Serial: (RX) (TX): dùng để gửi (transmit – TX) nhận (receive – RX) liệu TTL Serial Arduino Uno giao tiếp với thiết bị khác thông qua chân Kết nối bluetooth thường thấy nói nơm na kết nối Serial không dây Nếu không cần giao tiếp Serial, không nên sử dụng chân không cần thiết Chân PWM (~): 3, 5, 6, 9, 10, 11: cho phép bạn xuất xung PWM với độ phân giải 8bit (giá trị từ → 28 -1 tương ứng với 0V → 5V) hàm analogWrite() Nói cách đơn giản, điều chỉnh điện áp chân từ mức 0V đến 5V thay cố định mức 0V 5V chân khác Chân giao tiếp SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK) Ngoài chức thơng thường, chân cịn dùng để truyền phát liệu giao thức SPI với thiết bị khác LED 13: Arduino UNO có đèn led màu cam (kí hiệu chữ L) Khi bấm nút Reset, ta thấy đèn nhấp nháy để báo hiệu Nó nối với chân số 13 Khi chân người dùng sử dụng, LED sáng Arduino UNO có chân analog (A0 → A5) cung cấp độ phân giải tín hiệu 10bit (0 → 210 -1) để đọc giá trị điện áp khoảng 0V → 5V Với chân AREF board, ta để đưa vào điện áp tham chiếu sử dụng chân analog Tức cấp điện áp 2.5V vào chân ta dùng chân analog để đo điện áp khoảng từ 0V → 2.5V với độ phân giải 10bit Đặc biệt, Arduino UNO có chân A4 (SDA) A5 (SCL) hỗ trợ giao tiếp I2C/TWI với thiết bị khác d Extension shield Hình ảnh giao diện Hệ thống cần: - Lable - ComboBox - button - TextBox - DataGridView 2.7 Lưu đồ thuật toán 2.7.1 Lưu đồ thuật toán cho hệ thống đếm phân loại sản phẩm theo chiều cao Bắt đầu Chạy Chương Trình Cảm biến1 =1 Cảm biến2 =1 Cảm biến3 =1 SP Cao+1 Motor Servo1 SP Trung Binh+1 Hoạt động Motor Servo2 SP Thấp +1 Hoạt động Hiển Thị Hiển Thị Hiển Thị Dữ liệu máy tính Dữ liệu máy tính Dữ liệu máy tính OFF 2.7.2 Lưu đồ thuật tốn giao diện phần mền thiết kế Bắt Đầu Chọn Cổng Com,buad,data,stop Paraty Connect Disconnect Sai Nhận liệu Đúng Thêm liệu vào giao diện Dữ Liệu có giao diện Đúng Xóa liệu khổi bảng giao diện thêm vào sở liệu Disconnect Kết thúc Code – Chương trình Arduino #include #include #define sensor1 #define sensor2 #define sensor3 #define servo1 #define servo2 LiquidCrystal LCD(7,8,9,10,11,12); Servo motor1; Servo motor2; int cao =0; int TB = 0; int thap = 0; int sensor1Status; int sensor2Status; int sensor3Status; void setup() { Serial.begin(9600); LCD.begin(16,2); pinMode(sensor1, INPUT); pinMode(sensor2, INPUT); pinMode(sensor3, INPUT); motor1.attach(servo1); motor2.attach(servo2); // put your setup code here, to run once: } void loop() { LCD.setCursor(0,0); LCD.print("Cao"); LCD.setCursor(7,0); LCD.print("TB"); LCD.setCursor(12,0); LCD.print("Thap"); sensor1Status = digitalRead(sensor1); { if(sensor1Status==0) { cao=cao+1; { LCD.setCursor(1,2); LCD.print(cao); Serial.print("@"); Serial.print(cao); Serial.println("#"); Serial.println(""); delay(1000); } motor1.write(70); delay(2000); motor1.write(0); } } sensor2Status = digitalRead(sensor2); { if(sensor2Status==0) { TB=TB+1; { LCD.setCursor(7,2); LCD.print(TB); Serial.print("$"); Serial.print(TB); Serial.println("%"); Serial.println(""); delay(1000); } motor2.write(70); delay(2000); motor2.write(0); } } sensor3Status = digitalRead(sensor3); { if(sensor3Status==0) { thap=thap+1; { LCD.setCursor(14,2); LCD.print(thap); Serial.print("&"); Serial.print(thap); Serial.println("*"); delay(1000); } } } } Visual 2010 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.IO.Ports; using System.Xml; using System.Data.SqlClient; namespace ChieuCaoCuoi { public partial class Form1 : Form { string soluong; SerialPort Port = new SerialPort(); string indata = String.Empty; SqlConnection cc = new SqlConnection(@"Data Source=MAYTINHFCJ80LL;Initial Catalog=chieucao;Integrated Security=True"); public Form1() { InitializeComponent(); string[] ports = SerialPort.GetPortNames(); this.Port.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.Datareceive); cbbcom.Items.AddRange(ports); string[] buad = { "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200" }; cbbbuad.Items.AddRange(buad); string[] data = { "7", "8", "9" }; cbbdata.Items.AddRange(data); string[] stop = { "1", "1,5", "2" }; cbbstop.Items.AddRange(stop); string[] paraty = { "none", "odd", "evevn" }; cbbparaty.Items.AddRange(paraty); } private void hienthi() { try { cc.Open(); string hienthi = "select * from chieucao"; SqlDataAdapter data = new SqlDataAdapter(hienthi, cc); DataTable dt = new DataTable(); data.Fill(dt); dataGridView1.DataSource = dt; cc.Close(); } catch (Exception) { } } private void them() { try { cc.Open(); SqlCommand sql = new SqlCommand("them", cc); sql.CommandType = CommandType.StoredProcedure; sql.Parameters.Add(new SqlParameter("id", SqlDbType.Int)).Value = txbid.Text; sql.Parameters.Add(new SqlParameter("sp", SqlDbType.DateTime)).Value = txbsanpham.Text; sql.Parameters.Add(new SqlParameter("sl", SqlDbType.Float)).Value = txbsoluong.Text; sql.Parameters.Add(new SqlParameter("tg", SqlDbType.Text)).Value = txbthoigian.Text; sql.ExecuteNonQuery(); cc.Close(); } catch (Exception) { } } private void xoa() { try { cc.Open(); SqlCommand sql = new SqlCommand("xoa", cc); sql.CommandType = CommandType.StoredProcedure; sql.Parameters.Add(new SqlParameter("id", SqlDbType.Int)).Value = txbid.Text; sql.ExecuteNonQuery(); cc.Close(); } catch (Exception) { } } private void cbbcom_SelectedIndexChanged(object sender, EventArgs e) { if (Port.IsOpen) Port.Close(); Port.PortName = cbbcom.SelectedItem.ToString(); } private void cbbbuad_SelectedIndexChanged(object sender, EventArgs e) { if (Port.IsOpen) Port.Close(); Port.BaudRate = Convert.ToInt32(cbbbuad.Text); } private void cbbdata_SelectedIndexChanged(object sender, EventArgs e) { if (Port.IsOpen) Port.Close(); Port.DataBits = Convert.ToInt32(cbbdata.Text); } private void cbbstop_SelectedIndexChanged(object sender, EventArgs e) { if (Port.IsOpen) Port.Close(); switch (cbbstop.SelectedIndex.ToString()) { case "1": Port.StopBits = StopBits.One; break; case "1,5": Port.StopBits = StopBits.OnePointFive; break; case "2": Port.StopBits = StopBits.Two; break; } } private void cbbparaty_SelectedIndexChanged(object sender, EventArgs e) { if (Port.IsOpen) Port.Close(); switch (cbbparaty.SelectedIndex.ToString()) { case "none": Port.Parity = Parity.None; break; case "odd": Port.Parity = Parity.Odd; break; case "even": Port.Parity = Parity.Even; break; } } private void btconnect_Click(object sender, EventArgs e) { try { Port.PortName = cbbcom.Text; Port.Open(); btdisconnect.Enabled = true; btconnect.Enabled = false; timer1.Enabled = true; } catch { MessageBox.Show("Lỗi không kết nối được", "Thử lại", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btdisconnect_Click(object sender, EventArgs e) { Port.Close(); btdisconnect.Enabled = false; btconnect.Enabled = true; MessageBox.Show("Đã ngắt kết nối"); timer1.Enabled = false; } private void Form1_Load(object sender, EventArgs e) { try { Control.CheckForIllegalCrossThreadCalls = false; cbbcom.SelectedIndex = 0; cbbbuad.SelectedIndex = 3; cbbdata.SelectedIndex = 1; cbbstop.SelectedIndex = 0; cbbparaty.SelectedIndex = 0; hienthi(); } catch (Exception) {} } private void Datareceive(object sender, SerialDataReceivedEventArgs e) { int dau; int cuoi; indata = Port.ReadLine(); try { dau = indata.IndexOf("@"); cuoi = indata.IndexOf("#"); soluong = indata.Substring(dau + 1, cuoi - dau - 1); txbsoluong.Text = soluong; txbsanpham.Text = "Cao"; } catch (Exception) { } try { dau = indata.IndexOf("$"); cuoi = indata.IndexOf("%"); soluong = indata.Substring(dau + 1, cuoi - dau - 1); txbsoluong.Text = soluong; txbsanpham.Text = "Trung Binh"; } catch (Exception) { } try { dau = indata.IndexOf("&"); cuoi = indata.IndexOf("*"); soluong = indata.Substring(dau + 1, cuoi - dau - 1); txbsoluong.Text = soluong; txbsanpham.Text = "Thap"; } catch (Exception) { } } private void btthem_Click(object sender, EventArgs e) { them(); hienthi(); } private void btxoa_Click(object sender, EventArgs e) { xoa(); hienthi(); } int t = 0; private void timer1_Tick_1(object sender, EventArgs e) { txbthoigian.Text = DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss"); t++; if (t % 20 == 0) { t = 0; hienthi(); } } int dem; private void txbsoluong_TextChanged(object sender, EventArgs e) { dem++; txbid.Text = Convert.ToString(dem); them(); } } } Chương KẾT QUẢ Hướng dẫn sử dụng Bước Cấp nguồn kết nối Arduino với máy tính Cấp nguồn cho mạch cách cắm cổng kết nối với máy tính Bước Mở giao diện tạo visual studio lên Bước Chọn cổng COM ,tốc độ Baud ,Data, Stop Paraty Bước Đổ chương trình vào arduino tiến hành sử dụng Khi cấp nguồn song hệ thống bắt đầu hoạt động, bạn đặt sản phẩm lên băng chuyền(có loại sản phẩm cao, trung bình thấp), băng chuyền chuyển sản phẩm đến cảm biến - Nếu sản phẩm cao qua cảm biến số lượng sản phẩm cao tăng lên đơn vi động Motor Servo gạt sản phẩm xuống - Nếu sản phẩm trung bình qua cảm biến khơng nhận dc tín hiệu motor Servo1 khơng hoạt động, đến cảm biến nhận dc tín hiệu,số lượng sản phẩm trung bình tăng lên đớn vị động Motor Servo gạt sản phẩm xuống - Nếu sản phẩm thấp qua cảm biến k nhận dc tín hiệu động Motor Servo k hoạt động, đến cảm biến nhận dc tín hiệu , số lượng sản phẩm thấp tăng lên đơn vi Ngồi bạn dùng biển trở gắn động DC để làm giảm tốc độ cho băng chuyền cảm biến mạch để giảm độ tương phan cho LCD Bước Hiển thị máy tính Khi nhận liệu từ phần cứng hiển thị máy tính, kiểm tra liệu nhận có xác khơng k xác nhấn nút xóa cịn xác nhấn nút thêm để lưu liệu nhận SQL Tài Liệu Tham Khảo Giáo trình Do lường Điều khiển máy tính(tác giả Đặng Văn Ngọc) Trang Wed http://arduino.vn https://www.youtube.com/watch?v=dmL6BXlIrUg KẾT LUẬN Sau thời gian nghiên cứu tìm hiểu đề tài này; đến nay, “mơ hình phân loại đếm sản phẩm theo chiều cao sử dụng Arduino” thiết kế, chế tạo thành công Ưu/Nhược điểm * Ưu điẻm: - Mạch nhỏ gọn - Đáp ứng yêu cầu đề tài - Hiển thị rõ ràng * Nhược điểm: - Độ ổn định chưa tối ưu Hướng phát triển - Áp dụng cho dây chuyển sản xuất nhỏ - Thay đổi cảm biến để tạo dây chuyền phân loại dựa tiêu chí khác sản phẩm - Khắc phục nhược điểm đề đề tài hoàn thiện Do thời gian kiến thức cịn hạn hẹp nên khơng thể tránh khỏi thiếu sót q trình thực đề tài Rất mong nhận góp ý, đánh giá quý báu quý thầy cô bạn ... THÀNH CẢM ƠN! TỔNG QUAN VỀ CÔNG NGHỆ THIẾT KẾ ĐỀ BÀI: Xây đựng giao diện CSDL cho hệ thống dếm sản phẩm phân loại sản phẩm theo chiều cao Ý tưởng thực + Xây dựng giao diện điều khiển thiết bị WinForm... tế 2. 6 Thiết kế giao diện Hình ảnh giao diện Hệ thống cần: - Lable - ComboBox - button - TextBox - DataGridView 2. 7 Lưu đồ thuật toán 2. 7.1 Lưu đồ thuật toán cho hệ thống đếm phân loại sản phẩm. .. song hệ thống bắt đầu hoạt động, bạn đặt sản phẩm lên băng chuyền(có loại sản phẩm cao, trung bình thấp), băng chuyền chuyển sản phẩm đến cảm biến - Nếu sản phẩm cao qua cảm biến số lượng sản phẩm