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

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 Arduinocả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ù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é.

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

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

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);
}

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments