Проект 24: Умный вентилятор с обходом препятствий
Описание
В этом проекте мы создадим «умный вентилятор», который реагирует на окружающую среду. Мы объединим ультразвуковой датчик HC-SR04 с двигателем постоянного тока, управляемым микросхемой L293D. Ультразвуковой датчик выступает в роли датчика приближения: когда объект (например, ваша рука) слишком близко подходит к лопастям вентилятора, мотор автоматически останавливается, чтобы предотвратить травмы; когда препятствие убирается, вентилятор автоматически возобновляет вращение.
Аппаратное обеспечение
Плата разработки UNO R3 (CH340) × 1
Ультразвуковой датчик HC-SR04 × 1
Микросхема драйвера мотора L293D × 1
Двигатель постоянного тока 130 × 1
Батарея 9В и держатель для батареи × 1 (для независимого питания мотора)
Макетная плата × 1
Соединительные провода × несколько
Принцип работы
Измерение расстояния ультразвуком: Датчик HC-SR04 излучает высокочастотные звуковые волны и измеряет время, за которое эхо возвращается обратно. Arduino рассчитывает физическое расстояние до объекта на основе времени прохождения звуковой волны туда и обратно.
Логика управления: В коде мы задаём порог «безопасного расстояния» (например, 15 см). Arduino постоянно проверяет расстояние, измеренное ультразвуковым датчиком:
Если расстояние больше 15 см: Arduino через функцию
setMotorотправляет команды L293D для работы мотора на полной скорости.Если расстояние меньше или равно 15 см: Arduino сразу отправляет команду остановки L293D, и мотор мгновенно тормозит.
Схема подключения
1. Контакты ультразвукового датчика HC-SR04
VCC➔ Подключить к 5V ArduinoGND➔ Подключить к GND ArduinoTrig (Trigger)➔ Подключить к Arduino D8Echo (Echo)➔ Подключить к Arduino D7
2. Контакты драйвера мотора L293D (следуя предыдущему безопасному способу подключения)
Pin 1 (Enable 1)➔ Подключить к Arduino D10 (для управления скоростью / запуска и остановки)Pin 2 (Input 1)➔ Подключить к Arduino D11 (управление направлением 1)Pin 7 (Input 2)➔ Подключить к Arduino D9 (управление направлением 2)Pin 3 (Output 1)➔ Подключить к одному контакту мотораPin 6 (Output 2)➔ Подключить к другому контакту мотораPin 16 (VCC1)➔ Подключить к 5V Arduino (питание логики)Pin 8 (VCC2)➔ Подключить к положительному контакту батареи 9В (независимое питание мотора)Pin 4, 5 (GND)➔ Подключить к общему GND макетной платы (включая GND Arduino и отрицательный контакт батареи)

Пример кода
/*
Electronics Learning Starter Kit for Arduino
Project 24
Smart Obstacle Avoidance Fan
Edit By Keyes
*/
// --- 1. Ultrasonic sensor pin definitions ---
const int trigPin = 8; // Trigger pin
const int echoPin = 7; // Echo pin
// --- 2. L293D motor driver pin definitions ---
const int enablePin = 10; // D10: motor speed control (PWM)
const int in1Pin = 11; // D11: motor direction control 1
const int in2Pin = 9; // D9: motor direction control 2
// --- 3. Parameter settings ---
const int safeDistance = 15; // Safe distance threshold set to 15 cm
void setup() {
// Initialize ultrasonic sensor pins
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Initialize motor control pins
pinMode(enablePin, OUTPUT);
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
// Start serial communication to monitor distance data on PC
Serial.begin(9600);
}
void loop() {
// ================= Step 1: Emit sound wave and measure distance =================
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH); // Emit 10 microseconds high-frequency sound pulse
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Measure the duration of echo pin being HIGH (microseconds)
long duration = pulseIn(echoPin, HIGH);
// Calculate distance (speed of sound approx. 0.034 cm/us, divide by 2 for round trip)
int distance = duration * 0.034 / 2;
// Print current distance to serial monitor
Serial.print("Current distance: ");
Serial.print(distance);
Serial.println(" cm");
// ================= Step 2: Control motor start/stop based on distance =================
// Add distance > 0 to avoid misjudgment when sensor occasionally returns 0
if (distance > 0 && distance <= safeDistance) {
// Obstacle too close! Set speed to 0 and stop motor.
setMotor(0, false);
Serial.println(">>> Status: Danger! Braking <<<");
} else {
// Safe ahead! Set speed to 255, full speed forward.
setMotor(255, false);
Serial.println("Status: Running normally...");
}
// Short delay to avoid interference from too frequent measurements
delay(100);
}
// ================= Custom motor control function =================
void setMotor(int speed, boolean reverse) {
analogWrite(enablePin, speed);
digitalWrite(in1Pin, !reverse);
digitalWrite(in2Pin, reverse);
}
Объяснение кода
1. Измерение расстояния (pulseIn функция):
long duration = pulseIn(echoPin, HIGH);
int distance = duration * 0.034 / 2;
Функция pulseIn() измеряет, как долго пин Echo остаётся в состоянии HIGH. Мы умножаем это время на скорость звука (0.034 см за микросекунду), затем делим на 2, так как звук проходит путь туда и обратно, чтобы получить точное расстояние в сантиметрах в одну сторону.
2. Логика безопасного обхода препятствий:
if (distance > 0 && distance <= safeDistance)
Мы проверяем, меньше ли или равно расстояние порогу safeDistance (15 см). Условие distance > 0 добавлено, потому что ультразвуковой датчик иногда возвращает 0, если объект вне зоны действия или эхо не получено. Без этой проверки вентилятор мог бы ошибочно остановиться при значении 0.
3. Использование безопасного управления мотором:
Код продолжает использовать ранее написанную функцию setMotor(). Это гарантирует, что независимо от изменений в основной программе, базовая логика взаимного исключения, управляющая направлением (!reverse), защищает микросхему от коротких замыканий.
Результат проекта
После загрузки кода в Arduino и подключения батареи 9В:
Двигатель постоянного тока сразу начнёт вращаться.
Поднесите руку или книгу примерно на 10–15 см перед ультразвуковым датчиком — мотор немедленно остановится.
Отодвиньте руку — мотор автоматически возобновит вращение.
Если открыть Серийный монитор в Arduino IDE (скорость передачи 9600 бод), можно увидеть в реальном времени измеренное расстояние и состояние работы вентилятора.
