Tập bài giảng Điều khiển bằng máy tính

Chương trình cơ bản của LabVIEW là một VI, hay là Virtual Instruments: Thiết bị ảo. Để tạo 1 chương trình mới, ta ấn vào nút Blank VI. LabVIEW sẽ hiện ra 2 cửa sổ: Front Panel và Block Diagram. Hình 4.34 Cửa sổ Front Panel và Block Diagram137 Đó là 2 thành phần cơ bản của LabVIEW. Front Panel (từ đây gọi là FP) là giao diện của chương trình với người dùng. Tại đây lưu trữ: • Các biến điều khiển như: nút bấm (Button), thanh gạt (Slide), Núm vặn (Knob), TextBox để nhập chuỗi ký tự được gọi chung là các biến điều khiển, nơi người dùng có thể điều chỉnh giá trị của các biến đó bằng tương tác trực tiếp với chương trình • Các Biến hiển thị: Đồng hồ (Meter), Đồ thị (Chart), Biểu đồ (Graph), đèn báo (LED), hình ảnh (Picture) hay hình ảnh 3D (3D picture) gọi chung là các biến hiển thị, nơi người dung có thể quan sát thay đổi của các biến một cách trực quan. • Các biến điều khiển và các biến hiển thị không có sự phân biệt rõ ràng trong LabVIEW, ngoài hướng tương tác với người dùng và với máy tính. Trong LabVIEW coi 2 loại biến này đều là các biến, có thể được lập trình để thay đổi trực tiếp • Mỗi khi tạo 1 Biến Điều khiển hoặc Hiển thị trong Front Panel (FP), một biểu tượng (Icon) sẽ xuất hiện tương ứng trong Block Diagram (BD). Kích đúp vào Biến trên FP, Icon tương ứng trong BD sẽ được tự động biểu hiện. • Mũi tên được đánh dấu là nút RUN, dùng để bắt đầu chạy chương trình. Khi nút RUN đó bị gãy, tức là chương trình đang có lỗi (Error), không chạy được Block Diagram (DB) : Là nơi chương trình LabVIEW được lập trình, chứa nội dung (code) chương trình. • Tương tự trong Simulink của Matlab, việc lập trình trong DB bằng cách nối các biến với nhau và với các khối biểu diễn phép toán giống như đi dây trong thiết bị điện. • Trên Block Diagram cũng biểu diễn các vòng lặp, Cấu trúc lập trình, và các thuật toán. • Khi chương trình VI chạy Block Diagram không hiển thị giao diện tương tác vớingười dùng. • Có thể chạy chế độ Debug trên Block Diagram bằng cách ấn vào biểu tượng Bóng đèn trong BD (Highlight Execution). Các dòng dữ liệu sẽ được biểu diễn chạy tuần tự để biểu thị sự thay đổi chi tiết các biến trong chương trình • Để tạo ra một chương trình sáng sủa, gọn gàng nhằm đơn giản hóa việc kiểm tra, kiểm soát chương trình, một chương trình LabVIEW thông thường được lập trình theo trình tự: Từ trên xuống dưới, trái sang phải. c. Tạo project LabVIEW Để tạo 1 Project trong LabVIEW, ta ấn vào Empty Project. Trong các bài viết tiếp đây chúng ta hầu như làm việc bằng cách tạo Empty VI, việc tạo Project là chưa thực sự cần thiết. d. Các kiểu dữ liệu cơ bản trong LabVIEW

pdf155 trang | Chia sẻ: Tiểu Khải Minh | Ngày: 19/02/2024 | Lượt xem: 122 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Tập bài giảng Điều khiển bằng máy tính, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
noi voi port2 ;tan so thanh anh su dung la 11.0592 ;khung du lieu la: 1200,n,8,1 ;chuong trinh su dung ngat noi tiep de nhan ;-------------------------------------------------------- org 0 jmp start 104 ;--- khai bao dia chi vec to ngat noi tiep org 23h mov a,sbuf ;doc du lieu tu bo dm noi tiep vao A mov p2,a ;dua A ra port2 clr ri ;xoa co nhan reti ;-------------------------------------------------------- start: mov ie,#10010000b ;cho phep ngat noi tiep mov scon,#01010000b ;du lieu noi tiep 8bit UART va cho phep nhan mov tmod,#00100000b ;chon timer1 mode 8 bit tu dong nap lai mov th1,#0e8h ;to do la 1200 voi crystal=11.0592Mhz setb tr1 ;khoi dong timer1 mov p2,#0 ;tat led jmp $ ;dung tai cho end * Lúc này ta nạp chương trình cho VĐK và kết nối với máy tính để chạy thử nghiệm. Khi ta truyền một ký tự nào đó thì trên các led đơn nối với Port 2 sẽ có mã ASCII của ký tự đó. - Ví dụ 1: Viết chương trình trên Visual Basic tạo một ứng dụng để truyền các ký tự gõ vào từ bàn phím ra led đơn thông qua vi điều khiển 89c51 để điều khiển các LED đơn gắn ở Port 0 sáng tắt theo mã ASSCII của phím được nhấn. * Tạo ứng dụng trên Visual Basic. + Khởi động phần mềm Visual Basic. và tạo ra giao diện như sau: Hình 4.10 Tạo giao diện trên Visual Basic. Để tạo được giao diện như trên ta cần lấy trong thư viện Visual Basic gồm: + 1 textbox để hiển thị có ký hiệu Memo1 như trên hình đồng thời ta có thể dán nhãn cho textbox đó bằng cách lấy label trong thư viện và gán tên cho chúng là “dữ liệu cần truyền” 105 + 2 nút bấm lấy được bằng cách vào Commandbutton trong thư viện và gán tên lần lượt là “truyền”và “thoát” +Ta cần lấy biểu tượng chiếc điện thoại bàn như trên hình vẽ để thiết lập cổng COM.Trước khi lấy được biểu tượng này ta phải chọn Component trên menu của chương trình sau đó chọn Import Actix X lúc này chương trình hiện ra một hộp thoại cho phép ta lựa chọn các đối tượng cần nhập vào. Ta tiến hàn kéo thanh cuốn dọc và lựa chọn Microsoft Comm Control 6.0 sau đó chọn Install. Sau bước này ta sẽ thấy xuất hiện biểu tượng chiếc điện thoại trong thư viện và chỉ việc lấy ra sử dụng. Sau khi tạo được giao diện như trên ta sẽ phải thiết lập cho các sự kiện( viết chương trình cho các sự kiện) để chúng hoạt động đáp ứng theo yêu cầu bằng cách khi viết cho sự kiện nào ta sẽ nháy đúp chuột vào sự kiện đó rồi viết chương trình cho chúng. Thiết lập thông số cho Mscomm1 như sau: MSComm1.CommPort:= 1; // chọn cổng Com 1 MSComm1.PortOpen:= True; // mở cổng MSComm1.Settings:= '9600,n,8,1'; // chọn tốc đọ truyền là 9600, không kiểm tra chẵn lẻ, 8 bit dữ liệu, 1 bit stop. + Viết mã nguồn cho các sự kiện như sau: //CHUONG TRINH TRUYEN DU LIEU QUA CONG COM1 //THONG QUA 89C51 DIEU KHIEN LED DON interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, MSCommLib_TLB; type TForm1 = class(TForm) Label1: TLabel; Button1: TButton; Button2: TButton; MSComm1: TMSComm; MEMO1: TMemo; procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } 106 public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); begin MSComm1.PortOpen:= false; // CHON DONG CONG close; // DONG UNG DUNG end; procedure TForm1.FormCreate(Sender: TObject); begin // THIET LAP THUOC TINH CHO CONG COM MSComm1.CommPort:= 1; // CONG COM1 MSComm1.PortOpen:= True; // CHON MO CONG MSComm1.Settings:= '9600,n,8,1'; MEMO1.Text:=''; // XOA CAC KY TU TRONG MEMO1 end; procedure TForm1.Button1Click(Sender: TObject); begin // DAP UNG SU KIEN KHI NHAN NUT TRUYEN mscomm1.output:=memo1.Text; //TRUYEN DI end; end. + Sau khi thiết kế và viết mã nguồn xong ta hợp dịch và tạo ra được ứng dụng chạy trên Windows có giao diện như sau: Hình 4.11 Ứng dụng chạy trên WINDOW 107 * Viết chương trình cho VĐK 89C51. ;Chuong trinh nhan du lieu tu PC ;Tan so thanh anh su dung la 11.0592Mhz ;************************ mov scon,#50h ; MOV TMOD,#20h ;Timer 1 tu dong nap lai MOV TH1,#0FDh ;toc do truyen la 9600 SETB TR1 ;khoi dong timer1 ;************************ MOV P0,#00H ;tat het cac led port0 loop: jnb ri,$ ;kiem tra co nhan clr ri ;xoa co nhan de nhan ki tu ke tiep mov p0,sbuf ;dua du lieu tai bo dem noi tiep ra port0 jmp loop ;cho nhan end ;ket thuc chuong trinh + Hợp dịch nội dung chương trình vừa soạn thảo và nạp vào vi điều khiển. +Kết nối phần cứng để chạy ứng dụng và quan sát kết quả. + Kết nối Com1 với hệ Kit thực tập + Chọn truyền thông nối tiếp với khối VĐK + Dùng bus để nối đầu ra của Port 0 với Led đơn. + Chạy ứng dụng và nhập ký tự cần truyền từ bàn phím và nhấn truyền sau đó quan sát Led đơn. - Ví dụ 2: Viết chương trình trên Visual tạo một ứng dụng để truyền các ký tự gõ vào từ bàn phím ra led đơn thông qua vi điều khiển 89c51 để điều khiển các LED đơn gắn ở Port 0 sáng tắt theo mã ASSCII của phím được nhấn đồng thời hiển thị ký tự được nhấn từ bên ngoài trên ứng dụng. * Tạo ứng dụng trên Visual. + Khởi động phần mềm Visual Basic và tạo ra giao diện như sau: 108 Hình 4.12 Thiết lập giao diện dùng Visual Basic Để tạo được giao diện như trên ta cần lấy trong thư viện Visual Basic gồm: + 2 textbox để hiển thị có ký hiệu Memo1 và Memo2 như trên hình đồng thời để phân biệt rõ 2 textbox đó ta có thể dán nhãn cho chúng bằng cách lấy 2 label trong thư viện và gán tên cho chúng lần lượt là “dữ liệu cần truyền” và “dữ liệu nhận được” + 3 nút bấm lấy được bằng cách vào Commandbutton trong thư viện và gán tên lần lượt là “truyền”, “nhận” và “thoát” + Viết mã nguồn cho các sự kiện như sau: unit TRUYENNHAN; //CHUONG TRINH TRUYEN NHAN DU LIEU NOI TIEP TU PC THONG QUA VDK VOI THIET BI NGOAI VI // SU DUNG CONG COM1, TOC DO TRUYEN 9600B/S interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, MSCommLib_TLB; type TForm1 = class(TForm) Memo1: TMemo; Memo2: TMemo; Label1: TLabel; Label2: TLabel; MSComm1: TMSComm; Button1: TButton; Button2: TButton; Button3: TButton; procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); 109 procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button3Click(Sender: TObject); begin MSComm1.PortOpen:= false; //DONG CONG close //DONG UNG DUNG end; procedure TForm1.FormCreate(Sender: TObject); begin //TRHIET LAP THUOC TINH CONG COM MSComm1.CommPort:= 1; //CHONG CONG COM1 MSComm1.PortOpen:= True; //MO CONG MSComm1.Settings:= '9600,n,8,1'; MEMO1.Text:=''; //XOA CAC MEMO MEMO2.Text:=''; end; procedure TForm1.Button1Click(Sender: TObject); begin //SU KIEN KHI NHAN NUT TRUYEN mscomm1.output:=memo1.Text; //TRUYEN DI end; procedure TForm1.Button2Click(Sender: TObject); begin //SU KIEN KHI NHAN NUT NHAN memo2.Text:=memo2.Text+mscomm1.Input; // NHAN VAO end; end. 110 + Sau khi thiết kế và viết mã nguồn xong ta hợp dịch và tạo ra được ứng dụng chạy trên Windows có giao diện như sau: Hình 4.13 Ứng dụng chạy trên Window * Viết chương trình cho VĐK 89C51. (Chương trình viết trên Pinnacle 52 hoặc KEIL C). + Khởi động phần mềm lập trình soạn thảo chương trình như sau: ;Chuong trinh truyen va nhan du lieu tu PC ;Tan so thanh anh su dung la 11.0592Mhz ;************************ mov scon,#52h ; MOV TMOD,#20h ;Timer 1 tu dong nap lai MOV TH1,#0FDh ;toc do truyen la 9600 SETB TR1 ;khoi dong timer1 ;************************ mov p2,#0ffh ;dat p2 lam dau vao MOV P1,#00H ;tat het cac led port0 loop: jnb ti,$ clr ti mov a,p2 mov sbuf,a jnb ti,$ jnb ri,loop clr ri mov p1,sbuf jmp loop end ;ket thuc chuong trinh + Hợp dịch nội dung chương trình vừa soạn thảo và nạp vào vi điều khiển. 111 +Kết nối phần cứng để chạy ứng dụng và quan sát kết quả. + Kết nối Com1 với hệ Kit thực tập + Chọn truyền thông nối tiếp với khối VĐK + Dùng bus để nối đầu ra của Port 1 với Led đơn. + Nối Port 2 với bàn phím hexa + Chạy ứng dụng và nhập ký tự cần truyền từ bàn phím và nhấn truyền sau đó quan sát Led đơn và trên ứng dụng . 4.2.4. Lập trình giao tiếp PC với Arduino dùng VB.NET và cổng COM(USB) Arduino là một board mạch vi xử lý, nhằm xây dựng các ứng dụng tương tác với nhau hoặc với môi trường được thuận lợi hơn. Phần cứng bao gồm một board mạch nguồn mở được thiết kế trên nền tảng vi xử lý AVR Atmel 8bit, hoặc ARM Atmel 32- bit. Những Model hiện tại được trang bị gồm 1 cổng giao tiếp USB, 6 chân đầu vào analog, 14 chân I/O kỹ thuật số tương thích với nhiều board mở rộng khác nhau. Hình 4.14 Board arduino - Được giới thiệu vào năm 2005, Những nhà thiết kế của Arduino cố gắng mang đến một phương thức dễ dàng, không tốn kém cho những người yêu thích, sinh viên và giới chuyên nghiệp để tạo ra những thiết bị có khả năng tương tác với môi trường thông qua các cảm biến và các cơ cấu chấp hành. Những ví dụ phổ biến cho những người yêu thích mới bắt đầu bao gồm các robot đơn giản, điều khiển nhiệt độ và phát hiện chuyển động. Đi cùng với nó là một môi trường phát triển tích hợp (IDE) chạy trên các máy tính cá nhân thông thường và cho phép người dùng viết các chương trình cho Aduino bằng ngôn ngữ C hoặc C++. 112 Hình 4.15 Cấu tạo Arduino Một board Arduino đời đầu gồm một cổng giao tiếp RS-232 (góc phía trên-bên trái) và một chip vi xử lý 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 trên và 6 chân analog đầu vào ở phía đáy. Một mạch Arduino bao gồm một vi điều khiển AVR với nhiều linh kiện bổ sung giúp dễ dàng lập trình và có thể mở rộng với các mạch khác. Một khía cạnh quan trọng của Arduino là các kết nối tiêu chuẩn của nó, cho phép người dùng kết nối với CPU của board với các module thêm vào có thể dễ dàng chuyển đổi, được gọi là shield. Vài shield truyền thông với board Arduino trực tiếp thông qua các chân khách nhau, nhưng nhiều shield được định địa chỉ thông qua serial bus I²C-nhiều shield có thể được xếp chồng và sử dụng dưới dạng song song. Arduino chính thức thường sử dụng các dòng chip megaAVR, đặc biệt là ATmega8, ATmega168, ATmega328, ATmega1280, và ATmega2560. Một vài các bộ vi xử lý khác cũng được sử dụng bởi các mạch Aquino tương thích. Hầu hết các mạch gồm một bộ điều chỉnh tuyến tính 5V và một thạch anh dao động 16 MHz (hoặc bộ cộng hưởng ceramic trong một vài biến thể), mặc dù một vài thiết kế như LilyPad chạy tại 8 MHz và bỏ qua bộ điều chỉnh điện áp onboard do hạn chế về kích cỡ thiết bị. Một vi điều khiển Arduino cũng có thể được lập trình sẵn với một boot loader cho phép đơn giản là upload chương trình vào bộ nhớ flash on-chip, so với các thiết bị khác thường phải cần một bộ nạp bên ngoài. Điều này giúp cho việc sử dụng Arduino được trực tiếp hơn bằng cách cho phép sử dụng 1 máy tính gốc như là một bộ nạp chương trình. - Theo nguyên tắc, khi sử dụng ngăn xếp phần mềm Arduino, tất cả các board được lập trình thông qua một kết nối RS-232, nhưng cách thức thực hiện lại tùy thuộc vào đời phần cứng. Các board Serial Arduino có chứa một mạch chuyển đổi giữa RS232 sang TTL. Các board Arduino hiện tại được lập trình thông qua cổng USB, thực hiện 113 thông qua chip chuyển đổi USB-to-serial như là FTDI FT232. Vài biến thể, như Arduino Mini và Boarduino không chính thức, sử dụng một board adapter hoặc cáp nối USB-to-serial có thể tháo rời được, Bluetooth hoặc các phương thức khác. (Khi sử dụng một công cụ lập trình vi điều khiển truyền thống thay vì ArduinoIDE, công cụ lập trình AVR ISP tiêu chuẩn sẽ được sử dụng.) Board Arduino sẽ đưa ra hầu hết các chân I/O của vi điều khiển để sử dụng cho những mạch ngoài. Diecimila, Duemilanove, và bây giờ là Uno đưa ra 14 chân I/O kỹ thuật số, 6 trong số đó có thể tạo xung PWM (điều chế độ rộng xung) và 6 chân input analog, có thể được sử dụng như là 6 chân I/O số. Những chân này được thiết kế nằm phía trên mặt board, thông qua các header cái 0.10-inch (2.54 mm). Nhiều shield ứng dụng plugin cũng được thương mại hóa. Các board Arduino Nano, và Arduino- compatible Bare Bones Board và Boarduino có thể cung cấp các chân header đực ở mặt trên của board dùng để cắm vào các breadboard. Thư viện Serial được dùng trong việc giao tiếp giữa các board mạch với nhau (hoặc board mạch với máy tính hoặc với các thiết bị khác). Tất cả các mạch Arduino đều có ít nhất 1 cổng Serial (hay còn được gọi là UART hoặc USART). Giao tiếp Serial được thực hiện qua 2 cổng digital 0 (RX) và 1 (TX) hoặc qua cổng USB tới máy tính. Vì vậy, nếu bạn đang sử dụng các hàm của thư viện Serial này, bạn không thể sử dụng các chân digital 0 và digital 1 để làm việc khác được! Ta có thể sử dụng bảng Serial monitor có sẵn trong Arduino IDE để giao tiếp với Arduino qua giao thức Serial. Kích vào biểu tượng Serial Monitor ( ) hoặc nhấn tổ hợp phím Ctrl+Shift+M để mở bảng Serial Monitor, sau đó kích chuột vào bảng chọn để chọn baudrate giống với baudrate được dùng trong quá trình lập trình. Mặc định là 9600. Có thể nói Serial là một trong những phương thức giao tiếp đơn giản nhất trong môi trường Serial. Vì ta chỉ cần 2 dây và cách thức truyền dữ liệu của nó lại giống hệt stream trong các ngôn ngữ lập trình. Nhưng đối với Arduino Uno chỉ có duy nhất một cổng Serial được phần cứng hỗ trợ sẵn (Mega thì 3). Vì vậy, nếu ta muốn giao tiếp với nhiều module Serial thì sẽ rất khó khăn. Và đó chính là lý do ta sử dụng thư viện Software Serial. Ta sẽ tìm cách giao tiếp giữa 2 mạch Arduino thông qua Serial và một ví dụ về chuyển tiếp giá trị của một module giao tiếp qua Serial (như module bluetooth) với thư viện này. Cấu trúc cơ bản của một chương trình Arduino gồm hai hàm chính setup() và loop(). Hai hàm này là bắt buộc đối với một chương trình Arduino. setup() 114 Hàm setup() được gọi khi chương trình bắt đầu. Thường dùng để khởi tạo giá trị ban đầu cho biến, cài đặt chế độ hoạt động của các chân, khởi động việc sử dụng thư viện... Hàm setup() sẽ chỉ được gọi duy nhất một lần, ngay sau khi bật nguồn hoặc reset bo Arduino. loop() Sau khi thực hiện xong hàm setup(), hàm loop() sẽ được gọi để thực hiện và sẽ được gọi lặp đi lặp lại liên tục cho đến khi nào tắt hệ thống. Thường thì trong hàm loop() sẽ là chương trình chính, các công việc mà bạn muốn hệ thống Arduino của mình thực hiện. Cách viết: Một chương trình Arduino với hai hàm setup() và loop() sẽ được viết như sau: void setup() { // code khởi tạo sẽ được viết ở đây } void loop() { // code phần công việc mà bạn muốn board Arduino của mình thực hiện sẽ viết ở đây } Ví du về chương trình Blink LED (nháy LED) là đơn giản và cơ bản trên Arduino, vì hầu hết người lập trình Arduino đều trải qua. Blink LED thực hiện việc chớp tắt một LED đơn có sẵn trên bo và được kết nối với chân số 13 của Arduino. int led = 13; // số thứ tự của chân Arduino kết nối với LED // hàm setup sẽ được gọi chạy một lần khi reset void setup() { pinMode(led, OUTPUT); // cài đặt chân digital là output (ngõ ra) } // hàm loop sẽ được gọi chạy lặp đi lặp lại void loop() { digitalWrite(led, HIGH); // bật LED (xuất ngõ ra ở mức cao - HIGH) delay(1000); // chờ 1000ms = 1 giây digitalWrite(led, LOW); // tắt LED (xuất ngõ ra ở mức thấp - LOW) delay(1000); // chờ 1000ms = 1 giây } 115 Hình 4.16 Chương trình Blink LED Chương trình giao tiếp với máy tính Arduino có một điểm rất đa dạng là đã kết hợp cổng nạp và giao tiếp trong một, nghĩa là sau khi nạp xong ta có thể ngay lập tức giao tiếp với bo để lấy thông tin Để giao tiếp với máy tính thì đơn giản cần sử dụng class Serial có sẵn của Arduino: Khởi tạo trong setup: // Hàm setup chỉ chạy một lần khi bắt đầu khởi động lại void setup() { Serial.begin(9600); //Initialize Serial port with baud is 9600 } 116 Sau đó có thể đọc và truyền dữ liệu từ cổng Serial một cách tuần tự: void loop() { if(Serial.available()){ //Check if have data in Serial Buffer char inMess = Serial.read(); //Read data from Serial port Serial.println(inMess); // Print to Serial port when you want send data to computer } delay(100); // wait for a little } Như vậy nếu khéo léo kết hợp thì có thể dùng bàn phím truyền lệnh xuống như kiểu nút nhấn làm cho Arduino có thể lên tới hàng trăm lệnh điều khiển Chúng ta thường sử dụng Arduino giao tiếp với máy tính qua Serial Monitor qua Arduino IDE, vậy làm sao ta giao tiếp với Board qua phần mềm riêng biệt như Arduino. Với Arduino, cổng USB mặc định trên bản thân là cổng Serial0. Khi ta cắm board vào máy tính, Driver cổng sẽ gán cho board 1 cổng COM mặc định bất kỳ. Khi chúng ta dùng lệnh Serial.println('String...'), Board sẽ gửi thông tin lên cổng COM qua chuẩn truyền nối tiếp. Việc của ta là phải viết chương trình để nhận dữ liệu đó. Viết chương trình nhận dữ liệu trên VB. NET Hình 4.17 Giao diện chương trình nhận dữ liệu trên VB. NET 117 Ta tiến hành tạo New projects mới, kiểu Windows Form, reference lớp System.IO vào. Imports System.IO Mọi dữ liệu nhận được đều gọi sự kiện Dim WithEvents SerialPort As New IO.Ports.SerialPort Chương trình: Imports System.IO Public Class Form1 Dim WithEvents SerialPort As New IO.Ports.SerialPort Dim selPort As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load RefreshPorts() SPSetup() End Sub Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click If SerialPort.IsOpen Then SerialPort.Write(Chr(1) & Chr(90) & Chr(48) & Chr(57) & Chr(48)) txtSendData.Text) SerialPort.Write(txtSendData.Text) Else SPSetup() SerialPort.Write(txtSendData.Text) End If End Sub Private Sub ConnectSerial() Try SerialPort.BaudRate = 9600 SerialPort.PortName = selPort SerialPort.Open() Catch SerialPort.Close() End Try End Sub Delegate Sub myMethodDelegate(ByVal [text] As String) Dim myD1 As New myMethodDelegate(AddressOf myShowStringMethod) Sub myShowStringMethod(ByVal myString As String) txtSerialText.AppendText(myString) End Sub Private Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived Dim str As String = SerialPort.ReadExisting Invoke(myD1, str) 118 End Sub Private Sub btnRefreshPorts_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefreshPorts.Click RefreshPorts() End Sub Private Sub RefreshPorts() txtPort.Items.Clear() For Each sp As String In My.Computer.Ports.SerialPortNames txtPort.Items.Add(sp) Next If txtPort.Items.Count > 0 Then txtPort.SelectedIndex = 0 selPort = txtPort.Text End If End Sub Private Sub btnClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClear.Click txtSerialText.Text = String.Empty End Sub Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click Me.Close() End Sub Public Sub SPSetup() Serial Port Setup On Error Resume Next If SerialPort.IsOpen Then SerialPort.Close() End If SerialPort.PortName = selPort COM3 SerialPort.BaudRate = 9600 SerialPort.DataBits = 8 SerialPort.StopBits = IO.Ports.StopBits.One SerialPort.Handshake = IO.Ports.Handshake.None SerialPort.Parity = IO.Ports.Parity.None -----> Now change the Encoding to enable 8-bit communications: <----- SerialPort.Encoding = System.Text.Encoding.GetEncoding(1252) SerialPort.Open() End Sub Private Sub txtPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtPort.SelectedIndexChanged selPort = txtPort.Text Me.Text = String.Format(Arduino Serial Communication - {0}, selPort) SPSetup() End Sub End Class 119 Viết chương trình trên Ardunio: Chương trình ví dụ trên Arduino sẽ nhận các ký tự gửi xuống và gửi ngược trở lại PC char incomingByte = 0; void setup(){ Serial.begin(9600); } void loop(){ if (Serial.available() > 0) { // read the incoming byte: incomingByte = Serial.read(); // say what you received in ASCII //Serial.print(I received: ); Serial.println(incomingByte); } } 4.2.5. Lập trình dùng Matlab Như đã giới thiệu về giao tiếp nối tiếp giữa Matlab với thiết bị ngoại vi qua cổng nối tiếp ở phần trên. Sau đây ta sẽ tổng hợp lại một số bài viết về lập trình giao tiếp RS232 trên PC bằng phần mềm Matlab. Đối tượng Serial Object Việc giao tiếp này cũng không quá khó khăn. Đã giao tiếp thành công trên ngoại vi. Để bắt đầu kiểm tra trước tiên ta hãy đấu tắt 2 chân 2 và 3 (TX và RX) của cổng COM lại. Đầu tiên sẽ đưa ra môt chương trình đơn giản, cơ bản trong đó thiết lập một vài tham số, còn chi tiết về thiết lập tham số nó thế nào và ý nghĩa ra sao. Ví dụ đầu tiên giới thiệu cách tạo đối tượng, kết nối, viêt hàm callback. Tạo đối tượng: Chúng ta gõ lệnh và kết quả hiện luôn (nhớ là k có dấu ; ở cuối lệnh Chương trình: >> s = serial('COM1') 120 Serial Port Object : Serial-COM1 Communication Settings Port: COM1 BaudRate: 9600 Terminator: 'LF' Communication State Status: closed RecordStatus: off Read/Write State TransferStatus: idle BytesAvailable: 0 ValuesReceived: 0 ValuesSent: 0 Như vậy đối tượng là Serial-COM1, tốc độ 9600,.. Tiếp theo, chúng ta xem các tham số của đối tượng như thế nào bằng lệnh get(s): Chương trình: >> get(s) ByteOrder = littleEndian BytesAvailable = 0 BytesAvailableFcn = BytesAvailableFcnCount = 48 BytesAvailableFcnMode = terminator BytesToOutput = 0 ErrorFcn = InputBufferSize = 512 Name = Serial-COM1 ObjectVisibility = on OutputBufferSize = 512 OutputEmptyFcn = RecordDetail = compact RecordMode = overwrite RecordName = record.txt RecordStatus = off Status = closed 121 Tag = Timeout = 10 TimerFcn = TimerPeriod = 1 TransferStatus = idle Type = serial UserData = [] ValuesReceived = 0 ValuesSent = 0 SERIAL specific properties: BaudRate = 9600 BreakInterruptFcn = DataBits = 8 DataTerminalReady = on FlowControl = none Parity = none PinStatus = [1x1 struct] PinStatusFcn = Port = COM1 ReadAsyncMode = continuous RequestToSend = on StopBits = 1 Terminator = LF Ta thấy là có rất nhiều tham số trong chương trình nhưng chúng ta ở đây quan tâm đến tham số: BytesAvailableFcn tham số này chưa thiết lập. Tham số này chính là hàm callback mà nó sẽ gọi khi có byte nhận được ở bộ đệm nhận.Vậy chúng ta viết hàm này chính là viết hàm OnComm đáp ứng sự kiện ReceiveEvent như trong MSCOMM của MS vậy. Thiết lập này phải thực hiện trước khi mở cổng để giao tiếp, nên chúng ta sẽ viết hàm callback trước. Bạn viết 1 m-file với tên Serial_Callback.m như sau: function Serial_Callback(obj,event) ind = fscanf(obj) Cú pháp của hàm callback như trên với obj là đối tượng kiểu Serial như trên. Hàm có tác dụng đọc dữ liệu và hiển thị luôn kết quả lên command window. Chúng ta đưa tham số tên hàm vào cho đối tượng s của ta: 122 >> s.BytesAvailableFcn = @Serial_Callback; Tiếp theo chúng ta bắt đầu giao tiếp: >>fopen(s); >>fprintf(s,"chao cac ban"); Sau đó ta sẽ xem kết quả thế nào, và thử truyền các kí tự khác xem bằng lệnh fprintf(s,...), hoặc thử với vi xử lý xem nó truyền lên các bạn sẽ thấy rất rõ ràng. Khi không giao tiếp nữa thì đóng cổng lại: >>fclose(s); Chương trình giao tiếp RS232 Đây là chương trình viết dùng GUI, kiểm tra kết nối với mạch FPGA Spartan 3E rồi. Cách dùng: a/ Chọn tham số cho RS232 rùi ấn nút Connect để bắt đầu kết nối với RS232. b/ Nhập dữ liệu vào ô TX và nhấn nút Send để gửi dữ liệu. c/ Để thay đổi tham số (tốc độ, ..) cho RS232 thì phải nhấn Disconnect trước rồi mới chỉnh tham số. Sau đó quay lại bước 1. Hình 4.18 Chương trình RS232 Communication Chú ý đây là chương trình viết dưới dạng mở, tức là ta có thể thêm code vào các hàm để phục vụ mục đích của mình. Đó chính là các hàm ngắt nhận, ngắt gửi,... BytesAvailableFcnCount là số byte nhận được trong bộ đệm nhận trước khi xảy ra ngắt nhận. Các hàm đó là: 123 - function ByteAvailable_Callback(obj, event) - function OutputEmpty_Callback(obj, event) - function Error_Callback (obj, event) - function PinStatus_Callback(obj, event) - function Timer_Callback (obj,event) - function BreakInterrupt_Callback(obj, event) Khi ta muốn thao tác với dữ liệu vừa nhận được thì điều chỉnh thêm code trong hàm sau: function ByteAvailable_Callback(obj, event) Ví dụ tiếp theo ta sẽ thiết kế giao diện GUI trong Matlab. 1. Mở phần mềm Matlab, gõ lệnh sau vào cửa sổ Command >> guide Hình 4.19 Cửa sổ GUIDE Quick Start trong Matlab Trong cửa sổ GUIDE Quick Start có nhiều lựa chọn theo một trong các khuân mẫu sau: Create New GUI: Tạo một hộp thoại GUI mới theo một trong các loại sau  Blank GUI (Default): Hộp thoại GUI trống không có một điều khiển uicontrol nào cả.  GUI with Uicontrols: Hộp thoại GUI với một vài uicontrol như button, ... Chương trình có thể chạy ngay.  GUI with Axes and Menu: Hộp thoại GUI với một uicontrol axes và button, các menu để hiển thị đồ thị.  Modal Question Dialog: Hộp thoại đặt câu hỏi Yes, No. Open Existing GUI: mở một project có sẵn. 124 Trong hướng dẫn này, ta sẽ tạo một project mới nên sẽ chọn Blank GUI 2. Cửa sổ GUI Hình 4.20 Giao diện GUI trong Matlab Giao diện rất giống với các chương trình lập trình giao diện như Visual Basic, Visual C++, ... ta di chuột qua các biểu tượng ở bên trái sẽ thấy tên của các điều khiển. Ở đây ta giới thiệu qua một vài điều khiển hay dùng:  Push Button: giống như nút Command Button trong VB. Là các nút bấm như nút OK, Cancel mà ta vẫn bấm.  Slider : Thanh trượt có một con trượt chạy trên đó.  Radio Button : Nút nhỏ hình tròn để chọn lựa  Check Box  Edit Text  Static Text  Pop-up Menu  List Box  Axes  Panel  Button Group  ActiveX Control  Toggle Button Còn menu thì quan trọng nhất là menu Tools có:  Run (Ctr + T) : nhấn vào để chạy chương trình mà ta đã viết. Có lỗi là hiện ra báo ngay 125  Align Object: dùng để làm cho các điều khiển sắp xếp gọn đẹp theo ý mình như cùng căn lề bên trái, ...  Grid and Rulers : dùng để cấu hình về lưới trong giao diện vì nó sẽ coi giao diện như một ma trận các ô vuông nhỏ, ta sẽ thay đổi giá trị này để cho các điều khiển có thể thả ở đâu tùy ý cho đẹp.  Menu Editor : trình này để tạo menu cho điều khiển  Tab Order Editor : sắp xếp Tab order là thứ tự khi ta nhấn phím Tab  Gui Options : lựa chọn cho giao diện GUI. Các bạn nên vào menu Help để xem hướng dẫn thêm trong Help. Các bạn save dưới tên: TUT01, khi đó đồng thời xuất hiện cửa sổ Editor và đang mở file TUT01.m của bạn. Trong thư mục bạn save sẽ có 2 file là:  TUT01.fig : file này chứa giao diện của chương trình  TUT01.m : file chứa các mã thực thi cho chương trình như các hàm khởi tạo, các hàm callback,... (sẽ nói chi tiết vào bài khác). 3. Kéo thả các điều khiển Ta sẽ làm một ví dụ tiếp theo bằng cách kéo vào trong giao diện 2 edit box, 1 static box và 1 Push Button. Hình 4.21 Giao diện tạo nút bấm Chương trình có chức năng khi nhấn vào nút bấm thì kết quả của phép tính cộng giữa 2 số được gõ vào 2 ô sẽ hiện lên trong Static Text. 126 4. Thay đổi các thuộc tính của các điều khiển Click đúp vào Edit Text bên trái để xuất hiện cửa sổ các thuộc tính của điều khiển. Có thể sắp xếp theo chức năng hoặc theo thứ tự A-Z của tên thuộc tính bằng nút hiện ở gõ bên trái. Hình 4.22 Thay đổi các thuộc tính Thuộc tính quan trọng của Edit Box bao gồm:  Tag: đây là thuộc tính giống như Caption trong Visual Basic để đặt tên điều khiển. Dùng tên này có thể thao tác đến các thuộc tính của đối tượng. Mình đặt tên là: editStr1.  String : là xâu kí tự hiện lên Edit Box. Các bạn xóa cái này đi. Tương tự, thay đổi thuộc tính tag của Edit Box thứ 2 thành editStr2. Static Box cũng tương tự thành staticStr3. Push Button: thuộc tính tag = buttonCalculate, string = calculate 127 5. Viết lệnh cho chương trình Ví dụ trong chương trình có tác dụng khi nhấn vào nút Push Button sẽ hiện lên kết quả ở Static Box. Vì thế nên sẽ phải viết vào hàm nào mà khi nhấn vào Push Button sẽ gọi. Chính là hàm Callback. Điều khiển nào cũng có hàm callback, như hàm ngắt trong vi điều khiển vậy. Click chuột phải vào nút Calculate chọn Callback. Trong này còn một số hàm nữa sẽ tính sau. Hình 4.23 Giao diện chọn hàm callbacks Nhìn vào định nghĩa của hàm trong Editor ta sẽ thấy là: hàm này được thực hiện khi nhấn vào nút buttonCalculate. Hàm có một số tham số:  hObject : handle của điều khiển buttonCalculate  eventdata  handles : là một cấu trúc chứa tất cả các điều khiển và dữ liệu người dùng. Dùng hàm này để truy suất các điều khiển khác. 128 Qua thuộc tính tag của các điều khiển ta sẽ truy suất đến thuộc tính string của các điều khiển editStr1, editStr2,editStr3 bằng lệnh get và set. get(handles.tag_dieu_khien, 'ten thuoc tinh'); set(handles.tag_dieu_khien, 'ten_thuoc_tinh', gia_tri); và hàm quan trọng nữa biến từ string sang số là hàm: str2num và num2str để biến trở lại. Vậy chúng ta sẽ viết hàm như sau: Nhấn nút Run kiểm tra kết quả Hình 4.24 Kiểm tra kết quả trong Matlab 129 4.2.6. Lập trình dùng LABVIEW Như đã giới thiều ở phần trên, LabVIEW được dùng nhiều trong các phòng thí nghiệm, lĩnh vực khoa học kỹ thuật như tự động hóa, điều khiển, điện tử, cơ điện tử, hàng không, hóa sinh, điện tử y sinh,... Hiện tại ngoài phiên bản LabVIEW cho các hệ điều hành Windows, Linux, Hãng NI đã phát triển các mô-đun LabVIEW cho máy hỗ trợ cá nhân (PDA). Các chức năng chính của LabVIEW có thể tóm tắt như sau:  Thu thập tín hiệu từ các thiết bị bên ngoài như cảm biến nhiệt độ, hình ảnh từ webcam, vận tốc của động cơ,...  Giao tiếp với các thiết bị ngoại vi thông qua nhiều chuẩn giao tiếp thông qua các cổng giao tiếp: RS232, RS485, USB,PCI, Ethernet  Mô phỏng và xử lý các tín hiệu thu nhận được để phục vụ các mục đích nghiên cứu hay mục đích của hệ thống mà người lập trình mong muốn  Xây dựng các giao diện người dùng một cách nhanh chóng và thẩm mỹ hơn nhiều so với các ngôn ngữ khác như Visual Basic, Matlab,..  Cho phép thực hiện các thuật toán điều khiển như PID, Logic mờ (Fuzzy Logic), một cách nhanh chóng thông qua các chức năng tích hợp sẵn trong LabVIEW.  Cho phép kết hợp với nhiều ngôn ngữ lập trình truyền thống như C, C++,... Sau đây ta sẽ xem xét quá trình thiết lập trên LabView: Trong phần này nhóm tác giả sử dụng giao tiếp máy tính PC với VĐK Arduino, vì vậy ta cần có phần cứng là một Board Arduino và phần mềm tải về 3 bản sau: 1. Tải về và cài đặt Arduino IDE phiên bản mới nhất tại: 2. Tải về cài đặt LabView 2014: các bạn google từ khóa "labview 2014 full download". 3. Tải về cài đặt VI Package Manager mới nhất tại: Cài đặt như sau: Để kết nối và làm việc với Arduino, trên LabVIEW cần có 1 bộ VIs của Arduino. Thông qua bộ VIs, LabVIEW có thể lấy dữ liệu từ các chân Arduino và xử lý, điều khiển hoặc hiển thị kết quả trên màn hình máy tính. Do sự phổ biến và chuẩn hóa của Arduino nên bộ VIs của nó đã được phổ biến rộng rãi không cần người sử dụng phải tự lập trình. Thật ra không cần một bộ VIs cũng có thể giao tiếp Arduino với Labview 130 Trước tiên ta sẽ tìm hiểu cách giao tiếp để sao cho dễ hiểu nhất. Ứng dụng lập tức mà không cần đòi hỏi nhiều mặt chuyên môn. Thông thường khi viết giao diện cần phải viết trên máy tính 1 trong những ngôn ngữ lập trình nói trên (C++, JAVA, C#,...). Đồng thời cũng phải viết trên Arduino 1 lần nữa bằng C thì mới giao tiếp được. Với bộ VIs thì hầu như chỉ cần thiết kế giao diện thôi mọi việc đã có LabView xử lý hết. Hiện nay có 2 chuẩn: LIFA và LINX. Trong bài viết này sẽ sử dụng chuẩn LIFA. (LINX thường là cứ mỗi lần giao tiếp là phải nạp lại). Để sử dụng được ta thực hiện theo các bước sau: Bước 1 Cài đặt VI Package Manager (VIPM) – đây là phần mềm quản lý cũng như giúp chúng ta download các gói VI của LabVIEW. Hình 4.25 Cài đặt VI Package Manager Bước 2 Sau khi cài đặt xong ta vào VIPM và tìm giao diện Arduino cho LabVIEW với từ khóa “LabVIEW Interface for Arduino”. Sau đó cài đặt LabVIEW Interface for Arduino cho LabVIEW, lưu ý là phải đúng phiên bản của LabVIEW. 131 Hình 4.26 Cài đặt LabVIEW cho Arduino Bước 3 Kết nối Arduino với máy tính qua cổng USB. Bước 4 Nạp mã nguồn cho Arduino để có thể giao tiếp với LabVIEW. Choṇ vi.lib\LabVIEW interface for Arduino\Firmware Kích đúp vào LIFA_Base. Trình dic̣h IDE Arduino sẽ tư ̣hiêṇ thi ̣ Hình 4.27 Nạp mã nguồn cho Arduino Chọn đúng Board và Serial Port sau đó kích vào Upload để nạp vào Arduino. Khi có thông báo Done uploading là đã nạp thành công và đã có thể làm việc với Arduino trên LabVIEW. 132 1. Khởi động môi trường LabView a. Giao diện LabView Hình 4.28 Cửa số Getting Started của LabVIEW Đây là giao diện ban đầu khi khởi động chương trình LabVIEW. Sử dụng cửa sổ Getting Started để tạo ra các dự án mới và VI. Ta có thể tạo ra các chương trình từ đầu hoặc từ các chương trình mẫu và các ví dụ. Ta cũng có thể mở các tập tin LabVIEW đã có sẵn và truy cập vào các tài nguyên và trợ giúp của cộng đồng LabVIEW. + Chọn File»Create Project để hiển thị hộp thoại Create Project. Hộp thoại Create Project hiển thị một danh sách các chương trình mẫu và các ví dụ có thể sử dụng để đảm bảo rằng dự án tạo ra sử dụng thiết kế đáng tin cậy và phương thức lập trình chính thống. + Tìm dự án mẫu thích hợp với mục tiêu muốn thực hiện với dự án. Sử dụng các tính năng sau đây để tìm kiếm các dự án mẫu: Filters – Chỉ hiển thị chỉ kết quả của một loại nhất định, chẳng hạn như các dự án mẫu cho một mục tiêu cụ thể. Additional Search - Tìm kiếm theo các từ khóa, tiêu đề, và mô tả của các kết quả đã lọc. More Information - Mở tập tin trợ giúp cho các mục. Xem lại các tập tin trợ giúp để đảm bảo rằng dự án mẫu thích hợp với mục tiêu mà bạn muốn dự án thực hiện. 133 - Nhấn nút Next hay Finish để cấu hình chi tiết cho dự án, bao gồm cách lưu dự án. Sau khi bạn hoàn thành việc cấu hình dự án, LabVIEW lưu dự án và mở cửa sổ Project Explorer. - Sử dụng cửa sổ Project Explorer để chỉnh sửa dự án. Tham khảo các ghi chú trên block diagram của VI trong dự án mẫu để biết thêm thông tin về cách chỉnh sửa dự án. Tham khảo thêm thư mục Project Documentation trong cửa sổ Project Explorer để biết thêm thông tin về cách chỉnh sửa dự án. Các thanh công cụ liên quan đến dự án Sử dụng các nút trên các thanh công cụ Standard, Project, Build, và Source Control để thực hiện các hoạt động trong một dự án LabVIEW. Các thanh công cụ có sẵn ở trên cùng của cửa sổ Project Explorer. Bạn có thể cần phải mở rộng cửa sổ Project Explorer để xem tất cả các thanh công cụ. 2. Chức năng từng khối Hình 4.29 Cửa số các khối chính a. Khối INIT Hình 4.30 Khối INIT 134 Ta có thể thấy khối Init có rất nhiều chân ra song để thiết lập cho việc kết nối ta chỉ quan tâm tới một vài chân.Cụ thể là: - Chân VISA resource là chân thiết lập cổng COM để giao tiếp giữa LabVIEW và Arduino. - Chân Baud Rate là chân thiết lập tốc độ baud. Tốc độ baud là 115200 đối với Arduino Uno, là 9600 đối với các dòng Arduino khác. - Chân Board Type là chân để chọn loại Arduino để làm việc. Có 3 loại Arduino được hỗ trợ là: Uno,Mega 2560 và Dimuelanove/Atmega 328. - Chân Connection Type là chân lựa chọn kiểu kết nối: qua USB,XBEE hoặc Bluetooth. - Chân Arduino Resource để kết nối với các khối khác. Cách thiết lập chân và một số lưu ý nhỏ khi nối các khối Một khối được chia làm 2 dãy chân dữ liệu. Các chân nằm bên trái của khối là các chân đưa dữ liệu vào hoặc là các thiết lập ban đầu của tín hiệu. Các chân bên phải là các chân đưa dữ liệu ra hoặc các thành phần của tín hiệu đã tách được khi qua khối. Để thiết lập bất kỳ chân nào của một khối ta làm như sau: - Đưa con trỏ chuột tới chân cần thiết lập sao cho con trỏ chuột trở thành Wiring tool (hoặc có thể dùng Tool Palette). - Click Chuột phải, sau đó trỏ chuột vào Create chọn kiểu thiết lập. Có 3 kiểu thiết lập: Constant(hằng số), Control(điều khiển), Indicator(hiển thị) tùy vào mục đích để lựa chọn phù hợp. - Chân Arduino Resource của khối này nối với chân Arduino Resource của khối khác. - Chân error out của khối trước thì nối với error in của khối liền sau. - Đối với các khối còn lại ta cũng thiết lập tương tự 135 b. Khối CLOSE Hình 4.31 Khối INIT Là khối để dóng một chương trình giao tiếp với Arduino.Và chỉ gồm các chân cơ bản là Arduino Resource, error in, error out. c. Khối Low Level Hình 4.32 Khối Low Level Bao gồm các khối để đọc, ghi tín hiệu analog hoặc digital từ board Arduino. Ngoài ra còn có các khối phục vụ việc băm xung, bus... 136 d. Khối SENSORS Hình 4.33 Khối Sensor Bao gồm các khối VI sensor thường dùng như: Cảm biến nhiệt độ, cảm biến ánh sáng, LCD, led 7 thanh, led nhiều màu... Ngoài các khối cơ bản kể trên, trong gói Arduino còn có thêm khối Example gồm các ví dụ đã được thiết kế sẵn và khối Utility Từ đây ta có thể tạo một chương trình ban đầu (Blank VI), tạo một project trống (ấn vào Empty Project), tạo một chương trình theo mãu (VI from Template), hoặc nhiều lựa chọn khác. Ta cũng có thể mở một chương trình có sẵn (Browse) 3. Chương trình của LabVIEW: VI hay là Virtual Instruments Chương trình cơ bản của LabVIEW là một VI, hay là Virtual Instruments: Thiết bị ảo. Để tạo 1 chương trình mới, ta ấn vào nút Blank VI. LabVIEW sẽ hiện ra 2 cửa sổ: Front Panel và Block Diagram. Hình 4.34 Cửa sổ Front Panel và Block Diagram 137 Đó là 2 thành phần cơ bản của LabVIEW. Front Panel (từ đây gọi là FP) là giao diện của chương trình với người dùng. Tại đây lưu trữ: • Các biến điều khiển như: nút bấm (Button), thanh gạt (Slide), Núm vặn (Knob), TextBox để nhập chuỗi ký tự được gọi chung là các biến điều khiển, nơi người dùng có thể điều chỉnh giá trị của các biến đó bằng tương tác trực tiếp với chương trình • Các Biến hiển thị: Đồng hồ (Meter), Đồ thị (Chart), Biểu đồ (Graph), đèn báo (LED), hình ảnh (Picture) hay hình ảnh 3D (3D picture)gọi chung là các biến hiển thị, nơi người dung có thể quan sát thay đổi của các biến một cách trực quan. • Các biến điều khiển và các biến hiển thị không có sự phân biệt rõ ràng trong LabVIEW, ngoài hướng tương tác với người dùng và với máy tính. Trong LabVIEW coi 2 loại biến này đều là các biến, có thể được lập trình để thay đổi trực tiếp • Mỗi khi tạo 1 Biến Điều khiển hoặc Hiển thị trong Front Panel (FP), một biểu tượng (Icon) sẽ xuất hiện tương ứng trong Block Diagram (BD). Kích đúp vào Biến trên FP, Icon tương ứng trong BD sẽ được tự động biểu hiện. • Mũi tên được đánh dấu là nút RUN, dùng để bắt đầu chạy chương trình. Khi nút RUN đó bị gãy, tức là chương trình đang có lỗi (Error), không chạy được Block Diagram (DB) : Là nơi chương trình LabVIEW được lập trình, chứa nội dung (code) chương trình. • Tương tự trong Simulink của Matlab, việc lập trình trong DB bằng cách nối các biến với nhau và với các khối biểu diễn phép toán giống như đi dây trong thiết bị điện. • Trên Block Diagram cũng biểu diễn các vòng lặp, Cấu trúc lập trình, và các thuật toán. • Khi chương trình VI chạy Block Diagram không hiển thị giao diện tương tác với người dùng. • Có thể chạy chế độ Debug trên Block Diagram bằng cách ấn vào biểu tượng Bóng đèn trong BD (Highlight Execution). Các dòng dữ liệu sẽ được biểu diễn chạy tuần tự để biểu thị sự thay đổi chi tiết các biến trong chương trình • Để tạo ra một chương trình sáng sủa, gọn gàng nhằm đơn giản hóa việc kiểm tra, kiểm soát chương trình, một chương trình LabVIEW thông thường được lập trình theo trình tự: Từ trên xuống dưới, trái sang phải. c. Tạo project LabVIEW Để tạo 1 Project trong LabVIEW, ta ấn vào Empty Project. Trong các bài viết tiếp đây chúng ta hầu như làm việc bằng cách tạo Empty VI, việc tạo Project là chưa thực sự cần thiết. d. Các kiểu dữ liệu cơ bản trong LabVIEW 138 Trong LabVIEW có nhiều kiểu biến: Biến số (Numeric), Biến ký tự (String), Biến Mảng, Biến Cluster, Biến Logic (Boolean) Hình 4. 35 Các kiểu dữ liệu cơ bản trong LabVIEW Mỗi biến được phân biệt bằng các màu trong Block Diagram. Ví dụ: • Kiểu Numeric dạng Float (số 64 bit dấu phảy động) là kiểu biến có dải giá trị lớn nhất, với độ chính xác cao nhất nhưng tốn nhiều dung lượng chương trình nhất, biểu diện bằng màu vàng da cam • Các kiểu Numeric Integer: Int8, Int16, Int32, Int64 (số nguyên 8, 16, 32, 64 bit) và U8, U16, U32, U64 (số nguyên không dấu 8,16,32,64 bit) được biểu diễn màu xanh da trời • String: Chuỗi ký tự, biểu diễn màu hồng • Boolean : Kiểu Logic, là kiểu biến cho các nút bấm, đèn led và các giá trị logic khác, biểu diễn bằng màu xanh lá cây 4. Một số ví dụ cơ bản lập trình LabView: Ví dụ 1: Viết chương trình trên LabView theo yêu cầu: Khi chương trình chạy, nếu switch điều khiển (phần mềm hoặc phần cứng) được chọn là phần mềm thì chương trình sẽ điều khiển thông qua switch (ngừng hoặc chạy), khi switch được gạt qua chế độ chạy thì led sẽ chạy sáng dần trên LabView cũng như phần cứng. Khi switch điều khiển được chọn là phần cứng thì switch không hoạt động. Khi nhấn Stop thì chương trình ngừng và đèn tắt. Trước tiên thiết lập bảng điều khiển như sau: Hình 4.36 Giao diện bảng điều khiển 139 Thiết lập cửa sổ lập trình LabView Hình 4.37 Sơ đồ lập trình LabView Chức năng các khối lệnh được sử dụng: Hình 4.38 Chức năng các khối lệnh được sử dụng 140 Ví dụ 2: Viết chương trình cảnh báo trạng thái của biến đầu vào, nếu biến lớn hơn giá trị đặt, đèn Led nhấp nháy, nếu không đèn Led không sáng. Chương trình như sau: Hình 4.39 Sơ đồ chương trình khi điều kiện đầu vào là True Đây là chương trình khi điều kiện đầu vào lớn hơn giá trị đặt (10) thỏa mãn, ta thực hiện một phép đảo giá trị Led (nhấp nháy Led Alarm) sau mỗi vòng lặp. Còn đây là chương trình khi điều kiện đầu vào là False: Hình 4.40 Sơ đồ chương trình khi điều kiện đầu vào là False Ta cũng có thể thiết lập đầu vào của Case là dạng khác Boolean, ví dụ: • Dạng string: bạn chú ý khi đặt đầu vào là String, ta phải chú ý nhập đúng chính xác tên của điều kiện trong dấu ngoặc kép, nếu không LabVIEW sẽ coi như đó là một trường hợp khác. • Dạng enum: enum là một kiểu số Integer nhưng được đại diện bởi một tên nhất định. Sử dụng kiểu Enum ta sẽ ít gặp phải khả năng bị nhầm tên như khi sử dụng String, hơn nữa, sử dụng Enum cũng sẽ giảm bớt đáng kể dung lượng bộ nhớ được sử dụng. Ví dụ 3: • Cho đầu vào là 1 số nguyên X và 1 đèn Led • Nếu X=0 thì đèn Led tắt 141 • Nếu X=1 Led nháy với chu kỳ 100ms • Nếu X=2 Led nháy với chu kỳ 200ms • Các trường hợp khác Led sáng Bài toán này là một ví dụ về việc đầu vào của Case là số. Chương trình với từng trường hợp của đầu vào được lập trình như sau: Hình 4.41 Sơ đồ chương trình với từng trường hợp của đầu vào Chú ý: • Để tạo thêm 1 case mới, ta click phải vào cạnh của Case structure, chọn "Add case after" hoặc "Add case before". 142 • Default Case là trường hợp trong đó X bằng giá trị điều kiện, hoặc bằng bất cứ giá trị nào chưa được nêu trong điều kiện đó. Ví dụ trong bài toán này, Default case phải là 3 hoặc 4 hoặc bất cứ số nào khác 0,1,2. • Thường mặc định ban đầu X=0 sẽ là "Default case", muốn "default case" là 3, ta tạo Case X=3, và click chuột phải vào Case structure, chọn "Make this the default case" Enum: Enum bản chất tập hợp các số thông thường, nhưng mỗi số được đại diện bằng 1 tên riêng. Để tạo Enum trong Front panel, ta chọn: Modern >> Ring & Enum >> Enum Biểu tượng trong Block Diagram và Front Panel của 1 Enum như sau Để tạo thêm phần tử trong Enum, ta click phải vào biểu tượng, chọn Properties >> Edit Items Hình 4.42 Tạo thêm phần tử trong Enum Ta thêm các phần tử với các tên tương ứng như sau hình trên. Như vậy ta đã tạo ra các phần tử với các tên: "So 0" tương ứng với 0; "So 1" tương ứng với 1; "So 2" tương ứng với 2; Ta có thể thêm phần tử cuối là "So con lai" tương ứng với 3. Sau đó ta sẽ thay thế Enum vừa tạo cho số X trong ví dụ Case Structure trên, ta thấy Case structure tự nhận tập hợp các số Enum vừa tạo như là tên của từng trường hợp. 143 Hình 4.42 Nhập phần tử trong Enum Sau này, ta sẽ thấy Enum được sử dụng rất thông dụng trong các bài toán sử dụng Case, đặc biệt là các bài toán sử dụng. Ví dụ 3: Lập trình hiển thị đèn giao thông với đầu vào là các trạng thái của đèn. Trong bài toán này ta sẽ sử dụng Enum, case structure để lập trình 1 hệ thống đèn giao thông. Với 3 trạng thái của đèn: Green, Red, Yellow Bước 1: Trước tiên ta tạo 3 đèn Xanh, đỏ, vàng. Ta tạo 3 đèn Led. Hiện cả 3 đèn đều có màu Xanh. Để đổi màu từng đèn, ta kích chuột phải vào Led đã tạo, chọn Properties >> Appearance, kích chuột trái vào màu đèn ON/OFF và chọn màu tùy ý Kết quả ta được 3 đèn với 3 màu như sau: Bước 2: Tạo Enum với 3 Items: Red, Yellow, Green đại diện cho 3 trạng thái của đèn giao thông. Bước 3: Tạo 1 Case structure và lập trình cho từng đèn. Ở đây để cho gọn chương trình ta sẽ sử dụng 1 Constant array để lưu trạng thái của đèn cho từng trường hợp. 144 Hình 4.43 Sơ đồ cấu trúc cho từng đèn Chạy chương trình, thay đổi Enum STATE, ta thấy đèn giao thông được hiển thị đúng như trạng thái định trước. Bước 4: Lập trình chuyển đổi trạng thái Trong bước này ta sẽ sử dụng một phương pháp gọi là "State Machine" hay máy trạng thái để biểu diễn chuyển đổi của hệ đèn giao thông theo như dự kiến: Red >> Green >> Yellow >> Red. Ở đây, ngoài việc xuất ra tín hiệu cho hệ đèn, ta còn phải quy định cả Trạng thái tiếp theo (tức là giá trị của Enum) cho đèn đó ở vòng lặp sau. Vì thế ta cần sử dụng đến Shift Register. Ngoài ra mỗi trường hợp cũng quy định thời gian delay của trạng thái, ví dụ: Đèn Đỏ chờ 8s, đèn Vàng chờ 3s, đèn Xanh chờ 5s Lập trình như sau: 145 Hình 4.44 Sơ đồ chương trình với từng đèn Kết quả hiển thị: Hình 4.45 Kết quả hiển thị Đây là một ví dụ đơn giản của một phương pháp lập trình gọi là State Machine. Phương pháp này còn có 1 biến thể ưu việt hơn mà tôi sẽ nói trong một Bài khác. Có thể tóm tắt các bước của phương pháp này như sau: • Xác định từng trạng thái của hệ thống • Vẽ sơ đồ trạng thái (Sơ đồ chuyển trạng thái, và các điều kiện chuyển trạng thái) 146 • Lập trình cho từng trạng thái, trong đó quy định: Chương trình sẽ hoạt động thế nào, và trạng thái tiếp theo là gì. 4.3. Câu hỏi và bài tập chương 4 1. Viết chương trình tạo xung vuông góc tại chân D2 của cổng song song. 2. Viết chương trình điều khiển đèn giao thông dùng cổng LPT1(địa chỉ 378h). Thanh ghi điều khiển: 3. Viết chương trình điều khiển đèn nháy dùng cổng LPT1. Bao gồm các chương trình sau: Sáng dần, tắt dần, một điểm sáng chạy, một điểm tối chạy, sáng từ giữa ra, sáng từ 2 bên vào, tắt từ giữa ra, tắt từ 2 bên vào, một điểm sáng tối xen kẽ 4. Trình bày phương pháp ghép nối hai máy tính bằng cổng máy in. 5. Trình bày các chế độ chuẩn cổng máy in: SPP, EPP và ECP. 6. Nghiên cứu ghép 8255 với cổng máy in để tăng số ngõ logic. 7. Trình bày card chuyển đổi 8 kênh 12 bit dùng cổng máy in : phần cứng và chương trình điều khiển. 8. Viết chương trình điều khiển led ma trận dùng PC ghép nối 8051 qua cổng LPT. 9. Viết chương trình điều khiển nhiệt độ dùng máy tính PC giao tiếp qua cổng LPT (chế độ ECP). 10. Viết chương trình hợp ngữ 8051 và Visual Basic 6.0 để giao tiếp và điều khiển led đơn. P0 nối 8 led, P1 nối nút nhấn. - Viết chương trình hợp ngữ 8051 : Đèn sáng dần, sáng dồn , sáng tắt. - Chương trình Visual Basic 6.0 tạo giao diện điều khiển. 11. Phương thứclập trình giao tiếp nối tiếp trong DOS. 12. Lập trình giao tiếp nối tiếp dùng Delphi và Visual C++6.0/Borland C++ Builder 5.0. 12. Lập trình giao tiếp máy tính PC với Adruino điều khiển các động cơ một chiều ứng dụng trong rô bốt. 147 TÀI LIỆU THAM KHẢO [1]. Nguyễn Đức Thành, “Đo lường và điều khiển bằng máy tính”, NXB ĐHQG Tp. HCM,2002 và 2005(lần 2). [2]. Ngô Diên Tập, “Đo lường và điều khiển bằng máy tính”, NXB KHKT, Hà nội, 1999. [3]. Nguyễn Mạnh Giang, “Kỹ thuật ghép nối máy vi tính”, NXB GD, tập 1: 1998, tập 2-2006. [4]. Trần Hiếu, Lê Anh tuấn “Cấu trúc máy tính và giao diện”. Tập bài giảng Trường ĐH SPKT Nam Định [5]. Phạm Xuân Bách, Trần Văn Hạnh, “Giáo trình thực hành vi xử lý”, Trường ĐH SPKT Nam Định [6]. Serial port complete, Jan Axelson. [7]. Gustaf Olsson and Gianguido Piani, “Computer systems for automation and control”, Hall ,1992. [8]. K.J.Astrom,B.J Wittenmark, “Computer-Controlled Systems - Theory and Design, Prentice Hall”, 3rd ed., 1997. [9]. Gene F. Franklin, J. David Powell, Michael L. Workman, “Digital Control of Dynamic Systems”, 2nd ed., Addison-Wesley, 1990.

Các file đính kèm theo tài liệu này:

  • pdftap_bai_giang_dieu_khien_bang_may_tinh.pdf