Chế tạo gậy thông minh cho người mù sử dụng Arduino
![Chế tạo gậy thông minh cho người mù sử dụng Arduino](https://arduinokit.vn/wp-content/uploads/2023/06/che-tao-gay-thong-minh-cho-nguoi-mu-su-dung-arduino.jpg)
Trên thế giới hiện tại có hàng trăm nghìn người đang bị vấn đề mắt, như bị mù, khiếm thị…ảnh hưởng rất nhiều cho quá trình đi lại và sinh hoạt. Xuất phát từ vấn đề trên, mình đã bắt tay vào thực hiện một dự án nhỏ để phụ vụ cho cộng đồng, đó là chế tạo gậy thông minh dành cho người mù sử dụng Arduino và cảm biến siêu âm HC SR04.
Để bắt đầu dự án, các bạn cần chuẩn bị các linh kiện cần thiết mình có để link bên dưới.
Xem ngay: Hướng dẫn làm máy chơi Game xếp gạch sử dụng OLED 0.96 với Arduino
Linh kiện cần thiết cho dự án
TÊN LINH KIỆN | SỐ LƯỢNG | NƠI BÁN |
Arduino Pro Mini 3.3V 16M | 1 | Shopee | Cytron |
Cảm biến siêu âm HC SR04 | 1 | Shopee | Cytron |
Điện trở 220R | 3 | Shopee | Cytron |
Mạch sạc pin Lithium TP4056 | 1 | Shopee | Cytron |
Motor rung | 1 | Shopee | Cytron |
Pin 3.7V | 1 | Shopee | Cytron |
Còi Chíp 9.5x12mm | 1 | Shopee | Cytron |
Công tắc nguồn 3 chân | 1 | Shopee | Cytron |
Dây cắm | 10 – 20 | Shopee | Cytron |
Sơ đồ đấu nối gậy thông minh cho người mù sử dụng Arduino
Dưới đây là sơ đồ đấu nối gậy cho người mù và gậy cho người khiếm thị sử dụng bo mạch chính là Arduino Pro Mini và cảm biến HC-SR04. Sơ đồ đấu nối khá đơn giản các bạn có thể nhìn theo hình bên dưới để thực hiện theo nhé.
![](https://arduinokit.vn/wp-content/uploads/2023/06/so-do-dau-noi-gay-thong-minh-1024x682.webp)
Giải thích Code
// Pin assignments const int TRIGGER_PIN = 6; const int ECHO_PIN = 5; const int buzzer = 4; const int MOTOR_PIN = 7;
Đầu tiên, các chân kết nối được gán giá trị như TRIGGER_PIN (chân kích hoạt cảm biến siêu âm), ECHO_PIN (chân nhận tín hiệu từ cảm biến siêu âm), buzzer (chân điều khiển buzzer) và MOTOR_PIN (chân điều khiển động cơ rung).
// Threshold distances const int ALERT_DISTANCE = 100; // Alert if object is within 30 cm
ALERT_DISTANCE
là giá trị ngưỡng, nếu khoảng cách đo được nhỏ hơn hoặc bằng ALERT_DISTANCE thì sẽ được kích hoạt các thiết bị cảnh báo.
// Timing constants const int BUZZER_ON_TIME = 500; // Buzzer on time in milliseconds const int MOTOR_ON_TIME = 200; // Haptic motor on time in milliseconds const int LOOP_DELAY = 50; // Main loop delay in milliseconds
BUZZER_ON_TIME là thời gian kích hoạt buzzer (milliseconds), MOTOR_ON_TIME là thời gian kích hoạt động cơ rung (milliseconds), LOOP_DELAY là thời gian trễ trong vòng lặp chính (milliseconds).
void setup() { // Set up pins pinMode(TRIGGER_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(buzzer, OUTPUT); pinMode(MOTOR_PIN, OUTPUT); // Start serial communication for debugging Serial.begin(9600); }
Hàm setup(), hàm này được gọi một lần duy nhất khi Arduino khởi động. Trong hàm này, các chân kết nối được cấu hình là đầu ra (OUTPUT) hoặc đầu vào (INPUT). Serial.begin(9600) được sử dụng để bắt đầu giao tiếp (serial communication) để gửi thông tin debug qua cổng Serial.
void loop() { // Send ultrasonic pulse digitalWrite(TRIGGER_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIGGER_PIN, LOW); // Measure pulse duration long duration = pulseIn(ECHO_PIN, HIGH); // Calculate distance in cm int distance = duration / 58; // Debug output Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); // Check for alerts if (distance <= ALERT_DISTANCE) { // Turn on buzzer tone(buzzer, 1000, 1000); // 1KHz digitalWrite(MOTOR_PIN, HIGH); delay(BUZZER_ON_TIME); digitalWrite(MOTOR_PIN, LOW); noTone(buzzer); // 1KHz } noTone(buzzer); // 1KHz // Wait before taking another reading delay(LOOP_DELAY); }
Hàm loop() được chạy lặp đi lặp lại sau khi hàm setup() đã hoàn thành. Trong hàm này, các bước sau được thực hiện:
- Gửi một xung siêu âm từ cảm biến bằng cách thay đổi trạng thái của TRIGGER_PIN.
- Sử dụng hàm
pulseIn()
để đo thời gian phản hồi từ cảm biến. - Dựa trên thời gian phản hồi, tính toán khoảng cách trong đơn vị cm.
- Gửi thông tin về khoảng cách đo được qua cổng Serial để debug.
- Nếu khoảng cách đo được nhỏ hơn hoặc bằng ALERT_DISTANCE, thì kích hoạt buzzer và motor trong một khoảng thời gian nhất định.
- Chờ một khoảng thời gian LOOP_DELAY trước khi thực hiện lần đo tiếp theo.
Tay cầm In 3D
![](https://arduinokit.vn/wp-content/uploads/2023/06/in-3d-gay-thong-minh-cho-nguoi-mu.webp)
Trong dự án gậy thông minh dành cho người mù, phần khó khăn nhất của dự án là vỏ của gậy, từ việc thiết kế khung 3D cho đến quá trình in, phải sửa đổi rất nhiều lần. Để tạo động lực cho mình và Team các bạn có thể ủng hộ bằng cách Donate để chúng mình có thể ra nhiều bài viết chất lượng hơn nhé.
Lắp ráp
Đây là hình ảnh sau khi mình đã lắp đặt xong, các bạn có thể xem video bên dưới để xem kết quả hoạt động của gậy thông minh này nhé.
![](https://arduinokit.vn/wp-content/uploads/2023/06/lap-rap-gay-thong-minh-cho-nguoi-mu.webp)
Code
// Pin assignments const int TRIGGER_PIN = 6; const int ECHO_PIN = 5; const int buzzer = 4; const int MOTOR_PIN = 7; // Threshold distances const int ALERT_DISTANCE = 100; // Alert if object is within 30 cm // Timing constants const int BUZZER_ON_TIME = 500; // Buzzer on time in milliseconds const int MOTOR_ON_TIME = 200; // Haptic motor on time in milliseconds const int LOOP_DELAY = 50; // Main loop delay in milliseconds void setup() { // Set up pins pinMode(TRIGGER_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(buzzer, OUTPUT); pinMode(MOTOR_PIN, OUTPUT); // Start serial communication for debugging Serial.begin(9600); } void loop() { // Send ultrasonic pulse digitalWrite(TRIGGER_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIGGER_PIN, LOW); // Measure pulse duration long duration = pulseIn(ECHO_PIN, HIGH); // Calculate distance in cm int distance = duration / 58; // Debug output Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); // Check for alerts if (distance <= ALERT_DISTANCE) { // Turn on buzzer tone(buzzer, 1000, 1000); // 1KHz digitalWrite(MOTOR_PIN, HIGH); delay(BUZZER_ON_TIME); digitalWrite(MOTOR_PIN, LOW); noTone(buzzer); // 1KHz } noTone(buzzer); // 1KHz // Wait before taking another reading delay(LOOP_DELAY); }