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

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC BÁCH KHOA


KHOA CƠ KHÍ

ĐỒ ÁN TỐT NGHIỆP
NGÀNH: KỸ THUẬT CƠ ĐIỆN TỬ

ĐỀ TÀI:

Thiết kế và chế tạo xe điều khiển bằng


giọng nói

Người hướng dẫn: TS. NGUYỄN DANH NGỌC


Giảng viên duyệt: TS. ĐẶNG PHƯỚC VINH
Sinh viên thực hiện: VÕ TRUNG HIẾU
TRIỆU THỊ THU DUYÊN
Số thẻ sinh viên : 101140141
101140137
Lớp: 14CDT1

Đà Nẵng, 2019
TÓM TẮT

Tên đề tài: Thiết kế và chế tạo xe điều khiển bằng giọng nói
Sinh viên thực hiện: Võ Trung Hiếu - Triệu Thị Thu Duyên
Số thẻ SV: 101140141 - 101140137
Lớp: 14CDT1 - 14CDT1

Luận văn trình bày thiết kế và chế tạo xe điều khiển bằng giọng nói. Xe hoạt động nhờ
vào sự dẫn động của hai động cơ chính. Người dùng điều khiển xe thông qua màn hình
cảm ứng trên điện thoại cũng như giao tiếp qua giọng nói dựa trên nền Android. Ứng
dụng Andorid được thiết kế riêng cho xe và có thể tải từ của hàng ứng dụng CH Play
của Google. Xe được dùng làm phương tiện cá nhân để di chuyển trong công viên, phố
đi bộ, khuôn viên trường đại học. Đề tài thể ứng dụng trong kỉ nguyên của mạng
internet kết nối vạn vật; thích hợp với các dự án smarthome, robot chỉ đường trong
bệnh viện, sân bay hoặc robot phục vụ nhà hàng.
ĐẠI HỌC ĐÀ NẴNG CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
TRƯỜNG ĐẠI HỌC BÁCH KHOA Độc lập - Tự do - Hạnh phúc
KHOA CƠ KHÍ

NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP


TT Họ tên sinh viên Số thẻ SV Lớp Ngành
1 Triệu Thị Thu Duyên 101140137 14CDT1 Cơ điện tử
2 Võ Trung Hiếu 101140141 14CDT1 Cơ điện tử
1. Tên đề tài đồ án:
Thiết kế và chế tạo xe điều khiển bằng giọng nói.
2. Đề tài thuộc diện: ☐ Có ký kết thỏa thuận sở hữu trí tuệ đối với kết quả thực hiện
3. Các số liệu và dữ liệu ban đầu:
……………………………………..……………………………………………..……...………………
……………………..……………………………………………..……...
Nội dung các phần thuyết minh và tính toán:
a. Phần chung:
TT Họ tên sinh viên Nội dung
1 Võ Trung Hiếu • Tìm hiểu tổng quan về đề tài
• Tính toán thiết kế
2 Triệu Thị Thu Duyên
• Kết luận và đánh giá kết quả
b. Phần riêng:
TT Họ tên sinh viên Nội dung
1 Võ Trung Hiếu • Thiết kế và chế tạo nguyên mẫu xe
2 Triệu Thị Thu Duyên • Tìm hiểu và thiết kế thiết kế bộ điều khiển
4. Các bản vẽ, đồ thị ( ghi rõ các loại và kích thước bản vẽ ):
TT Họ tên sinh viên Nội dung
1 Võ Trung Hiếu • Kết cấu cơ khí
• Sơ đồ động
• Sơ đồ mạch
2 Triệu Thị Thu Duyên
• Sơ đồ khối chức năng
• Lưu đồ thuật toán

5. Họ tên người hướng dẫn: Phần/ Nội dung:


TS. Nguyễn Danh Ngọc
6. Ngày giao nhiệm vụ đồ án: ……../……./201…..
7. Ngày hoàn thành đồ án: ……../……./201…..

Đà Nẵng, ngày tháng năm 201


Trưởng Bộ môn Cơ Điện Tử Người hướng dẫn
LỜI NÓI ĐẦU

Sau thời gian 5 năm được đào tạo về các phần lý thuyết cơ bản của “Thiết kế chi tiết
máy”, “Cơ sở thiết kế máy”, “Điều khiển tự động”, “Hệ thống cơ điện tử”, …vv, kết
hợp với quá trình tự tìm tòi học hỏi, chúng em đã rút ra, tích lũy được những kiến thức
ban đầu hết sức quan trọng để bắt tay vào làm đồ án tốt nghiệp. Tuy nhiên sự non trẻ về
kinh nghiệm thực tế khiến chúng em không khỏi lung túng trong quá trình thiết kế để
có một hệ thống hoàn chỉnh, thẩm mỹ và hiệu quả kinh tế. Qua thời gian học tại khoa
Cơ khí – Trường Đại học Bách khoa, dưới sự tận tình hướng dẫn, giúp đỡ của các thầy,
cô giáo cũng như sự nỗ lực của bản thân, chúng em đã tích luỹ một số kiến thức như là
hành trang để trở thành những kỹ sư. Đồ án là bước đầu tìm hiểu thi công sản phẩm
thực tế đồng thời cũng áp dụng những kiến thức đã được học để giải quyết các vấn đề
thực tế xảy ra trong quá trình làm
Nhân đây, nhóm xin gởi lời cảm ơn chân thành và sâu sắc đên các thầy trong Khoa
Cơ khí, trường Đại học Bách khoa – Đại học Đà nẵng, trong suốt 5 năm qua đã giảng
dạy, truyền thụ kiến thức cho sinh viên. Xin gửi lời cảm ơn đặc biệt đến Thầy TS.
Nguyễn Danh Ngọc, người đã luôn hỗ trợ về mặt kiến thức cho nhóm, kịp thời động
viên những lúc khó khăn. Tuy kết quả của mô hình còn nhiều thiết sót, nhưng thực sự
những giúp đỡ quý báu của thầy là vô cùng có ý nghĩa với nhóm. Cuối cùng nhóm cũng
mong nhận được những ý kiến đóng góp của thầy cô Hội đồng bảo vệ đồ án tốt nghiệp
để nhóm rút được bài học cũng như kinh nghiệm khi bước chân vào đời.

Đà Nẵng, ngày 30 tháng 5 năm 2019


Nhóm sinh viên thực hiện

Võ Trung Hiếu
Triệu Thị Thu Duyên

i
LỜI CAM ĐOAN

Nhóm sinh viên xin cam đoan đồ án này do chúng tôi tự tính toán, thiết kế và nghiên
cứu dưới sự hướng dẫn của TS. Nguyễn Danh Ngọc. Để hoàn thành đồ án này, Chúng
tôi chỉ sử dụng những tài liệu đã ghi trong mục tài liệu tham khảo, ngoài ra không sử
dụng bất cứ tài liệu khác mà không được ghi. Nếu sai nhóm xin chịu mọi hình thức kỷ
luật theo quy định.

Nhóm sinh viên thực hiện

Triệu Thị Thu Duyên


Võ Trung Hiếu

ii
MỤC LỤC
TÓM TẮT ----------------------------------------------------------------------------------------------------------------------------- I
NHIỆM VỤ ĐỒ ÁN TỐT NGHIỆP ---------------------------------------------------------------------------------- II
LỜI NÓI ĐẦU ---------------------------------------------------------------------------------------------------------------------- I
LỜI CAM ĐOAN ---------------------------------------------------------------------------------------------------------------- II
MỤC LỤC ----------------------------------------------------------------------------------------------------------------------------III
DANH SÁCH CHỮ VIẾT TẮT--------------------------------------------------------------------------------------- VII
CHƯƠNG 1: TỔNG QUAN VỀ ĐỀ TÀI ------------------------------------------------------------------------- 1
1.1. Bối cảnh liên quan ----------------------------------------------------------------------------------------------------- 1
1.2. Giới thiệu chung về xe ---------------------------------------------------------------------------------------------- 3
1.3. Đối tượng nghiên cứu ----------------------------------------------------------------------------------------------- 3
1.4. Kiến trúc hệ thống ----------------------------------------------------------------------------------------------------- 4
CHƯƠNG 2: THIẾT KẾ VÀ CHẾ TẠO KẾT CẤU CƠ KHÍ ---------------------------------------- 5
2.1. Bộ dẫn động chính----------------------------------------------------------------------------------------------------- 5
2.1.1. Chọn động cơ ------------------------------------------------------------------------- 5
2.1.2. Chọn trục ------------------------------------------------------------------------------ 6
2.1.3. Chọn gối đỡ --------------------------------------------------------------------------- 9
2.1.4. Chọn bánh xe------------------------------------------------------------------------ 10
2.2. Khớp xoay cánh tay-------------------------------------------------------------------------------------------------- 10
2.3. Thiết kế mô hình trên Solidworks 2017------------------------------------------------------------------ 11
3.1. Sơ đồ khối điều khiển ---------------------------------------------------------------------------------------------- 16
3.2. Các linh kiện sử dụng----------------------------------------------------------------------------------------------- 17
3.2.1. Board Arduino mega 2560 -------------------------------------------------------- 17
3.2.2. Driver điều khiển động cơ DC BTS 7960--------------------------------------- 18
3.2.3. Module ổn áp 5V XL4005 -------------------------------------------------------- 19
3.2.4. Cảm biến siêu âm US-015 -------------------------------------------------------- 20
3.2.5. Cảm biến Encoder ------------------------------------------------------------------ 21
3.2.6. Ắc quy ------------------------------------------------------------------------------- 22
3.3. Thiết kế mạch điện --------------------------------------------------------------------------------------------------- 22
3.3.1. Sơ đồ nguyên lí --------------------------------------------------------------------- 22
3.3.2. Mạch in ------------------------------------------------------------------------------ 23
3.4. Chương trình điều khiển chính -------------------------------------------------------------------------------- 24
3.5. Thiết kế ứng dụng Android để xử lý giọng nói ------------------------------------------------------ 25
3.5.1. Thiết kế giao diện ------------------------------------------------------------------ 25
3.5.2. Xử lí giọng nói ---------------------------------------------------------------------- 26
CHƯƠNG 4: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN ------------------------------------------------- 30

iii
4.1. Kết quả đạt được: ----------------------------------------------------------------------------------------------------- 30
4.2. Một số mặt hạn chế: ------------------------------------------------------------------------------------------------- 31
4.3. Hướng phát triển đề tài: ------------------------------------------------------------------------------------------- 31
TÀI LIỆU THAM KHẢO -------------------------------------------------------------------- 33
PHỤ LỤC ---------------------------------------------------------------------------------------- 34

iv
DANH SÁCH BẢNG VÀ HÌNH ẢNH

Bảng 1.1: Thông số kĩ thuật Segway ta ga điện ---------------------------------------- 2


Bảng 2.1:Thông số động cơ một chiều -------------------------------------------------- 6
Bảng 2.2:Thông số động cơ servo SG90 ---------------------------------------------- 11
Bảng 2.3: Danh sách chi tiết phần đế dưới -------------------------------------------- 12
Bảng 2.4: Danh sách chi tiết phần thân trên ------------------------------------------ 14
Bảng 3.1: Thống số kĩ thuật board Arduino mega 2560 ---------------------------- 17
Bảng 3.2: Thống số kĩ thuật driver BTS 7960 ---------------------------------------- 18
Bảng 3.3: Bảng thống số kĩ thuật XL4005 -------------------------------------------- 20
Bảng 3.4: Thông số kĩ thuật cảm biến siêu âm US-015 ----------------------------- 21
Bảng 3.5: Thống số kĩ thuật encoder quang ------------------------------------------ 21

Hình 1.1: Xe Segway tay ga điện--------------------------------------------------------- 1


Hình 1.2: Robot Airstar chỉ đường trong sân bay -------------------------------------- 3
Hình 1.3: Sơ đồ kiến trúc hệ thống ------------------------------------------------------- 4
Hình 2.1: Động cơ một chiều có hộp giảm tốc ----------------------------------------- 6
Hình 2.2: Biểu đồ nội lực trục ------------------------------------------------------------ 8
Hình 2.3: Ổ bi đỡ --------------------------------------------------------------------------- 9
Hình 2.4: Bánh xe ------------------------------------------------------------------------ 10
Hình 2.5: Động cơ servo SG90 --------------------------------------------------------- 11
Hình 2.6: Thiết kế 3D phần đế dưới --------------------------------------------------- 12
Hình 2.7: Thiết kế 3D phần thân trên -------------------------------------------------- 13
Hình 2.8: Thiết kế 3D mô hình tổng quát --------------------------------------------- 14
Hình 3.1: Sơ đồ khối --------------------------------------------------------------------- 16
Hình 3.2: Board Arduino mega 2560 ------------------------------------------------- 17
Hình 3.3: Driver BTS 7960 và cách nối dây ------------------------------------------ 18
Hình 3.4: Module ổn áp XL4005 ------------------------------------------------------- 19
Hình 3.5: Cảm biến siêu âm US-015--------------------------------------------------- 20
Hình 3.6: Module encoder quang------------------------------------------------------- 21
Hình 3.7: Ắc quy 12V – 20 Ah --------------------------------------------------------- 22
Hình 3.8: Sơ đồ nguyên lí được vẽ trên proteus 8.5 --------------------------------- 22

v
Hình 3.9: Mạch in được xuất trên Proteus 8.5 ---------------------------------------- 23
Hình 3.10: Board mạch thực tế --------------------------------------------------------- 23
Hình 3.11: Lưu đồ thuật toán chương trình chính ------------------------------------ 24
Hình 3.12: Giao diện khuôn mặt-------------------------------------------------------- 25
Hình 3.13: Giao diện điều khiển bằng tay --------------------------------------------- 26
Hình 3.14: Các dây kết nối giữa Arduino và Android ------------------------------- 27
Hình 3.15: Tiến trình chuyển giọng nói thành văn bản ------------------------------ 28
Hình 3.16: Quá trình xử lí giọng nói và gửi xuống điện thoại---------------------- 28
Hình 3.17: Lưu đồ thuật toán xử lí giọng nói ----------------------------------------- 29
Hình 4.1: Khuôn mặt của xe khi hiện thị hướng dẫn chỉ đường ------------------- 31
Hình 4.2: Điều khiển sản phẩm thực tế ------------------------------------------------ 31

vi
DANH SÁCH CHỮ VIẾT TẮT

Chữ viết tắt Tiếng Anh Tiếng Việt


PWM Pusle Width Modulation Điều chế độ rộng xung
API Application Programming Interface Giao diện lập trình ứng dụng
IT Information Technology Công nghệ thông tin
CNC Computer(ized) Numerical(ly) Control(led) Điều khiển bằng máy tính
5G 5 Generation Thế hệ mạng di động thứ 5
AI Artificial Intelligence Trí thông minh nhân tạo
TTL Transistor-transistor logic Một lớp mạch kỹ thuật
số được xây dựng từ
các transistor lưỡng cực

vii
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

CHƯƠNG 1: TỔNG QUAN VỀ ĐỀ TÀI

1.1. Bối cảnh liên quan


Tại các nơi công cộng như khuôn viên, sân bay, các bệnh viện hay trường đại học lớn
thì việc lượng người di chuyển qua lại quá đông gây khó khăn trong việc tìm đường và
tăng áp lực phục vụ trong bệnh viện, nhà hàng. Từ đó nhóm sinh viên mong muốn làm
một sản phẩm kết hợp giữa phương tiện di chuyển và thiết bị chỉ đường bằng dòng chữ
hiện trên màn hình. Nếu sản phẩm này được đặt ở nơi công cộng giúp đi lại nhanh hơn,
thuận tiên hơn nhờ vào việc thiết bị này có thể hỗ trợ điều khiển trên điện thoại thông
minh thông qua màn hình cảm ứng hay giọng nói.
❖ Một số sản phẩm có sẵn
- Xe Segway tay ga điện

Hình 1.1: Xe Segway tay ga điện

Ứng dụng xe được dung để tuần tra, tiếp thị, cho thuê, Segway Tour, du
lịch cá nhân, vui chơi giải trí. Cho thuê ở các điểm tham quan du lịch,
công viên, sân chơi thú vui, sân vận động, địa điểm trong nhà, nhà kho
lớn, các trung tâm mua sắm lớn.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 1
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Khối lượng tịnh 56kg


Kích thước 90cm x 52cm x 63 cm
Màu 7 màu sắc có sẵn
tốc độ Max.cruise 20km / h (tùy chỉnh)
Max.load 125kg
Max.mileage 30-35km
góc Max.climb 30 độ
bán kính Min.turning 0 độ
Thời gian sạc 6-8hours
Ắc quy Lead Acid Battery 36V, 12AH
Điện áp 100V-240V
Công suất tối đa 2000watts (1000w * 2pcs)
Tuổi thọ của pin 1-3years
Lốp xe 19inches
bánh xe hợp kim nhôm magiê tích hợp Superior
Chiều cao của tay cầm 800-1100mm điều chỉnh

Bảng 1.1: Thông số kĩ thuật Segway tay ga điện

- Robot AIRSTAR chỉ đường tại sân bay Hàn Quốc


Robot AIRSTAR được trang bị trí thông minh nhân tạo (AI), công nghệ
nhận dạng giọng nói và có thể giao tiếp bằng nhiều ngôn ngữ bao gồm
tiếng Hàn Quốc, Trung Quốc, Nhật Bản và tiếng Anh. Năm 2017, sân bay
Incheon từng triển khai cùng lúc hai mẫu robot do tập đoàn LG phát triển
có khả năng lau sàn và cung cấp thông tin về thời gian cất cánh, hạ cánh
của các chuyến bay. Nó có khả năng giúp hành khách tìm đường tới quầy
làm thủ tục và nhận hành lý. Du khách sẽ tìm được thông tin hữu ích về
sân bay bằng cách trò chuyện trực tiếp với robot hoặc chạm vào màn hình
cảm ứng.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 2
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Hình 1.2: Robot Airstar chỉ đường trong sân bay


1.2. Giới thiệu chung về xe
Xe gồm hai động cơ quay chính cùng hai bánh chuyển động theo động cơ tạo lực đẩy
cho xe chạy và bánh thứ ba giúp xe cân bằng trọng tâm giúp việc điều khiển dễ dàng
hơn. Ngoài ra còn có phần thân xe chứa mạch điều khiển cùng màn hình điện thoại để
giao tiếp. Xe có công dụng chở người trong phạm vi khuôn viên trường học, công sở,
bệnh viện, sân bay. Dựa trên cơ sở dữ liệu về lịch trình bay, thủ tục hành chính, vị trí
phòng ban, … đã được tạo sẵn xe có thể cung cấp thông tin cho người dùng để tiết
kiệm thời gian hơn khi tìm đường ở nơi công cộng. Điều khiển xe có thế bằng chạm
cảm ứng hoặc giọng nói thông qua ứng dụng Android.
1.3. Đối tượng nghiên cứu
Đối tượng nghiên cứu của đề tài là chế tạo một chiếc xe kết hợp viết một ứng dụng trên
nền tảng Android giao tiếp với người điều khiển bằng giọng nói hoặc cảm ứng thông
qua phần mềm Android Studio. Sử dụng các phần mềm thiết kế mạch in Proteus, phần
mềm thiết kế mô hình 3D Solidworks và trình biên dịch Arduino IDE để lập trình cho

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 3
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

vi điều khiển. Sau đó lắp ráp các chi tiết cơ khí cùng các module chức năng làm sao để
chúng có thể hoạt động thống nhất, đồng bộ trên một mô hình.
❖ Phạm vi nghiên cứu
- Phần cứng:
+ Thiết kế toàn bộ khung xe.
+ Gia công trục bánh xe bằng phương pháp tiện.
+ Sử dụng công nghệ in 3D để in các chi tiết phụ.
+ Lắp ráp các chi tiết cơ khí theo thiết kế.
- Phần mềm:
+ Thiết kế và vẽ mạch trên phần mềm Proteus để chế tạo mạch thủ công.
+ Viết code Android trên phầm mềm Android Studio.
+ Viết code trên Arduino IDE để điều khiển thiết bị phần cứng.
❖ Phương pháp nghiên cứu
- Đọc tài liệu liên quan về thiết kế robot, chế tạo máy.
- Đọc sách về lập trình vi điều khiển.
- Tìm hiểu thông tin và học các phần mềm qua mạng internet.
- Kiểm tra kết quả trên sản phẩm thật.
1.4. Kiến trúc hệ thống
Ở đây nhóm làm một chiếc xe điều khiển bằng giọng nói với người đứng lên nói
tương tác với điện thoại, điện thoại nhận thông tin điều khiển gửi dữ liệu xuống vi
điều khiển Arduino là bộ xử lý trung tâm điều khiển động cơ chạy, bánh xe quay
đúng theo yêu cầu gửi xuống.

Hình 1.3: Sơ đồ kiến trúc hệ thống

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 4
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

CHƯƠNG 2: THIẾT KẾ VÀ CHẾ TẠO KẾT CẤU CƠ KHÍ

2.1. Bộ dẫn động chính


Bộ dẫn động chính bao gồm: động cơ, trục, gối đỡ trục, bánh xe. Động cơ chuyển hóa
điện năng thành cơ năng làm quay trục roto bên trong nó sau đó momen xoắn được
truyền qua trục chính của xe làm quay bánh xe.
2.1.1. Chọn động cơ
Cần chọn một động cơ có mô men xoắn đủ lớn để thắng trọng lực của xe cũng như
của người đứng trên xe. Công suất tiêu thụ cũng ở mức vừa phải để không khó khăn
khi tìm nguồn đáp ứng.
❖ Động cơ một chiều (DC Motor):
- Ưu điểm: Momen khởi động lớn, dễ điều khiển tốc độ và chiều, giá thành rẻ.
- Nhược điểm:
+ Dải tốc độ điều khiển hẹp.
+ Phải có mạch nguồn riêng.
❖ Động cơ xoay chiều (AC Motor):
- Ưu điểm:
+ Cấp nguồn trực tiếp từ điện lưới xoay chiều.
+ Đa dạng và rất phong phú về chủng loại, giá thành rẻ.
- Nhược điểm:
+ Phải có mạch cách ly giữa phần điều khiển và cơ cấu chấp hành để
đảm bảo an toàn, momen khởi động nhỏ.
+ Mạch điều khiển tốc độ phức tạp, thường sử dụng biến tần.
❖ Động cơ SERVO:
- Ưu điểm:
+ Momen xoắn lớn, có cả 2 loại AC và DC.
+ Tốc độ đáp ứng nhanh, độ chính xác cao.
- Nhược điểm:
+ Driver phức tạp, giá thành cao.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 5
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Từ những ưu nhược điểm của các loại động cơ ở trên thì ta chọn động cơ một
chiều vì kích thước nhỏ gọn, dễ điều khiển tốc độ và chiều. Đồng thời chọn loại có
tích hợp hộp giảm tốc để tăng mô men xoắn ở đầu ra.

Hình 2.1: Động cơ một chiều có hộp giảm tốc

STT TÊN THÔNG SỐ


1. Công suất 250 W
2. Điện áp làm việc 12 VDC-24 VDC
3. Cường độ dòng điện tối đa 14 A
4. Tốc độ quay 330 RPM
5. Tải trọng tối đa 100 Kg

Bảng 2.1:Thông số động cơ một chiều

2.1.2. Chọn trục


Trục truyền chịu tải trọng trung bình, ngoài tác dụng đỡ chi tiết quay còn truyền
momen xoắn, chịu uốn và xoắn. Ta chọn vật liệu là thép C45 nhiệt luyện bằng
phương pháp thường hóa.
❖ Tính sơ bộ trục

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 6
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Để xác định đường kính sơ bộ trục, dùng công thức sơ bộ để tính chỉ xét đến tác
dụng của mômen xoắn trên trục, vì không xét đến tác dụng của tải trọng gây
biến dạng uốn nên giá trị ứng suất cho phép lấy nhỏ hơn giá trị thực.

Trong đó: d – Đường kính trục (mm)


N – công suất truyềnb của trục (kW)
n – số vòng quay trong một phút của trục (vg/ph)
C – hệ số tính toán, phụ thuộc ứng suất xoắn cho phép .
C = 110 130 , chọn C = 130
N = 0.25kW
n = 330 vg/ph

❖ Phân bố lực trên trục


- Chiều dài trục = bề rộng bánh + khoảng hở bánh và má bên + gối đỡ + chiều
rộng encoder.
= 55+10+30+15=110 mm.
- Lực tác dụng
+ Phản lực khi có tải trọng đặt lên: N = 500 N
+ Lực ma sát : F ms = µ.N (1)
= 0,6.500 = 300 N
Chọn hệ số ma sát trên đường nhựa là 0.6

+ Lực hướng tâm: F ht = m. 2.r (2)


=0,5(. .0,105

= 74 N
- Tính phản lực ở gối trục:
+ RAy = Fht + N = 500 + 74 = 574 N
+ RAx = Fms = 300 N

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 7
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Hình 2.2: Biểu đồ nội lực trục

- Tính momen uốn ở điểm nguy hiểm sát cạnh ổ bi:


+ MAy = (Fht + N).52,5 = (500 + 74).52,5= 30135 Nmm
+ MAx = Fms.12,5 = 300.12,5 = 3750 Nmm
=> Mtd = = 30367 Nmm

+ Ứng suất cho phép: [Bảng 7-2, tr119-TL1]

Chọn đường kính trục là Φ 17 mm.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 8
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

2.1.3. Chọn gối đỡ


Do không có lực dọc trục nên chọn ổ bi đỡ 1 dãy.
- Kiểm tra hệ số khả năng làm việc:
C = Q.(n.h)0,3 ≤ Cbảng [CT 8-1, tr 158 - TL1]
Trong đó:
Q: Tải trọng tương đương
n = 330 (vg/ph) – tốc độ vòng quay của ổ
h = 350 (giờ) – thời gian phục vụ
Q = (KvR + mAt).KnKt [CT 8-6, tr 159 - TL1]
m=1 [Bảng 8-2, tr 161-TL1]
– tải trọng tĩnh [Bảng 8-3, tr 162-TL1]
– nhiệt độ làm việc dưới 100 0C [Bảng 8-4, tr 162-TL1]
– vòng trong của ổ quay [Bảng 8-5, tr 162-TL1]

=> Q = 647.1.1 = 646 daN


=> C = 647.(330.350)0,3 = 21364
Tra bảng (14P/339), ứng với d = 17 (mm) lấy ổ bi có ký hiệu 203 tìm được:
đường kính ngoài D = 40 mm; Cbảng = 11300; B = 12 mm. Ta lắp 2 ổ như nhau để
thõa mãn 2.Cbảng =22600>21364.

Hình 2.3: Ổ bi đỡ

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 9
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

2.1.4. Chọn bánh xe


Bánh xe là chi tiết của nhiều máy móc công nghệ và phương tiện vận tải có dạng đia
hoặc vành nắp nan hoa. Chức năng của bánh xe là truyền và biến đổi chuyển động
quay để di chuyển xe,máy hay phương tiện trên đường.
Chọn bánh xe có đường kính 210 mm để cân đối kích thước của xe và loại có
bơm hơi giúp di chuyển êm hơn.

Hình 2.4: Bánh xe


2.2. Khớp xoay cánh tay
Cánh tay được gắn ở phần thân để cho giống như một con robot hình người nó được
trang bị khớp xoay để vẫy chào khi mỗi khi mở nguồn cấp điện.
Chọn động cơ servo SG90 vì nhỏ gọn, dòng tiêu thụ thấp. Động cơ SG90 còn có tốc
độ phản ứng nhanh, được tích hợp sẵn driver điều khiển động cơ, dễ dàng điều khiển
góc quay bằng phương pháp điều chỉnh thời gian xung ở mức cao được gọi là PPM.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 10
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Hình 2.5: Động cơ servo SG90


STT TÊN THÔNG SỐ
1. Khối lượng 9g.
2. Kích thước 22.2x11.8 x 32 mm.
3. Momen xoắn 1.8kg/cm.
4. Tốc độ hoạt động 60 độ trong 0.1 giây.
5. Điện áp hoạt động 4.8V
6. Nhiệt độ hoạt động 0 ºC – 55 ºC
Bảng 2.2:Thông số động cơ servo SG90

2.3. Thiết kế mô hình trên Solidworks 2017


❖ Thiết kế mô hình 3D phần đế dưới
Phần đế có kích thước đủ để một người đứng lên, đủ nhỏ để đi qua các khu vực
hẹp và đủ chiều dài lắp các thành phần cơ khí như động cơ, bánh xe và ắc quy.
- Chiều dài bình ắc quy là 181mm, chiều rộng bánh thứ ba phía trước là
100mm và nối giữa hai tấm đế là 120mm vì thế ta chọn chiều rộng của toàn
tấm đế là 420mm.
- Kích thước hai động cơ 300mm, chiều rộng bình ác quy là 78mm, chiều dài
hai trục và hai bánh xe là 250mm nên chiều dài tối đa của phần đế dưới
khoảng 650mm.
- Chiều cao của đế bằng đường kính bánh xe cộng với manh xe là 265mm
Từ đó ta có kích thước tổng quan của đế là: chiều dài 650 mm, rộng 420mm, cao
265mm.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 11
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Hình 2.6: Thiết kế 3D phần đế dưới


STT Tên chi tiết Số lượng
1 Ác quy 1
2 Tấm đệm bánh 3 1
3 Nửa bàn chân 2
4 Động cơ 2
5 Tấm ván giữa 1
6 Tấm đế 1
7 Manh xe 2
8 Bánh xe 2
9 Tấm má 2
10 Ổ bi 4
11 Đĩa encoder 2
12 Hộp chứa acquy 2
13 Bánh thứ 3 1
Bảng 2.3: Danh sách chi tiết phần đế dưới

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 12
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

❖ Thiết kế mô hình 3D phần thân trên


Phần thân dùng để chứa mạch điều khiển, điện thoại, tay vịn. Chiều cao phần thân
cũng vừa đủ để quan sát được điện điện thoại gá trên đỉnh của xe, dựa vào chiều cao
trung bình của người Việt Nam của nam là 1640mm, nữ là 1530mm nên chọn chiều
cao vừa tầm vịn tay và tầm nhìn là 1000mm. Chiều rộng, chiều dài thân được thiết
kế gần giống như hình dạng con người nên phần thân có kích thước dài 250mm
rộng 80mm cao 1000mm.

Hình 2.7: Thiết kế 3D phần thân trên

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 13
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

STT Tên chi tiết Số lượng


15 Vỏ bọc thân 1
16 Khớp cổ 1
17 Hộp chứa điện thoại 1
18 Gá điện thoại 1
19 Điện thoại 1
20 Cánh tay 2
21 Thanh sắt 1
Bảng 2.4: Danh sách chi tiết phần thân trên
❖ Thiết kế mô hình 3D phần thân trên

Hình 2.8: Thiết kế 3D mô hình tổng quát

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 14
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Mô hình được thiết kế có chỗ cho một người đứng lên, có tay để vịn khi di chuyển và
có hộp để chứa điện thoại, có các ngăn nhỏ cho việc cất vật dụng cá nhân. Ngoài ra
kích thước cũng phải cân đối để dễ cất giữ, vận chuyển.
Kích thước tổng quát của mô hình: chiều dài 650mm, chiều rộng 430mm, chiều cao
1300mm.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 15
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

CHƯƠNG 3 : THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN

3.1. Sơ đồ khối điều khiển

Hình 3.1: Sơ đồ khối


Hệ thống điều khiển hoạt động bắt đầu từ nguồn 12v qua ổn áp 5v cung cấp điện một
chiều cho toàn bộ mạch. Điện thoại thu nhận tín hiệu điều khiển sau đó truyền dữ liệu
tới vi điều khiển Arduino và nó cũng gửi tín hiệu đã nhận khi truyền xong. Các cảm
biến siêu âm, encoder và nút nhấn là tín hiệu đầu vào giúp vi điều khiển trung tâm điều
khiển các động cơ hoạt động chính xác.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 16
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

3.2. Các linh kiện sử dụng


3.2.1. Board Arduino mega 2560

Hình 3.2: Board Arduino mega 2560


STT TÊN THÔNG SỐ

1 Vi điều khiển ATmega 2560


2 Điện áp hoạt động 5V DC (chỉ được cấp qua cổng USB)

3 Tần số hoạt động 16 MHz

4 Dòng tiêu thụ 50mA


5 Điện áp vào khuyên dùng 7-12V DC

6 Điện áp vào giới hạn 6-20V DC


7 Số chân Digital I/O 54 (15 chân hardware PWM)

8 Số chân Analog 16 (độ phân giải 10bit)


9 Dòng tối đa trên mỗi chân I/O 20 mA

10 Dòng ra tối đa (5V) 500 mA


11 Dòng ra tối đa (3.3V) 50 mA
Bảng 3.1: Thống số kĩ thuật board Arduino mega 2560

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 17
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

❖ Các chân năng lượng


- GND (Ground): cực âm của nguồn điện cấp cho Arduino. 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.
3.2.2. Driver điều khiển động cơ DC BTS 7960
Mạch cầu H - BTS7960 43A dễ dàng giao tiếp với vi điều khiển với driver tích hợp
sẵn trong IC với đầy đủ các tính kết hợp với điện trở đo dòng, chống quá nhiệt, quá
áp, quá dòng, sụt áp và ngắn mạch.

Hình 3.3: Driver BTS 7960 và cách nối dây


STT TÊN THÔNG SỐ
1. Điện áp hoạt động 6 ~ 27V
2. Dòng điện tải mạch 43A (Tải trở) hoặc 15A (Tải cảm)
3. Tín hiệu logic điều khiển 3.3 ~ 5V
4. Tần số điều khiển tối đa 25KHz
5. Kích thước 40 x 50 x12mm.
6. Nhiệt độ hoạt động 0 ºC – 55 ºC
Bảng 3.2: Thống số kĩ thuật driver BTS 7960

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 18
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

❖ Chức năng các chân:


- VCC : Nguồn tạo mức logic điều khiển ( 5V – 3,3V )
- GND : Chân đất.
- R_EN = 0 Disable nửa cầu H phải. R_EN = 1 : Enable nửa cầu H phải.
- L_EN = 0 Disable nửa cầu H trái. L_EN = 1 : Enable nửa cầu H trái.
- RPWM và LPWM : chân điều khiển đảo chiều và tốc độ động cơ.
- RPWM = 1 và LPWM = 0 : Mô tơ quay thuận.
- RPWM = 0 và LPWM = 1 : Mô tơ quay nghịch.
- RPWM = 1 và LPWM = 1 hoặc RPWM = 0 và LPWM = 0 : Dừng.
- R_IS và L_IS : kết hợp với điện trở để giới hạn dòng qua cầu H.
3.2.3. Module ổn áp 5V XL4005
Mạch ổn DC đầu ra 5A với kích thước nhỏ gọn đảm bảo được hiệu suất tốt, dùng để
thiết kế các mạch nguồn cho các thiết bị nhỏ như mô hình, thiết bị di động , …

Hình 3.4: Module ổn áp XL4005

STT TÊN THÔNG SỐ


1. Điện áp đầu vào 5V - 32V
2. Điện áp đầu ra điều chỉnh 1.25V đến 30V
3. Dòng đỉnh tối đa 5A
4. Hiệu suất 90%

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 19
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

5. Độ gợn sóng 30mV


6. Tần số 300KHz
7. Nhiệt độ làm việc - 400C – 850C
8. Kích thước 43mm x 21mm x14mm

Bảng 3.3: Bảng thống số kĩ thuật XL4005


3.2.4. Cảm biến siêu âm US-015
Cảm biến siêu âm Ultrasonic US-015 được sử dụng để nhận biết khoảng cách từ vật
thể đến cảm biến nhờ sóng siêu âm, cảm biến có thời gian phản hồi nhanh, độ chính
xác cao, phù hợp cho các ứng dụng phát hiện vật cản, đo khoảng cách bằng sóng
siêu âm.
Cảm biến siêu âm Ultrasonic US-015 thử nghiệm thực tế cho độ ổn định và
chính xác cao hơn so với hai phiên bản HY-SRF05 và HC-SR04 với cách sử dụng,
thư viện và code mẫu tương thích 100%.

Hình 3.5: Cảm biến siêu âm US-015

STT TÊN THÔNG SỐ


1. Điện áp hoạt động 5VDC
2. Dòng tiêu thụ: 10~40mA 43A (Tải trở) hoặc 15A (Tải cảm)

3. Tín hiệu giao tiếp TTL


4. Chân tín hiệu Echo, Trigger

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 20
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

5. Góc quét <15 độ


6. Tần số phát sóng: 40Khz 0 ºC – 55 ºC
7. Khoảng cách đo được 2~700cm
8. Sai số 0.3cm
9. Kích thước 43mm x 20mm x 15mm

Bảng 3.4: Thông số kĩ thuật cảm biến siêu âm US-015


3.2.5. Cảm biến Encoder
Nguyên tắc hoạt động của mạch bao gồm 1 mắt phát và 1 mắt thu hồng ngoại đặt
cách nhau qua một khe hở, khi ánh sáng từ mắt phát đi được tới mắt thu (xuyên qua
lỗ của dĩa encoder) thì sẽ có tín hiệu mức cao (5v) phát ra khỏi chân out, khi bị che
lại thì chân out phát ra tín hiệu mức thấp (0v).

Hình 3.6: Module encoder quang


STT TÊN THÔNG SỐ
1. Điện áp hoạt động 3.3 - 5VDC
2. Dòng sử dụng 15mA
5. Khoảng cách giữa hai mắt 12mm
phát và thu
6. Kích thước 31mm x 20mm x 18mm
Bảng 3.5: Thống số kĩ thuật encoder quang
❖ Chức năng các chân:
- VCC: Cấp nguồn 3.3-5VDC
- GND: Cấp nguồn mass 0VDC.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 21
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

- DO: Xuất Digital Low (0VDC) hoặc High (3.3-5VDC)


3.2.6. Ắc quy
Chọn nguồn ác quy 12V để vừa cung cấp cho 2 động cơ một chiều, vừa cung cấp
cho ổn áp 5V để cấp điện cho vi điều khiển và các cảm biến. Dòng điện tiêu thụ
trung bình của hai động cơ một chiều là 2A, ta chọn ắc quy có dung lượng 20 Ah để
xe có thể hoạt động trên 8 tiếng.

Hình 3.7: Ắc quy 12V – 20 Ah


3.3. Thiết kế mạch điện
3.3.1. Sơ đồ nguyên lí

Hình 3.8: Sơ đồ nguyên lí được vẽ trên proteus 8.5

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 22
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

3.3.2. Mạch in
Mạch in được xuất trên phần mềm Proteus 8.5

Hình 3.9: Mạch in được xuất trên Proteus 8.5


Mạch in được làm thủ công bằng phương pháp là mạch rồi ngâm trong nước FeCl3.
Trên mạch được hàn dính vi điều khiên arduino, ổn áp và các domino kết nối dây ra
cảm biến, driver.

Hình 3.10: Board mạch thực tế

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 23
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

3.4. Chương trình điều khiển chính

Hình 3.11: Lưu đồ thuật toán chương trình chính


Chương trình chính được viết trong “phần mềm Arduino” trong máy tính và nạp vào
bo mạch “Arduino mega2560” với code để ở “phụ mục B”. Và dười đây tóm tắt sơ
lược chương trình.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 24
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Đầu tiên vi điều khiển kiểm tra nút nhấn “stop” và khoảng cách an toàn do cảm
biến siêu âm trả về, nếu có bật nút hoặc khoảng cách phía trước dưới 1m (tức có vật
cản) thì dừng động cơ. Đồng lúc đó điện thoại luôn đợi nghe và thu âm để xử lý tín
hiệu âm thanh và gởi dữ liệu xuống vi điều khiển. Lúc này vi điều khiển kiểm tra dữ
liệu đã truyền xuống từ điện thoại, nếu có tín hiệu dừng thì dừng động cơ còn không
thì chạy động cơ tương ứng với lệnh điều khiển. Khi động cơ chạy, cập nhập tín hiệu
phản hồi từ encoder, tính vận tốc, tính sai lệch rồi tính toán giá trị PWM thông qua bộ
PID.
3.5. Thiết kế ứng dụng Android để xử lý giọng nói
Để viết một ứng dụng thể hiện một khuôn mặt giao tiếp với người dùng bằng giọng nói
và có thể điều khiển bằng tay xong gởi dữ liệu xuống vi điều khiển điểu khiển xe thì
cần một phần mềm chuyên dụng là “Android Studio”
3.5.1. Thiết kế giao diện
Tạo một khuôn mặt thân thiện trên app điện thoại để xe thêm phần thân thiện với
người sử dụng.

Hình 3.12: Giao diện khuôn mặt


Vì giao tiếp bằng giọng nói chưa được tối ưu nên cần tạo thêm một giao diện điều
khiển bằng tay cho người dùng khi cần thiết.
Với 9 nút nhấn tương ứng với mỗi lệnh trên màng hình: bắt đầu, đi thẳng, đi lùi, rẽ
trái, rẽ phải, tăng tốc, giảm tốc, quay trái, quay phải.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 25
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Hình 3.13: Giao diện điều khiển bằng tay

3.5.2. Xử lí giọng nói


Trên các ứng dụng như Google Voice hay Facebook Message, ứng dụng nhận dạng
giọng nói không còn xa lạ hay các ứng dụng thường ngày trên SmartPhone của hầu
hết mọi người. Vậy với lập trình viên làm sao ta có thể kế thừa sử dụng lại và nhận
biết được dữ liệu gì đã nhận được sau khi đầu vào là giọng nói. Các nhà phát triển
phải xây dựng nên một công nghệ có thể lắng nghe, phân tích và phiên dịch một
cách chính xác giọng nói của người dùng. Nếu không thì làm sao ứng dụng biết bạn
đang nói gì, còn nếu độ chính xác không cao thì cũng như không. Ngoài ra vấn đề
bản địa hóa trước kia cũng là một chuyện làm đau đầu các lập trình viên vì mỗi
quốc gia sẽ có ngôn ngữ của riêng. Tuy nhiên hiện nay vấn đề đó không còn gây
khó khăn với ngưởi lập trình nữa vì hầu hết những dịch vụ giọng nói đều hỗ trợ
tiếng Anh hay Tiếng Việt khá chuẩn. Google thì bắt đầu hỗ trợ nhập liệu tiếng Việt
cho Android khoảng một năm về trước. Ngoài ra, Apple, Google cũng có cung cấp
các hàm API giúp ứng dụng của lập trình viên biết nói chỉ với vài dòng mã nguồn.
Mô hình triển khai công nghệ: Có nhiều cách thức mà các công ty hiện nay đang
triển khai voice technology, có thể kể đến 2 phương pháp phổ biến như sau:
- Điện toán đám mây: Trong trường hợp này, việc nhận dạng, xử lý ngôn ngữ
sẽ diễn ra trên máy chủ của các công ty cung cấp dịch vụ. Phương pháp đám

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 26
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

mây giúp việc nhận dạng được chính xác hơn, ứng dụng thì có dung lượng nhỏ,
nhưng bù lại thì thiết bị ở phía người dùng phải luôn kết nối với Internet. Độ trễ
trong quá trình gửi giọng nói từ máy lên server rồi trả kết quả từ server về lại
máy cũng là những thứ đáng cân nhắc. Google Voice, Cortana hiện đang xài
cách này.
- Tích hợp thẳng vào app: Với phương thức này, quá trình xử lý giọng nói sẽ
diễn ra trong nội bộ ứng dụng, không cần giao tiếp với bên ngoài, chính vì thế
tốc độ sẽ nhanh hơn. Người dùng cũng không bắt buộc phải kết nối vào mạng
thường trực. Tuy nhiên, giải pháp này gặp nhược điểm đó là khi có cập nhật
hoặc thay đổi gì đó về bộ máy nhận dạng, nhà sản xuất sẽ phải cập nhật lại cả
một app, trong khi với phương thức đám mây thì những thay đổi đó chỉ cần làm
ở phía server. Kích thước ứng dụng cũng sẽ tăng lên, có thể lên tới cả vài trăm
MB.
Ở đây nhóm sử dụng phương pháp “điện toán đám mây”. Vì bây giờ mạng
Internet không còn xa lạ, đặc biệt hiện nay 5G dự kiến năm 2020 sẽ được vận hành
thì tốc độ xử lý giọng nói từ việc gởi voice lên server rồi trả kết quả về sẽ nhanh
hơn và việc sử dụng phương pháp này chính xác hơn.
Giao tiếp Android và Arduino: Ở đây dùng giao tiếp thông qua cổng USB
(Universal Serial Bus) và một cáp chuyển USB OTG (On The Go) để hỗ trợ kết nối.
Phần lập trình sử dụng usb serial library để hỗ trợ xử lý kết nối.

Hình 3.14: Các dây kết nối giữa Arduino và Android

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 27
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Thu âm giọng Ứng dụng Chuyển giọng nói


nói Android sang văn bản

Hình 3.15: Tiến trình chuyển giọng nói thành văn bản

Hình 3.16: Quá trình xử lí giọng nói và gửi xuống điện thoại
Đầu tiên app luôn ở chế độ đợi nghe giọng nói, khi có giọng nói điện thoại sẽ
ghi giọng nói đó gởi lên google speech API rồi trả kết quả văn bản về điện thoại.
Sâu đó điện thoại sẽ gởi dữ liệu kí tự xuống vi điều khiển tương ứng với kết quả trả
về. Và sau đó phản hồi bằng giọng nói lại cho người sử dụng biết bằng cách chuyển
đổi văn bản thành giọng nói. Dưới đây là lưu đồ thuật toán xử lý giọng nói và code
của chương trình để ở phần “phụ lục A”.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 28
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Hình 3.17: Lưu đồ thuật toán xử lí giọng nói

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 29
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

CHƯƠNG 4: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN

Qua quá trình tìm hiểu, nghiên cứu tìm mô hình thích hợp và phương pháp tối ưu về
phần cứng cũng như phần mềm để hoàn thiện sản phẩm nhóm đã gặt hái được rất nhiều
kinh nghiệm quý báu, hiểu sâu và rộng hơn các vấn đề liên quan đến đề tài. Mặc dù
trong quá trình hoàn thiện sản phẩm gặp rất nhiều khó khăn về phần kinh phí, về việc
tìm ra mô hình tối ưu cho sản phẩm. Như việc chế tạo phần cơ khí cho khung xe sao
đảm bảo được độ cứng vững để con người đứng lên được an toàn hay thiết kế mạch
điện, nối dây phải ổn định, đảm bảo nguồn, dòng và gởi dữ liệu, cảm biến ổn định,
chống nhiễu. Và cả phần lập trình phải đáp ứng nhanh, chống giật và kết quả trả về có
độ chính xác cao….
4.1. Kết quả đạt được:
- Nhóm đã chế tạo được xe cho một người đứng lên có thể di chuyển với tốc độ
10km/h và hoạt động tối đa 10 tiếng liên tục sau mỗi lần sạc.
- Tạo được một ứng dụng Android có thể giao tiếp được với người điều khiển. Đi
thẳng, rẽ hướng để đi đến địa điểm người điều khiển muốn đến.
- Bất kì điện thoại nào dùng hệ điều hành android cũng có thể tải app về dùng và để
lên mặt xe thì có thể điều khiển xe được.
- Không những xe có công dụng chở và hướng dẫn con người đến nơi mình cần, xe
còn giao tiếp chào hỏi thân thiệt với người sử dụng. Bằng việc trả lời bằng giọng
nói và cả vẫy tay chào người sử dụng.
- Khi cần hỏi xe về bất kì địa điểm nào trong trường hay trong một khu mà xe đang
hoạt động (đã được lập trình trước vị trí các địa điểm trong khu đó) thì trên màng
hình điện thoại sẽ xuất ra cở sở dữ liệu chỉ dẫn bạn đến nơi mà bạn cần muốn đến.
Nếu chưa rõ vị trí thì bạn chỉ cần đứng lên xe theo lời mời của xe và điều khiển xe
theo đúng chỉ dẫn đã ghi trên màn hình thì xe sẽ vận hành và chở bạn đi. Dưới đây
là giao diện màng hình điện thoại của xe và một số hình ảnh thực tế người điều
khiển xe chạy trên đường.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 30
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

Hình 4.1: Khuôn mặt của xe khi hiện thị hướng dẫn chỉ đường

Hình 4.2: Điều khiển sản phẩm thực tế


4.2. Một số mặt hạn chế:
- Một số chi tiết cơ khí của xe được làm bằng nhựa in 3D nên tuy hoạt động tương
đối tốt nhưng độ cứng vững chưa cao.
- Tốc độ xử lí giọng còn chưa nhanh do tốc độ băng thông internet còn hạn chế.
- Vì thời gian hạn hẹp nên nhóm chưa kết hợp bộ sạc pin cho điện thoại.

4.3. Hướng phát triển đề tài:


- Ngắn hạn:
+ Giải pháp đưa ra là thay các kết cấu cơ khí làm bằng nhựa in 3D bằng vật liệu
kim loại, gia công bằng máy CNC để tăng cứng vững, độ chính xác.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 31
Thiết kế và chế tạo xe điều khiển bằng giọng nói GVHD: TS. Nguyễn Danh Ngọc

+ Kết hợp việc gửi dữ liệu thêm mạch sạc pin cho điện thoại để điện thoại khỏi
tốn pin trong quá trình sữ dụng.
+ Các board mạch nên được thiết kế gọn hơn, nên sử dụng chung một board để
tránh các hư hỏng về đường dây mạch.
- Dài hạn:
+ Có thể áp dụng xe ở nhiều nơi công cộng để giúp thủ tục hành chính nhanh
hơn giảm tải cho con người thay thế các công việc của nhân viên phục vụ, tiếp
tân.
+ Vận dụng công nghệ mạng 5G và tích hợp trí thông minh nhân tạo trong tương
lai giúp xe phản ứng nhanh hơn và hỗ trợ hiệu quả hơn cho con người.

SVTH: Võ Trung Hiếu


Triệu Thị Thu Duyên 32
TÀI LIỆU THAM KHẢO

1. Nguyễn Trọng Hiệp, Nguyễn Văn Lẫm. Thiết kế chi tiết máy. Nhà xuất bản
Giáo Dục, 1999
2. Trịnh Chất, Lê Văn Uyển. Tính toán thiết kế hệ dẫn động cơ khí tập 1. Nhà xuất
bản Giáo Dục, Hà Nội, 2000.
3. Hoàng Minh Công. Giáo trình cảm biến công nghiệp. Nhà xuất bản Xây Dựng,
Hà Nội, 2004
4. Lê Cung, Giáo trình truyền động cơ khí. Nhà xuất bản Xây Dựng, Đà Nẵng,
2007
5. Phạm Đăng Phước. Giáo trình robot công nghiệp. Nhà xuất bản Khoa học và
Kỹ thuật, Hà Nội, 2002
6. Đặng Phước Vinh, Võ Như Thành. Giáo trình kỹ thuật vi điều khiển PIC, Nhà
xuất bản Xây Dựng, Hà Nội, 2019

Trang website thao khảo:

1. https://viblo.asia/p/huong-dan-lam-viec-voi-speech-to-text-trong-
android-aRBeXnmpvWE, (truy cập gần nhất 4/6/2019).
2. https://www.programcreek.com/java-api-
examples/?class=android.speech.RecognizerIntent&method=ACTION_
RECOGNIZE_SPEECH, (truy cập gần nhất 4/6/2019).
3. https://vi.electronics-council.com/communicate-with-your-arduino-
through-android-64971, (truy cập gần nhất 4/6/2019).
4. https://developer.android.com/reference/android/speech/tts/TextToSpeec
h, (truy cập gần nhất 4/6/2019).
5. https://Hshop.vn , (truy cập gần nhất 1/5/2019).
6. https://Arduino.cc, (truy cập gần nhất 4/6/2019).

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 33
PHỤ LỤC

A. Code Android Studio:

AndroiManifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test1">
<uses-permission android:name="android.permission.RECORD_AUDIO"
/>
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission
android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-feature android:name="android.hardware.usb.host" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.NoActionBar">
<meta-data

android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />

<activity android:name=".Main2Activity" />


<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category
android:name="android.intent.category.LAUNCHER" />

<action
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />

</intent-filter>
</activity>
</application>

</manifest>

MainActivity:
package com.example.test1;

import android.content.Intent;

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 34
import android.os.Bundle;
import android.media.MediaPlayer;
import android.os.CountDownTimer;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.speech.tts.TextToSpeech;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Locale;

public class MainActivity extends AppCompatActivity implements


IMIUTouchHandler.OnActionRecorededHandler,
UsbSerial.OnUsbReconnectHandler, RecognitionListener {

private static final String TAG = "View Animation";

private String sound;


private String stringSend;
private String stringSpeak;
private String data;
private CatFace MiuMiuFace;

private UsbSerial serial;


private TextView txvDisplaySpeak;

private ImageView REyeBG;


private ImageView LEyeBG;
private ImageView REyePupil;
private ImageView LEyePupil;
private ImageView REyelid;
private ImageView LEyelid;
private ImageView Mouth;

CountDownTimer EyeTimer;
CountDownTimer MouthTimer;
CountDownTimer EyelidTimer;

private IMIUTouchHandler touchHandler;


boolean isNhan = false;

MediaPlayer player1;

TextToSpeech toSpeech;
protected Intent intent;
protected SpeechRecognizer recognizer;

@Override
protected void onCreate(Bundle savedInstanceState) {

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 35
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ConfigProgram();
InitVariables();
InitFace();

txvDisplaySpeak = findViewById(R.id.txvDisplaySpeak);

serial = new UsbSerial(this);


serial.Init(this);
serial.Open();

WakeScreenUp();

intent = new
Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,getPackageNam
e());
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,
Locale.getDefault());
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

recognizer = SpeechRecognizer.createSpeechRecognizer(this);
recognizer.setRecognitionListener(this);
recognizer.startListening(intent);
}

private void ConfigProgram() {

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}

void EyeMotion() {
if (MiuMiuFace.GetFace() == CatFace.HAPPY_FACE) {

MiuMiuFace.MoveAndRotate(getString(R.string.right_eye_bg), 0, 2, 0,
-16, -3, 3, 50, 50, 1000, 1, true);

MiuMiuFace.MoveAndRotate(getString(R.string.left_eye_bg), 0, 2, 0, -
16, -3, 3, 50, 50, 1000, 1, true);
} else if (MiuMiuFace.GetFace() == CatFace.NORMAL_FACE) {
MiuMiuFace.Move(getString(R.string.right_eye_pupil), 0,
2, -2, 4, 1000, 1, true);
MiuMiuFace.Move(getString(R.string.left_eye_pupil), 0, -
2, -2, 4, 1000, 1, true);
} else if (MiuMiuFace.GetFace() == CatFace.SAD_FACE) {
MiuMiuFace.Move(getString(R.string.right_eye_pupil), 0,
2, -2, 4, 1000, 1, true);
MiuMiuFace.Move(getString(R.string.left_eye_pupil), 0, -
2, -2, 4, 1000, 1, true);
}
}

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 36
void MouthMotion() {
MiuMiuFace.Scale(getString(R.string.mouth), 1.0f, 1.1f,
1.0f, 1.1f, Mouth.getWidth() / 2, 0, 1000, 1, true);
MiuMiuFace.Scale(getString(R.string.forehead), 1.0f, 1.0f,
1.0f, 1.05f, Mouth.getWidth() / 2, 0, 1000, 1, true);

void EyelidMotion() {
if (MiuMiuFace.GetFace() == CatFace.HAPPY_FACE) {
LEyelid.setVisibility(View.INVISIBLE);
REyelid.setVisibility(View.INVISIBLE);
return;
}

LEyelid.setVisibility(View.VISIBLE);
REyelid.setVisibility(View.VISIBLE);

MiuMiuFace.Move(getString(R.string.right_eyelid), 0, 0, 0,
175, 30, 1, true);
MiuMiuFace.Move(getString(R.string.left_eyelid), 0, 0, 0,
175, 30, 1, true);
}

private void InitFace() {


EyeTimer = new CountDownTimer(2000, 1000) {
public void onFinish() {
EyeMotion();

this.start();
}

public void onTick(long millisUntilFinished) {

}
}.start();

MouthTimer = new CountDownTimer(8000, 1000) {


public void onFinish() {
MouthMotion();

this.start();
}

public void onTick(long millisUntilFinished) {

}
}.start();

EyelidTimer = new CountDownTimer(6000, 1000) {


public void onFinish() {
EyelidMotion();
this.start();
}

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 37
public void onTick(long millisUntilFinished) {

}
}.start();

private void InitVariables() {


MiuMiuFace = new CatFace(this);

REyeBG = findViewById(R.id.iv_R_Eye_Background);
LEyeBG = findViewById(R.id.iv_L_Eye_Background);
REyePupil = findViewById(R.id.iv_R_Eye_Pupil);
LEyePupil = findViewById(R.id.iv_L_Eye_Pupil);
REyelid = findViewById(R.id.iv_R_Eyelid);
LEyelid = findViewById(R.id.iv_L_Eyelid);
Mouth = findViewById(R.id.iv_Mouth);

MiuMiuFace.InitFace(REyeBG, LEyeBG, REyePupil, LEyePupil,


REyelid, LEyelid, Mouth);
touchHandler = new IMIUTouchHandler(this);
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
touchHandler.Handle(ev);
return super.dispatchTouchEvent(ev);
}

@Override
public void onPointerCaptureChanged(boolean hasCapture) {
}

@Override
public void OnActionRecorded(Actions action, Position
startPosition, double velocity)
{
}

private void Reply() {


toSpeech = new TextToSpeech(MainActivity.this, new
TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status != TextToSpeech.ERROR)
{
toSpeech.setLanguage(Locale.getDefault());
toSpeech.speak(sound, TextToSpeech.QUEUE_FLUSH,
null);
}
}
});
}

@Override

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 38
protected void onResume() {
super.onResume();
serial.Open();
}

@Override
protected void onPause() {
super.onPause();
serial.Close();
}

void WakeScreenUp() {

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUAR
D
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}

@Override
public void OnUsbReconnect() {
Log.i(TAG, "USB reconected!");
WakeScreenUp();
}

void OpenAds() {
Intent main2 = new Intent(MainActivity.this,
Main2Activity.class);
startActivity(main2);
}

@Override
public void onReadyForSpeech(Bundle bundle) {

@Override
public void onBeginningOfSpeech() {

@Override
public void onRmsChanged(float v) {

@Override
public void onBufferReceived(byte[] bytes) {

@Override
public void onEndOfSpeech() {

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 39
@Override
public void onError(int error) {
if (!isNhan) {
recognizer.startListening(intent);
}else recognizer.stopListening();

@Override
public void onResults(Bundle results) {
ArrayList<String> words =
results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
player1 = MediaPlayer.create(MainActivity.this,
R.raw.babyshark);

if (words.get(0).contains("right") ||
words.get(0).contains("phải")) {
stringSend = "L";
sound = ("Vâng, rẽ phải");
} else if (words.get(0).contains("left") ||
words.get(0).contains("trái")) {

stringSend = "R";
sound = ("Vâng, rẽ trái");
} else if (words.get(0).contains("stop") ||
words.get(0).contains("dừng lại") || words.get(0).contains("đứng
lại")) {

stringSend = "X";
sound = ("Vâng, dừng lại");
} else if (words.get(0).contains("start") ||
words.get(0).contains("bắt đầu") || words.get(0).contains("khởi
động")) {

stringSend = "S";
sound = ("okay boss, start");
} else if (words.get(0).contains("forward") ||
words.get(0).contains("thẳng") || words.get(0).contains("tiến") ||
words.get(0).contains("tới")) {

stringSend = "F";
sound = ("Vâng, đi thẳng");
} else if (words.get(0).contains("back") ||
words.get(0).contains("lùi")) {

stringSend = "B";
sound = ("Vâng đi lùi");
} else if (words.get(0).contains("Hello") ||
words.get(0).contains("xin chào")) {

stringSend = "H";
sound = ("Xin chào! Tôi tên là smart vehicle ");

} else if (words.get(0).contains("Good morning") ||


words.get(0).contains("chào buổi sáng")) {

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 40
stringSend = "H";
sound = ("chào buổi sáng");

} else if (words.get(0).contains("Good afternoon") ||


words.get(0).contains("chào buổi chiều")) {

stringSend = "H";
sound = ("chào buổi chiều");

} else if (words.get(0).contains("name") ||
words.get(0).contains("tên")) {

stringSend = "H";
sound = ("Tôi tên là smart vehicle");

} else if (words.get(0).contains("raising") ||
words.get(0).contains("fast") || words.get(0).contains("nhanh") ||
words.get(0).contains("tăng")) {

stringSend = "U";
sound = ("Okay boss, raising");

} else if (words.get(0).contains("reduced") ||
words.get(0).contains("slow") || words.get(0).contains("chậm") ||
words.get(0).contains("giảm")) {

stringSend = "D";
sound = ("Okay boss, reduced");

} else if (words.get(0).contains("follow me") ||


words.get(0).contains("theo")) {
stringSend = "C";
sound = ("Vâng, đi theo bạn");

} else if (words.get(0).contains("rotate left") ||


words.get(0).contains("quay trái")) {

stringSend = "Q";
sound = ("rotate");

} else if (words.get(0).contains("rotate right") ||


words.get(0).contains("quay phải")) {

stringSend = "P";
sound = ("rotate");

} else if (words.get(0).contains("khu A")) {

stringSend = "1";
stringSpeak = "Đi thắng khoảng 500m, rồi dừng lại, bạn
nhìn về hướng qua bên phải 30 độ thì bạn sẽ thấy khu A";
sound = "Vâng, giờ bạn hãy đứng lên tôi và điều khiển
tôi như hướng dẫn ghi trên màng hình";

} else if (words.get(0).contains("khu B")) {

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 41
stringSend = "2";
stringSpeak = "Đi thắng khoảng 300m, rồi dừng lại, bạn
nhìn về hướng qua bên trái thì bạn sẽ thấy khu B";
sound = "Vâng, giờ bạn hãy đứng lên tôi và điều khiển
tôi như hướng dẫn ghi trên màng hình";

} else if (words.get(0).contains("music") ||
words.get(0).contains("âm nhạc")) {
if (player1 != null) {
player1.start();
}

} else if (words.get(0).contains("turn off") ||


words.get(0).contains("tắt nhạc") || words.get(0).contains("dừng
nhạc")) {

player1.stop();
sound = ("đã tắt nhạc");

} else if (words.get(0).contains("thank you") ||


words.get(0).contains("Cảm ơn")) {

stringSend = "H";
sound = ("Cảm ơn bạn đã tin tưởng vào tôi, hẹn gặp lại
bạn");

} else {

stringSend = "E";
sound = ("Can you speak again ?");
}

if (stringSend != data){
serial.Write(stringSend);

txvDisplaySpeak.setText(stringSpeak);

Reply();
data = stringSend;
}

if (!isNhan) {
recognizer.startListening(intent);
}else recognizer.stopListening();
}

@Override
public void onPartialResults(Bundle bundle) {
}

@Override
public void onEvent(int i, Bundle bundle) {
}
}

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 42
Activity_main:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/CatBackground"
tools:context=".MainActivity">

<ImageView
android:id="@+id/ivface"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:srcCompat="@drawable/n_imiuface"
tools:ignore="MissingConstraints" />

<ImageView
android:id="@+id/iv_R_Eye_Background"
android:layout_width="90dp"
android:layout_height="89dp"
android:layout_marginStart="108dp"
android:layout_marginTop="188dp"
android:layout_marginBottom="1dp"
android:src="@drawable/n_r_eye_background"
app:layout_constraintBottom_toTopOf="@+id/iv_Mouth"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0"
android:layout_marginLeft="108dp" />

<ImageView
android:id="@+id/iv_L_Eye_Background"
android:layout_width="90dp"
android:layout_height="89dp"
android:layout_marginStart="476dp"
android:layout_marginTop="188dp"
android:layout_marginBottom="1dp"
android:src="@drawable/n_l_eye_background"
app:layout_constraintBottom_toTopOf="@+id/iv_Mouth"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.97"
android:layout_marginLeft="476dp" />

<ImageView
android:id="@+id/iv_R_Eye_Pupil"
android:layout_width="53dp"
android:layout_height="37dp"
android:layout_marginStart="140dp"
Sinh viên: Võ Trung Hiếu
Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 43
android:layout_marginTop="184dp"
android:src="@drawable/n_r_eye_pupil"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginLeft="140dp" />

<ImageView
android:id="@+id/iv_L_Eye_Pupil"
android:layout_width="53dp"
android:layout_height="40dp"
android:layout_marginStart="484dp"
android:layout_marginTop="180dp"
android:src="@drawable/n_l_eye_pupil"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginLeft="484dp" />

<ImageView
android:id="@+id/iv_Mouth"
android:layout_width="200dp"
android:layout_height="100dp"
android:layout_marginStart="236dp"
android:layout_marginTop="244dp"
android:src="@drawable/n_mouth"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginLeft="236dp" />

<ImageView
android:id="@+id/iv_R_Eyelid"
android:layout_width="115dp"
android:layout_height="110dp"
android:layout_marginStart="92dp"
android:layout_marginTop="50dp"
android:layout_marginBottom="1dp"
android:src="@drawable/n_eyelid"
app:layout_constraintBottom_toTopOf="@+id/iv_Mouth"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
android:layout_marginLeft="92dp" />

<ImageView
android:id="@+id/iv_L_Eyelid"
android:layout_width="115dp"
android:layout_height="110dp"
android:layout_marginStart="464dp"
android:layout_marginTop="50dp"
android:layout_marginBottom="1dp"
android:src="@drawable/n_eyelid"
app:layout_constraintBottom_toTopOf="@+id/iv_Mouth"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
android:layout_marginLeft="464dp" />

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 44
<TextView
android:id="@+id/txvResult"
android:layout_width="300dp"
android:layout_height="30dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="false"
android:layout_marginLeft="30dp"
android:layout_marginTop="20dp"
android:textColor="@color/colorPrimary"
android:textSize="20sp"
android:textStyle="normal"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/txvSendUsb"
android:layout_width="300dp"
android:layout_height="30dp"
android:layout_centerHorizontal="false"
android:layout_marginStart="400dp"
android:layout_marginTop="20dp"
android:gravity="bottom"
android:textColor="@color/colorPrimary"
android:textSize="20sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/txvDisplaySpeak"
android:layout_width="616dp"
android:layout_height="109dp"
android:layout_centerHorizontal="false"
android:layout_marginLeft="30dp"
android:layout_marginTop="50dp"
android:gravity="bottom"
android:textColor="@color/colorPrimary"
android:textSize="20sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 45
B. Code Arduino
#include <Servo.h>
#define SV1 9
#define SV2 11

Servo myservo1;
Servo myservo2;

#define STOP 10

#define R_PWM1 4
#define L_PWM1 3
#define R_PWM2 2
#define L_PWM2 5

#define RESOLUTION 40 // 20
#define encodLeft 20 //18
#define encodRight 21
#define encoderL 3
#define encoderR 2
#define VELOCITY_SAMPLE_TIME_MS 300

#define Kp1 50//100


#define Ki1 0.09
#define Kd1 2 //2

volatile long encoderPosR, encoderPosL;


float lastTime, newTime;
float timeChange;
float PWMValueRight, PWMValueLeft;
char received;
const int trig = A10;
const int echo = 19;
unsigned long duration;
int beforeDistance;
float speedUp = 1, speedUpR, speedUpL;

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 46
void setup()
{
Serial.begin(9600);
pinMode(L_PWM1, OUTPUT);
pinMode(R_PWM1, OUTPUT);
pinMode(L_PWM2, OUTPUT);
pinMode(R_PWM2, OUTPUT);

pinMode(STOP, INPUT);
myservo1.attach(SV1);
myservo2.attach(SV2);
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(encodLeft, INPUT); //20-3
pinMode(encodRight, INPUT); //21-2
attachInterrupt(encoderL, CountPulseLeft, CHANGE);
attachInterrupt(encoderR, CountPulseRight, CHANGE);
}

void loop() {

digitalWrite(trig, 0);
delayMicroseconds(2);
digitalWrite(trig, 1);
delayMicroseconds(5);
digitalWrite(trig, 0);
duration = pulseIn(echo, HIGH);
beforeDistance = int(duration / 58.824 ); //(2 / 29.412)

while (Serial.available() > 0)


{
received = Serial.read();
}

if (beforeDistance <= 100 || digitalRead(STOP) == HIGH ||


received == 'X' || received == 'E')
{
Stop();
}

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 47
else {
Control();

timeChange = millis() - lastTime ;


if (timeChange >= VELOCITY_SAMPLE_TIME_MS) //time lay mau
{
Serial.println(timeChange);
PWMValueRight = AdjustSpeedRight(speedUpR);
PWMValueLeft = AdjustSpeedLeft(speedUpL);
PWMValueRight = PWMValueRight * (speedUpR / abs(speedUpR));
PWMValueLeft = PWMValueLeft * (speedUpL / abs(speedUpL));
lastTime = millis();
}
}
motorLeft(PWMValueLeft);
motorRight(PWMValueRight);
received = '0';
}
void Forward() {
speedUpR = speedUpL = speedUp;
}
void Back() {
speedUpR = speedUpL = -speedUp;
}
void Stop() {
speedUpR = speedUpL = 0;
if (PWMValueRight > 0) {
delay(30);
PWMValueRight -= 10;
PWMValueLeft -= 10;
if (abs(PWMValueRight) <= 20) PWMValueRight = PWMValueLeft = 0;
}
}

void Right() {
speedUpL = 0.6;
speedUpR = 0.2;
}

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 48
void RotateRight() {
speedUpR = speedUp;
speedUpL = 0;
}

void Left() {
speedUpR = 0.6;
speedUpL = 0.2;
}

void RotateLeft() {
speedUpL = speedUp;
speedUpR = 0;
}

float Add = 0.1;


void UpSpeed() {
if (speedUpR >= 0) {
speedUpR += Add;
speedUpL += Add;
if (speedUpR >= 2) speedUpR = speedUpL = 2;
}
else if (speedUpR <= 0) {
speedUpR -= Add;
speedUpL -= Add;
if (speedUpR <= -2) speedUpR = speedUpL = -2;
}
}

void DownSpeed() {
if (speedUpR >= 0) {
speedUpR -= Add;
speedUpL -= Add;
if (speedUpR <= 0) speedUpR = speedUpL = 0;
}
else if (speedUpR <= 0) {
speedUpR += Add;
speedUpL += Add;
if (speedUpR >= 0) speedUpR = speedUpL = 0;

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 49
}
}
void motorRight(int speed) {
if (speed < 0)
{
analogWrite(L_PWM1, -speed);
analogWrite(R_PWM1, 0);
} else {
analogWrite(L_PWM1, 0);
analogWrite(R_PWM1, speed);
}
}
void motorLeft(int speed) {
if (speed < 0)
{
analogWrite(L_PWM2, -speed);
analogWrite(R_PWM2, 0);
} else {
analogWrite(L_PWM2, 0);
analogWrite(R_PWM2, speed);
}
}

void Control()
{
switch (received) {
case 'F':
Forward();
break;
case 'B':
Back();
break;
case 'R':
Right();
break;
case 'L':
Left();
break;
case 'U':

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 50
UpSpeed();
break;
case 'D':
DownSpeed();
break;
case 'S':
Forward();
break;
case 'H':
Hello();
break;
case 'Q':
RotateRight();
break;
case 'P':
RotateLeft();
break;
}
}

void Hello()
{
for (int x = 140; x >= 0; x--)
{
myservo1.write(x);
delay(10);
}
for (int x = 0; x <= 180; x++)
{
myservo2.write(x);
delay(10);
}
for (int x = 180; x >= 0; x--)
{
myservo2.write(x);
delay(10);
}
for (int x = 0; x <= 140; x++)
{

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 51
myservo1.write(x);
delay(10);
}
}

void CountPulseRight() {
if (digitalRead(encodRight) == HIGH) encoderPosR++;
else if (digitalRead(encodRight) == LOW) encoderPosR++;
}
void CountPulseLeft() {
if (digitalRead(encodLeft) == HIGH) encoderPosL++;
else if (digitalRead(encodLeft) == LOW) encoderPosL++;
}

float LastError1;
float LastLastError1;
float I1;
float PWMValue_L;

float AdjustSpeedLeft(float w_speed1)


{
float Error ;
float dError ;
float desiredVel;
float currenVel;

if (w_speed1 == 0) PWMValue_L = 0;
else {

desiredVel = abs(w_speed1);
currenVel = abs((encoderPosL * 1000) / (RESOLUTION * timeChange));
float P, D = 0;
encoderPosL = 0;
Error = desiredVel - currenVel;
dError = Error - 2 * LastError1 + LastLastError1;
LastLastError1 = LastError1;
LastError1 = Error;
P = (Error) * Kp1;
I1 += (Error * Ki1) * ((float)timeChange / 1000);

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 52
I1 = constrain(I1, -100, 100);// gioi han gia tri tich phan
D = (dError * Kd1) / ((float)timeChange / 1000);
PWMValue_L = PWMValue_L + P + I1 + D; //gia tri pwm
PWMValue_L = constrain(PWMValue_L, -255, 255); // gioi han pwm
}
if (abs(PWMValue_L) <= 10) PWMValue_L = 0;
return PWMValue_L;
}

float LastError2;
float LastLastError2;
float I2;
float PWMValue_R;

float AdjustSpeedRight(float w_speed2)


{
float Error ;
float dError ;
float desiredVe2;
float currenVe2;

if (w_speed2 == 0) PWMValue_R = 0;

else {
desiredVe2 = abs(w_speed2); //toc do mong muon
currenVe2 = abs((encoderPosR * 1000) / (RESOLUTION * timeChange));
float P, D = 0;
encoderPosR = 0;
Error = desiredVe2 - currenVe2;
dError = Error - 2 * LastError2 + LastLastError2;
LastLastError2 = LastError2;
LastError1 = Error;
P = (Error) * Kp1;
I1 += (Error * Ki1) * ((float)timeChange / 1000);
I1 = constrain(I1, -100, 100);
D = (dError * Kd1) / ((float)timeChange / 1000);
PWMValue_R = PWMValue_R + P + I1 + D;
PWMValue_R = constrain(PWMValue_R, -255, 255);
}

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 53
if (abs(PWMValue_R) <= 10) PWMValue_R = 0;
return PWMValue_R;
}

Sinh viên: Võ Trung Hiếu


Triệu Thị Thu Duyên Hướng dẫn: TS. Nguyễn Danh Ngọc 54

You might also like