tien gửi vào
- 17985 lượt xem
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.
Những hình ảnh về dự án:
Bài viết truyền cảm hứng:
Cộng đồng Arduino Việt Nam
Chưa biết cách đăng bài? Tìm hiểu ngay và kiếm điểm cộng đồng.
Hãy trở thành thành viên của Cộng đồng Arudino Việt Nam để mở khóa chức năng này.
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:
Lưu ý
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
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ỏ
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
//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
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!!!