Chuyên đề Tin11 HK2

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 32

TRƯỜNG THPT CHUYÊN LÝ TỰ TRỌNG

TỔ TIN HỌC
----------

CHUYÊN ĐỀ TIN HỌC 11


LẬP TRÌNH ARDUINO VÀ ỨNG DỤNG
“XE ĐỒNG HỒ BÁO THỨC”

Giáo viên hướng dẫn: Học sinh thực hiện:


 Nguyễn Hoàng Phú  Võ Minh Thiên Long
 Mai Phước Vinh

Năm học: 2016 - 2017


Chuyên đề nghiên cứu và ứng dụng Arduino

LỜI MỞ ĐẦU
Ngày này, xu hướng tự động hóa, robot hóa ngày càng phát triển. Trong thời đại
Công nghệ Thông tin này, với sự phát triển mạnh mẽ của Khoa học Kỹ thuật, những
máy móc thông minh hỗ trợ con người từ công việc thường nhật đến tận những việc
nặng nhọc, nguy hiểm liên tục được ra đời. Những máy móc, robot đó không chỉ phục
vụ trên Trái đất mà còn được đem ra ngoài vũ trụ, khai thác vô số thông tin hữu ích về
các thiên thể khác phục vụ cho công cụ tìm kiếm sự sống ngoài hành tinh của con
người.
Cùng với sự ra đời của mạch Arduino, nó đã thúc đẩy sự yêu thích, tìm tòi
nghiên cứu, ứng dụng tự động hóa, robot hóa vào đời sống và công nghiệp. Với những
ưu điểm riêng của mình, Arduino đã nhanh chóng nổi tiếng toàn thế giới và được giới
học sinh, sinh viên, giới nghiên cứu, những người yêu thích kỹ thuật, những người thích
làm đồ tự chế sử dụng rộng rãi. Tại Việt Nam, số lượng người sử dụng mạch Arduino
ngày càng tăng.
Hòa chung với nhịp điệu phát triển khoa học kỹ thuật của thế giới, nhóm chúng
em quyết định sẽ nghiên cứu về đề tài Arduino, và thông qua đó tạo nên những sản
phẩm hữu ích phục vụ cho cuộc sống. Chuyên đề này của chúng em vừa sơ thiệu sơ
lược vầ phần cứng và cách lập trình Arduino, đồng thời cũng qua đó giới thiệu mẫu
robot “Xe đồng hồ báo thức” mà chúng em dày công chế tạo.
Mỗi người chúng ta, khi cần dậy đúng giờ, thường có thói quen đặt đồng hồ báo
thức. Tuy nhiên, khi đồng hồ bắt đầu reo lên, thì ta lại có xu hướng tắt đồng hồ đi và
chìm vào giấc ngủ tiếp. Thế nhưng, giả sử chiếc đồng hồ đó biết … chạy thì sao? Sau
khi mệt mỏi tìm kiếm, rượt đuổi để tắt chiếc đồng hồ này, có lẽ ai cũng đã tỉnh hẳn khỏi
giấc ngủ rồi. Dựa vào ý tưởng này, chúng em sẽ tạo ra một chiếc đồng hồ báo thức gắn
trên chiếc xe.
Khi tới thời gian đã được đặt trước đó, chiếc đồng hồ sẽ bắt đầu chạy đi một cách
ngẫu nhiên. Bằng cách sử dụng cảm biến siêu âm để đo khoảng cách, mỗi khi xe chuẩn
bị va chạm với vật cản, thì nó sẽ lập tức chuyển hướng một cách ngẫu nhiên, không theo
một quy luật có thể đoán trước nào đó.
Dù đã cố gắng nhiều trong quá trình viết tài liệu, nhưng chắc chắn tài liệu không
thể tránh khỏi sai sót trong quá trình biên soạn. Chúng em rất mong nhận được sự góp ý
chân thành của mọi người để chúng em có thể hoàn thiện hơn nữa tài liệu này. Mọi ý
kiến đóng góp xin gửi về địa chỉ email: thienlongtpct@gmail.com. Chúng em xin chân
thành cảm ơn.

-1-
Chuyên đề nghiên cứu và ứng dụng Arduino

NỘI DUNG
I. Giới thiệu về Arduino
1) Arduino là gì ?
Arduino là một bo mạch vi điều khiển do một nhóm giáo sư và sinh viên
Ý thiết kế và đưa ra đầu tiên vào năm 2005. Mạch Arduino được sử dụng để
nhận biết và điều khiển nhiều đối tượng khác nhau. Nó có thể thực hiện nhiều
nhiệm vụ, từ lấy tín hiệu của cảm biến cho đến điều khiển đèn, động cơ, và nhiều
đối tượng khác. Ngoài ra mạch còn có khả năng liên kết với nhiều module khác
nhau như module đọc thẻ từ, module Ethernet shield, module 298N, ….để tăng
khả năng ứng dụng của mạch.

Ảnh: Mạch Arduino liên kết module Ethernet shield.

Arduino 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à chương trình lập trình
được tự bản thân viết ra.

Các loại mạch Arduino:

Ảnh: Arduino Diecimila in. Ảnh: Arduino Mega. Ảnh: Arduino Uno.

-2-
Chuyên đề nghiên cứu và ứng dụng Arduino
2) Cấu tạo Arduino
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 phiên bản hiện
tại được trang bị 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. Hiện tại Arduino có tất
cả 6 phiên bản. Tuy nhiên phiên bản thường được sử dụng nhiều nhất là Arduino
Uno. Vì vậy, trong chuyên đề này chúng em sẽ giới thiệu phiên bản này.

Ảnh: Cấu tạo Arduino.

3) Ứng dụng trong đời sống

Arduino được chọn làm bộ não xử lý của rất nhiều thiết bị từ đơn
giản đến phức tạp. Trong số đó có một vài ứng dụng thực sự chứng tỏ khả năng
vượt trội của Arduino do chúng có khả năng thực hiện nhiều nhiệm vụ rất phức
tạp. Sau đây là danh sách ba ứng dụng nổi bật của Arduino.
Điều khiển ánh sáng: Bằng các kết hợp các cảm biến, từ những tác vụ
đơn giản như đóng ngắt đèn LED cho đến việc phức tạp hơn như điều khiển ánh
sáng theo nhạc hoặc tương tác với ánh sáng laser đều có thể thực hiện với
Arduino.

Ảnh: Điều khiển bóng đèn thông qua mạch Arduino.

-3-
Chuyên đề nghiên cứu và ứng dụng Arduino

Robot: Do kích thước nhỏ gọn và khả năng xử lý mạnh mẽ, Arduino
được chọn làm bộ xử lý trung tâm của rất nhiều loại robot, đặc biệt là robot di
động.

Ảnh: Robot dò đường và vật cản.

Thiết bị bay không người lái UAV: Với những cảm biến hỗ trợ đi kèm
như cảm biến góc nghiêng (Gyro sensor), cảm biến gia tốc (accelerometer), …
Arduino hoàn toàn thích hợp để tạo nên những thiết bị bay không người lái.

Ảnh: Thiết bị không người lái UAV.

-4-
Chuyên đề nghiên cứu và ứng dụng Arduino

II. Phương hướng chuẩn bị


1) Chuẩn bị về phần cứng:
Dưới đây là một vài phần cứng sẽ được giới thiệu và sử dụng trong
chuyên đề của chúng em:
a/ Arduino Uno

Ảnh: Mạch Arduino Uno R3.

Arduino UNO là dòng Arduino phổ biến nhất, hiện đã phát triển tới phiên
bản thứ 3 (R3). Trong chuyên đề này, chúng em sẽ giới thiệu và sử dụng mạch
Arduino UNO R3.

Arduino UNO có thể sử dụng 3 vi điều khiển họ 8bit AVR là ATmega8,


ATmega168, ATmega328. Bộ não này có thể xử lí những tác vụ đơn giản như
điều khiển đèn LED nhấp nháy, xử lí tín hiệu cho xe điều khiển từ xa, làm một
trạm đo nhiệt độ - độ ẩm và hiển thị lên màn hình LCD,…

Arduino UNO có thể được cấp nguồn 5V thông qua cổng USB hoặc 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 không có sẵn nguồn
từ cổng USB. Nếu cấp nguồn vượt quá giới hạn trên, mạch Arduino UNO sẽ bị
hỏng.

-5-
Chuyên đề nghiên cứu và ứng dụng Arduino
b/ Motor DC 3-6VDC

Ảnh: Motor DC3-6VDC.

Motor DC 3-6VDC là động cơ giảm tốc, có trọng lượng nhẹ và lực xoắn
lớn. Nó có khả năng vượt địa hình với lực kéo lớn và có thể gắn bánh xe ở cả 2
phía của động cơ. Hiệu điện thế hoạt động từ 3-6V, tuy nhiên, thực tế cho thấy,
motor vẫn hoạt động hiệu quả ở hiệu điện thế 12V. Đối với motor, lưu ý khi thiết
lập tốc độ không nên để tốc độ quá thấp, vì khi đó sức quay của động cơ sẽ
không thắng được ma sát nghỉ của các bánh răng, từ đó động cơ sẽ không chuyển
động.

c/ Module 298N

Ảnh: Module 298N.

Module 298N, còn gọi là mạch khuếch đại, có tác dụng cung cấp hiệu
điện thế phù hợp với chế độ làm việc của động cơ (5V hoặc 12V).

-6-
Chuyên đề nghiên cứu và ứng dụng Arduino
d/ Cảm biến siêu âm HY-SRF05

Ảnh: Cảm biến siêu âm HY-SRF05.

Cảm biến có 2 loa (thu và phát), cùng với 5 chân để kết nối với Arduino.
Theo tài liệu của nhà sản xuất thì tầm hoạt động tối đa của cảm biến này nằm
trong khoảng 5m.
Cảm biến siêu âm HY-SRF05 hoạt động trên nguyên tắc:
 Ban đầu một loa (loa phát) của cảm biến phát ra một sóng âm có
tầng số cao (tai người không thể nghe được).
 Sóng âm này va chạm với môi trường và phản xạ lại, loa còn lại
(loa thu) sẽ thu nhận sóng âm này.
 Dựa vào thời gian phát/ thu, ta có thể tính toán được khoảng cách
giữa cảm biến và vật cản.

e/ Bánh xe và mắt trâu

Ảnh: Bánh xe và mắt trâu.

-7-
Chuyên đề nghiên cứu và ứng dụng Arduino
f/ Mạch 4 LED 7 đoạn

Ảnh: Mạch 4 LED 7 đoạn.

Ảnh: Mạch 4 LED 7 đoạn và các chân.

Trong module đó có các pin gồm: 4 chân GND – nếu là chung cực âm
(COMMON_CATHODE) hoặc Vcc – nếu là chung cực dương
(COMMON_ANODE), 4 led đơn. Các chân A, B, C, D, E, F, G, DP của từng led
đơn được nối chung lại như hình dưới, tổng cộng là 12 chân tất cả.

-8-
Chuyên đề nghiên cứu và ứng dụng Arduino
g/ Đế pin Lithyum 18650 (2 viên)

Ảnh: Đế pin Lithyum 18650 (2 viên)

Gồm một hộp đế có thể chứa 2 viên pin, mỗi viên có một đầu âm và
dương được ghép nối tiếp với nhau. Dòng điện từ nguồn pin sẽ thông qua 2 dây
nóng và nguội để cung cấp năng lượng cho mạch, cảm biến và motor hoạt động.
Do đó, muốn động cơ hoạt động thì lắp pin vào, và ngược lại, muốn động cơ
ngưng hoạt động thì chỉ cần tháo pin ra.

Ở thiết bị “Xe đồng hồ cảm biến” của chúng em, để tiện cho việc sử dụng,
bọn em đã lắp thêm một công tắc nguồn để có thể bật/ tắt nguồn dễ dàng hơn
thay vì phải thao tác tháo lắp pin.

h/ Tấm mica

Ảnh: Tấm mica cho robot.

Tấm mica được dùng để làm khung cho robot, với thiết kế có những lỗ
đục nhỏ nhằm luồn các sợi dây điện hoặc dùng để vặn ốc cố định các bộ phận lại.

-9-
Chuyên đề nghiên cứu và ứng dụng Arduino
2) Chuẩn bị về phần mềm IDE Arduino
Về phần mềm IDE Arduino, chúng em sẽ hướng dẫn sơ lược cách cài đặt
và sử dụng phần mềm phục vụ cho chuyên đề chúng em.
a/ Hướng dẫn cài đặt phần mềm
- Vào trang chủ https://www.arduino.cc/.

Ảnh: Giao diện trang chủ https://www.arduino.cc/.

- Nhấn vào mục SOFTWARE.

Ảnh: Giao diện trang https://www.arduino.cc/en/Main/Software.

- Kéo xuống mục Download the Arduino IDE.

- 10 -
Chuyên đề nghiên cứu và ứng dụng Arduino

Ảnh: Giao diện phần Download the Arduino IDE.

- Kéo xuống mục PREVIOUS RELEASES.

Ảnh: Giao diện phần PREVIOUS RELEASE.

- Nhấn vào previous version of the current release (ở đây, bọn em sẽ


không sử dụng phiên bản mới nhất là Arduino 1.8.2, mà sẽ sử dụng bản
Arduino 1.0.6 – lý do sẽ được nói rõ hơn ở những phần tiếp theo).

- 11 -
Chuyên đề nghiên cứu và ứng dụng Arduino

Ảnh: Giao diện trang https://www.arduino.cc/en/Main/OldSoftwareReleases#previous.

- Lựa chọn hệ điều hành phù hợp, ở đây chúng em sẽ sử dụng Windows
Installer, nhấn vào đường link đó sẽ chuyển vào giao diện trang
https://www.arduino.cc/en/Main/Donate.

Ảnh: Giao diện trang https://www.arduino.cc/en/Main/Donate

- Kéo xuống và nhấn Just Download nếu bạn chỉ cần Download miễn phí,
nếu có điều kiện thì có thể đóng góp tiền bằng cách nhấn vào Contribute
& Download.

- 12 -
Chuyên đề nghiên cứu và ứng dụng Arduino

Ảnh: Giao diện trang https://www.arduino.cc/en/Main/Donate

b/ Giao diện phần mềm IDE


- Sau khi tải về, bạn cài đặt theo hướng dẫn của phần mềm. Nếu ra được
giao diện như hình sau đây là bạn đã cài đặt thành công.

Ảnh: Giao diện chính phần mềm IDE.

- 13 -
Chuyên đề nghiên cứu và ứng dụng Arduino
- Các phần giao diện cơ bản của phần mềm IDE:

Nút nạp Tạo file mới.


chương trình Mở file.
xuống mạch
Lưu file.
Arduino.

Nút kiểm tra


chương trình.

Vùng lập trình

Ảnh: Giao diện chính phần mềm IDE.

c/ Cấu trúc của một chương trình trong phần mềm IDE
Phần khai báo:
Định nghĩa:
o #define <bị gán> <giá trị được gán>
o Phần <bị gán>, <giá trị gán> có thể là số nguyên, chuỗi
hay thậm chí là một lệnh, một hàm.
o Lưu ý: Không thêm dấu “;” vào sau dòng lệnh.

#define trig 12 // Gán giá trị của trig là 12


#define echo 13 // Gán giá trị của echo là 13
#define aW analogWrite // Gán "aW" tương đương với
analogWrite

void setup(){
// Put your setup code here, to run once:
}

void loop(){
//Put your main code here, to run repeatedly:
}

Ảnh: Phần định nghĩa trong chương trình.

- 14 -
Chuyên đề nghiên cứu và ứng dụng Arduino
Kiểu dữ liệu tương tự như trong ngôn ngữ C/C++:
o int: kiểu dữ liệu số nguyên 16bit.
o long: kiểu dữ liệu số nguyên 32bit.
o double: kiểu dữ liệu số thực 32bit.
Lưu ý:
Đối với các kiểu dữ liệu số nguyên, khi thêm vào trước tên
kiểu dữ liệu từ <unsigned> thì sẽ trở thành kiểu dữ liệu số
nguyên không âm.
Ngoài ra, xem kỹ phần kiểu dữ liệu, vì giới hạn int, float
trong Arduino khác int, float trong C++.
Khai báo biến cũng tương tự như C/ C++:
o Một biến: <Kiểu dữ liệu> <biến>;
o Nhiều biến: <Kiểu dữ liệu> <biến 1>, <biến 2>, …;
o Khai báo đồng thời gán giá trị cho 1 biến:
<Kiểu dữ liệu> <biến> = <giá trị>;
o Khai báo đồng thời gán giá trị cho nhiều biến:
<Kiểu dữ liệu> <biến 1> = <giá trị 1>, <biến 2> = <giá trị 2>, …;
o Lưu ý: Những biến được khai báo ở phần này mang giá trị
toàn cục (global variable), tức là nó mang giá trị ở tất cả chương
trình con trong chương trình.

Phần thiết lập (setup):


Định nghĩa:
o Hàm setup() được gọi khi chương trình khởi động. Hàm này
được dùng khai báo biến, xác định kiểu chân (vào/ra), …
o Lưu ý rằng, hàm setup() chỉ thực hiện 1 lần mỗi khi khởi
động lại hoặc mở nguồn mạch Arduino.
Khai báo biến:
o Biến khai báo ở đây là biến cục bộ, tức nghĩa là phần khai
báo biến ở đây chỉ thực hiện nội bộ trong hàm setup(), không có
ảnh hưởng tới các biến trùng tên ở ngoài hàm, cũng như là dùng
biến này ở ngoài hàm cũng không được.
o Cách khai báo tương tự như ở phần trên.

- 15 -
Chuyên đề nghiên cứu và ứng dụng Arduino
Xác định kiểu chân: pinMode(cổng, vào/ra)
o Cổng: Khai báo cổng chân đó cắm vào (ví dụ: cổng A0, A1,
…, 12, 13, …)
Có thể dùng một biến chứa giá trị thay thế.
o Vào/ra: Xác định kiểu vào (INPUT) hoặc ra (OUTPUT).
void setup() {
int trig = 12;
int echo = 13;

pinMode(trig, OUTPUT); // Chân từ cổng 12 được xác định là kiểu ra


pinMode(echo, INPUT); // Chân từ cổng 13 được xác định là kiểu vào
}

void loop(){

}
Phần code thiết lập (setup) trong chương trình.

Phần vòng lặp (loop):


Định nghĩa:
o Sau khi thực thi hàm setup(), khởi tạo và thiết lập các giá trị
ban đầu, hàm loop() sẽ cho phép chương trình thay đổi và đáp trả.
o Lưu ý rằng, hàm loop() sẽ thực hiện như tên của nó, lặp đi
lặp lại liên tục. Nó được sử dụng để chủ động điều khiển mạch
Arduino.
Khai báo biến: Hoàn toàn tương tự phần setup().

Câu lệnh về điều kiện: Tương tự như trong C/C++.


if (<điều kiện>) {
//Nếu thỏa điều kiện, thực hiện.
}
else {
//Nếu sai điều kiện, thực hiện.
}

Câu lệnh về vòng lặp: Tương tự như trong C/C++.


for (<kiểu dữ liệu> <tên biến> = <giá trị bắt đầu>; <tên biến> <so
sánh> <giá trị kết thúc>; <tên biến> += <giá trị thay đổi>) {
//Lệnh được thực hiện bên trong.
}

- 16 -
Chuyên đề nghiên cứu và ứng dụng Arduino
3) Các câu lệnh cơ bản về động cơ và cảm biến
a/ Các câu lệnh về động cơ

Khai báo
Tiêu chuẩn analogWrite(motorPort, speed)
Mô tả Hàm điều khiển tốc độ quay của motor.
Thông số
motorPort Cổng analog kết nối với động cơ.
speed Tốc độ quay của motor (0 ≤ speed ≤ 255).

b/ Các câu lệnh về cảm biến

Khai báo
Tiêu chuẩn digitalWrite(trig, switch)
Mô tả Hàm điều khiển cảm biến siêu âm phát sóng.
Thông số
motorPort Cổng digital kết nối với cảm biến.
switch Trạng thái của motor.
switch = 1 hoặc switch = HIGH, cảm biến phát sóng.
switch = 0 hoặc switch = LOW, cảm biến dừng phát sóng.

Khai báo
Tiêu chuẩn pulseIn(echo, switch)
Mô tả Hàm trả về khoảng thời gian (microseconds) tính từ lúc cảm biến
phát ra sóng siêu âm đến lúc nhận lại sóng phản xạ.
Thông số
motorPort Cổng digital kết nối với cảm biến.
switch Trạng thái của motor.
switch = 1 hoặc switch = HIGH, cảm biến thu sóng.
switch = 0 hoặc switch = LOW, cảm biến dừng thu sóng.

- 17 -
Chuyên đề nghiên cứu và ứng dụng Arduino
c/ Các câu lệnh thuộc thư viện SegSev

Khai báo
Tiêu chuẩn myDisplay.Begin(displayType, numberOfDigits, digit1, digit2,
digit3, digit4, segA, segB, segC, segD, segE, segF, segG, segDP)
Mô tả Hàm khởi tạo mạch 4 LED 7 đoạn.
Thông số
motorPort Mạch 4 LED 7 đoạn.
displayType Kiểu LED của mạch.
COMMON_CATHODE: Kiểu LED chung cực âm.
COMMON_ANODE: Kiểu LED chung cực dương.
numberOfDigits Số lượng chữ số hiển thị (ở mạch 4 LED là 4).
digit1 Cổng của pin chung nhóm 1.
digit2 Cổng của pin chung nhóm 2.
digit3 Cổng của pin chung nhóm 3.
digit4 Cổng của pin chung nhóm 4.
segA Cổng của nhánh A.
segB Cổng của nhánh B.
segC Cổng của nhánh C.
segD Cổng của nhánh D.
segE Cổng của nhánh E.
segF Cổng của nhánh F.
segG Cổng của nhánh G.
segDP Cổng dấu chấm.

Khai báo
Tiêu chuẩn myDisplay.SetBrightness(percentBright)
Mô tả Hàm điều khiển độ sáng của mạch 4 LED 7 đoạn.
Thông số
myDisplay Mạch 4 LED 7 đoạn.
percentBright Độ sáng (tính theo phần trăm độ sáng tối đa của mạch).

- 18 -
Chuyên đề nghiên cứu và ứng dụng Arduino
Khai báo
Tiêu chuẩn myDisplay.DisplayString(toDisplay, DecAposColon)
Mô tả Hàm điều khiển đèn LED sáng theo ký tự.
Thông số
myDisplay Mạch 4 LED 7 đoạn.
toDisplay Xâu được in ra (ở kiểu char).
DecAposColon Vị trí của các dấu chấm được hiển thị (ở hệ thập lục phân).

Một số lưu ý khác:


Ta có thể chuyển đổi từ thời gian (microseconds) về khoảng cách
thông qua công thức:
microseconds 1
Distance  .
29.412 2
Tốc độ của âm thanh trong không khí là 340 m / s (hằng số vật lý),
tương đương với 29.412 ms / cm .
Vì vậy, khi đã tính được thời gian, ta có thể chia cho 29.412 để tính
được quãng đường.
Sau đó ta lại chia tiếp cho 2 vì đó là khoảng thời gian bao gồm cả
đến vật cản và trở về cảm biến (bằng 2 lần khoảng cách từ cảm biến tới
vật cản).
d/ Các câu lệnh khác

Khai báo
Tiêu chuẩn millis()
Mô tả Hàm trả về kiểu long là thời gian tính bằng mili giây từ lúc bật mạch
(quay về 0ms sau 50 ngày).

Khai báo
Tiêu chuẩn delay(delayTime)
Mô tả Hàm tạm dừng chương trình (tiếp tục thực hiện những gì trước đó).
Thông số
delayTime Thời gian dừng (tính bằng mili giây).

- 19 -
Chuyên đề nghiên cứu và ứng dụng Arduino
Khai báo
Tiêu chuẩn delayMicroseconds(delayTime)
Mô tả Tương tự như hàm delay.
Thông số
delayTime Thời gian dừng (tính bằng micro giây).

Khai báo
Tiêu chuẩn Serial.print (value)
Mô tả Hàm in giá trị ra trong Serial Monitor.
Thông số
value Giá trị muốn in ra, có thể là xâu hoặc là số thực (tự động làm tròn 3
chữ số).

III. Lập trình và lắp ráp “Xe đồng hồ báo thức”


1) Lắp rắp
a/ Nối dây
Cổng mạch 4 led 7 đoạn:
Digit1 Digit2 Digit3 Digit4
8 12 13 2

SegA SegB SegC SegD SegE SegF SegG SegDP


9 11 4 6 7 10 3 5

Motor: Kết nối thông qua module


Motor trái Motor phải
OUT1 OUT2 OUT3 OUT2

Module kết nối tiếp mạch và nguồn


IN1 IN2 IN3 IN4 12V GND
A2 A3 A4 A5 Nguồn (+) Nguồn (-)

Cảm biến:
Trig Echo GND VCC
1 0 GND mạch 5V

- 20 -
Chuyên đề nghiên cứu và ứng dụng Arduino
b/ Thiết kế
Vị trí tương đối trong phần này sẽ xét theo chiều từ cảm biến siêu
âm HY-SRF05 đến mạch Arduino UNO (xem hình để thấy rõ hơn).

Ảnh: Xe nhìn theo chiều từ cảm biến siêu âm HY-SRF05 đến mạch Arduino UNO.

Cảm biến siêu âm HY-SRF0:


Được gắn trực diện trước mặt xe, thông qua tấm mica nhỏ để quay
lên trên (các phần chân cắm được lắp sao cho quay lên).

Ảnh: Vị trí lắp cảm biến siêu âm HY-SRF05.

- 21 -
Chuyên đề nghiên cứu và ứng dụng Arduino
Mạch 4 LED 7 đoạn:
Được gắn về phía bên tay phải của cảm biến siêu âm HY-SRF05,
được lắp sao cho phần các dấu chấm quay xuống.

Ảnh: Vị trí lắp mạch 4 LED 7 đoạn.

Đế pin:
Lắp đế pin nẳm giữa xe, phần có dây nối quay về phía mạch (để
tiện nối dây nguồn về sau).

Ảnh: Vị trí lắp đế pin.

- 22 -
Chuyên đề nghiên cứu và ứng dụng Arduino
Bánh xe:
Bánh xe gồm hai màu – vàng và đen. Bánh xe màu vàng được gắn
vào phía bên trái, bánh xe màu đen được gắn vào phía bên phải.

Ảnh: Vị trí lắp bánh xe trái.

Ảnh: Vị trí lắp bánh xe phải.

- 23 -
Chuyên đề nghiên cứu và ứng dụng Arduino
Mạch Arduino:
Gắn mạch Arduino vào phần cuối của tấm mica, về phía bên trái.
Phần cổng USB được quay về bên trái, để tiện cho việc kết nối.

Ảnh: Vị trí lắp mạch Arduino.

Module 298N:
Gắn module 298N vào phần cuối của tấm mica, về phía bên phải,
kế bên mạch Arduino.

Ảnh: Vị trí module 298N.

- 24 -
Chuyên đề nghiên cứu và ứng dụng Arduino
2) Lập trình

Phần khai báo:


Đối với chương trình này, ta sử dụng lên đến 18 cổng, vì vậy ta rất dễ bị
nhầm cổng. Để giải quyết tình trạng này, ở phần khai báo, ta sẽ gán các giá trị
cổng thành những biến có nghĩa – từ đó dễ dàng nhớ và sử dụng hơn.
#include "SevSeg.h" // khai báo thư viện SevSeg.h
SevSeg myDisplay; // khai báo mạch 4 LED 7 đoạn

// timer
const int setHour = 2; // giờ báo thức
const int setMin = 5; // phút báo thức
const int setDelay = 1; // thời gian kéo dài (phút)

// current-time
const int curHour = 2; // giờ hiện tại
const int curMin = 0; // phút hiện tại

//ultra-sonic
const int trig = A0; // cổng của chân trig là cổng A0
const int echo = A1; // cổng của chân echo là cổng A1

//motor
const int mtR1 = A5; // cổng của IN1 của module là A5
const int mtR2 = A4; // cổng của IN2 của module là A4
const int mtL1 = A3; // cổng của IN3 của module là A3
const int mtL2 = A2; // cổng của IN4 của module là A2
const int Speed = 150; // tốc độ quay motor là 150

//digit
const int digit1 = 8; // cổng của pin chung nhóm 1 là 8
const int digit2 = 11; // cổng của pin chung nhóm 2 là 11
const int digit3 = 12; // cổng của pin chung nhóm 3 là 12
const int digit4 = 2; // cổng của pin chung nhóm 4 là 2

//seven-segment
const int segA = 9; // cổng của nhánh A là 9
const int segB = 13; // cổng của nhánh B là 13
const int segC = 4; // cổng của nhánh C là 4
const int segD = 6; // cổng của nhánh D là 6
const int segE = 7; // cổng của nhánh E là 7
const int segF = 10; // cổng của nhánh F là 10
const int segG = 3; // cổng của nhánh G là 3
const int segDP = 5; // cổng của dấu chấm là 5
const int disType = COMMON_CATHODE; // kiểu 4 LED 7 đoạn chung cực âm
const int numberOfDigits = 4; // số lượng số hiện thị là 4

- 25 -
Chuyên đề nghiên cứu và ứng dụng Arduino
Phần thiết lập:
Ở phần này, ta thiết lập các cổng cho motor, mạch LED và cảm biến.
Đối với motor và cảm biến, ta chỉ cần khai báo cổng và kiểu chân, riêng
với mạch LED thì cần phải khai báo theo thư viện.
void setup() {
//sevseg
myDisplay.Begin(disType, numberOfDigits, digit1, digit2, digit3,
digit4, segA, segB, segC, segD, segE, segF, segG, segDP);
// Thiết lập cách chân của mạch 4 LED 7 đoạn
myDisplay.SetBrightness(100); // Thiết lập độ sáng cho mạch LED

//ultra-sonic
pinMode(trig, OUTPUT); // Thiết lập kiểu của trig là OUTPUT
pinMode(echo, INPUT); // Thiết lập kiểu của echo là INPUT

//motor
pinMode(mtR1, OUTPUT); // Thiết lập kiểu của mtR1 là OUTPUT
pinMode(mtR2, OUTPUT); // Thiết lập kiểu của mtR2 là OUTPUT
pinMode(mtL1, OUTPUT); // Thiết lập kiểu của mtL1 là OUTPUT
pinMode(mtL2, OUTPUT); // Thiết lập kiểu của mtL2 là OUTPUT
}

Phần lập trình:


Đầu tiên là các hàm và chương trình con (không nằm trong vòng lặp -
loop), cũng được viết theo cách thức tương tự như trong C/C++, với:
void <Tên chương trình con> { // để viết chương trình con
}

<kiểu dữ liệu> <Tên hàm> { // để viết hàm trả về kiểu dữ liệu đó


}

Vì chương trình này là một sự kết hợp từ động cơ, mạch cho đến cảm
biến, nên việc nhồi nhét tất cả vào một chương trình chính sẽ gây ra nhiều bất
tiện cho việc lập trình.
Bởi vậy mà, chúng em quyết định sẽ chia ra làm nhiều phần nhỏ, từ đó có
thể quản lý nó được tốt hơn, dễ chỉnh sửa, trực quan hơn.
// chương trình con để xe chạy thẳng với tham số truyền vào là tốc độ
void Forward(int Speed) {
analogWrite(mtR1, 0);
analogWrite(mtR2, Speed);
analogWrite(mtL1, 0);
analogWrite(mtL2, Speed);
}

// chương trình con để xe rẽ trái với tham số truyền vào là tốc độ


void TurnLeft(int Speed) {
analogWrite(mtR1, 0);
analogWrite(mtR2, 0);
analogWrite(mtL1, 0);
analogWrite(mtL2, Speed);
}

- 26 -
Chuyên đề nghiên cứu và ứng dụng Arduino

// chương trình con để xe rẽ phải với tham số truyền vào là tốc độ


void TurnRight(int Speed) {
analogWrite(mtR1, 0);
analogWrite(mtR2, Speed);
analogWrite(mtL1, 0);
analogWrite(mtL2, 0);
}

// chương trình con để xe dừng


void Stop() {
analogWrite(mtR1, 0);
analogWrite(mtR2, 0);
analogWrite(mtL1, 0);
analogWrite(mtL2, 0);
}

// hàm chuyển từ mili giây về cm (dùng cho cảm biến khoảng cách)
double msToCm(int ms) {return ((double)ms/29.412)/2.0;}

// hàm trả về khoảng cách từ cảm biến khoảng cách đến vật cản
double checkDis() {
digitalWrite(trig, 0);
delayMicroseconds(2);

digitalWrite(trig, 1);
delayMicroseconds(10);
digitalWrite(trig, 0);
long duration = pulseIn(echo, 1);

double cm = msToCm(duration);
return cm;
}

Tiếp theo là phần chương trình chính nằm trong vòng lặp – loop. Ở phần
này, ta sẽ kết hợp và sử dụng các câu lệnh đã viết bên trên để hoàn thành chương
trình.

Nhắc lại về “Xe đồng hồ báo thức” – khi tới giờ báo thức, xe sẽ chạy
thẳng mãi cho đến khi gần chạm vật cản, xe sẽ đổi hướng một cách ngẫu nhiên
và chạy tiếp.

Dự vào ý tưởng trên, ta xây dựng được tư tưởng lập trình sau:
- Khi chưa tới giờ báo thức, xe sẽ đứng im và chỉ chạy đồng hồ.
- Khi đã tới giờ báo thức, xe sẽ chạy thẳng mãi đến khi gần tới vật
cản, xe sẽ chuyển hướng ngẫu nhiên.
- Sau khi đã cách đủ xa vật cản, xe lại tiếp tục chạy thẳng.
- Hết thời gian kéo dài báo thức, xe đứng yên và tiếp tục chạy đồng
hồ, quá trình quay về lại từ đầu.

- 27 -
Chuyên đề nghiên cứu và ứng dụng Arduino

Đoạn mã dưới đây được xây dựng dựa vào tư tưởng trên:

void loop() {
unsigned long times = millis(); // Thời gian từ thời điểm mở mạch
char b[4];

times /= 1000; // chuyển từ mili giây về giây


// cộng thêm thời gian thực khi mở mạch
times += (unsigned long)curHour*3600+curMin*60
times %= 86400; // tuần hoàn thời gian mỗi ngày

// chuyển giờ và phút báo thức sang giây


int toSec = (unsigned long)setHour*60*60+setMin*60;

// kiểm tra trong thời gian báo thức đến hết thời gian kéo dài không
if (times >= toSec && times < toSec+setDelay*60) {
double distance = checkDis(); // đo khoảng cách
if (distance > 8.0) // khoảng cách dưới 20cm thì đi tiếp
Forward(200);
else { // ngược lại xử lý rẽ ngẫu nhiên
Backward(Speed); // lùi xe lại một khoảng
delay(250);
int tmp = rand()%2;
if (tmp) TurnRight(Speed);
else TurnLeft(Speed);
delay(500);
}
}
else {
// chuyển times thành kiểu “hh:mm” để biểu thị trên mạch LED
b[0] = (times/3600)/10+'0';
b[1] = (times/3600)%10+'0';
b[2] = ((times%3600)/60)/10+'0';
b[3] = ((times%3600)/60)%10+'0';

Stop(); // dừng xe lại


myDisplay.DisplayString(b, 0b00000010);
}
return;
}

- 28 -
Chuyên đề nghiên cứu và ứng dụng Arduino

KẾT LUẬN
I. Kết quả thu được
 Học tập lập trình và ứng dụng của Arduino.
 Tạo ra được một sản phẩm phần cứng thú vị, bổ ích.
 Kinh nghiệm về lập trình phần cứng.

II. Thuận lợi và khó khăn


1) Thuận lợi
- Nguồn tài liệu đa dạng, phong phú trên mạng và các tài liệu.
- Sự hướng dẫn tận tình của giáo viên hướng dẫn.
- Kinh nghiệm sẵn có từ cuộc thi phần cứng.
- Có kinh nghiệm lập trình C/C++ nên dễ dàng lập trình Arduino.
2) Khó khăn
- Thời gian tương đối hạn hẹp.
- Chi phí đầu tư lớn.

III. Hướng phát triển


 Thiết lập thời gian báo thức bằng nút bấm vật lý.
 Thiết lập thời gian hiện tại bằng nút bấm vật lý.
 Cải tiến chương trình.
 Thực hiện khảo sát, tính toán thời gian pin duy trì xe hoạt động.
 Trang trí, mang lại cho thiết bị vẻ ngoài dễ nhìn và thân thiện hơn.

- 29 -
Chuyên đề nghiên cứu và ứng dụng Arduino

TÀI LIỆU THAM KHẢO


[1]. “Tự học nhanh Arduino dành cho người mới bắt đầu” – Huỳnh Minh Phú.

[2]. Website: http://arduino.vn/

[3]. Website: http://srobot.saigontech.edu.vn/

- 30 -
Chuyên đề nghiên cứu và ứng dụng Arduino

MỤC LỤC
LỜI MỞ ĐẦU .............................................................................................................. 0
NỘI DUNG .................................................................................................................. 2
I. Giới thiệu về Arduino ............................................................................................. 2
1) Arduino là gì ?...................................................................................................................... 2
2) Cấu tạo Arduino .................................................................................................................. 3
3) Ứng dụng trong đời sống..................................................................................................... 3
II. Phương hướng chuẩn bị ........................................................................................ 5
1) Chuẩn bị về phần cứng: ...................................................................................................... 5
a/ Arduino Uno ................................................................................................................................... 5
b/ Motor DC 3-6VDC ........................................................................................................................... 6
c/ Module 298N .................................................................................................................................. 6
d/ Cảm biến siêu âm HY-SRF05 ........................................................................................................... 7
e/ Bánh xe và mắt trâu ....................................................................................................................... 7
f/ Mạch 4 LED 7 đoạn......................................................................................................................... 8
g/ Đế pin Lithyum 18650 (2 viên) ....................................................................................................... 9
h/ Tấm mica ........................................................................................................................................ 9

2) Chuẩn bị về phần mềm IDE Arduino .............................................................................. 10


a/ Hướng dẫn cài đặt phần mềm...................................................................................................... 10
b/ Giao diện phần mềm IDE .............................................................................................................. 13
c/ Cấu trúc của một chương trình trong phần mềm IDE .................................................................. 14

3) Các câu lệnh cơ bản về động cơ và cảm biến .................................................................. 17


a/ Các câu lệnh về động cơ ............................................................................................................... 17
b/ Các câu lệnh về cảm biến ............................................................................................................. 17
c/ Các câu lệnh thuộc thư viện SegSev ............................................................................................. 18
d/ Các câu lệnh khác ......................................................................................................................... 19

III. Lập trình và lắp ráp “Xe đồng hồ báo thức” .......................................................... 20
1) Lắp rắp ............................................................................................................................... 20
a/ Nối dây ......................................................................................................................................... 20
b/ Thiết kế ......................................................................................................................................... 21

2) Lập trình............................................................................................................................. 25
KẾT LUẬN ................................................................................................................. 29
I. Kết quả thu được ................................................................................................. 29
II. Thuận lợi và khó khăn .......................................................................................... 29
1) Thuận lợi ............................................................................................................................ 29
2) Khó khăn ............................................................................................................................ 29
III. Hướng phát triển ................................................................................................. 29
TÀI LIỆU THAM KHẢO ............................................................................................... 30

- 31 -

You might also like