Professional Documents
Culture Documents
(123doc) - Do-An-Tot-Nghiep-Thiet-Ke-Va-Che-Tao-Xe-Dieu-Khien-Bang-Giong-Noi
(123doc) - Do-An-Tot-Nghiep-Thiet-Ke-Va-Che-Tao-Xe-Dieu-Khien-Bang-Giong-Noi
ĐỒ ÁN TỐT NGHIỆP
NGÀNH: KỸ THUẬT CƠ ĐIỆN TỬ
ĐỀ TÀI:
Đà 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Í
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.
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.
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
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
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
Ứ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.
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.
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.
Để 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.
= 74 N
- Tính phản lực ở gối trục:
+ RAy = Fht + N = 500 + 74 = 574 N
+ RAx = Fms = 300 N
Hình 2.3: Ổ bi đỡ
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.
3.3.2. Mạch in
Mạch in được xuất trên phần mềm Proteus 8.5
Đầ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.
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.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”.
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.
Hình 4.1: Khuôn mặt của xe khi hiện thị hướng dẫn chỉ đường
+ 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.
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
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).
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" />
<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;
CountDownTimer EyeTimer;
CountDownTimer MouthTimer;
CountDownTimer EyelidTimer;
MediaPlayer player1;
TextToSpeech toSpeech;
protected Intent intent;
protected SpeechRecognizer recognizer;
@Override
protected void onCreate(Bundle savedInstanceState) {
ConfigProgram();
InitVariables();
InitFace();
txvDisplaySpeak = findViewById(R.id.txvDisplaySpeak);
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);
}
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);
}
}
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);
}
this.start();
}
}
}.start();
this.start();
}
}
}.start();
}
}.start();
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);
@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)
{
}
@Override
@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() {
@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 ");
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");
stringSend = "Q";
sound = ("rotate");
stringSend = "P";
sound = ("rotate");
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("music") ||
words.get(0).contains("âm nhạc")) {
if (player1 != null) {
player1.start();
}
player1.stop();
sound = ("đã tắt nhạc");
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) {
}
}
<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" />
</android.support.constraint.ConstraintLayout>
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
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)
void Right() {
speedUpL = 0.6;
speedUpR = 0.2;
}
void Left() {
speedUpR = 0.6;
speedUpL = 0.2;
}
void RotateLeft() {
speedUpL = speedUp;
speedUpR = 0;
}
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;
void Control()
{
switch (received) {
case 'F':
Forward();
break;
case 'B':
Back();
break;
case 'R':
Right();
break;
case 'L':
Left();
break;
case 'U':
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++)
{
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;
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);
float LastError2;
float LastLastError2;
float I2;
float PWMValue_R;
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);
}