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 )
2. Tại sao chọn Arduino?
Hiện tại ở Việt Nam và trên thế giới có rất nhiều bo mạch vi điều khiển khác nhau. Tuy
nhiên Arduino có rất nhiều ưu điểm để khiến nó trở nên rất phổ biến trên thế giới. Các ưu
điểm nổi trội như: chi phí đầu tư cho mỗi board thấp; khả năng thích ứng với nhiều hệ điều
hành; chương trình đơn giản; rất dễ sử dụng; sử dụng mã nguồn mở; có thể thực hiện nhiều
nhiệm vụ lấy tín hiệu từ các cảm biến hoặc xung điều khiển đèn, động cơ, và nhiều đối
tượng; có thể kết hợp với nhiều module khác (đọc thẻ từ, athernet shield, Sim900A,…).
3. Tổng quan về Arduino Uno R3
3.1. Phần cứng của Arduino Uno R3
Nhắc tới dòng mạch Arduino dùng để lập trình, cái đầu tiên mà người ta thường nói tới
chính là dòng Arduino UNO. Hiện dòng mạch này đã phát triển tới thế hệ thứ 3 (R3).
Hình 1: Arduino Uno R3.
Cổng USB:
Dùng để kết nối board Arduino với máy tính bằng cáp USB hoặc có thể sử dụng nguồn
5V từ USB máy tính truyền đến.
Cổng nguồn ngồi:
Cấp nguồn ngoài với điện áp khuyên dùng là 7 - 12V DC và giới hạn là 6 - 20V. Thường
thì cấp nguồn bằng pin vuông 9V là hợp lý nhất nếu bạn khơng có sẵn nguồn từ cổng USB.
Nếu cấp nguồn vượt quá ngưỡng giới hạn trên có thể sẽ làm hỏng Arduino UNO.
Chân cấp nguồn cho cảm biến:
-
GND (Ground): cực âm của nguồn điện cấp cho Arduino UNO. Khi bạn dùng các thiết bị
sử dụng những nguồn điện riêng biệt thì những chân này phải được nối với nhau.
-
5V: cấp điện áp 5V đầu ra. Dòng tối đa cho phép ở chân này là 500mA.
-
3.3V: cấp điện áp 3.3V đầu ra. Dòng tối đa cho phép ở chân này là 50mA.
-
Vin (Voltage Input): để cấp nguồn ngoài cho Arduino UNO, bạn nối cực dương của
nguồn với chân này và cực âm của nguồn với chân GND.
-
IOREF: điện áp hoạt động của vi điều khiển trên Arduino UNO có thể được đo ở chân
này. Và dĩ nhiên nó ln là 5V. Mặc dù vậy bạn không được lấy nguồn 5V từ chân này để
sử dụng bởi chức năng của nó khơng phải là cấp nguồn.
-
RESET: việc nhấn nút Reset trên board để reset vi điều khiển tương đương với việc chân
RESET được nối với GND qua 1 điện trở 10KΩ.
Chân lấy tín hiệu Analog:
Arduino UNO có 6 chân analog (A0 → A5) cung cấp độ phân giải tín hiệu 10bit (0 →
210 - 1) để đọc giá trị điện áp trong khoảng 0V → 5V. Với chân AREF trên board, bạn có thể
để đưa vào điện áp tham chiếu khi sử dụng các chân analog. Tức là nếu bạn cấp điện áp 2.5V
vào chân này thì bạn có thể dùng các chân analog để đo điện áp trong khoảng từ 0V → 2.5V
với độ phân giải vẫn là 10bit. Đặc biệt, Arduino UNO có 2 chân A4 (SDA) và A5 (SCL) hỗ
trợ giao tiếp I2C/TWI với các thiết bị khác.
IC Atmega 328:
-
IC Atmega 328 là phần quan trọng nhất của board Arduino UNO, IC này giống như một
bộ não dùng để thu thập dữ liệu và xử lý chúng để truyền đi. Một sô thông tin cơ bản của
IC này:
-
32KB bộ nhớ Flash: những đoạn lệnh bạn lập trình sẽ được lưu trữ trong bộ nhớ Flash
của vi điều khiển. Thường thì sẽ có khoảng vài KB trong số này sẽ được dùng cho
bootloader nhưng đừng lo, bạn hiếm khi nào cần quá 20KB bộ nhớ này đâu.
-
2KB cho SRAM (Static Random Access Memory): giá trị các biến bạn khai báo khi lập
trình sẽ lưu ở đây. Bạn khai báo càng nhiều biến thì càng cần nhiều bộ nhớ RAM. Tuy
vậy, thực sự thì cũng hiếm khi nào bộ nhớ RAM lại trở thành thứ mà bạn phải bận tâm.
Khi mất điện, dữ liệu trên SRAM sẽ bị mất.
-
1KB cho EEPROM (Electrically Eraseble Programmable Read Only Memory): đây
giống như một chiếc ổ cứng mini – nơi bạn có thể đọc và ghi dữ liệu của mình vào đây
mà không phải lo bị mất khi cúp điện giống như dữ liệu trên SRAM.
Nút Reset: Nút này thường được sử dụng khi muốn chạy lại chương trình hay đơi khi
chương trình bị lỗi chúng ta muốn reset lại chương trình đó.
ICSP Atmega: ICSP (In - Ciruit Serial Programming) là các chân giao tiếp của chíp
Atmega 16U2. Các chân này thường được sử dụng trong các dự án lớn về Arduino.
Các chân đọc và xuất tín hiệu Digital:
Arduino UNO có 14 chân digital dùng để đọc hoặc xuất tín hiệu. Chúng chỉ có 2 mức
điện áp là 0V và 5V với dòng vào/ra tối đa trên mỗi chân là 40mA. Ở mỗi chân đều có các
điện trở pull - up từ được cài đặt ngay trong vi điều khiển ATmega328 (mặc định thì các điện
trở này khơng được kết nối).
Một số chân digital có các chức năng đặc biệt như sau:
-
2 chân Serial: 0 (RX) và 1 (TX): dùng để gửi (transmit – TX) và nhận (receive – RX) dữ
liệu TTL Serial. Arduino Uno có thể giao tiếp với thiết bị khác thông qua 2 chân này. Kết
nối bluetooth thường thấy nói nơm na chính là kết nối Serial không dây. Nếu không cần
giao tiếp Serial, bạn không nên sử dụng 2 chân này nếu không cần thiết
-
Chân PWM (~): 3, 5, 6, 9, 10, và 11: cho phép bạn xuất ra xung PWM với độ phân giải
8bit (giá trị từ 0 → 28-1 tương ứng với 0V → 5V) bằng hàm analogWrite(). Nói một cách
đơn giản, bạn có thể điều chỉnh được điện áp ra ở chân này từ mức 0V đến 5V thay vì chỉ
cố định ở mức 0V và 5V như những chân khác.
-
Chân giao tiếp SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK). Ngồi các chức năng
thơng thường, 4 chân này còn dùng để truyền phát dữ liệu bằng giao thức SPI với các
thiết bị khác.
3.2. Phần mềm Arduino IDE
Arduino IDE (Integrated Development Environment) là một trình soạn thảo văn bản,
giúp bạn viết code để nạp vào bo mạch Arduino. Arduino IDE là phần mềm nguồn mở được
viết bằng Java và sẽ làm việc được trên các nền tảng khác nhau: Windows, Mac, và Linux.
IDE cho phép bạn viết mã trong môi trường đặc biệt với sự nhấn mạnh cú pháp và các tính
năng khác sẽ làm cho việc lập trình dễ dàng hơn, và sau đó dễ dàng tải mã của bạn vào thiết
bị với việc đơn giản nháy vào một cái núm.
Giao diện Arduino IDE
Hình 2: Giao diện Arduino
-
Nút kiểm tra lỗi của code: khi hoàn tất việc viết code ta cần dùng nút này để kiểm tra
xem code đã đúng chưa. Khi code bị sai, bên phần vùng thông tin sẽ thông báo cho ta
biết lỗi sai và vị trí lỗi trên mã code.
-
Nút nạp code cho board Arduino: dùng để nạp code xuống board khi code đã được kiểm
tra và sửa lỗi hoàn chỉnh.
-
Nút hiển thị màn hình giao tiếp với máy tính (Serial Monitor): khi nhấn vào màn hình sẽ
hiển thị phần mà người dùng muốn đưa lên nhằm giao tiếp với các phần mềm khác.
-
Vùng lập trình: tại đây người dùng viết code theo ngơn ngữ lập trình mà mình muốn cài
đặt lên board Arduino hoạt động để thu thập tin hiệu hay truyền tín hiệu đi cho các hệ
thống liên quan.
-
Vùng thông tin: chức năng chính của vùng này là thơng báo các vấn đề của mã code đã
viết về lỗi và các thông tin liên quan khác.
Sử dụng một số chức năng khác trên thanh Menu của Arduino IDE
-
File - Example: thông thường ở các phần mềm cơ bản đều có File nhưng ở phần mềm
Arduino IDE này có thêm phần Example rất hữu ích cho người dùng. Nó đưa ra các ví dụ
mẫu cơ bản nhất để những người mới hay đã lập trình thơng thạo cũng có thể sử dụng và
tham khảo để giảm bớt thời gian viết code.
Hình 3: Thư viện Example của Arduino
-
Tools - Board: tại đây chúng ta cần chọn board Arduino đúng với board mà mình đang sử
dụng. Phần mềm bên dưới đang sử dụng kiểu board Arduino Uno do đó khi chọn nhầm
board khác thì code sẽ khơng nạp xuống được.
Hình 4: Chọn đúng board Arduino đang sử dụng
-
Tools - PORT: Giống như việc chọn board trên chúng ta cũng phải đồng thời chọn đúng
cổng PORT mà board Arduino kết nối với cổng USB trên máy tính.
4. Lập trình trên Arduino IDE
4.1. Ngơn ngữ lập trình trên Arduino
Bảng A.1: Cấu trúc, giá trị và hàm thủ tục
CẤU TRÚC
-
stepup()
-
soop()
Cấu trúc điều khiển
GIÁ TRỊ
HÀM VÀ THỦ TỤC
Hằng số
Nhập xuất Digital
High | Low
INPUT
if
INPUT_PULLUP
if…else
OUTPUT
switch/case
LED_BULTIN
for
(digital I/O)
pinMode()
digitalWrite()
digitalRead()
Nhập xuất Analog
(Analog I/O)
true | fales
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 - {