
Vật liệu cần thiết
Linh kiện phần cứng
- Arduino Nano R3 × 1
- Mô-đun Bluetooth HC-05 × 1
- Máy đo gia tốc tương tự Adafruit: ADXL335 × 1
- Màn hình LCD chữ số, 16 x 2 (Tùy chọn) × 1
- Dây nối (chung) ×20
- Cảm biến SparkFun Flex ×5 Điện trở 10k ohm x 5
- Bạn có thể sử dụng điện trở từ 10k đến 47,5k ohm. Lưu ý rằng mỗi giá trị điện trở khác nhau sẽ dẫn đến các giá trị tương tự khác nhau mà bạn đọc được từ bộ chia điện áp.
- Bảng mạch cắm không cần hàn Kích thước đầy đủ Tùy chọn nhưng khuyến nghị × 1
- Cáp USB-A sang Micro-USB x 1
- Tùy thuộc vào đầu nối trên Nano của bạn, hãy sử dụng thang đo ưa thích để kết nối USB với máy tính của bạn
- Đơn vị đo lường quán tính (IMU) (6 độ tự do) x 1
- Tôi nói hãy dùng cái này thay vì máy đo gia tốc vì nó có các tính năng tốt hơn về độ chính xác của cảm biến vị trí và chuyển động. Tuy nhiên, điều này có nghĩa là bạn sẽ phải tự tìm cách kết hợp nó.
Ứng dụng phần mềm và dịch vụ trực tuyến
- Nhà phát minh ứng dụng MIT 2
- Arduino IDE
Dụng cụ cầm tay và máy chế tạo
- Mỏ hàn (chung chung)
- Dây hàn không chì
- Giá đỡ PCB, Mỏ hàn
- Súng bắn keo nóng (chung chung)
Câu chuyện
GIỚI THIỆU
Như tiêu đề đã gợi ý, thiết bị này là thiết bị đeo dựa trên cảm biến có thể chuyển đổi cử chỉ tay đơn giản thành văn bản và giọng nói.
Đối với dự án này, các công cụ và công nghệ sẽ được sử dụng là bộ vi xử lý Atmega328p, Bluetooth (Mô-đun Bluetooth), cảm biến Flex, Máy đo gia tốc, Mô-đun nguồn, Điện trở và phần mềm Chuyển văn bản thành giọng nói (ứng dụng thiết bị đầu cuối Bluetooth). Cảm biến flex đo độ cong của ngón tay theo cử chỉ và đưa ra các thay đổi về điện trở tương ứng với lượng uốn cong. Cảm biến gia tốc đo các chuyển động tuyến tính của bàn tay trên các trục X, Y và Z và đưa ra các giá trị khác nhau của X, Y và Z tương ứng với chuyển động trên các trục này.
Tất cả dữ liệu từ các cảm biến sau đó được xử lý bởi Arduino Nano, bao gồm các tổ hợp logic IF/ELSE, AND và OR của tất cả các đầu ra của cảm biến để khớp đầu ra kết quả với các giá trị được lưu trữ trước của các dấu hiệu khác nhau liên quan đến bảng chữ cái. Đối với điều này, các phạm vi thích hợp được đặt cho từng bảng chữ cái và các từ có thể được nhận dạng bằng một tay dựa trên dữ liệu đo được thu được từ các phép đo lặp lại. Mô-đun Bluetooth HC-05 được kết nối với Arduino NANO. Dữ liệu đã xử lý sau đó được chuyển đến mô-đun Bluetooth (bộ phát) ở định dạng chuỗi. Điện thoại di động Android cũng có khả năng Bluetooth tích hợp. Sau đó, hai thiết bị Bluetooth này được ghép nối và chuỗi được truyền đến ứng dụng Android.
Ứng dụng Android nhận dữ liệu qua Bluetooth ở định dạng byte và sau đó chuyển đổi chúng thành chuỗi. Cuối cùng, chuỗi được chuyển đổi thành giọng nói bằng ứng dụng chuyển văn bản thành giọng nói của thiết bị di động Android. Hệ thống tổng thể này được gắn trên một chiếc găng tay thông thường để dễ dàng xử lý và nhận dạng cử chỉ tay chính xác.

Hình 1, Sơ đồ vỏ phần cứng

Hình 2, Sơ đồ trường hợp phần mềm
Hình 3, Sơ đồ hoạt động của găng tay cảm biến

Hình 4, Sơ đồ hoạt động của ứng dụng Android
Các nguyên tắc chính đằng sau thiết kế hệ thống này là sự thay đổi sức cản, gia tốc do trọng lực và hệ thống thời gian thực.
Sự liên quan của điện trở là cách cảm biến flex hoạt động. Cảm biến flex càng bị uốn cong, điện trở càng lớn. Mực dẫn điện được in trên cảm biến hoạt động như một điện trở. Khi cảm biến thẳng, điện trở này khoảng 25k. Lớp dẫn điện bị kéo căng khi cảm biến bị uốn cong, dẫn đến mặt cắt ngang giảm. Mặt cắt ngang giảm này dẫn đến điện trở tăng. Ở góc 90°, điện trở này khoảng 100KΩ.
Khi cảm biến được duỗi thẳng trở lại, điện trở trở lại giá trị ban đầu. Người ta có thể xác định cảm biến bị uốn cong bao nhiêu bằng cách đo điện trở. Cách dễ nhất để đọc cảm biến uốn cong là kết nối nó với một điện trở có giá trị cố định (thường là 10 hoặc 47 kΩ) để tạo ra một bộ chia điện áp như thể hiện trong hình 5. Để thực hiện việc này, một đầu của cảm biến được kết nối với Nguồn và đầu còn lại được kết nối với điện trở kéo xuống. Sau đó, điểm giữa điện trở kéo xuống có giá trị cố định và cảm biến uốn cong được kết nối với đầu vào ADC của Arduino. Theo cách này, người ta có thể tạo ra đầu ra điện áp thay đổi, có thể được đọc bởi đầu vào ADC của Arduino.

Hình 5, Bộ chia điện áp
Mô-đun cảm biến uốn cong
Trên găng tay, 5 cảm biến flex được lắp cho 5 ngón tay khác nhau. Các cảm biến flex thay đổi điện trở tùy thuộc vào lượng uốn cong của các ngón tay. Chân 1 của cảm biến flex được kết nối với 3,3v trên Arduino Nano, sau đó, Chân 2 được kết nối với điện trở 10k ohm, hoạt động như một bộ chia điện áp. Điểm giữa điện trở kéo xuống và cảm biến flex được kết nối với chân analog trên Arduino. Hình 6 cho thấy mô-đun cảm biến uốn cong.

Hình 6, Mô-đun cảm biến uốn con
Mô-đun cảm biến vị trí
Máy đo gia tốc (ADXL 335) trong hệ thống này được sử dụng như một máy dò độ nghiêng. Nó có đầu ra tương tự thay đổi từ 1,5 vôn đến 3,5 vôn. ADXL335 là mạch tích hợp (IC) máy đo gia tốc tương tự ba trục, đọc gia tốc trục X, Y và Z dưới dạng điện áp tương tự. Bằng cách đo lượng gia tốc do trọng lực, máy đo gia tốc có thể xác định được góc nghiêng của nó so với mặt đất. Bằng cách cảm nhận lượng gia tốc động, máy đo gia tốc có thể tìm ra tốc độ và hướng di chuyển của thiết bị. Chức năng cơ bản của thiết bị này là phát hiện độ nghiêng của bàn tay và gửi dữ liệu có liên quan theo các cử chỉ có ý nghĩa, đến bộ vi điều khiển để nhận dữ liệu và lưu chúng. Hình 7 cho thấy giao diện của Arduino nano với máy đo gia tốc để tạo ra mô-đun cảm biến vị trí.

Hình 7, Mô-đun cảm biến vị trí
Mô-đun truyền dẫn
Mô-đun Bluetooth chịu trách nhiệm gửi dữ liệu đầu ra đến ứng dụng di động, cho phép chuyển đổi văn bản thành giọng nói và bao gồm HC-05 Bluetooth và bộ vi điều khiển Arduino. Bộ vi điều khiển xử lý cụm từ nào đã được biểu diễn và gửi dữ liệu đó đến mô-đun HC-05 để gửi dữ liệu đến thiết bị Android được kết nối với nó thông qua Bluetooth. Hình 8 cho thấy mô-đun truyền.

Hình 8, Mô-đun truyền dẫn
LƯU Ý: Tôi thực sự khuyên bạn nên hàn cẩn thận vì các chân cảm biến flex rất mỏng manh. Bạn tự quyết định cách bạn muốn bố trí vì bố cục của tôi hơi lộn xộn và tôi không khuyên bất kỳ ai làm theo cách của tôi. Bạn có thể chọn sử dụng bảng perf hoặc không, chỉ cần đảm bảo rằng tất cả các thành phần được kết nối đúng cách và an toàn với găng tay.
Tôi đã sử dụng dây USB cho Arduino Nano làm nguồn điện, nhưng bạn có thể quyết định sử dụng pin. Hãy tự tìm hiểu cách sử dụng pin, không quá khó. Tôi đã chọn không sử dụng pin vì không đủ chỗ trên thiết bị và bất tiện.
Nếu bạn đang thắc mắc tại sao nguyên mẫu của tôi chỉ có 3 cảm biến flex, 3 cảm biến bị hỏng trong quá trình hàn, đó là lý do tại sao tôi khuyên bạn nên cẩn thận khi hàn. Cảm biến flex ở ngón giữa cũng bị hỏng nhưng tôi không nhận ra cho đến khi tôi đã hàn nó.
Trong trường hợp lý tưởng, một Đơn vị đo quán tính (IMU) sẽ hữu ích hơn nhiều trong dự án này, nhưng do một vài yếu tố gây khó chịu, tôi đã không thể có được nó kịp lúc.
Khi bạn hoàn tất việc hàn, sản phẩm cuối cùng sẽ trông giống như thế này:

Hình 9, Nguyên mẫu
Đối với ứng dụng Android, bạn có thể chọn tự tạo một ứng dụng bằng MIT app inventor 2 hoặc bất kỳ công cụ nào khác mà bạn thành thạo với tư cách là nhà phát triển Android. Ứng dụng trông như thế này:

Hình 10, Ứng dụng Android
Sơ đồ
Sơ đồ mạch điện
Sơ đồ mạch này được thực hiện bằng phương pháp lắp ráp thủ công và cho thấy cách các thành phần được kết nối với nhau.
Lưu ý rằng việc sử dụng LCD là lựa chọn bạn nên thực hiện. Mặc dù tôi đã đưa LCD vào sơ đồ mạch của mình, tôi đã không đưa nó vào nguyên mẫu cuối cùng và kết thúc bằng việc chỉ sử dụng ứng dụng Android mà tôi đã phát triển.
Cuối cùng, tôi đã sử dụng Arduino Mega trong sơ đồ mạch nhưng sử dụng Nano trong nguyên mẫu cuối cùng

Sơ đồ mạch điện
Sơ đồ này cho thấy tổng quan chung về cách các thành phần được kết nối. Nó được thiết kế với fritzing

Mã số
Mã cho hoạt động Arduino
Thực hiện các điều chỉnh cần thiết, sau đó tải mã lên Arduino Nano
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
const int flex1 = A0;
const int flex2 = A1;
const int flex3 = A2;
const int xpin = A3; // x-axis of the accelerometer
const int ypin = A4; // y-axis
const int zpin = A5; // z-axis (only on 3-axis models)
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
mySerial.begin(9600);
delay(15000);
}
void loop() {
// put your main code here, to run repeatedly:
int x = analogRead(xpin);
delay(50);
int y = analogRead(ypin);
delay(50);
int z = analogRead(zpin);
delay(50);
int thumb;
int pointer;
int middle;
int nomx;
int nomy;
int nomz;
thumb = analogRead(flex1);
pointer = analogRead(flex2);
middle = analogRead(flex3);
nomx = x-265;
nomy = y-253;
nomz = z-323;
Serial.print(thumb);
Serial.print("\t");
Serial.print(pointer);
Serial.print("\t");
Serial.print(middle);
Serial.print("\t");
Serial.print(nomx);
Serial.print("\t");
Serial.print(nomy);
Serial.print("\t");
Serial.print(nomz);
Serial.print("\n");
Serial.println("");
delay(500);
//group1
if ((thumb > 175) && (thumb < 210) && (pointer > 210) && (pointer < 235) && (nomy > 75) && (nomy < 95)) {
mySerial.print("LOOK FORWARD");
}
else if ((thumb > 175) && (thumb < 200) && (pointer > 210) && (pointer < 235) && (nomy > 160) && (nomy < 175)) {
mySerial.print("LOOK DOWN");
}
else if ((thumb > 175) && (thumb < 200) && (pointer > 210) && (pointer < 230)&& (nomy > 20) && (nomy < 35)) {
mySerial.print("LOOK UP");
}
//group2
else if ((thumb > 160) && (thumb < 195) &&(pointer > 160) && (pointer < 200) && (nomy > 28) && (nomy < 43)) {
mySerial.print("OKAY");
}
else if ((thumb > 190) && (thumb < 210) && (pointer > 180) && (pointer < 200) && (nomy > 160) && (nomy < 180)) {
mySerial.print("HOLD");
}
else if ((thumb > 160) && (thumb < 200) &&(pointer > 160) && (pointer < 190) && (nomy > 60) && (nomy < 75)) {
mySerial.print("PRONTO");
}
//group3
else if ((thumb > 230) && (thumb < 250) && (pointer > 150) && (pointer < 180) && (nomy >80) && (nomy < 100)) {
mySerial.print("CALL ME");
}
else if ((thumb > 230) && (thumb < 250) && (pointer > 150) && (pointer < 180) && (nomy >105) && (nomy < 125)) {
mySerial.print("THUMBS DOWN");
}
else if ((thumb > 230) && (thumb < 250) && (pointer > 150) && (pointer < 189) && (nomy >58) && (nomy < 70)) {
mySerial.print("I LOVE YOU");
}
else if ((thumb > 230) && (thumb < 250) && (pointer > 220) && (pointer < 235) && (nomy > 80) && (nomy < 105)) {
mySerial.print("GIVE ME");
}
else if ((thumb > 175) && (thumb < 195) && (pointer > 170) && (pointer < 190) && (nomy > 90) && (nomy < 110)) {
mySerial.print("GIVE ME SOME");
}
else{
mySerial.print("...");
}
}