Giới thiệu
Dự án là một vòng đeo tay hỗ trợ cho người mù có trọng lượng khá nhẹ chỉ khoảng 65g, có thể sạc pin khi hết, sử dụng cảm biến khoảng cách hc-sr04 và những thứ sẵn có xung quanh chúng ta. Mình mong muốn đóng góp sản phẩm này với hy vọng, nó sẽ sẽ giúp người mù đi lại được tốt hơn bằng việc thông báo cho họ âm thanh hoặc rung động khi đến gần vật cản. Với một chút kiến thức về Arduino bất cứ ai cũng có thể làm được điều này. Thiết bị dễ dàng đeo và tháo ra khỏi tay một cách nhanh chóng. Các bạn cùng chiêm ngưỡng nhé!
I. Chuẩn bị
- 2 × Ống nước nhựa loại có đường kính 21mm và 48mm (hoặc kích thước khác)
- 1 × Vài mẩu của tấm nhựa pvc (để tạo thành hình hộp chữ nhật 5.6 * 3.2 * 3.2 cm)
- 1 × Keo con voi 502
- 1 × Arduino promini
- 1 × Cảm biến khoảng cách HC-SR04
- 1 × Pin 3.7v 300 -> 500mah (pin lipo mua ở cửa hàng linh kiện điện tử hoặc đồ chơi mô hình rc)
- 1 × Nguồn DC Adapter 5v 0.5a (dùng để sạc khi hết pin)
- 2 × Mô tơ rung loại nhỏ (dễ dàng mua ở các cửa hàng sửa điện thoại)
- 1 × Relay 3v3a
- 1 × Opto pc817
- 3 × Điện trở 10k ohm
- 1 × Điện trở 1.5k ohm
- 4 × Điện trở 200 ohm
- 2 × Transistor c1815 (có thể không cần vì nối trực tiếp từ arduino ra mô tơ nhỏ)
- 2 × Diode fr107
- 1 × Jack nguồn DC loại nhỏ(dùng để cắm sạc)
- 1 × Led đỏ
- 1 × Button / nút nhấn
- 1 × Buzzer / còi chíp
- 1 × Dây điện loại nhỏ
- 1 × Thiếc hàn
II. Sơ đồ mạch và cách hoạt động
Vòng đeo tay có 3 chế độ hoạt động:
- Chế độ sạc pin: Bật khi cắm adapter 5 volt vào Jack cắm DC. Khi pin đạt đến 4,2 V, chế độ sạc sẽ bị tắt.
- Chế độ rung ngón tay:
- Khi khoảng cách tới vật cản nhỏ hơn 1 mét, mô tơ trên ngón tay cái sẽ rung động nhẹ để cảnh báo.
- Khi khoảng cách tới vật cản từ 1 mét đến 2,5 mét, mô tơ trên ngón tay út sẽ rung động nhẹ để cảnh báo.
- Khi khoảng cách trên 2.5 mét cả 2 mô tơ sẽ không rung
- Chế độ âm thanh:
- Nhịp âm thanh sẽ kêu nhanh hơn khi đi lại gần vật cản.
- Nhịp Âm thanh sẽ kêu chậm lại khi di chuyển ra xa vật cản, và không kêu khi khoảng cách trên 2.5 mét.
Lưu ý
- "Nút nhấn" :
- Được sử dụng để bật hoặc tắt thiết bị bằng cách nhấn và giữ trong 3 giây.
- Được sử dụng để chuyển đổi giữa hai chế độ, chế độ rung ngón tay hoặc chế độ phát âm thanh, bằng cách nhấn nhanh khoảng nửa giây.
- Opto-pc817 có chức năng đóng dòng điện để chân A2 của Arduino đo hiệu điện thế của pin khi ở chế độ sạc.
- Relay 3v3a có chức năng đóng ngắt dòng điện từ pin tới arduino và dòng điện từ pin tới nguồn sạc.
- Việc rung mô tơ trên ngón tay thời gian lâu có thể gây đau nhức ngón tay, vì vậy tôi để rung ở mức nhẹ, đủ để cảm nhận được từ hai ngón út và ngón cái. (analogWrite(ngon_tay_ut_3,150); analogWrite(ngon_tay_cai_6,150); )
Dưới đây là video minh hoạ làm thế nào để bật thiết bị và cách nó hoạt động trong chế độ âm thanh.
Dưới đây là video đang sạc pin cho "Vòng đeo tay"
I. Hướng dẫn chi tiết cách làm
Bước 1: Tạo vòng tròn khuyết từ ống nhựa
Loại đường kính 21mm và 48mm(kích thước có thể khác)
Chỉ cần tạo hai vòng tròn khuyết cho ngón cái và ngón út, và một vòng tròn khuyết lớn đeo cổ tay như trong hình
Bước 2: Cắt các miếng nhựa pvc nhỏ
Để tạo thành hình hộp chữ nhật 5.6 * 3.2 * 3.2 cm
Bao gồm một miếng mặt trước có 2 lỗ vừa cảm biến hc-sr04. sau đó dùng keo 502 để dính chắc lại.
Thử đeo vào tay
Bước 3: Nạp chương trình cho Arduino promini
Cách nạp: http://arduino.vn/bai-viet/938-nap-c...
- //tác giả: Đỗ Xuân Tiến
- #include <EEPROM.h>
- const int trig = 8; //chân trig của HC-SR04
- const int echo = 7; //chân echo của HC-SR04
- byte ngon_tay_cai_6 = 6; //ngón tay cái - thumb
- //byte middle_finger = 5; //ngón tay giữa
- byte ngon_tay_ut_3 = 3; //ngón tay út - little finger
- byte relay_A0 = A0; //relay 3v3a
- byte button_A3 = A3; //button
- byte coi_chip_10 = 10; //buzzer
- byte led_11 = 11; //led
- byte opto_volt_pin_12 = 12; //opto pc817
- byte do_volt_out_A1 = A1; //Check whether the charger is charging or not
- byte do_volt_pin_A2 = A2; //Measure the battery voltage
- byte rung_cai = 0;
- byte rung_ut = 0;
- byte rung_cai_1 = 0;
- byte rung_cai_2 = 0;
- byte rung_ut_1 = 0;
- byte rung_ut_2 = 0;
- byte che_do_rung = 0;
- byte khong_lap = 0;
- byte sau_tha_nut = 0;
- byte loa1 = 0;
- byte loa2 = 0;
- byte den1 = 0;
- byte den2 = 0;
- byte tat = 0; //biến giúp khi rút sạc thì tắt - Turn off the power when not charging
- int dovolt_out = 0;
- float volt_out = 0;
- unsigned long pe_rung = 0;
- unsigned long pe_rung_cai_1 = 0;
- unsigned long pe_rung_cai_2 = 0;
- unsigned long pe_rung_ut_1 = 0;
- unsigned long pe_rung_ut_2 = 0;
- unsigned long pe_loa1 = 0;
- unsigned long pe_loa2 = 0;
- unsigned long pe_nhanli = 0;
- unsigned long pe11 = 0;
- unsigned long pe12 = 0;
- int GT_button = 0;
- int GT_button_000 = 0;
- int time_x = 0;
- void tien_sacpin(unsigned long giay)
- {
- unsigned long peham_sac = millis();
- while ((millis() - peham_sac <= giay) && (volt_out >= 3.5)) {
- //đo volt ngoài
- dovolt_out = analogRead(do_volt_out_A1);
- volt_out = dovolt_out / 1023.0 * 5.0;
- //nháy đèn
- if ((den1 == 0) && (millis() - pe12 >= 150)) {
- pe11 = millis();
- digitalWrite(led_11, HIGH);
- den1 = 1;
- den2 = 0;
- }
- if ((den2 == 0) && (millis() - pe11 >= 150)) {
- pe12 = millis();
- digitalWrite(led_11, LOW);
- den2 = 1;
- den1 = 0;
- }
- }
- }
- void setup()
- {
- pinMode(relay_A0, OUTPUT);
- digitalWrite(relay_A0, HIGH);
- //Serial.begin(9600); // giao tiếp Serial với baudrate 9600
- pinMode(trig, OUTPUT); // chân trig sẽ phát tín hiệu
- pinMode(coi_chip_10, OUTPUT);
- pinMode(ngon_tay_cai_6, OUTPUT);
- pinMode(ngon_tay_ut_3, OUTPUT);
- pinMode(opto_volt_pin_12, OUTPUT);
- pinMode(led_11, OUTPUT);
- pinMode(echo, INPUT); // chân echo sẽ nhận tín hiệu
- pinMode(button_A3, INPUT);
- pinMode(do_volt_out_A1, INPUT);
- pinMode(do_volt_pin_A2, INPUT);
- delay(6000);
- che_do_rung = EEPROM.read(6);
- delay(200);
- if ((che_do_rung != 1) && (che_do_rung != 0)) {
- delay(1000);
- EEPROM.write(6, 0);
- delay(1000);
- che_do_rung = EEPROM.read(6);
- } //quan trọng, chỉ dùng 1 lần - Only run once
- }
- void loop()
- {
- //đo volt ngoài - Check whether the charger is charging or not
- dovolt_out = analogRead(do_volt_out_A1);
- volt_out = dovolt_out / 1023.0 * 5.0;
- //Serial.println(volt_out);
- //chế độ sạc pin - Battery charging mode
- if (volt_out >= 3.5) {
- tat = 1;
- } //biến giúp khi rút sạc thì tắt - "tat = 1: Turn off the power when not charging"
- while ((volt_out >= 3.5) or (tat == 1)) {
- digitalWrite(coi_chip_10, LOW);
- analogWrite(ngon_tay_cai_6, 0);
- analogWrite(ngon_tay_ut_3, 0);
- //đo volt ngoài - Check whether the charger is charging or not
- dovolt_out = analogRead(do_volt_out_A1);
- volt_out = dovolt_out / 1023.0 * 5.0;
- digitalWrite(led_11, LOW);
- digitalWrite(relay_A0, LOW);
- digitalWrite(opto_volt_pin_12, HIGH);
- delay(3500);
- //đo volt pin - Measure the battery voltage
- int dovolt_pin = analogRead(do_volt_pin_A2);
- float volt_pin = dovolt_pin / 1023.0 * 5.0;
- //Serial.println("pin_1");
- //Serial.println(volt_pin);
- //Serial.println("pin_2");
- if (volt_pin <= 4.9) {
- digitalWrite(relay_A0, HIGH);
- tien_sacpin(60000);
- }
- else {
- digitalWrite(led_11, HIGH);
- delay(500);
- }
- }
- digitalWrite(relay_A0, HIGH);
- digitalWrite(opto_volt_pin_12, LOW);
- if ((den1 == 0) && (millis() - pe12 >= 1500)) {
- pe11 = millis();
- digitalWrite(led_11, HIGH);
- den1 = 1;
- den2 = 0;
- }
- if ((den2 == 0) && (millis() - pe11 >= 1500)) {
- pe12 = millis();
- digitalWrite(led_11, LOW);
- den2 = 1;
- den1 = 0;
- }
- //chế độ không sạc pin - No battery charging mode
- if (volt_out < 3.5) {
- //nhấn lỳ 3s để tắt - Hold down for 3 seconds to turn off
- GT_button = digitalRead(button_A3);
- if (GT_button != GT_button_000) {
- GT_button_000 = GT_button;
- pe_nhanli = millis();
- }
- if ((GT_button == 1) && (millis() - pe_nhanli > 3000)) {
- digitalWrite(coi_chip_10, HIGH);
- digitalWrite(led_11, HIGH);
- analogWrite(ngon_tay_cai_6, 100);
- analogWrite(ngon_tay_ut_3, 100);
- delay(500);
- digitalWrite(coi_chip_10, LOW);
- delay(5000);
- digitalWrite(relay_A0, LOW);
- delay(5000);
- }
- //nhấn nhanh để chuyển đỗi gữa loa và rung, Đọc trạng thái button để bật loa hoặc bật rung - Quick click to switch speakers and vibrate
- GT_button = digitalRead(button_A3);
- if ((GT_button == 1) && (khong_lap == 0)) {
- khong_lap = 1;
- sau_tha_nut = 1;
- }
- if ((GT_button == 0) && (sau_tha_nut == 1)) {
- sau_tha_nut = 0;
- khong_lap = 0;
- che_do_rung = EEPROM.read(6);
- delay(10);
- if (che_do_rung == 1) {
- delay(300);
- EEPROM.write(6, 0);
- delay(300);
- }
- else {
- delay(300);
- EEPROM.write(6, 1);
- delay(300);
- }
- che_do_rung = EEPROM.read(6);
- }
- unsigned long thoi_gian = 0; // biến đo thời gian - Time variable
- int khoang_cach; // biến lưu khoảng cách - Distance variable
- /* Phát xung từ chân trig */
- delay(50); //delay tránh nhiễu sóng siêu âm
- digitalWrite(trig, 0); // tắt chân trig
- delayMicroseconds(2);
- digitalWrite(trig, 1); // phát xung từ chân trig
- delayMicroseconds(5); // xung có độ dài 5 microSeconds
- digitalWrite(trig, 0); // tắt chân trig
- /* Tính toán thời gian */
- thoi_gian = pulseIn(echo, HIGH);
- // Tính khoảng cách đến vật.
- khoang_cach = int(thoi_gian / 2 / 29.412);
- //Serial.print(khoang_cach);
- //Serial.println("cm");
- if (khoang_cach <= 130) {
- rung_cai = 1;
- rung_ut = 0;
- pe_rung = millis();
- }
- if ((khoang_cach > 130) && (khoang_cach <= 280)) {
- rung_cai = 0;
- rung_ut = 1;
- pe_rung = millis();
- }
- else {
- if (millis() - pe_rung >= 1000) {
- rung_cai = 0;
- rung_ut = 0;
- }
- }
- //chế độ rung ngón tay - finger vibration mode
- if (che_do_rung == 0) {
- if (millis() - pe_loa1 >= 50) {
- digitalWrite(coi_chip_10, LOW);
- }
- // rung nhẹ ngón tay cái - Motor vibration on the thumb
- if (rung_cai == 1) {
- if ((rung_cai_1 == 0) && (millis() - pe_rung_cai_2 >= 100)) {
- pe_rung_cai_1 = millis();
- analogWrite(ngon_tay_cai_6, 150);
- rung_cai_1 = 1;
- rung_cai_2 = 0;
- } //rung có nhịp
- if ((rung_cai_2 == 0) && (millis() - pe_rung_cai_1 >= 300)) {
- pe_rung_cai_2 = millis();
- analogWrite(ngon_tay_cai_6, 0);
- rung_cai_2 = 1;
- rung_cai_1 = 0;
- }
- }
- else {
- analogWrite(ngon_tay_cai_6, 0);
- }
- // rung nhẹ ngón tay út - Vibration motor on the little finger
- if (rung_ut == 1) {
- if ((rung_ut_1 == 0) && (millis() - pe_rung_ut_2 >= 100)) {
- pe_rung_ut_1 = millis();
- analogWrite(ngon_tay_ut_3, 150);
- rung_ut_1 = 1;
- rung_ut_2 = 0;
- } //rung có nhịp - Vibration motor feel comfortable
- if ((rung_ut_2 == 0) && (millis() - pe_rung_ut_1 >= 300)) {
- pe_rung_ut_2 = millis();
- analogWrite(ngon_tay_ut_3, 0);
- rung_ut_2 = 1;
- rung_ut_1 = 0;
- }
- }
- else {
- analogWrite(ngon_tay_ut_3, 0);
- }
- }
- //chế độ phát loa, nháy loa nhanh dần khi khoảng cách giảm dần - Sound mode
- else {
- analogWrite(ngon_tay_cai_6, 0);
- analogWrite(ngon_tay_ut_3, 0);
- if (khoang_cach <= 300) {
- time_x = (2 * khoang_cach) + (khoang_cach / 2);
- if ((loa1 == 0) && (millis() - pe_loa2 >= time_x)) {
- pe_loa1 = millis();
- digitalWrite(coi_chip_10, HIGH);
- loa1 = 1;
- loa2 = 0;
- }
- if ((loa2 == 0) && (millis() - pe_loa1 >= 50)) {
- pe_loa2 = millis();
- digitalWrite(coi_chip_10, LOW);
- loa2 = 1;
- loa1 = 0;
- }
- }
- else {
- if (millis() - pe_loa1 >= 30) {
- digitalWrite(coi_chip_10, LOW);
- }
- }
- //nháy loa nhanh khi khoảng cách đến vật khoảng 1m
- //if(rung_cai == 1){ if((loa1 == 0) && (millis() - pe_loa2 >= 60)){pe_loa1 = millis();digitalWrite(coi_chip_10,HIGH); loa1 = 1; loa2 = 0;}
- // if((loa2 == 0) && (millis() - pe_loa1 >= 60)){pe_loa2 = millis();digitalWrite(coi_chip_10,LOW); loa2 = 1; loa1 = 0; }}
- //nháy loa chậm khi khoảng cách đến vật từ 1m đến 2.8m
- //if(rung_ut == 1) { if((loa1 == 0) && (millis() - pe_loa2 >= 500)){pe_loa1 = millis();digitalWrite(coi_chip_10,HIGH); loa1 = 1; loa2 = 0;}
- // if((loa2 == 0) && (millis() - pe_loa1 >= 80)){pe_loa2 = millis();digitalWrite(coi_chip_10,LOW); loa2 = 1; loa1 = 0; }}
- //
- //if((rung_cai == 0) && (rung_ut == 0)){if(millis() - pe_loa1 >= 60){digitalWrite(coi_chip_10,LOW);}}
- }
- }
- }
Bước 4: Lắp ráp phần điện và hoàn thành
Hàn thiếc 2 chân GND của arduino với 2 chân GND của hc-sr04 (phần tô màu đỏ), để 2 mạch bám chắc chắn vào nhau, như trong hình dưới
Hãy thử đặt nó vào hộp, và vẫn còn một khoảng rộng cho các linh kiện còn lại
Sử dụng keo để gắn 2 mô tơ rung lên 2 vòng tròn nhỏ
Nên dùng loại mô tơ rung này, có kèm theo miếng dán, dễ dàng mua ở các cửa hàng sửa điện thoại
Sau khi phần điện hoàn thành theo đúng sơ đồ mạch điện và cho vào hộp
Sử dụng hai vít nhỏ (có thể tháo từ các thiết bị điện tử bỏ đi) để vít chặt đáy của hộp.
Đã hoàn thành vòng đeo tay, hỗ trợ cho người mù
IV. Cải tiến
Bọc vải cho vòng đeo cổ tay và thêm bộ phận dây đeo điều chỉnh được kích thước
Tận dụng dây đeo của mũ bảo hiểm hỏng hoặc mua ở nơi sửa mũ bảo hiểm, một chiếc bít tất hoặc 1 mảnh vải co dãn được.
Dùng kim chỉ, may loại vải co dãn thành túi có chiều rộng bằng 3/4 chiều rộng của vòng đeo cổ tay.
Sau đó bọc túi vải co dãn vào phần nhựa, có thể dùng ít keo nến cố định chúng lại để không bị tuột ra khi tháo vòng ra khỏi tay.
Dùng keo 502 gắn phần nhựa của khóa dây vào mặt hộp như hình dưới.
Dây đeo được dính bằng keo 502 hoặc dùng ốc, dính hoặc vít chặt cố định một đầu dây ở vị trí giữa vòng và hộp.
Khi đeo vòng, đối với tay nhỏ hơn vòng thì điều chỉnh dây đeo ngắn lại và ngược lại đối với tay lớn hơn
Các bạn thấy sao! có vẻ như chúng ta cần có tài khâu vá nữa đấy.
Cảm ơn mọi người đã xem!!!
Không có nhận xét nào:
Đăng nhận xét