5.5 Thiết kế
5.5.1 Thiết kế mơ hình
Hình 5. 16 Mơ hình xe lăn mơ phỏng
69
5.5.2 Mơ hình thực tế
Hình 5. 18 Bánh xe được thiết kế thêm nhông sên dĩa và thiết kế phần đế để động cơ
Sau khi lắp ráp hoàn thiện tất cả cơng đoạn:
70
Hình 5. 20 Mơ hình xe lăn mặt bên và mặt sau
71
Chương 6
ĐÁNH GIÁ KẾT QUẢ VÀ KẾT LUẬN
Sau nhiều tuần tìm hiểu, nghiên cứu trên các tài liệu đồng thời vận dụng các kiến thức đã được học trong suốt 4 năm, nhóm chúng em đã hồn thành xong đề tài “Thiết kế xe lăn hỗ trợ người khuyết tật”.
6.1 Kết luận. 6.1.1 Tổng quát. 6.1.1 Tổng quát.
Những kết quả và kinh nghiệm đã đạt được sau khi nhóm chúng em hồn thành đề tài này là:
- Cải tiến thiết kế và thi cơng hồn chỉnh mơ hình xe lăn chạy bằng điện có hai chế độ điều khiển gồm:
✓ Điều khiển bằng giọng nói.
✓ Điều khiển bằng điện thoại.
- Xe có các chức năng có thể điều khiển gồm: dừng, chạy tiến, lùi, rẽ trái, rẽ phải và điều chỉnh được tốc độ xe.
- Nghiên cứu và tìm hiểu cấu tạo, chức năng của module ESP8266 NodeMCU,
biết cách lập trình cho module ESP8266 tạo một điểm truy cập Wifi, từ đó điện thoại có thể kết nối với Wifi này để truyền nhận dữ liệu điều khiển mơ hình.
- Nghiên cứu và tìm hiểu cấu tạo, chức năng của module nhận dạng giọng nói
VR3, biết cách lập trình cho module VR3 để điều khiển xe lăn.
- Biết cách sử dụng phần mềm Blynk xây dựng ứng dụng điều khiển mơ hình
trên điện thoại Android.
72
6.1.2 Ưu điểm
- Xe lăn có thể chạy được trên nhiều địa hình khác nhau như: lên, xuống dốc,
đường gồ ghề,…
- Di chuyển dễ dàng, khớp lệnh người dùng
- Giá thành thấp
- Gọn nhẹ, dễ sắp xếp
- Khơng tiêu hao sức lực, đồng thời khơng cần có người phía sau hỗ trợ nên rất tiện dụng.
- Thích hợp với nhiều đối tượng sử dụng khác nhau: người già, trẻ em, người
khuyết tật, người rất cần hạn chế vận động, đặc biệt là trong thời gian dài. - Tạo tâm lý thoải mái, tự do nên hỗ trợ cuộc sống người dùng tốt hơn.
- Thơng minh, tích hợp 2 chế độ điều khiển: hoặc điều khiển bằng giọng nói,
hoặc điều khiển bằng điện thoại
6.1.3 Nhược điểm.
Bên cạnh các kết quả đạt được thì mơ hình xe lăn vẫn cịn một số hạn chế nhất định:
- Vì điều khiển thơng qua internet nên bắt buộc phụ thuộc vào điện thoại - Nguồn hoạt động chính của xe là pin nên có hạn chế về thời gian sử dụng
- Trọng lượng xe phụ thuộc vào pin
6.2 Hướng phát triển
Mơ hình xe lăn hiện tại chỉ đang trong giai đoạn chạy thử nghiệm, vì vậy để mơ hình này có thể hồn thiện hơn, nhóm xin đưa ra phương án nhằm cải thiện mơ hình để có thể triên khai áp dụng thực tế:
- Kết hợp với cảm biến phát hiện vật cản.
- Có thêm chế độ hiển thị dung lượng pin trên app điều khiển
- Hướng tới nhiều đối tượng người dùng hơn, ví dụ như người mù, người câm
73
TÀI LIỆU THAM KHẢO
Sách tham khảo
[1] PGS.TS. Nguyễn Hữu Phương, “Mạch số dùng cho sinh viên đại học ngành điện tử, tự động hóa, viễn thơng, tin học, v.v.”, Nhà xuất bản Thống kê, 2004.
[2] Nguyễn Văn Hiệp, “Giáo trình Lập trình Android trong ứng dụng điều khiển”, Nhà xuất bản đại học quốc gia TP. Hồ Chí Minh.
[3] “Giáo trình điện tử cơ bản” Trần Thu Hà, Trương Thị Bích Ngà, Nguyễn Thị Lưỡng,.. --Tp. Hồ Chí Minh: Đại học Quốc gia Tp.HCM,2013.
Trang Web tham khảo
[4] “Arduino”, truy cập ngày 6/11/2019, đường dẫn: https://vi.wikipedia.org/wiki/Arduino
[5] “Arduino là gì và những ứng dụng của nó trong cuộc sống”, truy cập ngày 6/11/2019, đường dẫn: https://quantrimang.com/arduino-la-gi-va-ung-dung-cua-no- trong-cuoc-song-145388
[6] “Động cơ giảm tốc là gì? Motor giảm tốc có gì khác so với hộp giảm tốc? Khái niệm hộp giảm tốc?”, truy cập ngày 6/11/2019, đường dẫn:
http://www.namtrung.com.vn/document/dong-co-giam-toc-la-gi-hop-giam-toc-la-gi
[7] “WiFi Access Point”, truy cập ngày 13/11/2019, đường dẫn: https://arduino.esp8266.vn/wifi/access-point.html#softap
[8] “Internet Of Things (IoT) : cho người mới bắt đầu”, truy cập ngày 13/11/2019, đường dẫn: https://iotmakervn.github.io/iot-starter-book/#_esp8266
[9] truy cập ngày 14/11/2019, đường dẫn: https://viblo.asia/p/machine-learning- that-thu-vi-6-nhan-dien-giong-noi-1Je5E8DylnL
74
[10] Ths. Hà Đình Dũng, Giáo trình kỹ thuật âm thanh, truy cập ngày 14/11/2019, đường dẫn: https://xemtailieu.com/tai-lieu/giao-trinh-ky-thuat-am-thanh-ths-ha- dinh-dung.1573504.html
75
PHỤ LỤC
Chương trình cho Module nhận diện giọng nói VR3
#include <SoftwareSerial.h>
#include "VoiceRecognitionV3.h
VR myVR(10,11); uint8_t records[7];
uint8_t buf[64];
int lnhanh = 2 ;int ltien = 3; int llui = 4;
int rnhanh = 5; int rtien = 6; int rlui = 7;
#define nhanhRecord (0) #define tienRecord (1)
#define luiRecord (2) #define traiRecord (3)
#define phaiRecord (4) #define dungRecord (5)
void printSignature(uint8_t *buf, int len)
{ int i;
for(i=0; i<len; i++){
if(buf[i]>0x19 && buf[i]<0x7F){
Serial.write(buf[i]); } else{ Serial.print("["); Serial.print(buf[i], HEX); Serial.print("]"); } }}
76
void printVR(uint8_t *buf)
{ Serial.println("VR Index\tGroup\tRecordNum\tSignature"); Serial.print(buf[2], DEC); Serial.print("\t\t"); if(buf[0] == 0xFF){ Serial.print("NONE"); } else if(buf[0]&0x80){ Serial.print("UG "); Serial.print(buf[0]&(~0x80), DEC); } else{ Serial.print("SG "); Serial.print(buf[0], DEC); } Serial.print("\t"); Serial.print(buf[1], DEC); Serial.print("\t\t"); if(buf[3]>0){ printSignature(buf+4, buf[3]); } else{ Serial.print("NONE"); } Serial.println("\r\n");} void setup() //sua
{ myVR.begin(9600);
Serial.begin(115200);
Serial.println("Module nhận dạng giọng nói");
pinMode(lnhanh, OUTPUT); pinMode(ltien, OUTPUT); pinMode(llui, OUTPUT); pinMode(rnhanh, OUTPUT);
77
pinMode(rtien, OUTPUT); pinMode(rlui, OUTPUT);
if(myVR.clear() == 0){
Serial.println("Đã xóa nhận dạng");
}else{
Serial.println("Khơng tìm thấy mạch nhận diện giọng nói");
Serial.println("Vui lịng kiểm tra kết nối và khởi động lại Arduino."); while(1); } if(myVR.load((uint8_t)nhanhRecord) <=0){ Serial.println("nhanhRecord loaded"); } if(myVR.load((uint8_t)tienRecord) <=1){ Serial.println("tienRecord loaded"); } if(myVR.load((uint8_t)luiRecord) <=2){ Serial.println("luiRecord loaded"); } if(myVR.load((uint8_t)phaiRecord) <=3){ Serial.println("phaiRecord loaded"); } if(myVR.load((uint8_t)traiRecord) <=4){ Serial.println("traiRecord loaded"); } if(myVR.load((uint8_t)dungRecord) <=5){ Serial.println("dungRecord loaded"); }} void loop()
{ int i; int ret;
ret = myVR.recognize(buf, 50);
if(ret>0){ switch(buf[1]){
case nhanhRecord:
78
digitalWrite(lnhanh, HIGH); digitalWrite(ltien, HIGH); digitalWrite(llui, LOW); digitalWrite(rnhanh, HIGH);
digitalWrite(rtien, HIGH); digitalWrite(rlui, LOW);
for(i = 0; i <= 100; i= i+20) //Speed up
{ analogWrite(lnhanh, i); analogWrite(rnhanh, i); } break;
case tienRecord: /** XE TIEN*/
digitalWrite(lnhanh, HIGH); digitalWrite(ltien, HIGH); digitalWrite(llui, LOW); digitalWrite(rnhanh, HIGH);
digitalWrite(rtien, HIGH); digitalWrite(rlui, LOW);
for(i = 0; i <= 50; i= i+10)
{ analogWrite(lnhanh, i); analogWrite(rnhanh, i); } break;
case luiRecord: /** XE CHAY LÙI */ digitalWrite(lnhanh, HIGH); digitalWrite(ltien, LOW);
digitalWrite(llui, HIGH); digitalWrite(rnhanh, HIGH);
digitalWrite(rtien, LOW); digitalWrite(rlui, HIGH);
for(i = 0; i <= 50; i= i+10)
{ analogWrite(lnhanh, i); analogWrite(rnhanh, i); } break; case traiRecord: /** XE RẼ TRÁI */
digitalWrite(lnhanh, LOW); digitalWrite(ltien, LOW);
digitalWrite(llui, LOW); digitalWrite(rnhanh, HIGH);
digitalWrite(rtien, HIGH);delay(100); digitalWrite(rlui, LOW);
for(i = 0; i <= 50; i= i+10)
{ analogWrite(rnhanh, i);delay(100); }
break;
case phaiRecord: /** XE RẼ PHẢI */
79
digitalWrite(llui, LOW); digitalWrite(rnhanh, LOW); digitalWrite(rtien, LOW); digitalWrite(rlui, LOW);
for(i = 0; i <= 50; i= i+10)
{ analogWrite(lnhanh, i);delay(100); } break;
case dungRecord:
/** DỪNG XE */
digitalWrite(lnhanh, LOW); digitalWrite(ltien, LOW);
digitalWrite(llui, LOW); digitalWrite(rnhanh, LOW);
digitalWrite(rtien, LOW); digitalWrite(rlui, LOW);
break;
default:
Serial.println("chức năng ghi âm không xác định");
break; }
/** giọng nói được nhận dạng */
printVR(buf); }}
Chương trình cho Module phát wifi ESP8266
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
char auth[] = "DwGKZSFyS4oP_FJcMH_Tiwf5MoN8uZ3K";
char ssid[] = "HTX TB L2_2.4G";
char pass[] = "htxtb2016"; #define lnhanh 5 //D1
80 #define ltien 4 //D2 #define llui 14 //D5 #define rnhanh 12 //D6 #define rtien 13//D7 #define rlui 15//D7 void setup() { Serial.begin(152000);
pinMode(lnhanh, OUTPUT);pinMode(ltien, OUTPUT);pinMode(llui, OUTPUT);
pinMode(rnhanh, OUTPUT);pinMode(rtien, OUTPUT);pinMode(rlui, OUTPUT);
Blynk.begin(auth, ssid, pass);
} void loop() { Blynk.run();} BLYNK_CONNECTED(){ Blynk.syncVirtual(V1);Blynk.syncVirtual(V2);Blynk.syncVirtual(V3);Blynk.sync Virtual(V4);Blynk.syncVirtual(V5);} int i; BLYNK_WRITE(V1) //tiến
{ int pinValue = param.asInt();
digitalWrite(lnhanh, HIGH);digitalWrite(ltien,pinValue);digitalWrite(llui, LOW); digitalWrite(rnhanh, HIGH);digitalWrite(rtien, pinValue);digitalWrite(rlui, LOW);
for(i = 0; i <= 50; i= i+10)
{ analogWrite(lnhanh, i); analogWrite(rnhanh, i);
}}
81
{ int pinValue = param.asInt();
digitalWrite(llui,pinValue);digitalWrite(rlui,pinValue);digitalWrite(ltien,LOW);
digitalWrite(rtien,LOW);digitalWrite(rnhanh, HIGH);digitalWrite(lnhanh, HIGH);
for(i = 0; i <= 50; i= i+10)
{analogWrite(lnhanh, i); analogWrite(rnhanh, i);
}}
BLYNK_WRITE(V3) //trái { int pinValue = param.asInt();
digitalWrite(lnhanh, LOW);digitalWrite(ltien, LOW);digitalWrite(llui, LOW);
digitalWrite(rnhanh, HIGH);digitalWrite(rtien,
pinValue);delay(100);digitalWrite(rlui, LOW); for(i = 0; i <= 50; i= i+10)
{analogWrite(lnhanh, i); analogWrite(rnhanh, i); }}
BLYNK_WRITE(V4) //phải
{ int pinValue = param.asInt();
digitalWrite(lnhanh, HIGH);digitalWrite(ltien,
pinValue);delay(100);digitalWrite(llui, LOW);
digitalWrite(rnhanh, LOW);digitalWrite(rtien, LOW);digitalWrite(rlui, LOW);
for(i = 0; i <= 50; i= i+10)
{ analogWrite(lnhanh, i); analogWrite(rnhanh, i);
}}
BLYNK_WRITE(V5) //dừng
{ int pinValue = param.asInt();
digitalWrite(lnhanh, LOW);digitalWrite(ltien, LOW);digitalWrite(llui, LOW);
digitalWrite(rnhanh, LOW);digitalWrite(rtien, LOW);digitalWrite(rlui, LOW);
82
Tao Project cho Blynk
Tạo tài khoản Blynk
Để có thể sử dụng App Blynk chúng ta cần phải đăng ký một tài khoản mới. Ở đây có 2 cách đăng ký bằng Facebook hoặc tạo một tài khoản mới (Create New Account). Việc đăng kí bằng Facebook sẽ mang lại khá nhiều rủi ro như: Tài khoản Facebook bị mất, đánh cắp, quên mật khẩu,… Do đo trong bài viết sẽ chỉ đề cập tới việc tạo tài khoản mới để tiện cho việc phục hồi cũng như tránh được phần lớn các rủi ro.
Đầu tiên để tạo tài khoản ta cần chọn mục (Create New Account)
Nhập thông tin tài khoản Gmail. Rồi nhấn Sign Up để tiến hành đăng ký.
83
Nhấn vào New Project để tạo một Project mới
Click vào Create để hoàn tất việc tạo mới
Blynk sẽ cấp cho các bạn một mã Token, mã này sẽ gửi trực tiếp vào Gmail mà lúc nãy bạn đăng ký.
84
Như vậy chúng ta đã hoàn thành việc đăng ký tài khoản và tạo một Project mới, Một Project mới sẽ có giao diện như sau:
85
Bước 1: Chọn nút “+” để thêm tiện ích Bước 2: Chọn tiện ích “Timer
Tùy chỉnh cho nút nhấn
86
Và tủy chỉnh nút button
87
Huấn luyện giọng nói cho module VR3
Trên Module Reco V3, lệnh thoại được lưu trữ trong một nhóm lớn như thư viện. Bất kỳ 7 lệnh thoại nào trong thư viện đều có thể được nhập vào bộ nhận dạng, nghĩa là chỉ có 7 lệnh có hiệu lực cùng một lúc.
Hình 5. 22 Số lệnh mà module có thể thực hiện
Ta tiến hành nạp code train bằng cách chọn File train có sẵn trong thư viện Module VR3
88
Hình 5. 23 Cửa sổ khi nạp code huấn luyên
Sau đó bấm nạp chương trình
89
Hình 5. 25 Cửa sổ khi nạp code huấn luyện xong
Ta nhập lệnh sigtrain 0 nhanh để huấn luyện giọng số 0 (nhanh). Ta đọc 2 lần vào Micro thu âm cùng một giọng.
90
Sau khi đọc 2 lần vào mic ta nhận được nếu kết quả là Success, tức là thành cơng cịn Cant Match thì phải làm lại
Hình 5. 27 Cửa sổ khi đã huấn luyện xong sigtrain 0 nhanh
Lập lại thao tác với 5 lệnh còn lại “sigtrain 1 tien” , “sigtrain 2 lui” , “sigtrain 3 trai” , “sigtrain 4 phải” , “sigtrain 5 dung”
91
Và load đã thành cơng.
Hình 5. 29 Cửa sổ khi load thành công
Cứ thế, ta chỉ cần nạp chương trình chính là có thể sử dụng những dữ liệu giọng nói này để nhận dạng.