Автор Arduino Project Hub под ником Nakshatra401 знакомит начинающих ардуинщиков с двумя периферийными устройствами: датчиком шума и драйвером двух коллекторных двигателей. Затем он предлагает собрать тренировочную конструкцию, которая, впрочем, может найти и практическое применение - вентилятор, управляемый хлопком в ладоши. Лицензия - GPL версии 3 или больше по вашему выбору.
Внешний интерфейс датчика шума не просто лаконичен, а очень лаконичен. Три вывода: плюс питания, общий провод и выход. Если уровень шума превышает заданный, на выходе появляется логическая единица. Порог срабатывания датчика регулируется подстроечным резистором. Подать выходной сигнал можно на любой цифровой вход Arduino - на тот, который пропишете в скетчей. Можно и вообще без Arduino. Подключите Т-триггер, ключ и реле с защитным диодом - получите выключатель, управляемый хлопками, такие ещё в шестидесятых начали делать. Подключите одновибратор, ключ и несколько светодиодов с резисторами - будет светильник для коридора, реагирующий на шаги, такие ставят в некоторые дома при капитальном ремонте.
Переходим к драйверу двух коллекторных двигателей на микросхеме L298N. Питать этот модуль можно двумя способами. Первый - подать на соответствующие входы как напряжение питания двигателей (до +35 В, но обязательно не больше напряжения, на которое рассчитан двигатель), так и напряжение питания логики (+5 В). Второй - подать только первое напряжение, а для получения второго прямо на плате при помощи встроенного стабилизатор установить отдельно стоящую перемычку, расположенную вдали от входов управления. В обоих случаях общий провод драйвера следует соединить с общим проводом логики. Суммарный ток, потребляемый обоими двигателями - не более 2 А.
К боковым клеммникам подключаются собственно двигатели. Поскольку драйвер мостовой, ни один из выводов двигателей соединять с общим проводом нельзя.
Переходим к входам IN1 и IN2. Если на IN1 подать логическую единицу, а на IN2 - логический нуль, первый двигатель будет вращаться в одном направлении. Если наоборот, то в другом. Оба нуля - драйвер снимает с двигателя питание, и он останавливается. Обе единицы - драйвер закорачивает двигатель, и он тоже останавливается, но резко. Входы IN3 и IN4 работают так же, только происходит управление вторым двигателем.
Входы ENA и ENB позволяют управлять скоростью, соответственно, первого и второго двигателей при помощи ШИМ. При этом следует предварительно выбрать направление вращения способом, описанным выше. Если ШИМ не нужен, на соответствующий вход надо подать логическую единицу - тогда управлять двигателем можно быдет только дискретно - включён или выключен. Для удобства подачи на эти входы единицы предусмотрены ещё две перемычки рядом с ними.
Перейдём к тренировочной конструкции, её схема показана на КДПВ. Похоже, собрал её мастер правильно, раз она у него заработала. А схему составил с ошибками, но тем интереснее - давайте исправим их:
1. Соединим общие провода драйвера и Arduino.
2. Установим на модуле все три перемычки, которые мастер вообще не изобразил.
3. К точке соединения светодиода с резистором ничего подключать не будем. Перемычку, закорачивающую светодиод, удалим. Выводы 4 и 5 Arduino соединим между собой, а также с анодом светодиода и входом IN1 драйвера.
Скетч - очень короткий, даже под спойлер прятать не надо:
/*For this project you will have to connect external power supply of 9V or 5V to the 12V pin of driver.*/
int soundSensor=2; //This is the input pin connected to digital output of sound sensor
int LED=4; //This pin is connected to led for indication and input to motor driver
int stat = 5; //This pin is used as input to verify that LED pin is on or off
void setup() {
pinMode(soundSensor,INPUT);
pinMode(LED,OUTPUT);
pinMode(stat,INPUT);
}
void loop() {
stat = digitalRead(5);
int SensorData=digitalRead(soundSensor);
//Now to turn on
if(SensorData==1) //If the sensor detected any sound
{
if(stat==false) //And if Led pin is false or off
{
digitalWrite(LED,HIGH);//We will turn onn the input pin for H-Bridge driver and LED
digitalWrite(8, LOW);//This is to ensure that our DC motor rotates in one direction
}
}
//Now to turn off
if(SensorData==1) //If the sensor detected any sound
{
if(stat==true) //And if Led pin is true or on
{
digitalWrite(LED,LOW); //Now the dc motor won't work as there is no input to the driver
}
}
}
Как видим, сигнал с датчика шума поступает на вывод 2 Arduino, откуда и считывается программой. Далее начинаются небольшие костыли... но всё работает ведь. Так, вывод 8 задействован только чтобы всё время подавать на вход IN2 драйвера логический нуль. Не проще ли соединить IN2 с общим проводом, освободив вывод 8 и упростив скетч? Далее, вывод 4 Arduino сконфигурирован как выход, чтобы переключать состояние входа IN1 драйвера, а заодно и индикаторного светодиода. А вывод 5 - внимание, сконфигурирован как вход, чтобы считывать состояние вывода 4, тем самым упрощая программную реализацию T-триггера. Упрощая ли? Может, лучше переменную выделить для этого, освободив ещё один вывод? И обойтись двумя выводами Arduino (2 и 4) вместо четырёх (2, 4, 5, 8). И следующий шаг - вообще заменить Arduino на аппаратный T-триггер.
Но неоптимальные вещи тем и хороши, что в них есть резерв для оптимизации...
Источник (Source)