# Проект 23: Драйвер мотора L293D ## Введение в проект Цель этого проекта — добиться полностью автоматического управления двигателем постоянного тока с помощью платы Arduino в сочетании с драйвером мотора L293D (или совместимым SN754410). После запуска программы мотор будет работать без ручного вмешательства (не нужно отправлять команды через последовательный монитор), автоматически и циклично выполняя последовательность: «вращение вперед -> остановка -> вращение назад -> остановка». Этот проект является отличной базовой практикой для изучения управления моторами, регулировки скорости с помощью ШИМ и логики управления мостом H. ## Аппаратная часть проекта Для выполнения этого проекта требуются следующие базовые аппаратные компоненты: * **Плата Arduino** (например, Arduino UNO) × 1 * **Драйвер мотора L293D или SN754410** × 1 * **Стандартный двигатель постоянного тока** × 1 * **Макетная плата (breadboard)** × 1 * **Провода Dupont** (мужчина-мужчина) × несколько * **Внешний независимый источник питания** (рекомендуется, например, держатель для 4 батареек AA или 9В батарея, используется для отдельного питания мотора) ## Принцип работы проекта Рабочее состояние двигателя постоянного тока (направление и скорость) контролируется драйвером L293D, основные принципы следующие: 1. **Управление направлением (принцип моста H):** Внутри микросхемы интегрирована схема моста H. Для одного канала мотора микросхема предоставляет два входных пина направления (Input 1 и Input 2). Когда эти два пина получают противоположные логические уровни (один HIGH, другой LOW), мотор вращается; при смене HIGH и LOW направление вращения меняется на обратное; если оба пина HIGH или оба LOW, мотор останавливается (тормозит). 2. **Управление скоростью (ШИМ):** Пин включения (Enable) микросхемы получает ШИМ-сигнал (аналоговый выход) от Arduino. Регулируя коэффициент заполнения ШИМ (значение от 0 до 255), контролируется среднее напряжение на моторе, что позволяет плавно регулировать скорость. ## Схема подключения Пожалуйста, подключите компоненты на макетной плате строго согласно следующим соответствиям пинов: **1. Пины управления (со стороны Arduino)** * `Arduino D10` ➔ подключен к **пину микросхемы 1 (Enable 1,2)** —— *управление скоростью через ШИМ* * `Arduino D11` ➔ подключен к **пину микросхемы 2 (Input 1)** —— *управление направлением 1* * `Arduino D9` ➔ подключен к **пину микросхемы 7 (Input 2)** —— *управление направлением 2* **2. Пины мотора** * **Один вывод двигателя постоянного тока** ➔ подключен к **пину микросхемы 3 (Output 1)** * **Другой вывод двигателя постоянного тока** ➔ подключен к **пину микросхемы 6 (Output 2)** *(Примечание: проводка двигателя постоянного тока не полярна; смена проводов влияет только на начальное направление вращения.)* **3. Питание и земля** * `Arduino 5V` ➔ подключен к **пину микросхемы 16 (VCC1 — питание логики)** * `Положительный вывод внешней батареи` ➔ подключен к **пину микросхемы 8 (VCC2 — питание мотора)** ⚠️ *Предупреждение по безопасности: не рекомендуется подключать этот пин к 5V Arduino. Пусковой ток мотора может вызвать сброс платы или повредить стабилизатор напряжения.* * `GND Arduino` и `отрицательный вывод батареи` ➔ соединены вместе с общей землей на макетной плате (GND), которая также подключена к **пинам микросхемы 4, 5, 12, 13**. ![Img](../media/img-20260403132052.png) ## Пример кода Скопируйте и загрузите следующий код в вашу Arduino: ```cpp /* Electronics Learning Starter Kit for Arduino Project 23 L293D Motor Driver Edit By Keyes */ // Define pins const int enablePin = 10; // D10: controls motor speed (PWM) const int in1Pin = 11; // D11: controls motor direction 1 const int in2Pin = 9; // D9: controls motor direction 2 void setup() { // Set control pins as output pinMode(enablePin, OUTPUT); pinMode(in1Pin, OUTPUT); pinMode(in2Pin, OUTPUT); } void loop() { // 1. Full speed forward for 2 seconds setMotor(255, false); delay(2000); // 2. Stop for 1 second setMotor(0, false); delay(1000); // 3. Full speed reverse for 2 seconds setMotor(255, true); delay(2000); // 4. Stop for 1 second setMotor(0, false); delay(1000); } // Custom motor control function // Parameter speed: speed (0~255) // Parameter reverse: direction (false = forward, true = reverse) void setMotor(int speed, boolean reverse) { // Send PWM signal to set speed analogWrite(enablePin, speed); // Use negation logic to control direction, ensuring the two pins always have opposite levels digitalWrite(in1Pin, !reverse); digitalWrite(in2Pin, reverse); } ``` ## Объяснение кода Эта программа состоит из трех основных частей: 1. **Определение и инициализация пинов (`setup`)**: В начале кода реальные аппаратные пины D10, D11 и D9 назначаются соответствующим переменным, и все они настраиваются в режиме `OUTPUT` в функции `setup()`, чтобы отправлять управляющие сигналы на микросхему. 2. **Пользовательская функция управления (`setMotor`)**: Это суть кода. Мы инкапсулируем скорость (`speed`) и направление (`reverse`) как параметры. Строка `digitalWrite(in1Pin, !reverse);` умело использует логику отрицания (`!`). При передаче `false` `in1Pin` выдает HIGH, а `in2Pin` — LOW; при передаче `true` выходы меняются местами. Это полностью исключает риск одновременного HIGH на обоих пинах из-за ошибок в коде, делая вызовы основной программы очень простыми. 3. **Основной цикл управления (`loop`)**: Вызывает функцию `setMotor()` как строительные блоки. Последовательно отправляет команды на вращение вперед (скорость 255), остановку (скорость 0), вращение назад (скорость 255) и остановку (скорость 0), используя `delay()` между каждым шагом для поддержания соответствующей длительности состояния, тем самым достигая полностью автоматической работы. ## Экспериментальный результат После загрузки кода и подачи питания на схему вы увидите следующее: 1. Мотор начинает вращаться на полной скорости в одном направлении (например, по часовой стрелке) в течение **2 секунд**. 2. Мотор отключается и полностью останавливается, оставаясь неподвижным в течение **1 секунды**. 3. Мотор снова запускается и вращается на полной скорости в противоположном направлении (например, против часовой стрелки) в течение **2 секунд**. 4. Мотор снова отключается и останавливается, оставаясь неподвижным в течение **1 секунды**. 5. Система автоматически возвращается к шагу 1, повторяя этот цикл бесконечно до отключения питания. ![P23](../media/P23.gif)