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
155 trang |
Chia sẻ: Tiểu Khải Minh | Ngày: 19/02/2024 | Lượt xem: 143 | Lượt tải: 0
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:
- tap_bai_giang_dieu_khien_bang_may_tinh.pdf