Vòng đeo tay hỗ trợ người mù

Cảm ơn! bài viết của NTP_PRO về Sử dụng cảm biến khoảng cách HC-SR04. 

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ị

II. Sơ đồ mạch và cách hoạt động

Sơ đồ mạch gốc

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-code-cho-arduino-promini-thong-qua-mach-nap-cua-arduino-uno

//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ù smiley

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.laugh

Cảm ơn mọi người đã xem!!!

Youtube: 
video minh hoạ làm thế nào để bật thiết bị và cách nó hoạt động trong chế độ âm thanh
video đang sạc pin cho "Vòng đeo tay"
Những hình ảnh về dự án: 
Bài viết truyền cảm hứng: 
lên
15 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results