1. Trang chủ >
  2. Kỹ thuật >
  3. Giao thông - Vận tải >

Lập trình trên Arduino IDE

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



Xem Thêm
Tải bản đầy đủ (.docx) (123 trang)

×