Hướngdẫn chi tiết ghépnối điều khiển từ máytính ứng dụng “Điều khiển động chiều” Cho ứng dụng có sơ đồ khối sau: Mạch vi điều khiển Mạch đảo chiều ĐM Vi điều khiển PIC16F877A Máytính Max 232 Cổng RS 232 Phần mềm Visual Studio 2010 Giao diện máytính (Nút, đối tượng hiển thị trạng thái động cơ) Trong đó: Phía Mạch vi điều khiển gồm Vi điều khiển PIC16F877A kết nối với mạch đảo chiều gồm Role trung gian, để đảo điều động chiều Để kết nối với máytính thơng qua cổng RS232, mạch vi điều khiển sử dụng thêm IC chuyển đổi mức MAX232 Phía máy tính, ta sử dụng phần mềm Visual Studio 2010 để thiết kế giao diện, nhằm giám sát (biết trạng thái ĐM) điều khiển (điều khiển chạy thuận, chạy ngược, dừng) động Sơ đồ nguyên lý giao diện điều khiển gợi ý sau: 2.1 Sơ đồ nguyên lý mạch Vi điều khiển: 2.2 Giao diện máytính đề xuất sau: Thiết kế chương trình: 3.1 Chương trình Vi điều khiển PIC16F877A: 3.1.1 Bảng phân công IO: Stt Đầu vào TB ĐC Rx Đầu MT RC7 St t TB ĐC MT C_T C_N Tx RE0 RE1 RC6 C_T = 1,ĐM chạy Thuận C_N = 1,ĐM chạy Ngược 3.1.2 Lưu đồ thuật tốn: VĐK PIC16F877A có nhiệm vụ nhận tín hiệu điều khiển từ máytính - Khi nhận tín hiệu từ máytính (chạy Thuận 1, chạy Ngược 2, Dừng 3) - Thì kiểm tra liệu nhận được: + Nếu liệu nhận bật động chạy thuận, truyền máytính giá trị báo hiệu trạng thái ĐC chạy thuận (trạng thái báo chạy thuận 10) + Nếu liệu nhận bật động chạy thuận, truyền máytính giá trị báo hiệu trạng thái ĐC chạy ngược (trạng thái báo chạy ngược 20) + Nếu liệu nhận dừng động cơ, truyền máytính giá trị báo hiệu trạng thái ĐC dừng (trạng thái dừng 30) 3.1.3 Viết chương trình #include #use delay(clock=20Mhz) #use RS232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) #use fast_IO(E) #define RE 0x09 #bit CHAY_T = RE.0 //khai bao dia chi #bit CHAY_N = RE.1 //khai bao dia chi int8 DL_nhan_tu_MT; //khai bao bien void main() { set_tris_E(0x00); //chon chuc nang IO, RE la nhom chan CHAY_T=0; CHAY_N=0;//dung DC while(TRUE) { if(kbhit()==1) //kiem tra xem co nhan duoc DL khong? { DL_ nhan_tu_MT = getc();//Luu DL nhan tu MT if(nhan_DL_tu_MT==1) //Neu DL nhan duoc la { CHAY_T=1; CHAY_N=0; //DM chay Thuan putc(10);//truyen ve MT gia tri 10,de bao trang thai DC } if(DL_nhan_tu_MT==2) { CHAY_T=0; CHAY_N=1;//DM chay Nguoc putc(20); } if(DL_nhan_tu_MT==3) { CHAY_T=0; CHAY_N=0;//DM dung putc(30); } } } } 3.2 Thiết kế giao diện máy tính: Tham khảo bước tạo nên giao diện từ file hướngdẫn thiết kế giao diện Visual Studio 2010, giao diện ta có đối tượng: - Form1: Là nơi chứa đối tượng cần xây dựng - Lable: Hiển thị thơng tin (“ĐẠI HỌC ĐƠNG Á”,…) - Button: Nút bấm giao diện (“NÚT THUẬN”, “MỞ CỔNG”,…) - OvalShape: Các “LED” hiển thị trạng thái ĐM (“LED_T”, …) - TextBox: Hiển thị giá trị nhận từ máytính - SerialPort: Giúp giao diện truyền thơng (truyền/nhận liệu) với mạch VĐK thông qua cổng RS232 - Timer: Tạo vòng lặp để cập nhật trạng thái liệu nhận từ cổng RS232 Lập trình cho đối tượng giao diện: - Với Form1: + Đổi tên hiển thị Form cách điều chỉnh thuộc tính Text Đổi tên hiển thị Form + Để lập trình cho Form ta click đơi Form, ta có đoạn chương trình sau: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load LED_T.FillColor = Color.Black 'Tắt LED_T LED_D.FillColor = Color.Black 'Tắt LED_N LED_N.FillColor = Color.Black 'Tắt LED_D nut_thuan.Enabled = False 'Ẩn nút Thuận nut_nguoc.Enabled = False 'Ẩn nút Ngược nut_dung.Enabled = False 'Ẩn nút Dừng nut_dong_cong.Enabled = False 'Ẩn nút Đóng Cổng End Sub Vậy đoạn chương trình thực Form chạy, nên đoạn chương trình thực đầu tiên, thông thường lệnh đặt đoạn chương trình với mục đích đặt thơng số, trạng thái ban đầu Với Lable: Hãy chọn đối tượng Lable ToolBox kéo thả Form, sau điều chỉnh thuộc tính Text Font để nội dung hình thức mong muốn (trong ứng dụng không cần click đôi vào Lable khơng thêm câu lệnh liên quan đến Lable) Với Button: Chọn đối tượng Buton ToolBox kéo thả Form, chọn kích thướt Button theo ý muốn cách kéo giản Button Đổi thuộc tính Text nút để có nội dung hiển thị nút phù hợp, theo chức nút Để dễ dàng phân biệt đoạn chương trình nút bấm lập trình, ta nên đổi thuộc tính Name Button, lưu ý đổi thuộc tính khơng phép đặt nội dung tiếng việt không chứa ký tự trống (Space) Public Class Form1 Lưu ý: Ta phải có đối tượng SerialPort, đổi thuộc tính Name thành COM Dim truyen(10) As Byte Dim nhan(10) As Byte ' chứa đoạn chương trình đối tượng Form End Class Phải khai báo biến đầu chương trình: Ví dụ: Để lập trình cho “NÚT THUẬN”, ta click đơi vào nút viết lệnh vào vị trí mà trỏ chờ, bấm NÚT THUẬN máytính truyền cổng nối tiếp giá trị = Private Sub nut_thuan_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nut_thuan.Click truyen(0) = 'Gán giá trị biến truyen, vị trí giá trị COM.Write(truyen, 0, 1) 'Ghi cổng COM nội dung biến truyền, vị trí 0, ghi byte End Sub Các nút lại tạo lập trình theo bước tương tự trên, cụ thể sau: - Với “NÚT NGƯỢC”: Ta biết bấm nút ra, máytính truyền cổng nối tiếp giá trị = Private Sub nut_nguoc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nut_nguoc.Click truyen(0) = COM.Write(truyen, 0, 1) End Sub - Với “NÚT DỪNG”: Ta biết bấm nút ra, máytính truyền cổng nối tiếp giá trị = Private Sub nut_dung_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nut_dung.Click truyen(0) = COM.Write(truyen, 0, 1) End Sub - Với “NÚT MỞ CỔNG”: Khi bấm nút ta tiến hành mở cổng COM( COM.Open()) để chuẩn bị truyền liệu từ máytính xuống Vi điều khiển Lưu ý: Nếu khơng dùng nút ta đặt lệnh mở cổng đoạn chương trình Form Trước thực thao tác nhận truyền liệu cổng COM ta phải mở cổng trước, không máytính báo lỗi Private Sub nut_mo_cong_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nut_mo_cong.Click COM.Open() 'Lệnh mở cổng COM nut_thuan.Enabled = True 'Cho phép NÚT THUẬN bấm nut_nguoc.Enabled = True 'Cho phép NÚT NGƯỢC bấm nut_dung.Enabled = True 'Cho phép NÚT DỪNG bấm nut_dong_cong.Enabled = True 'Cho phép NÚT ĐÓNG CỔNG bấm nut_mo_cong.Enabled = False 'Ẩn NÚT MỞ CỔNG bấm End Sub - Với “NÚT ĐĨNG CỔNG”: Khi bấm nút ta tiến hành đóng cổng COM Lưu ý: Nếu khơng dùng nút ta đặt lệnh đóng cổng( COM.Close()) đoạn chương trình “NÚT THOÁT” Private Sub nut_dong_cong_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nut_dong_cong.Click COM.Close() 'Lệnh đóng cổng nut_thuan.Enabled = False 'Ẩn nút thuận nut_nguoc.Enabled = False 'Ẩn nút ngược nut_dung.Enabled = False 'Ẩn nút dừng nut_dong_cong.Enabled = False 'Ẩn nút đóng cổng End Sub - Với “NÚT THỐT”: Bấm nút đóng cửa sổ giao diện Private Sub nut_thoat_chuong_trinh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nut_thoat_chuong_trinh.Click COM.Close() 'Đóng cổng COM End 'Thốt cửa sổ giao diện End Sub Với OvalShape: LED_T, LED_N, LED_D Để có “LED” nhằm thể trạng thái ĐM máy tính, ta chọn vào đối tượng OvalShape Toolbox, kéo thả Form Điều chỉnh thuộc tính BorderStyle = Solid, Hãy nhớ thuộc tính: FillColor để thay đổi màu theo mong muốn lúc lập trình LED_T.FillColor = Color.Green Và thuộc tính Name, đổi tên đối tượng theo ý định người dùng để chủ động trình lập trình Với TextBox: Để hiển thị nội dung/ liệu nhận từ cổng COM Chọn đối tượng TextBox Toolbox, kéo thả Form, (bạn di chuyển vị trị bạn cần hiển thị TextBox, lưu ý bạn kéo to TextBox được, mà hãy(*)) Điều chỉnh thuộc tính Name: đặt nhớ tên để thuận lợi cho q trình lập trình (*)Điều chỉnh thuộc tính Font để có font chữ, kiểu chữ kích thướt mong muốn, bạn chọn kích thướt font lớn kích thướt đối tượng TextBox tự động tăng lên theo để phù hợp với font Điều chỉnh thuộc tính ForeColor để có đuộc màu text theo mong muốn hien_thi_gia_tri_nhan.Text = nhan(0) hoặc: hien_thi_gia_tri_nhan.Text = “NỘI DUNG CẦN HIỂN THỊ LÊN TEXTBOX” Với SerialPort: Đối tượng giúp giao diện trao đổi liệu với mạch vi điều khiển Chọn đối tượng SerialPort Toolbox, kéo thả Form, lúc ta thấy có tượng lạ với đối tượng trước, nằm phía khơng thuộc giao diện, bạn lưu ý Form chạy, đối tượng hoàn toàn khơng thể Form Đổi thuật tính Name thành COM (thống tên ứng dụng khác) Các thuật tính: BaudRate, DataBits, Parity, StopBits phải hồn thành giống với thiết bị kết nối với máytính (Vi điều khiển) Lưu ý thuộc tính PortName (mặc định COM1), nhiên phải điều chỉnh cho phù hợp với thời điểm mà máytính kết nối với thiết bị ngoại vi Ví dụ: - Nếu cần mơ ghépnốimáytính (Visual) với mạch vi điều khiển(trên Proteus) ta cần sử dụng thêm phần mềm thứ ba, ta dùng VSPD 6.9 (tạo cổng COM ảo, kết nối cổng COM ảo với nhau) Vậy mơ phỏng, ta sử dụng cổng COM1 cho phần mềm Visual Studio 2010 COM2 cho phần mềm Proteus, nên ta chọn thuộc tính PortName phù hợp Việc truyền liệu từ máytính xuống mạch VĐK thực lệnh: COM.Write(truyen, 0, 1) Máytính nhận liệu từ VĐK nào? Dữ liệu chứa đâu? Chọn COM g Chọn Events g COM COM Để nhận liệu từ VĐK máytính sử dụng Event: DataReceived đối tượng COM, tức Chọn đối tượng COM, chọn tab Events COM, xuất thêm Events: DataReceived, ErrorReceived PinChanged Đưa chuột vào vị trí DataReceived gõ tên chương trình con(tùy ý) mà máytính thực nhận liệu từ Vi điều khiển (nhandulieu) bấm Enter , xuất đoạn chương trình mà Visual thực nhận liệu, viết lệnh nhận liệu vào! Private Sub nhandulieu(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles COM.DataReceived COM.Read(nhan, 0, 1) 'Lệnh nhận liệu từ VĐK End Sub Với đối tượng Timer: Là đối tượng giúp tạo vòng lặp liên tục, nhằm cập nhật giá trị nhận từ cổng COM Chọn đối tượng Timer Toolbox, kéo thả Form (sẽ xãy tượng giống SerialPort, khơng nằm Form, tức chạy Timer không hiển thị) Cần quan tâm thuộc tính Enabled (cho phép Timer làm việc), mặc định ban đầu False (không cho phép) ta điều chỉnh thành True (tức cho phép Timer làm việc) Với thuộc tính Name để mặc định (Timer1) Với thuộc tính Interval, giá trị thuộc tính định chu Timer, Ví dụ Interval =100, nghĩa sau thời gian 100ms Timer thực đoạn chương trình Timer Vậy “đoạn chương trình Timer” đâu? … tương tự đối tượng khác, để thực đoạn chương trình Timer click đôi vào đối tượng Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 'Đoạn chương trình Timer, 'sẽ thực sau khoảng thời gian đặt thuộc tính Interval End Sub Khác với ngôn ngữ sử dụng cho PIC16F887A (tức ngôn ngữ C phần mềm CCS), với VĐK ta phải lập trình có cấu trúc, thực theo tuần tự, trước sau,… Trong VĐK để thực vòng lặp ta sử dụng cấu trúc while Với ngôn ngữ dùng cho VĐK, để tạo vòng lặp … while(TRUE) { //đoạn CT lặp } Với ngôn ngữ VisualStudio2010 ta sử dụng Timer 'Máytính đếm đủ thời gian đặt thuộc tính Interval Private Sub Timer1_Tick(……) Handles Timer1.Tick 'Đoạn chương trình cần lặp End Sub 'Thốt tiếp tục đếm thời gian Trong ứng dụng này, ta cần cập nhật thường xuyên giá trị mà Máytính nhận từ Vi điều khiển (tức giá trị phản hồi báo trạng thái Động cơ) Cho nên đoạn chương trình Timer ta kiểm tra giá trị nhận bật /tắt LED (thuận/ngược/dừng) Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick hien_thi_gia_tri_nhan.Text = nhan(0) 'hiển thị giá trị nhận TextBox, để xem If nhan(0) = 10 Then 'Kiểm tra giá trị nhận có = 10 hay khơng, tức ĐM chạy Thuận LED_T.FillColor = Color.Green 'Bật LED_T sáng màu xanh LED_D.FillColor = Color.Black 'Tắt LED_N, màu đen LED_N.FillColor = Color.Black 'Tắt LED_D, màu đen End If If nhan(0) = 20 Then 'Kiểm tra giá trị nhận có = 20 hay không,tức ĐM chạy Ngược LED_T.FillColor = Color.Black 'Tắt LED_T, màu đen LED_N.FillColor = Color.Blue 'Bật LED_N sáng màu xanh dương LED_D.FillColor = Color.Black 'Tắt LED_D, màu đen End If If nhan(0) = 30 Then 'Kiểm tra giá trị nhận có = 30 hay khơng,tức ĐM Dừng LED_T.FillColor = Color.Black 'Tắt LED_T, màu đen LED_N.FillColor = Color.Black 'Tắt LED_N, màu đen LED_D.FillColor = Color.Red 'Bật LED_D sáng màu đỏ End If End Sub Khi mô lưu ý phần mềm tạo cổng COM ảo (VSPD6.9), cho ta kết cổng COM nào, phải chọn cổng COM ảo cho phần mềm (VD: Visual dùng COM1, Proteus dùng COM2 dùng cặp COM3COM4,…Khi chạy phần mềm phần mềm VSPD có kết quả: COM1 mở nhờ phần mềm Visual COM2 mở nhờ phần mềm Proteus ... nút đóng cửa sổ giao diện Private Sub nut_thoat_chuong_trinh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles nut_thoat_chuong_trinh.Click COM.Close() 'Đóng cổng COM End