BỘ GIÁO DỤC & ĐÀO TẠO
TRƯỜNG: ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI
KHOA: ĐIỆN, ĐIỆN TỬ- CƠ KHÍ – XÂY DỰNG
BÁO CÁO ĐỒ ÁN HỌC PHẦN I
ĐỀ TÀI: LẬP TRÌNH CHO XE BỐN BÁNH ĐIỀU KHIỂN BẰNG
BLUETOOTH
GIẢNG VIÊN HƯỚNG DẪN: TH.S NGUYỄN THANH TÙNG
CÁC THÀNH VIÊN THỰC HIỆN: NHÓM
1
LỜI MỞ ĐẦU
Ngày nay cùng với sự phát triển của đất nước thì ngành công nghệ kĩ thuật
điện tử nói riêng và ngành tin học nói chung đã có những bước phát triển
mạnh mẽ không ngừng là chiếc chìa khoá dẫn đến thành công trên nhiều
lĩnh vực, hoạt động .
Nhiệm vụ của một sinh viên ngành Điện Tử chúng em cần phải nghiên
cứu, tìm tòi và phát triển các ứng dụng dựa trên các cơ sở lí thuyết đã được
học. Để có thể tạo ra những sản phẩm có chất lượng tốt nhất đáp ứng nhu
cầu trong cuộc sống hiện đại như robot vận chuyển hàng hóa, robot kiểm
tra nguy hiểm, robot xe lăn cho người khuyết tật. Robot phục vụ sinh hoạt
gia đình.…
Nhưng điểm hạn chế của các robot thịnh hành hiện tại là tính thiếu linh
hoạt và khả năng thích ứng khi làm việc ở những vị trí và địa lí khác nhau.
Chính vì những điểm hạn chế ấy đã đặt ra một câu hỏi :”Làm sao để cho
Robot có thể tránh né được vật cản trở ?“. Hầu hết các robot hiện đại đều
có một giải pháp tránh vật cản nào đó robot xác định vật cản và dừng lại ở
khoảng cách ngắn so với vật cản để tránh va chạm, đến các thuật toán tinh
tế hơn.
Đề tài “Điều khiển xe bằng bluetooth và tự hành tránh vật cản” nhằm
góp phần giải quyết các vấn đề trên.
Tuy nhiên trong quá trình tìm tòi, nghiên cứu và làm báo cáo. Nhóm vẫn
còn một số vấn đề thiếu xót và chưa được trình bày sâu sắc. Rất mong sự
đóng góp ý kiến của Thầy để bài báo cáo của chúng em được hoàn thiện
hơn.
Chúng em xin gửi lời cảm ơn chân thành đến thầy Lê Xuân Vịnh đã
hướng dẫn trong quá trình học tập, thầy đã tận tình quan tâm, chỉ bảo , định
hướng cũng như cung cấp các kiến thức lý thuyết và tạo mọi điều kiện
thuận lợi và đồng thời hướng dẫn cho chúng em trong suốt quá trình thực
hành để chúng em có thể hiểu rõ hơn về Môn Ngôn Ngữ Lập Trình C++
Chúng Em Xin Trân Trọng Cảm Ơn!
2
MỤC LỤC
Phần I/ GIỚI THIỆU ĐỀ TÀI
1/ Lí Do Chọn Đề Tài………………………………………………
2/ Mục Tiêu Nghiên Cứu…………………………………………..
3/ Ý Nghĩa Khoa Học & Thực Tiễn Của Đề Tài…………………...
3.1/ Ý Nghĩa Khoa Học…………………………………………….
3.2/ Ý Nghĩa Thực Tiễn…………………………………………….
4/ Những Đóng Góp Mới Của Đề Tài & Những Vấn Đề Mà Đề Tài Chưa
Thực Hiện Được………………………………………………………
5/ Ưu Điểm Và Nhược Điểm Của Xe Điều Khiển…………………..
5.1/ Ưu Điểm……………………………………………………..
5.2/ Nhược Điểm……………………………………………………
PHẦN II/ GIỚI THIỆU KHÁT QUÁT VỀ MẠCH ARDUINO
1/Giới Thiệu Arduino ………………………………………………
2/ Phần Cứng……………………………………………………….
3/ Phần Mềm………………………………………………………..
PHẦN III/ GIỚI THIỆU NGÔN NGỮ LẬP TRÌNH C++
1/ Lịch Sử Hình Thanh………………………………………….
2/ Đặc Điểm……………………………………………………..
3/ Ví Dụ…………………………………………………………..
PHẦN IV/ TỔNG QUÁT VỀ HỆ THỐNG
1/ Giới Thiệu Chung Về Xe Điều Khiển……………………………
1.1/ Định Nghĩa…………………………………………………….
1.2/ Cấu Tạo Xe Điều Khiển……………………………………….
2/ Hệ Thống Xe Robot 4 Bánh……………………………………...
2.1/ Các Chức Năng Của Từng Bộ Phận…………………………
2.2/ Chương Trình Chạy Mã Code Cho Arduino………………..
2.3/ Phần Mềm Điều Khiển Trên Android……………………….
PHẦN V/ NGÔN NGỮ LẬP TRÌNH TRÊN ARDUINO
1/ Giới Thiệu Ngôn Ngữ Lập Trình Trên Arduino………………..
2/ Ý Nghĩa Các Hàm Sử Dụng Trong Điều Khiển………………..
PHẦN VI/ KẾT LUẬN & KIẾN NGHỊ
1/ Kết Luận…………………………………………………………
2/ Kiến Nghị………………………………………………………..
3/ Nhận Xét Của Giảng Viên……………………………………..
3
PHẦN I/ KHÁI QUÁT VỀ CHỦ ĐỀ ĐIỀU KHIỂN XE BẰNG
BLUETOOTH VÀ TỰ HÀNH TRÁNH VẬT CẢN
1/ Lí Do Để Chọn Đề Tài
- Nắm bắt từ thực tế hiện nay nhiều nước trên thế giới đã ứng
dụng Robot để phục vụ trong nhiều lĩnh vực như: công nghiệp, nông
nghiệp trong quân sự và trong cuộc sống sinh hoạt hằng ngày. Trong tương
lai Robot sẽ là một công cụ hỗ trợ đắc lực cho con người và giúp con người
vươn đến những tầm cao mới. Nhận thức được xu hướng và tầm quan
trọng của Robot trong tương lai, nhằm góp phần xây dựng và phát triển
công nghệ Robot ở Việt Nam, nhóm sinh viên đã quyết định chọn thực
hiện đề tài
“ Điều khiển xe bằng Bluetooth và tự hành tránh vật cản”.
2/Mục tiêu nghiên cứu:
- Đối với nhóm sinh viên, đề tài là bước đầu tìm hiểu, thi công
sản phẩm Robot ứng dụng trong thực tế, đồng thời cũng là bước triển khai
những kiến thức đã được học. Thông qua việc nghiên cứu và làm việc
nghiêm túc để rèn luyện tác phong, tinh thần khoa học, cũng như hoàn
thiện phương pháp, tư duy nghiên cứu, giải quyết một vấn đề thực tiễn.
Quan trọng hơn, đề tài còn là bước “tổng kết và hoàn thiện” những kỹ năng
còn thiếu sót trước khi thực sự trở thành người kỹ sư. Về mặt ứng dụng
thực tiễn, đề tài có thể sử dụng hỗ trợ trong việc điều khiển hoặc tự động
tránh né vật cản trong những khu vực phức tạp nhằm tránh va chạm với
vật.
3/ Ý Nghĩa Khoa Học & Thực Tiễn Của Đề Tài
3.1/ Ý Nghĩa Khoa Học:
- Ứng dụng các kết quả nghiên cứu lý thuyết, đề tài sẽ xây dựng
mô hình xe điều khiển 4 bánh thông qua thiết bị bluetooth và phụ kiện cảm
biến để né tránh vật cản. Đề tài minh chứng tı́nh đúng đắ n của hướng
nghiên cứu , khẳ ng đinh
̣ đô ̣ tin câ ̣y của các kế t quả nghiên cứu khoa học.
3.2/ Ý Nghĩa Thực Tiễn:
- Xây dựng một xe vừa có thể điều khiển bằng bluetooth thông
qua điện thoại android và có thể tự hành khi mất kết nối . Điểm mới của xe
là có khả năng tránh vật cản trong quá trình di chuyển. Nhóm chúng em
dừng lại ở việc tìm hiểu cấu trúc tổng quang của robot, đồng thời tìm hiểu
4
các khối phục vụ cho việc điều khiển robot và các giao thức truyền thông
giữa máy tính và mạch Arduino.
4/Những Đóng Góp Mới Của Đề Tài & Những Vấn Đề Mà Đề
Tài Chưa Thực Hiện Được
-Đề tài có ý nghĩa như những bước đầu chập chững tiến lên
ngành công nghiệp nghiên cứu Robot đang còn yếu của nước ta, góp phần
làm “điểm tựa” cho các thế hệ sau tiến lên những nấc thang cao hơn của
nghiên cứu chế tạo Robot. Xe Robot 4 bánh có thiết kế nhỏ gọn hoạt động
tốt với kết cấu vững chắc và nguồn hoạt động lâu có thể giúp cho con
người dễ dàng vận chuyển và triển khai trong phạm vi ứng dụng một cách
linh hoạt. Tuy nhiên do thời gian nghiên cứu không nhiều nên đề tài còn
nhiều mặt hạn chế chưa áp dụng được nhiều công nghệ như GPS, Camera,
Đèn, các cảm biến công nghệ giúp xe Robot trở nên thông minh hơn và có
ứng dụng thực tiễn nhiều hơn nữa.
5/ Những Ưu Điểm & Nhược Điểm Của Xe Điều Khiển
5.1/ Ưu Điểm:
- Không ô nhiễm, sử dụng pin và có thể sạc pin được
- Sử dụng trong không gian hiệu quả, đa năng ( sử dụng trong nhà hoặc
ngoài phố)
- Dễ dàng điều khiển bằng Điện thoại thông minh thông qua Bluetooth
- Như một phương tiện vận chuyển hàng hoá hoặc có thể giám sát
- Gía thành thấp hơn những robot khác
- Tốc độ di chuyển nhanh chóng tiện lợi
- Tránh né mọi vật xung quanh một cách linh hoạt
- Mẫu mã thiết kế bắt mắt
- Không có tiếng ồn
- Dễ dàng thiết kế và lắp ráp
- Di chuyển đa hướng nhanh nhẹn
5.2/ Nhược Điểm:
- Không thể vượt qua các địa hình xấu
- Tiêu hao năng lượng nhiều
- Khoảng cách điều khiển ngắn
- Các bánh xe khi chạy chưa đều
5
PHẦN II/ GIỚI THIỆU KHÁI QUÁT VỀ ARDUINO
1/Giới Thiệu Arduino
-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.
Đượ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 nhiế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++.
Giá của các board Arduino dao động xung quanh €20, hoặc $27 hoặc
574 468VNĐ, nếu được "làm giả" thì giá có thể giảm xuống thấp hơn $9.
Các board Arduino có thể được đặt hàng ở dạng được lắp sẵn hoặc dưới
dạng các kit tự-làm-lấy. Thông tin thiết kế phần cứng được cung cấp công
khai để những ai muốn tự làm một mạch Arduino bằng tay có thể tự mình
thực hiện được (mã nguồn mở). Người ta ước tính khoảng giữa năm 2011
có trên 300 ngàn mạch Arduino chính thức đã được sản xuất thương mại,
và vào năm 2013 có khoảng 700 ngàn mạch chính thức đã được đưa tới tay
người dùng.
2/ Phần Cứng
-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,
6
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 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.5 mm). Nhiều shield ứng dụng plug-in 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.
Có nhiều biến thể như Arduino-compatible và Arduino-derived. Một vài
trong số đó có chức năng tương đương với Arduino và có thể sử dụng để
thay thế qua lại. Nhiều mở rộng cho Arduino được thực thiện bằng cách
thêm vào các driver đầu ra, thường sử dụng trong các trường học để đơn
giản hóa các cấu trúc của các 'con rệp' và các robot nhỏ. Những board khác
thường tương đương về điện nhưng có thay đổi về hình dạng-đôi khi còn
duy trì độ tương thích với các shield, đôi khi không. Vài biến thể sử dụng
bộ vi xử lý hoàn toàn khác biệt, với các mức độ tương thích khác nhau.
3/Phần Mềm
7
Môi trường phát triển tích hợp (IDE) của Arduino là một ứng dụng crossplatform (nền tảng) được viết bằng Java, và từ IDE này sẽ được sử dụng
cho Ngôn ngữ lập trình xử lý (Processing programming language) và
project Wiring. Nó được thiết kế để dành cho các nghệ sĩ và những người
mới tập tành làm quen với lĩnh vực phát triển phần mềm. Nó bao gồm một
chương trình code editor với các chức năng như đánh dấu cú pháp, tự
động brace matching, và tự động canh lề, cũng như compile(biên dịch) và
upload chương trình lên board chỉ với 1 cú click chuột. Một chương trình
hoặc code viết cho Arduino được gọi là một sketch.[5]
Các chương trình Arduino được viết bằng C hoặc C++. Arduino IDE đi
kèm với một thư viện phần mềm được gọi là "Wiring", từ project Wiring
gốc, có thể giúp các thao tác input/output được dễ dàng hơn. Người dùng
chỉ cần định nghĩa 2 hàm để tạo ra một chương trình vòng thực thi (cyclic
executive) có thể chạy được:
setup() : hàm này chạy mỗi khi khởi động một chương trình, dùng để
thiết lập các cài đặt
loop() : hàm này được gọi lặp lại cho đến khi tắt nguồn board mạch
Một chương trình điển hình cho một bộ vi điều khiển đơn giản chỉ là làm
cho một bóng đèn Led sáng/tắt. Trong môi trường Arduino, ta sẽ phải viết
một chương trình giống như sau:[6]
Đèn LED tích hợp với chân 13
#define LED_PIN 13
void setup () {
pinMode (LED_PIN, OUTPUT); // Cho phép chân 13 làm đầu ra digital
}
void loop () {
digitalWrite (LED_PIN, HIGH); // Bật LED on
delay (1000); // chờ trong 1 giây (1000 mili giây)
digitalWrite (LED_PIN, LOW); // Tắt LED off
delay (1000); // chờ trong 1s
}
Một đặc điểm của hầu hết các board Arduino là chúng có một đèn LED và
điện trở nối giữa chân 13 với đất; một đặc điểm thuận tiện cho nhiều ứng
dụng đơn giản.[6] Đoạn code ở trên không thể đọc được bởi
một compiler C++ chuẩn như là một chương trình đúng, vì vậy khi ta click
8
vào nút "Upload to I/O board" trong IDE này, một bản copy của đoạn code
này sẽ được ghi vào một file tạm với một extra include header ở phía trên
cùng và một hàm main () đơn giản nằm ở phía đáy, để làm cho thàn một
chương trình C++ khả dụng.
Arduino IDE này sử dụng GNU toolchain và AVR Libc để biên dịch
chương trình, và sử dụng avrdude để upload chương trình lên board.
Vì nền tảng của Arduino là các vi điều khiển của Atmel, cho nên môi
trường phát triển của Atmel, AVR Studio hoặc các phiên bản Atmel Studio
mới hơn, cũng có thể được sử dụng để làm phần mềm phát triển cho
Arduino.
PHẦN III/ GIỚI THIỆU NGÔN NGỮ LẬP TRINH C++
1/ Lịch Sử Hình Thành:
-Ngôn ngữ lập trình C do Dennis Ritchie nghĩ ra khi ông làm việc
tại AT&T Bell Laboratories vào năm 1972.
C là một ngôn ngữ mạnh và có tính linh hoạt, nó đã nhanh chóng được sử
dụng một cách rộng rãi, vượt ra khỏi phạm vi của Bell Labs. Các lập trình
viên ở khắp mọi nơi bắt đầu sử dụng nó để viết tất cả các loại chương trình.
C++ được biết đến như là ngôn ngữ mới bao trùm lên C và do Bjarne
Stroustrup sáng tác năm 1980 cũng tại phòng thí nghiệm Bell tại bang New
Jersey, Mỹ. Ban đầu được ông đặt tên cho nó là “C with classes” (C với
các lớp). Tuy nhiên đến năm 1983 thì ông đổi tên thành C++, trong đó ++
là toán tử tăng thêm 1 của C.
C++ được biết đến như là ngôn ngữ lập trình hướng sự vật hay hướng đối
tượng - OOP (Object Oriented Programming).
2/ Đặc Điểm:
-C là một ngôn ngữ mạnh và linh hoạt. C được sử dụng trong nhiều
dự án khác nhau, như viết hệ điều hành, chương trình xử lý văn bản, đồ
hoạ, bảng tính, và thậm chí cả chương trình dịch cho các ngôn ngữ khác.
C có sẵn rất nhiều các trình biên dịch (compiler) và các thư viện được viết
sẵn khác.
C là một ngôn ngữ khả chuyển (portable language). Nghĩa là một chương
trình viết bằng C cho một hệ máy tính (ví dụ như IBM PC) có thể được
dịch và chạy trên hệ máy tính khác (chẳng hạn như DEC VAX) chỉ với rất
ít các sử đổi. Tính khả chuyển đã được bởi chuẩn ANSI cho C.
C chỉ gồm một số ít từ khoá (keywords) làm nền tảng để xây dựng các các
chức năng của ngôn ngữ.
C là ngôn ngữ lập trình theo modul. Mã chương trình C có thể (và nên)
được viết thành các thủ tục gọi là function. Những function này có thể
9
được sử dụng lại trong các ứng dụng (application) và chương trình khác
nhau. Tuy nhiên C không cho phép khai báo hàm trong hàm.
C++ bao trùm lên C nên mọi đặc điểm của C đều có trong C++. Ngoài ra,
C++ còn có một số đặc điểm khác như:
C++ là ngôn ngữ hướng đối tượng.
C++ là ngôn ngữ định kiểu rất mạnh.
C++ cung cấp cách truyền tham số bằng tham chiếu cho hàm.
C++ cung cấp cơ cấu thư viện để người lập trình có thể tự tạo thêm hàm
thông dụng vào thư viện và có thể tái sử dụng sau này.
C++ cung cấp một cơ chế đa dạng hóa tên hàm và toán tử.
C++ cung cấp các class là loại cấu trúc mới đóng gói chung cho cả dữ liệu
lẫn các hàm trong một chủ thể được bảo vệ một cách chặt chẽ.
Cấu trúc của một chương trình C++
(1): Khai báo thư viện
(2): [Khai báo các nguyên mẫu hàm của người dùng].
(3): [Các định nghĩa kiểu].
(4): [Các định nghĩa Macro].
(5): [Các định nghĩa biến, hằng].
(6): <kiểu hàm> main ([khai báo tham số]).
(7): {
(8): Thân hàm main
(9): }
(10): Các định nghĩa hàm của người dùng.
Chú ý: Các thành phần trong cặp ngoặc vuông [] có thể có hoặc không
trong chương trình.
Giải thích cú pháp:
(1): Cú pháp để khai báo thư viện: #include<tên_thư_viên.h>
Ví dụ: #include<iostream.h>; #include<conio.h>;…
(2): Cung cấp tên hàm, kiểu hàm, số đối số và kiểu của từng đối số của
hàm.
Cú pháp khai báo nguyên mẫu hàm: <kiểu hàm> <tên hàm> ([Khai báo các
đối số]);
Ví dụ: int chanle (int x); Trong đó, kiểu hàm là int, tên hàm là chanle,
đối số là x và kiểu của đối số là int.
(3): Định nghĩa kiểu mới
Ngoài những kiểu chuẩn đã được cung cấp sẵn của ngôn ngữ, người lập
trình có thể định nghĩa ra các kiểu mới từ những kiểu đã có bằng cách sử
dụng từ khóa typedef.
(4): Định nghĩa Macro
10
(5): Các định nghĩa biến, hằng: Các biến và hằng được định nghĩa tại đây
sẽ trở thành biến và hằng toàn cục.
(6) – (9): Hàm main():Đây là thành phần bắt buộc trong một chương trình
C++, thân của hàm main bắt đầu từ sau dấu mở móc { (dòng 7) cho tới dấu
đóng móc } (dòng 9).
(10): Các định nghĩa hàm của người dùng: Một định nghĩa hàm bao gồm
tiêu đề của hàm, thân hàm với cú pháp như sau:
<Kiểu hàm> <Tên hàm> ([Khai báo các đối])
{
<Thân hàm>
}
3/ Ví dụ :
Chương trình nhập vào điểm 3 môn: Toán, Lý, Hóa và tính điểm
trung bình của 3 môn đó.
//Khai báo thư viện
#include<iostream.h>
//Bắt đầu hàm main
int main()
{
//Khai báo 3 biến
double dtb,dt,dl,dh;
//Nhập vào 3 điểm Toán, Lý, Hóa
cout<<"Diem toan la:";
cin>>dt;
cout<<"diem ly la:"; cin>>dl;
cout<<"Diem hoa la:"; cin>>dh;
dtb = (dt+dl+dh)/3;
cout<<"diem trung binh 3 mon la:"<<"="<
if (dtb<5)
cout<<"Hoc luc yeu“;
if (dtb>=5&&dtb<7)
cout<<"Hoc luc trung binh";
if (dtb>=7 && dtb<=8)
cout<<"Hoc luc kha";
else
cout<<"Hoc luc gioi";
return 0;
} //Kết thúc hàm main
11
PHẦN IV/ TỔNG QUÁT VỀ HỆ THỐNG XE ĐIỀU KHIỂN
BLUETOOTH VÀ CẢN BIẾN VẬT CẢN
1/ Giới Thiệu Chung Về Xe
1.1/ Định nghĩa :
-Là một loại xe robot có khả năng tự di chuyển hoặc điều
khiển bằng ứng dụng trên hệ điều hành android ( có thể lập trình lại
được để phù hợp với yêu cầu đặt ra ).Môi trường hoạt động của robot
là đất. Địa hình bề mặt mà robot di chuyển có thể bằng phẳng hoặc
thay đổi , lồi lõm.
Bộ phận thực hiện chuyển động bằng bánh
Hình 1
12
1.2/ Cấu tạo xe điều khiển:
- Các Bộ phận của xe điều khiển bao gồm:
Mạch Aduino Uno R3
Cảm biến siêu âm HC-SCR4
Module Bluetooth HC-06
Mạch điều khiển động cơ L298N
Bộ khung xe 4 bánh
RC- Sovor
2/ Hệ thống xe điều khiển:
2.1/Các chức năng của từng bộ phận:
*Cảm biến siêu âm HC-SCR4
Hình 2
Cảm biến sử dụng sóng siêu âm và có thể đo khoảng cách từ 2 đến 300cm
với độ chính xác gần như chỉ phụ thuoccj vào việc lập trình. Cảm biến HCSR04 có 4 chân là Vcc, Trig, Echo và GND
Nguyên lí hoạt động : Để đo khoảng cách, ta sẽ phát 1 xung rất ngắn (5
microSeconds ) từ chân Trig. Sau đó, cảm biến sẽ tạo ra 1 xung HIGH ở
chân Echo cho đến khi nhận lại được sóng phản xạ ở pin này. Chiều rộng
của xung sẽ bằng với thời gian sóng siêu âm được phát từ cảm biển và
quay trở lại.
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 microSeconds/cm (106 / (340*100)). Khi đã tính được
thời gian, ta sẽ chia cho 29,412 để nhận được khoảng cách.
*Module Bluetooth HC-06
13
Hình 3
Để giao tiếp với với Module ở đây nhóm em lựa chọn ứng dụng
Arduino Bluetooth RC Car khi chạy ứng dụng sẽ tìm kiếm địa chỉ của
module HC-06 (ở đây đã có sẵn các phím điều khiển ). Khi ấn phím , điện
thoại sẽ truyền mã tương ứng qua Bluetooth đến module HC-06 . Sử dụng
vi điều khiển ATMEGA328P để nhận mã và tiến hành điều khiển các động
cơ thực hiện chức năng tương ứng của phím. Kết nối giữa module và vi
điều khiển như sau :
- TX module
RX ATMEGA
- RX module
TX ATMEGA
Ở ứng dụng này ta củng có thể đổi sang chế độ điều khiển bằng chế độ
lắc điện thoại.
* Motor Shield L298N
Hình 6
Mạch Điều Khiển Động Cơ L298N có tích hợp một IC nguồn 7805 để tạo
ra nguồn 5V để cung cấp cho các thiết bị khác.
Thông số kĩ thuật :
Driver: L298N tích hợp hai mạch cầu H.
-Điện áp điều khiển: +5 V ~ +35 V
- Dòng tối đa cho mỗi cầu H là: 2A
- Điện áp của tín hiệu điều khiển: +5 V ~ +7 V
- Dòng của tín hiệu điều khiển: 0 ~ 36mA
- Công suất hao phí: 20W (khi nhiệt độ T = 75 ℃)
Các chân tín hiệu :
14
1.
2.
3.
DC motor 1 và 2 "+"
DC motor 1 và 2 "-"
12V jumper .Jumper này dùng để cấp nguồn cho IC ổn áp tạo ra
nguồn 5V nếu nguồn trên 12V sẽ làm cháy IC Nguồn
4. cằm dây nguồn cung cấp điện áp cho motor vào đây từ 6V đến 35V.
5. cắm chân GND của nguồn
6. ngõ ra nguồn 5V
7. Chân Enable của Motor 1, chân này dùng để cấp xung PWM cho
motor
8. IN1
9. IN2
10. IN3
11. IN4
12. Chân Enable của Motor 2, chân này dùng để cấp xung PWM cho
motor
13. DC motor 3 và 4 "+"
14. DC motor 3 và 4 "-"
Bộ phận chấp hành là các bánh xe có gắn động cơ điện 1 chiều.
* Mạch Aduino UNO R3
Hình 4
15
Một vài thông số của Arduino UNO R3
Vi điều khiển
ATmega328 họ 8bit
Điện áp hoạt động
5V DC (chỉ được cấp qua cổng USB)
Dòng tiêu thụ
khoảng 30mA
Tần số hoạt động
Điện áp vào khuyên dùng
Điện áp vào giới hạn
Số chân Digital I/O
Số chân Analog
16 MHz
7-12V DC
6-20V DC
14 (6 chân hardware PWM)
6 (độ phân giải 10bit)
Dòng tối đa trên mỗi chân
I/O
30 mA
Dòng ra tối đa (5V)
500 mA
Bộ nhớ flash
32 KB (ATmega328) với 0.5KB dùng bởi
bootloader
Dòng ra tối đa (3.3V)
SRAM
EEPROM
50 mA
2 KB (ATmega328)
1 KB (ATmega328)
*Các cổng vào & ra
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. 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
16
Chân PWM (~): 3, 5, 6, 9, 10, và 11: cho phép 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().
Chân giao tiếp SPI: 10 (SS), 11 (MOSI), 12 (MISO), 13 (SCK).
Ngoà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.
LED 13: trên Arduino UNO có 1 đèn led màu cam (kí hiệu chữ L).
Khi bấm nút Reset, sẽ thấy đèn này nhấp nháy để báo hiệu. Nó được nối
với chân số 13. Khi chân này được người dùng sử dụng, LED sẽ sáng.
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. Đặ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.
Lập trình cho Arduino
Các thiết bị dựa trên nền tảng Arduino được lập trình bằng ngôn riêng.
Ngôn ngữ này dựa trên ngôn ngữ Wiring được viết cho phần cứng nói
chung. Và Wiring lại là một biến thể của C/C++.
Để lập trình cũng như gửi lệnh và nhận tín hiệu từ mạch Arduino, nhóm
phát triển dự án này đã cũng cấp đến cho người dùng một môi trường lập
trình
Arduino
được
gọi
là
Arduino
IDE
(IntergratedDevelopment Environment) như hình dưới đây.
17
Hình 5
Đoạn mã nguồn trong hình vẽ dùng để điều khiển xe .
18
2.2/ Chương Trình Chạy Mã Code Cho Arduino
Chương Trình Chạy Code Cho Xe Điều Khiển
19
1. #include <Servo.h>
2. const int ENA = 5;
3. const int ENB = 6;
4. const int IN1 = 2;
5. const int IN2 = 3;
6. const int IN3 = 4;
7. const int IN4 = 7;
8. const int TrigPin = 8;
9. const int EchoPin = 9;
10. const int Head = 11;
11. const int Central = 90;
12. const int LeftPos = 160;
13. const int RightPos = 20;
14. const int PWM255 = 255;
15. const int PWM128 = 128;
16. const int D = 1;
17. const int timeDelay = 30;
18. char incomingByte;
19. Servo myHead;
20. const int SafeDistance = 20;
21. const int SafeSideDistance = 10;
22. boolean stopFlag = false;
23. void setup()
24. {
25. pinMode(ENA, OUTPUT);
26. pinMode(ENB, OUTPUT);
27. pinMode(IN1, OUTPUT);
28. pinMode(IN2, OUTPUT);
29. pinMode(IN3, OUTPUT);
30. pinMode(IN4, OUTPUT);
31. digitalWrite(ENA, LOW);
32. digitalWrite(ENB, LOW);
33. pinMode(TrigPin, OUTPUT);
34. pinMode(EchoPin, INPUT);
35. myHead.attach(Head);
36. Serial.begin(9600);
37. }
38. void loop()
39. {
40. if(Serial.available() > 0)
41. {
42.
incomingByte = Serial.read();
43.
Serial.println(incomingByte);
44.
switch(incomingByte)
45.
{
46.
case 'f':
47.
if(!stopFlag) {
48.
Forward();
49.
if(!checkSafe()) {
50.
Brake();
51.
stopFlag = true;
52.
}
53.
}
54.
break;
55.
case 'b':
56.
Backward();
57.
if(checkSafe())
58.
stopFlag = false;
59.
break;
60.
case 'l':
61.
if(!stopFlag) {
62.
Left(PWM255);
63.
if(!checkSafe()) {
64.
Brake();
65.
stopFlag = true;
66.
}
67.
}
68.
else
69.
{
70.
Left(PWM128);
71.
if(!leftSafe()) {
72.
Brake();
73.
stopFlag = true;
74.
}
75.
}
76.
break;
20
77.
case 'r':
78.
if(!stopFlag) {
79.
Right(PWM255);
80.
if(!checkSafe()) {
81.
Brake();
82.
stopFlag = true;
83.
}
84.
}
85.
else
86.
{
87.
Right(PWM128);
88.
if(!rightSafe()) {
89.
Brake();
90.
stopFlag = true;
91.
}
92.
}
93.
break;
94.
default:
95.
break;
96.
} //Switch
97.
StopMove();
98. }
99. }
100. void Forward()
101. {
102. analogWrite(ENA, PWM255);
103. analogWrite(ENB, PWM255);
104. digitalWrite(IN1, LOW);
105. digitalWrite(IN2, HIGH);
106. digitalWrite(IN3, LOW);
107. digitalWrite(IN4, HIGH);
108. }
109. void Backward()
110. {
111. analogWrite(ENA, PWM255);
112. analogWrite(ENB, PWM255);
113. digitalWrite(IN1, HIGH);
114. digitalWrite(IN2, LOW);
115. digitalWrite(IN3, HIGH);
116. digitalWrite(IN4, LOW);
21
117. }
118. void Left(int pwm)
119. {
120. analogWrite(ENA, pwm);
121. analogWrite(ENB, pwm);
122. digitalWrite(IN1, LOW);
123. digitalWrite(IN2, HIGH);
124. digitalWrite(IN3, HIGH);
125. digitalWrite(IN4, LOW);
126. }
127. void Right(int pwm)
128. {
129. analogWrite(ENA, pwm);
130. analogWrite(ENB, pwm);
131. digitalWrite(IN1, HIGH);
132. digitalWrite(IN2, LOW);
133. digitalWrite(IN3, LOW);
134. digitalWrite(IN4, HIGH);
135. }
136. void Brake()
137. {
138. analogWrite(ENA, PWM255);
139. analogWrite(ENB, PWM255);
140. digitalWrite(IN1, HIGH);
141. digitalWrite(IN2, HIGH);
142. digitalWrite(IN3, HIGH);
143. digitalWrite(IN4, HIGH);
144. delay(timeDelay);
145. }
146. int getDistance()
147. {
148. long time, distance;
149. digitalWrite(TrigPin, LOW);
150. delayMicroseconds(5);
151. digitalWrite(TrigPin, HIGH);
152. delayMicroseconds(15);
153. digitalWrite(TrigPin, LOW);
154. time = pulseIn(EchoPin, HIGH);
155. return round(distance = (time / 2) / 29.1);
156. }
22
157. int getDistanceAtPosition(int position)
158. {
159. myHead.write(position);
160. delay(timeDelay);
161. return getDistance();
162. }
163. boolean checkSafe()
164. {
165. int distance = getDistanceAtPosition(Central);
166. boolean flag = true;
167. if (distance < SafeDistance)
168. flag = false;
169. return flag;
170. }
171. boolean leftSafe()
172. {
173. boolean flag = true;
174. int dCenter = getDistanceAtPosition(Central);
175. int dLeft = getDistanceAtPosition(LeftPos);
176. if (dCenter < SafeDistance)
177. {
178. if (dCenter < SafeSideDistance)
179.
flag = false;
180. else
181. {
182.
if (dLeft < SafeDistance)
183.
flag = false;
184.
else
185.
flag = true;
186. }
187. }
188. else
189. stopFlag = false;
190. return flag;
191. }
192. boolean rightSafe()
193. {
194. boolean flag = true;
195. int dCenter = getDistanceAtPosition(Central);
196. int dRight = getDistanceAtPosition(RightPos);
23
197. if (dCenter < SafeDistance)
198. {
199. if (dCenter < SafeSideDistance)
200.
flag = false;
201. else
202. {
203.
if (dRight < SafeDistance)
204.
flag = false;
205.
else
206.
flag = true;
207. }
208. }
209. else
210. stopFlag = false;
211. return flag;
212. }
213. void StopMove()
214. {
215. analogWrite(ENA, PWM255);
216. analogWrite(ENB, PWM255);
217. digitalWrite(IN1, LOW);
218. digitalWrite(IN2, LOW);
219. digitalWrite(IN3, LOW);
220. digitalWrite(IN4, LOW);
221. }
24
2.3/ Phần Mềm Điều Khiển Bluetooth Trên Android
Hình 7
25