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 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ế chế tạo xe điều khiển 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ế chế tạo xe điều khiển giọng nói Sinh viên thực hiện: Võ Trung Hiếu - Triệu Thị Thu Duyên Số thẻ SV: Lớp: 101140141 14CDT1 - 101140137 - 14CDT1 Luận văn trình bày thiết kế chế tạo xe điều khiển giọng nói Xe hoạt động nhờ vào dẫn động hai động Người dùng điều khiển xe thơng qua hình cảm ứng điện thoại giao tiếp qua giọng nói dựa Android Ứng dụng Andorid thiết kế riêng cho xe tải từ hàng ứng dụng CH Play Google Xe dùng làm phương tiện cá nhân để di chuyển công viên, phố bộ, khuôn viên trường đại học Đề tài thể ứng dụng kỉ nguyên mạng internet kết nối vạn vật; thích hợp với dự án smarthome, robot đường bệnh viện, sân bay 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ự - 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 Triệu Thị Thu Duyên 101140137 14CDT1 Cơ điện tử Võ Trung Hiếu 101140141 14CDT1 Cơ điện tử Tên đề tài đồ án: Thiết kế chế tạo xe điều khiển giọng nói Đề tài thuộc diện: ☐ Có ký kết thỏa thuận sở hữu trí tuệ kết thực Các số liệu liệu ban đầu: …………………………………… …………………………………………… …… ……………… …………………… …………………………………………… …… Nội dung phần thuyết minh tính toán: a Phần chung: TT Họ tên sinh viên Võ Trung Hiếu Triệu Thị Thu Duyên Nội dung • Tìm hiểu tổng quan đề tài • Tính tốn thiết kế • Kết luận đánh giá kết b Phần riêng: TT Họ tên sinh viên Nội dung Võ Trung Hiếu • Thiết kế chế tạo nguyên mẫu xe Triệu Thị Thu Duyên • Tìm hiểu thiết kế thiết kế điều khiển Các vẽ, đồ thị ( ghi rõ loại kích thước vẽ ): TT Họ tên sinh viên Võ Trung Hiếu Triệu Thị Thu Duyên Họ tên người hướng dẫn: TS Nguyễn Danh Ngọc Nội dung • Kết cấu khí • Sơ đồ động • Sơ đồ mạch • Sơ đồ khối chức • Lưu đồ thuật tốn Phần/ Nội dung: Ngày giao nhiệm vụ đồ án: …… /……./201… Ngày hoàn thành đồ án: …… /……./201… Đà Nẵng, ngày Trưởng Bộ môn Cơ Điện Tử tháng Người hướng dẫn năm 201 LỜI NÓI ĐẦU Sau thời gian năm đào tạo phần lý thuyết “Thiết kế chi tiết máy”, “Cơ sở thiết kế máy”, “Điều khiển tự động”, “Hệ thống điện tử”, …vv, kết hợp với q trình tự tìm tịi học hỏi, chúng em rút ra, tích lũy kiến thức ban đầu quan trọng để bắt tay vào làm đồ án tốt nghiệp Tuy nhiên non trẻ kinh nghiệm thực tế khiến chúng em khơng khỏi lung túng q trình thiết kế để có hệ thống hồn chỉnh, thẩm mỹ hiệu kinh tế Qua thời gian học khoa Cơ khí – Trường Đại học Bách khoa, tận tình hướng dẫn, giúp đỡ thầy, giáo nỗ lực thân, chúng em tích luỹ số kiến thức hành trang để trở thành kỹ sư Đồ án bước đầu tìm hiểu thi cơng sản phẩm thực tế đồng thời áp dụng kiến thức học để giải vấn đề thực tế xảy q trình làm Nhân đây, nhóm xin gởi lời cảm ơn chân thành sâu sắc đên thầy Khoa Cơ khí, trường Đại học Bách khoa – Đại học Đà nẵng, suốt 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 hỗ trợ mặt kiến thức cho nhóm, kịp thời động viên lúc khó khăn Tuy kết mơ hình cịn nhiều thiết sót, thực giúp đỡ quý báu thầy vơ có ý nghĩa với nhóm Cuối nhóm mong nhận ý kiến đóng góp thầy Hội đồng bảo vệ đồ án tốt nghiệp để nhóm rút học kinh nghiệm bước chân vào đời Đà Nẵng, ngày 30 tháng năm 2019 Nhóm sinh viên thực Võ Trung Hiếu Triệu Thị Thu Duyên i LỜI CAM ĐOAN Nhóm sinh viên xin cam đoan đồ án chúng tơi tự tính tốn, thiết kế nghiên cứu hướng dẫn TS Nguyễn Danh Ngọc Để hồn thành đồ án này, Chúng tơi sử dụng tài liệu ghi mục tài liệu tham khảo, ngồi khơng sử dụng tài liệu khác mà khơng ghi Nếu sai nhóm xin chịu hình thức kỷ luật theo quy định Nhóm sinh viên thực 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 Bối cảnh liên quan - 1.2 Giới thiệu chung xe 1.3 Đối tượng nghiên cứu - 1.4 Kiến trúc hệ thống - CHƯƠNG 2: THIẾT KẾ VÀ CHẾ TẠO KẾT CẤU CƠ KHÍ 2.1 Bộ dẫn động - 2.1.1 Chọn động - 2.1.2 Chọn trục 2.1.3 Chọn gối đỡ - 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 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 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 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 đạ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 Bảng 2.1:Thông số động chiều Bảng 2.2:Thông số động servo SG90 11 Bảng 2.3: Danh sách chi tiết phần đế 12 Bảng 2.4: Danh sách chi tiết phần thâ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 - Hình 1.2: Robot Airstar đường sân bay Hình 1.3: Sơ đồ kiến trúc hệ thống - Hình 2.1: Động chiều có hộp giảm tốc - Hình 2.2: Biểu đồ nội lực trục Hình 2.3: Ổ bi đỡ - Hình 2.4: Bánh xe 10 Hình 2.5: Động servo SG90 - 11 Hình 2.6: Thiết kế 3D phần đế - 12 Hình 2.7: Thiết kế 3D phần thâ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 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ơ đồ ngun lí vẽ proteus 8.5 - 22 v Hình 3.9: Mạch in xuất Proteus 8.5 23 Hình 3.10: Board mạch thực tế - 23 Hình 3.11: Lưu đồ thuật tốn chương trì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 tay - 26 Hình 3.14: Các dây kết nối Arduino Android - 27 Hình 3.15: Tiến trình chuyển giọng nói thành văn 28 Hình 3.16: Q trình xử lí giọng nói gửi xuống điện thoại 28 Hình 3.17: Lưu đồ thuật tốn xử lí giọng nói - 29 Hình 4.1: Khn mặt xe thị hướng dẫn đường - 31 Hình 4.2: Điều khiển sản phẩm thực tế 31 vi @Override public void onError(int error) { if (!isNhan) { recognizer.startListening(intent); }else recognizer.stopListening(); } @Override public void onResults(Bundle results) { ArrayList 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, thẳng"); } else if (words.get(0).contains("back") || words.get(0).contains("lùi")) { stringSend = "B"; sound = ("Vâng 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 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 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, 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, dừng lại, bạn nhìn hướng qua bên phải 30 độ bạn thấy khu A"; sound = "Vâng, bạn đứng lên điều khiển tơi hướng dẫn ghi 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, dừng lại, bạn nhìn hướng qua bên trái bạn thấy khu B"; sound = "Vâng, bạn đứng lên điều khiển hướng dẫn ghi 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: Sinh viên: Võ Trung Hiếu Triệu Thị Thu Duyên Hướng dẫn: TS Nguyễn Danh Ngọc 44 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 #define SV1 #define SV2 11 Servo myservo1; Servo myservo2; #define STOP 10 #define R_PWM1 #define L_PWM1 #define R_PWM2 #define L_PWM2 #define RESOLUTION 40 // 20 #define encodLeft 20 //18 #define encodRight 21 #define encoderL #define encoderR #define VELOCITY_SAMPLE_TIME_MS #define Kp1 50//100 #define Ki1 0.09 #define Kd1 300 //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 = 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) = 0) { speedUpR += Add; speedUpL += Add; if (speedUpR >= 2) speedUpR = speedUpL = 2; } else if (speedUpR