Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (12.58 MB, 123 trang )
while
Kiểu dữ liệu
analogReference()
break
void
analogRead()
continue
boolean
analogWrite()
return
char
goto
unsigned char
Cú pháp
byte
; (dấu chấm phẩy)
int
{} (dấu ngoặc
unsigned int
nhọn)
//(single line
word
comment)
long
unsigned long
float
#define
double
#include
array
Toán tử số học
string (chuỗi ký
tự biểu diễn bằng
= (phép gán)
+ (phép cộng)
- (phép trừ)
Hàm thời gian
millis()
mcros()
delay()
delayMicrosecond
s()
comment)
/**/(muti - line
PWM – PPM
array)
Hàm toán học
min()
max()
abs()
map()
pow()
sqrt()
Chuyển đổi kiểu dữ
sq()
liệu
isnan()
* (phép nhân)
char()
/(phép chia)
byte()
% (phép chia lấy
int()
contrain()
Hàm lượng giác
cos()
dư)
word()
sin()
Toán tử so sánh
long()
tan()
== (so sánh bằng)
float()
Sinh số ngẫu nhiên
!= (khác bằng)
Phạm vi của biến và
randomSeed()
> (lớn hơn)
phân loại
random(0
< (bé hơn)
static – biến tĩnh
>= (lớn hơn hoặc
const – biến hằng
bằng)
<= (bé hơn hoặc
bằng)
Toán tử logic
&& (và)
|| (hoặc)
! (phủ định)
^ (loại trừ)
Phép toán hợp nhất
++ (cộng thêm
một đơn vị)
-- (trừ đi một đơn
vị)
+= (phép rút gọn
của phép cộng)
-= (phép rút gọn
volatile
Hàm hỗ trợ
sizeof()
Nhập xuất nâng cao
(advanced I/O)
tone()
noTone()
shiftOut()
shiftln()
pulseln()
Bít và Bytes
lowByte()
highByte()
bitRead()
bitWrite()
bitSet()
bitClear()
bit()
Ngắt (interrupt)
attachInterrupt()
của phép trừ)
*= (phép rút gọn
của phép nhân)
/= (phép rút gọn
của phép chia)
detachInterrupt()
interrupts()
noInterrupts()
Giao tiếp
Serial
4.2. Chương trình code
1 - int THA, THW, PIM, VTA, FUEL;
2 - const int pin1 = 3;
3 - const int pin0 = 2;
4 - unsigned long thoigianmuccao1, biencux1, biencuy1, thoigianmucthap1;
5 - unsigned long thoigianmuccao0, biencux0, biencuy0, thoigianmucthap0;
6 - unsigned long chuky, tocdo;
7 - void setup()
8-{
9 - Serial.begin(9600);
10 - pinMode(3, INPUT_PULLUP);
11 - pinMode(2, INPUT_PULLUP);
12 - attachInterrupt(1, ngat1, FALLING);
13 - attachInterrupt(0, ngat0, FALLING);
14 - }
15 - void ngat1()
16 - {
17 - detachInterrupt(1);
18 - if (digitalRead(pin1) == LOW)
19 - {
20 - thoigianmuccao1 = micros() - biencuy1;
21 - biencux1 = micros();
22 - attachInterrupt(1, ngat1, RISING);
23 - }
24 - else
25 - {
26 - thoigianmucthap1 = micros() - biencux1;
27 - biencuy1 = micros();
28 - attachInterrupt(1, ngat1, FALLING);
29 - }
30 - }
31 - void ngat0() {
32 - detachInterrupt(0);
33 - if (digitalRead(pin0) == LOW)
34 - {
35 - thoigianmuccao0 = micros() - biencuy0;
36 - biencux0 = micros();
37 - attachInterrupt(0, ngat0, RISING);
38 - }
39 - else
40 - {
41 - thoigianmucthap0 = micros() - biencux0;
42 - biencuy0 = micros();
43 - attachInterrupt(0, ngat0, FALLING);
44 - }
45 - chuky = thoigianmuccao0 + thoigianmucthap0;
46 - }
47 - void loop()
48 - {
49 - tocdo = 1000000 * 60 /chuky;
50 - THA = analogRead(A0);
51 - THW = analogRead(A1);
52 - PIM = analogRead(A2);
53 - VTA = analogRead(A3);
54 - FUEL = analogRead(A4);
55 - Serial.print("a");
56 - Serial.print(THA);
57 - Serial.print("b");
58 - Serial.print(THW);
59 - Serial.print("c");
60 - Serial.print(PIM);
61 - Serial.print("d");
62 - Serial.print(VTA);
63 - Serial.print("e");
64 - Serial.print(FUEL);
65 - Serial.print("f");
66 - Serial.print(thoigianmuccao0);
67 - Serial.print("g");
68 - Serial.print(thoigianmucthap1);
69 - Serial.print("h");
70 - Serial.print(tocdo);
71 - }
4.3. Giải thích chương trình code
Khai báo biến:
int THA, THW, PIM, VTA, FUEL;
const int pin1 = 3;
const int pin0 = 2;
unsigned long thoigianmuccao1, biencux1, biencuy1, thoigianmucthap1;
unsigned long thoigianmuccao0, biencux0, biencuy0, thoigianmucthap0;
unsigned long chuky, tocdo;
Dòng 1-7 để khai báo biến dữ liệu của các tín hiệu cảm biến và chương trình con ngắt để xử
lý xung:
Bảng A.2: Ý nghĩa các kiểu biến dữ liệu
Kiểu khai báo
Ý nghĩa
Kiểu int là kiểu số nguyên chính được dùng trong chương trình
Arduino. Kiểu int chiếm 2 byte bộ nhớ.
Int
Trên mạch Arduino Uno, nó có đoạn giá trị từ -32,768 đến 32,767
(-215 đến 215-1) (16 bit)
Kiểu unsigned long là kiểu số nguyên nằm trong khoảng từ 0 đến
unsigned long
4,294,967,295 (0 đến 232 - 1). Mỗi biến mang kiểu dữ liệu này chiếm 4 byte bộ
nhớ.
Giống như khai báo kiểu int nhưng giá trị của biến cố định được
const int
gán cho các chân (như chương trình trên pin1 gán cho chân Digital
3).
Chương trình setup()
Ở phần này khi chương trình được khởi động, bạn có thể sử dụng nó để khai báo biến,
khai báo thư viện, thiết lập các thơng số, khởi tạo chương trình ngắt, đặt chế độ cho các chân
(nhận hay xuất tín hiệu),…. Hàm setup() này chỉ chạy một lần sau khi cấp nguồn hoặc reset
mạch.
Bắt đầu từ dòng 7-14 của chương trình:
Dòng 9: Serial.begin(9600);
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 ở dòng 9 của
chương trình chúng ta khởi tạo giao tiếp. Giá trị baudrate được đặt mặc định 9600. Khi sử
dụng bảng Serial monitor trong Arduino IDE ta chọn giá trị baudrate giống như khi lập trình.
Dòng 10, 11: pinMode(3, INPUT_PULLUP); pinMode(2, INPUT_PULLUP);
Hàm pinMode(pin, mode) với pin là chân digital mà mình muốn thiết đặt và mode là cấu
hình 1 pin quy định hoạt động như là một đầu vào (INPUT) hoặc đầu ra (OUTPUT). Nó có
thể kích hoạt các điện trở pullup nội bộ với chế độ INPUT_PULLUP. Ngồi ra, chế độ
INPUT vơ hiệu hóa một cách rõ ràng điện trở pullups nội bộ.
Dòng 12, 13: attachInterrupt(1, ngat1, FALLING); attachInterrupt(0, ngat0, FALLING);
Ngắt (interrupt) là những lời gọi hàm tự động khi hệ thống sinh ra một sự kiện. Những
sự kiện này được nhà sản xuất vi điều khiển thiết lập bằng phần cứng và được cấu hình trong
phần mềm bằng những tên gọi cố định. Ngắt giúp chương trình gọn nhẹ và xử lý nhanh hơn.
Để khởi tạo chương trình con ngắt ta sử dụng hàm attachInterrupt(interrupt, ISR, mode);,
trong đó:
-
interrupt: Số thứ tự của ngắt. Trên Arduino Uno, bạn có 2 ngắt với số thứ tự là 0 và 1.
Ngắt số 0 nối với chân digital số 2 và ngắt số 1 nối với chân digital số 3. Muốn dùng ngắt
bạn phải gắn nút nhấn hoặc cảm biến vào đúng các chân này thì mới sinh ra sự kiện ngắt.
Nếu dùng ngắt số 0 mà gắn nút nhấn ở chân digital 4 thì khơng chạy được rồi.
-
ISR: tên hàm sẽ gọi khi có sự kiện ngắt được sinh ra.
-
mode: kiểu kích hoạt ngắt, bao gồm:
-
LOW: kích hoạt liên tục khi trạng thái chân digital có mức thấp
-
HIGH: kích hoạt liên tục khi trạng thái chân digital có mức cao.
-
RISING: kích hoạt khi trạng thái của chân digital chuyển từ mức điện áp thấp sang mức
điện áp cao.
-
FALLING: kích hoạt khi trạng thái của chân digital chuyển từ mức điện áp cao sang mức
điện áp thấp.
Chương trình con xử lý ngắt
- Dòng 15 - 30 chương trình con của ngat1: void ngat1(){…}
-
Dòng 17 hàm detachInterrupt(interrupt) sẽ tắt các ngắt đã được kích hoạt tương ứng với
-
thông số truyền vào. Ở đây interrupt là số thứ tự ngắt.
Dòng 18 – 29 chương trình ngắt chạy hàm if … else để xử lý tín hiệu xung từ kim phun
để tách ra được thời gian mà kim phun nhiên liệu vào buồng đốt cho mỗi chu trình cơng
tác của mỗi máy. Bằng cách xử dụng hàm định thời gian micros()có nhiệm vụ trả về một
số - là thời gian (tính theo micro giây) kể từ lúc chương trình ngắt ngừng hoạt động (sau
hàm dettachInterrupt(1)) và từ việc đọc được giá trị điện áp ở mức cao và mức thấp
Arduino xác định được thời gian kim phun phun nhiên liệu mỗi chu trình ở mức thấp
(LOW) của mỗi chu kỳ xung mà tín hiệu kim phun gửi về board. Và chương trình xử lý ta
-
lấy ra được thời gian kim phun cho mỗi chu trình là thoigianmucthap1.
Từ dòng 30 – 46 chương trình con của ngat0: void ngat0(){…}
Từ cách thức tương tự như chương trình con ở ngat1 ta cũng tính ra được thời gian ngậm
(thoigianmuccao0) từ xung IGT ở chương trình con ngat0 này. Ở phần này ta còn tính ra
được chuky bằng tổng của thoigianmuccao0 và thoigianmucthap0 để phục vụ cho q trình
tính tốn số vòng quay của động cơ bên dưới vòng lặp.
Chương trình vòng lặp
Những lệnh trong setup() sẽ được chạy khi chương trình của bạn khởi động. Bạn có thể
sử dụng nó để khai báo giá trị của biến, khai báo thư viện, thiết lập các thông số, …. Sau khi
setup() chạy xong, những lệnh trong loop() được chạy. Chúng sẽ lặp đi lặp lại liên tục cho
tới khi nào bạn ngắt nguồn của board Arduino mới thơi.
Hình 5: Chương trình vòng lặp Arduino
Chương trình này bắt đầu từ dòng 47 – 71: void loop() {... }
-
Dòng 49 thể hiện cơng thức tính tocdo của động cơ qua chuky của xung IGT. Vì thời gian
của chuky trong chương trinh ngắt trên là micros và tocdo được tính bằng vòng/phút do
-
đó ta có cơng thức tính tocdo = 1000000 * 60 /chuky;.
Dòng 50 - 54 sử dụng hàm analogRead() để đọc giá trị điện áp của các cảm biến THA,
-
THW, PIM, VTA, FUEL từ các chân Analog A0, A1, A2, A3, A4.
Dòng 55 - 70 các tín hiệu được Arduino đọc được sẽ xuất ra cổng Serial bằng hàm
Serial.print(); dưới dạng chuỗi dài nối tiếp xen kẽ các chữ cái: a, THA, b, THW, c , PIM,
d , VTA, e , FUEL, f , thoigianmuccao0, g, thoigianmucthap1, h, tocdo. Việc chen các
chữ cái này để phục vụ cho việc tách tín hiệu dễ dàng khi phần mềm LabVIEW nhận
được chuỗi tín hiệu này.
PHỤ LỤC B: GIỚI THIỆU LabVIEW
1. LabVIEW là gì ?
LabVIEW là môi trường ngôn ngữ đồ họa hiệu quả trong việc giao tiếp đa kênh giữa con
người, thuật toán và các thiết bị.
Gọi LabVIEW là ngôn ngữ đồ họa hiệu quả vì cách thức lập trình LabVIEW khác với
các ngơn ngữ C hay (Python, Basic, vv.) ở điểm thay vì sử dụng các từ vựng (từ khóa) cố
định thì LabVIEW sử dụng các khối hình ảnh sinh động và các dây nối để tạo ra các lệnh và
các hàm như trong hình 6. Cũng chính vì sự khác biệt này mà LabVIEW đã giúp cho việc
lập trình trở nên đơn giản hơn bao giờ hết, đặc biệt, LabVIEW rất phù hợp đối với kỹ sư,
nhà khoa học, hay giảng viên. Chính sự đơn giản, dễ học, dễ nhớ đã giúp cho LabVIEW trở
thành một trong những công cụ phổ biến trong các ứng dụng thu thập dữ liệu từ các cảm
biến, phát triển các thuật toán, và điều khiển thiết bị tại các phòng thì nghiệm trên thế giới.
Hình 6: Mã nguồn viết bằng LabVIEW
Về ý nghĩa kỹ thuật, LabVIEW cũng được dùng để lập trình ra các chương trình (source
code: mã nguồn) trên máy tính tương tự các ngơn ngữ lập trình dựa trên chữ (text - based
language) như C, Python, Java, Basic, vv.
Đồng thời, LabVIEW hỗ trợ các kỹ sư, nhà khoa học và sinh viên, vv. Xây dựng (thực
thi) các thuật toán một cách nhanh, gọn, sáng tạo và dễ hiểu nhờ các khối hình ảnh có tính