Ардуино жалюзи: управление звуком, голосом или кнопкой

Управляем жалюзи на Ардуино звуком, голосом или кнопкой

10 июня в 14:26

Используем Ардуино, чтобы сделать автоматическую систему открывания и закрывания жалюзи с активацией звуком или кнопкой.

Этот проект Ардуино жалюзей позволит вам автоматизировать открывание и закрывание шторок, используя только Arduino и шаговый двигатель. Благодаря этому проекту вы сможете сэкономить время на процессе открывания или закрывания жалюзей, а также сможете произвести впечатление на окружающих. Для этого урока нам понадобятся следующие детали:

1x Ардуино (использовали в уроке Arduino Nano из-за экономии места)
1x Звуковой сенсор от Adafruit (по желанию)
1x Шаговый двигатель + драйвер (сборка) Дарлингтона
3x Кнопки
1x Светодиод
Провода/перемычки
1x Макетная плата

Дизайн этой системы автоматических жалюзей Ардуино довольно прост и в нём два способа активировать занавески:

  • Используя звуковой датчик (микрофон), чтобы управлять им, используя хлопки в ладоши;
  • Использование кнопок для открывания/закрывания шторок.

Шаг 2. Как это работает?

Работа этой системы очень проста. Ардуина принимает входные сигналы от звукового датчика (микрофона) или кнопок. Затем он соответственно управляет шаговым двигателем через драйвер Дарлингтона для двигателя. Шаговый двигатель прикреплен к ручке управления шторками и, таким образом, вращает и открывает/закрывает шторы.

Шаг 3. Подключаем и настраиваем шаговый мотор

Сначала всегда должно идти тестирование проекта до его финальной сборки. Начнем с двигателя. Двигатель подключен к 4 проводам драйвера, как показано на рисунках выше. В зависимости от направления вращения необходимо соответствующим образом подключить драйвер.

Первая кнопка справа активирует двигатель для вращения в определенном направлении (вы можете изменить это в коде ниже). Нажмите кнопку 4 раза и она вернется в исходное положение, так как она будет вращаться на 90 градусов во время каждого нажатия. Средняя кнопка блокирует цепь так, чтобы первая кнопка не могла активировать двигатель.

Светодиод включается, когда двигатель заблокирован. Последняя кнопка вернет двигатель в исходное положение независимо от того, где он находится, в момент нажатия.

Скачать zhaluzi-dvigatel.

inoint pin[8]={2,3,4,5,6,7,8,9}; int steps[][4] = { {HIGH,HIGH,LOW,LOW}, {HIGH,LOW,LOW,HIGH}, {LOW,LOW,HIGH,HIGH}, {LOW,HIGH,HIGH,LOW}, } ; int numofroun=1; //Change accordingly to your needs int current=1; int type=3; int place=0; int lastLockState = LOW; long lastLockTime = 0; int LockState; int Lockreading; bool lock=true; int lastPauseState = LOW; long lastPauseTime = 0; int PauseState; int Pausereading; bool Pauseled=false; bool pause=false; int lastReturnState = LOW; long lastReturnTime = 0; int ReturnState; int Returnreading; void setup() { for (int num=0; num0) { for (int num=0; num 50) { if (Returnreading != ReturnState) { ReturnState = Returnreading; if (ReturnState == HIGH) { type=3; while (place>0) { for (int num=0; num1000)) {sound();} if (lock==false) {stepper();spanconditioncheck=false; } if ((place==2048*numofroun)or(place==0)or(((place==1024*numofroun)or(place==512*numofroun))&&(type==3))){ lock=true; reset(); if (!spanconditioncheck){ spancondition=millis(); spanconditioncheck=true; } } if (current==3) {current=0;} else ++current; } }

Шаг 5. Финальные действия

Лучше использовать пенопласт, чтобы сделать держатель для двигателя (1, 2) и ручки жалюзи (3). Т.к. в некоторых домах многие предпочитают не сверлить стены позже можно использовать двусторонний скотч, чтобы зафиксировать всё на месте.

У нас есть также кнопка паузы на тот случай если в вашей комнате становится слишком громко, — тогда вы сможете заблокировать ее, чтобы шторы не сошли с ума.

Обратите внимание! Вам, возможно, придется настроить потенциометр на звуковом датчике, чтобы настроить чувствительность.

Посмотрите ниже демо-видео финального результата проекта, когда управление производится хлопком:

Если вам не нравится управление звуком, вы можете просто использовать кнопки. В таком случае нужно только две кнопки: активация и возврат в исходное положение (поскольку пауза нам теперь не нужна). Активация такая же, как и раньше, а кнопка сброса вернет занавеску назад в исходное положение. Код для этой версии ниже:

Скачать zhaluzi-knopki.inoint pin[8]={2,3,4,5,6,7,8}; int steps[][4] = { {HIGH,HIGH,LOW,LOW}, {HIGH,LOW,LOW,HIGH}, {LOW,LOW,HIGH,HIGH}, {LOW,HIGH,HIGH,LOW}, } ; int current=1; int type=3; int place=0; int lastLockState = LOW; long lastLockTime = 0; int LockState; int Lockreading; bool lock=true; int lastReturnState = LOW; long lastReturnTime = 0; int ReturnState; int Returnreading; void setup() { for (int num=0; num

Источник: https://ArduinoPlus.ru/upravlaem-zhaluzi-arduino/

Управление одной кнопкой несколькими устройствами на Arduino

Источник: http://xn——7kcglddctzgerobebivoffrddel5x.xn--p1ai/kommunikatsii/elektronika/arduino/874-upravlenie-odnoj-knopkoj-neskolkimi-ustrojstvami-na-arduino

Драйвер моторов L298N. Электропривод жалюзи

  • AliExpress
  • Сделано руками
  • Радиотовары

Кореш как то подогнал мне кучу моторов от принтеров, моторы были шаговые, и я решил купить распространенный драйвер для шаговиков, который умные люди подружили с ардуино
По приезду драйвера я пофиксил его косяк

косяк

сопля между ног

Далее думал, куда этот модуль пустить, чтоб пользу приносил, и радость. Додумался до дистанционного управления жалюзи на окне. У вертикальных жалюзи есть шнурок, при протягивании которого они смещаются в крайние положения, а у меня имеется китайский кондиционер, на котором одна кнопка пульта не задействована.

Эту кнопку я и использовал для управления. Лень — двигатель прогресса, как известно. Вооружившись электролобзиком, напильником, такой-то матерью, я принялся пилить свое поделие. Использовал родную монтажную пластину от двигателя, шестерню от него же.

В шестерню прекрасно вошла после доработки напильником пластиковая водопроводная труба, получился отличный барабан для шнура.
Схема на макетке отрабатывала исправно, с механикой же пришлось попотеть. Сначала я хотел, чтобы шнур жалюзи обвивал барабан тремя витками, и он, вращаясь, открывал-закрывал жалюзи.

Шнур не хотел вести себя так, как я того желал, а собирался в кучу у краев барабана в крайних положениях, и захлестывался, не давая остаткам размотаться, и клиня механизм. Потом я сделал разделенный барабан, и дело пошло лучше. Намного.

Вот тест изготовленной платы, и новой механики
Затем прикрепил на стену деревяшку, и к ней на саморезах приделал механизм и электронику, и намотал шнур жалюзи.

Корпус делать не стал, во первых лишняя морока, а во вторых я бы его не видел все равно, так как жалюзи постоянно закрыты, я не использую поворот ламелей (или лент?) вообще, просто отодвигаю их, когда надо.

При подаче сигнала на закрытие или открытие одна часть катушки наматывает шнур, а со второй он разматывается, жалюзи при этом движется в нужном направлении. Чтобы ограничить ход жалюзи я использовал концевик от старого дисководаКонцевик сдвоенный, с двумя нажимными штырьками двумя парами контактов.

При надавливании на штырьки соединяются соответствующие пары контактов.

На шнур нацепил ограничители, которые при подходе к крайнему положению давят на механизм концевика, ардуино при этом выключает модуль мотора, и он останавливается.

Мотор выключается убиранием +5 В от модуля L298, так как при простой остановке обмотки мотора находятся под напряжением, и он жрет около ампера, греется. Для выключения пустил +5 к модулю через транзистор, которым управляет нога ардуино. Полную схему можно посмотреть здесь. Основной управляющий орган — пульт от кондиционера, на котором, как сказано выше, не задействована одна кнопка, по видимому в некоторых моделях она включает подсветку, на дисплейчике пульта появляется символ лампочки, повторное нажатие кнопки убирает ее. Пульт поочередно выдает две разные команды, Их принимает управляющая схема с помощью ик-приемника, и открывает/закрывает жалюзи. Так же решил добавить управление кнопками. Были мысли реализовать управление от степени освещения, но я не нашел причин делать это, мне это не было нужно.

Пробный запуск, и сразу фейл.Произошло это из-за недостаточного натяжения шнура на второй части катушки. Исправил, все окКнопки и ик-приемник решил сунуть в отдельный аккуратный корпус и приляпать на стену/ Для этого была куплена розетка rj45, которую я немного доработал

Процесс

розетка до вмешательства
Плата с ик-приемником и кнопкамиготово
Соединяется этот блок с основным устройством через витую пару, я использовал штатный разъем в розетке для его подключения, обжал с одной стороны кабеля коннектор rj45
Клей высох, всё собрано, и прекрасно работает. Доволен собой, но все таки легче было купить жалюзи с заводским электроприводом.

Все исходники, если кому интересно, тут.

Планирую купить +53 Добавить в избранное Обзор понравился +63 +125

Источник: https://mysku.ru/blog/aliexpress/33771.html

Как подключить датчик звука (микрофон) к Arduino

Подключим модуль с звуковым датчиком – микрофоном CMA-4544PF-W – к Arduino.

Нам понадобятся:

1Электретный капсюльный микрофон CMA-4544PF-W

Электретный микрофон CMA-4544PF-W, который является основой модуля, реагирует на звуковые волны с частотами от 20 Гц до 20 кГц. Микрофон является всенаправленным, т.е.

чувствителен к звуку, приходящему со всех направлений, с чувствительностью -44 дБ.

Более подробно об устройстве и принципе действия электретных микрофонов можно почитать в статье «Устройство и принцип работы электретных микрофонов».

Электретный капсюльный микрофон CMA-4544PF-W и модуль с микрофоном

Мы воспользуемся готовым модулем, в котором присутствует микрофон, а также минимально необходимая обвязка. Приобрести такой модуль можно здесь.

2Схема подключения микрофона к Arduino

Модуль содержит в себе электретный микрофон, которому необходимо питание от 3 до 10 вольт. Полярность при подключении важна. Подключим модуль по простой схеме:

  • вывод «V» модуля – к питанию +5 вольт,
  • вывод «G» – к GND,
  • вывод «S» – к аналоговому порту «A0» Arduino.

Схема подключения электретного микрофона к Arduino

3Скетч для считывания показаний электретного микрофона

Напишем программу для Arduino, которая будет считывать показания с микрофона и выводить их в последовательный порт в милливольтах.

const int micPin = A0; // задаём пин, куда подключён микрофон void setup() { Serial.begin(9600); // инициализация послед. порта } void loop() { int mv = analogRead(micPin) * 5.0 / 1024.0 * 1000.0; // значения в милливольтах Serial.println(mv); // выводим в порт }

Для чего может понадобиться подключать микрофон к Arduino? Например, для измерения уровня шума; для управления роботом: поехать по хлопку или остановиться.

Некоторые даже умудряются «обучить» Arduino определять разные звуки и таким образом создают более интеллектуальное управление: робот будет понимать команды «Стоп» и «Иди» (как, например, в статье «Распознавание голоса с помощью Arduino»).

4«Эквалайзер»на Arduino

Давайте соберём своеобразный простейший эквалайзер по приложенной схеме.

Схема «эквалайзера» на Arduino, датчике звука и светодиодах

5Скетч «эквалайзера»

Немного модифицируем скетч. Добавим светодиоды и пороги их срабатывания.

const int micPin = A0; const int gPin = 12; const int yPin = 11; const int rPin = 10; void setup() { Serial.begin(9600); pinMode(gPin, OUTPUT); pinMode(yPin, OUTPUT); pinMode(rPin, OUTPUT); } void loop() { int mv = analogRead(micPin) * 5.0 / 1024.0 * 1000.0; // значения в милливольтах Serial.println(mv); // выводим в порт /* Пороги срабатывания светодиодов настраиваются вами экспериментальным методом: */ if (mv < 2100) { // порог срабатывания зелёного светодиода, мВ digitalWrite(gPin, HIGH); digitalWrite(yPin, LOW); digitalWrite(rPin, LOW); } else if (mv < 2125) { // порог срабатывания жёлтого светодиода, мВ digitalWrite(gPin, HIGH); digitalWrite(yPin, HIGH); digitalWrite(rPin, LOW); } else if (mv < 2150) { // порог срабатывания красного светодиода, мВ digitalWrite(gPin, HIGH); digitalWrite(yPin, HIGH); digitalWrite(rPin, HIGH); } }

Эквалайзер готов! Попробуйте поговорить в микрофон, и увидите, как загораются светодиоды, когда вы меняете громкость речи.

Полезный совет

Значения порогов, после которых загораются соответствующие светодиоды, зависят от чувствительности микрофона. На некоторых модулях чувствительность задаётся подстроечным резистором, на моём модуле его нет. Пороги получились 2100, 2125 и 2150 мВ. Вам для своего микрофона придётся определить их самим.

Источник: https://soltau.ru/index.php/arduino/item/377-kak-podklyuchit-datchik-z

Подключение кнопки к ардуино

Подключение датчика кнопки к ардуино требует определенных знаний и навыков. В этой статье мы поговорим о том, что такое тактовая кнопка, что такое дребезг кнопки, как правильно подключать кнопку с подтягивающим и стягивающим резистором, как можно управлять с помощью кнопки светодиодами и другими устройствами.

Кнопка ардуино

Кнопка (или кнопочный переключатель) – самый простой и доступный из всех видов датчиков. Нажав на нее, вы подаете контроллеру сигнал, который затем приводит к каким-то действиям: включаются светодиоды, издаются звуки, запускаются моторы. В своей жизни мы часто встречаемся с разными выключателями и хорошо знакомы с этим устройством.

Тактовые кнопки и кнопки-переключатели

Как обычно, начинаем раздел с простых вещей, интересных только начинающим. Если вы владеете азами  и хотите узнать о различных вариантах подключения кнопки к ардуино – можете пропустить этот параграф.

Что такое кнопка? По сути, это достаточно простое устройство, замыкающее и размыкающее электрическую сеть. Выполнять это замыкание/размыкание можно в разных режимах, при этому  фиксировать или не фиксировать свое положение. Соответственно, все кнопки можно поделить на две большие группы:

  • Кнопки переключатели с фиксацией. Они возвращаются в исходное состояние после того, как их отпустили. При в зависимости от начального состояния разделяют на нормально-замкнутые и нормально-разомкнутые кнопки.
  • Кнопки без фиксации (тактовые кнопки). Они фиксируются и остаются в том положении, в котором их оставили.

Вариантов различных кнопок великое множество, это действительно один из самых распространенных видов электронных компонентов.

Кнопки ардуино для простых проектов

В наших проектах мы будем работать с очень простыми тактовыми кнопками с 4 ножками, которые идут практически в любом наборе ардуино.

Кнопка представляет собой переключатель с двумя парами контактов.

Контакты в одной паре соединены между собой, поэтому больше одного выключателя в схеме реализовать не удастся, но вы можете одновременно управлять двумя параллельными сегментами, это бывает полезно.

В зависимости от ситуации, вы можете создавать как схемы с нормально замкнутыми, так и с нормально разомкнутыми контактами – для этого нужно будет только соответствующим образом выполнить соединение в схеме.

Для удобства работы в комплекте с тактовой кнопкой обычно идет пластмассовый колпачок какого-то цвета, он достаточно очевидно надевается на кнопку и придает проекту менее хакерский вид.

Подключение кнопки Ардуино

Включение и выключение светодиода с помощью кнопки

Давайте начнем с самого простого способа подключения тактовой кнопки. Рассмотрим схему с Arduino в качестве источника питания,  светодиода, ограничительного резистора номиналом 220 Ом и кнопки, которая будет замыкать и размыкать цепь.

При подключении кнопки с двумя парами ножек важно правильно выбрать размыкающие контакты. Посмотрите на изображение внимательно: пары ножек расположены по бокам кнопки.

Сама кнопка квадратная, но расстояния между парами контактов визуально заметны: можно сразу выделить два на одной стороне и два а другой. Так вот, именно между одной «парой» на стороне и будет реализован выключатель.

Для включения в схему мы соединяемся с одним и с другим контактом, между которыми минимальное расстояние. Вторая пара контактов просто дублирует первую.

Если у вас переключатель другого типа, то можете смело выбрать контакты с противоположных углов (на некоторых кнопка делается специальный знак в  виде выемки, по которому можно определить, с какой стороны расположены спаренные контакты). Самый надежный способ определить правильные ножки – это прозвонить контакты тестером.

Сама схема с кнопкой, светодиодом и контроллером Arduino не нуждается в особых пояснениях. Кнопка разрывает цепь, светодиод не горит. При нажатии цепь замыкается, светодиод включается. Если вы перепутаете контакты (включите через замкнутые спаренные контакты кнопки), то кнопка работать не будет, потому что цепь никогда не разомкнется. Просто поменяйте контакты местами.

Подключение кнопки с подтягивающим резистором

Давайте теперь подключим кнопку к ардуино так, чтобы можно было считывать в скетче ее состояние. Для этого воспользуемся следующей схемой.

В скетче мы будем отслеживать факт нажатия и выводить сообщение в монитор порта. Более интересный пример и подробное объяснение самой схемы мы приведем чуть позже.

Следует обратить внимание на сопротивление 10 К, которое мы добавили в этой схеме. Более подробно о его предназначении мы поговорим позже, просто имейте в виду, что такой резистор необходим для правильной работы схемы.

Скетч для кнопки ардуино с подтягивающим резистором:

/* Пример использования тактовой кнопки в ардуино. Кнопка подключена к пину 2.
*/ const int PIN_BUTTON = 2; void setup() { Serial.begin(9600); pinMode(PIN_LED, OUTPUT);
} void loop() { // Получаем состояние кнопки и выводим в мониторе порта int buttonState = digitalRead(PIN_BUTTON); Serial.println(buttonState); delay(50);
}

Подключение кнопки в режиме INPUT_PULLUP

В указанной выше схеме мы использовали резистор, называемый подтягивающим, для формирования определенного уровня сигнала на цифровом порту. Но есть другой способ подключить кнопку без резистора, используя внутренне сопротивление платы ардуино. В блоке setup мы должны всего лишь определить тип пина, к которому подключим кнопку, как INPUT_PULLUP.

pinMode(PIN_BUTTON, INPUT_PULLUP);

Альтернативным вариантом будет выбрать режим пина как OUTPUT и установить на данный порт высокий уровень сигнала. Встроенный подтягивающий резистор подключиться автоматически.

pinMode(PIN_BUTTON, INPUT_PULLUP); digitalWrite(PIN_BUTTON, HIGH);

И все. Можно собрать вот такую сложную схему и работать с кнопкой в скетче.

Мигание светодиода после нажатия на кнопку

В предыдущем примере со светодиодами мы подключили кнопку к плате ардуино и поняли, как она работает. Светодиод включался и выключался, но делал это в совершенно пассивном режиме – сам контроллер здесь был абсолютно лишним, его можно было бы заменить батарейками.

Поэтому давайте сделаем наш новый проект более «интеллектуальным»: при нажатии на кнопку заставим светодиод непрерывно мигать.

Обычной схемой с лампочкой и выключателем этого уже не сделаешь — мы будем использовать мощь нашего микроконтроллера для решения этой пусть и простой, но не тривиальной задачи.

Полная схема проекта изображена на рисунке:

Фрагмент схемы со светодиодом уже хорошо нам знаком. Мы собрали обычный маячок со светодиодом и ограничительным резистором. А вот во второй части мы видим знакомую нам кнопку и еще один резистор. Пока не будем вдаваться в подробности, просто соберем схему и закачаем в ардуино простой скетч. Все элементы схемы  идут в самых простых стартовых наборах ардуино.

/* Скетч для схемы с использованием тактовой кнопки и светодиода Светодиод мигает, пока нажата кнопка. Кнопка подтянута к земле, нажатию соответствует HIGH на входе
*/ const int PIN_BUTTON = 2;
const int PIN_LED = 13; void setup() { Serial.begin(9600); pinMode(PIN_LED, OUTPUT);
} void loop() { // Получаем состояние кнопки int buttonState = digitalRead(PIN_BUTTON); Serial.println(buttonState); // Если кнопка не нажата, то ничего не делаем if (!buttonState) { delay(50); return; } // Этот блок кода будет выполняться, если кнопка нажата // Мигаем светодиодом digitalWrite(PIN_LED, HIGH); delay(1000); digitalWrite(PIN_LED, LOW); delay(1000);
}

Нажимаем и держим – светодиод мигает. Отпускаем – он гаснет. Именно то , что хотели. Хлопаем от радости в ладоши и приступаем к анализу того, что сделали.

Давайте посмотрим на скетч. В нем мы видим довольно простую логику.

  1. Определяем, нажата ли кнопка.
  2. Если кнопка не нажата, то просто выходим из метода loop, ничего не включая и не меняя.
  3. Если кнопка нажата, то выполняем мигание, используя фрагмент стандартного скетча:
    1. Включаем светодиод, подавая напряжение на нужный порт
    2. Делаем нужную паузу при включенном светодиоде
    3. Выключаем светодиод
    4. Делаем нужную паузу при выключенном светодиоде

Логика поведения кнопки в скетче может зависеть от способа подключения с подтягивающим резистором. Об этом мы поговорим в следующей статье.

Дребезг кнопки ардуино

В процессе работы с кнопками мы можем столкнуться с очень неприятным явлением, называемым дребезгом кнопки. Как следует из самого названия, явление это обуславливается дребезгом контактов внутри кнопочного переключателя.

Металлические пластины соприкасаются друг с другом не мгновенно (хоть и очень быстро для наших глаз), поэтому на короткое время в зоне контакта возникают скачки и провалы напряжения.

 Если мы не предусмотрим появление таких «мусорных» сигналов, то будем реагировать на них каждый раз и можем привести наш проект к хаусу.

Для устранения дребезга используют программные и аппаратные решения. В двух словах лишь упомянем основные методы подавления дребезга:

  • Добавляем в скетче паузу 10-50 миллисекунд между полкучением значений с пина ардуино.
  • Если мы используем прерывания, то программный метд использоваться не может и мы формируем аппаратную защиту. Простейшая из них  — RC фильтр с конденсатором и сопротивлением.
  • Для более точного подавления дребезга используется аппаратный фильтр с использованием триггера шмидта. Этот вариант позволит получить на входе в ардуино сигнал практически идеальной формы.

Более подробную информацию о способах борьбы с дребезгом вы можете найти в этой статье об устранении дребезга кнопок.

Переключение режимов с помощью кнопки

Для того, чтобы определить, была ли нажата кнопка, надо просто зафиксировать факт ее нажатия и сохранить признак в специальной переменной.

Факт нажатия мы определяем с помощью функции digitalRead(). В результате мы получим HIGH (1, TRUE) или LOW(0, FALSE), в зависимости от того, как подключили кнопку. Если мы подключаем кнопку с помощью внутреннего подтягивающего резистора, то нажатие кнопки приведет к появлению на входе уровня 0 (FALSE).

Для хранения информации о нажатии на кнопку можно использовать переменную типа boolean:

boolean keyPressed = digitalRead(PIN_BUTTON)==LOW;

Почему мы используем такую конструкцию, а не сделали так:

boolean keyPressed = digitalRead(PIN_BUTTON);

Все дело в том, что digitalRead() может вернуть HIGH, но оно не будет означать нажатие кнопки. В случае использования схемы с подтягивающим резистором HIGH будет означать, что кнопка, наоборот, не нажата.

В первом варианте (digitalRead(PIN_BUTTON)==LOW ) мы сразу сравнили вход с нужным нам значением и определили, что кнопка нажата, хотя и на входе сейчас низкий уровень сигнала. И сохранили в переменную статус кнопки.

Старайтесь явно указывать все выполняемые вами логические операции, чтобы делать свой код более прозрачным и избежать лишних глупых ошибок.

Как переключать режимы работы после нажатия кнопки?

Часто возникает ситуация, когда мы с помощью кнопок должны учитывать факт не только нажатия, но и отпускания кнопки.

Например, нажав и отпустив кнопку, мы можем включить свет или переключить режим работы схемы.

  Другими словами, нам нужно как-то зафиксировать в коде факт нажатия на кнопку и использовать информацию в дальнейшем, даже если кнопка уже не нажата.  Давайте посмотрим, как это можно сделать.

Логика работы программы очень проста:

  • Запоминаем факт нажатия в служебной переменной.
  • Ожидаем, пока не пройдут явления, связанные с дребезгом.
  • Ожидаем факта отпускания кнопки.
  • Запоминаем факт отпускания и устанавливаем в отдельной переменной признак того, что кнопка была полноценно нажата.
  • Очищаем служебную переменную.

Как определить нажатие нескольких кнопок?

Нужно просто запомнить состояние каждой из кнопок в соответствующей переменной или в массиве ардуино. Здесь главное понимать, что каждая новая кнопка – это занятый пин.

Поэтому если количество кнопок у вас будет большим, то возможно возникновение дефицита свободных контактов.

Альтернативным вариантом является использование подключения кнопок на один аналоговый пин по схеме с резистивным делителем. Об этом мы поговорим в следующих статьях.

Источник: https://ArduinoMaster.ru/datchiki-arduino/knopka-arduino/

Автоматические жалюзи на Arduino

Идея автоматизации жалюзи зародилась в моей голове достаточно давно.

Особенно сильно этому способствовало специфичное расположение окон моей комнаты: после обеда в мои окна бьет яркий солнечный свет, мешающий работе за компьютером и отбивающий всяческое желание заниматься продуктивной деятельностью.

В тоже время, находиться в комнате с закрытыми створками жалюзи удовольствие, на мой взгляд, сомнительное.

Мне хотелось получить систему, позволяющую автоматически менять угол поворота створок, в зависимости от интенсивности солнечного света, а так же обладающую возможностью ручного управления с дистанционного пульта.
Первой задачей была автоматизация самих створок. Необходим двигатель, осуществляющий поворот и датчик, который будет показывать в каком положение находятся сами створки жалюзи.

Главным препятствием установки двигателя был штатный червячный привод изменения угла поворота створок. Его наличие блокировало возможность внутренней установки мотора, в то время как размещение двигателя снаружи, на месте штатной ручки, также было весьма затруднительно. В конечном итоге было принято решение целиком демонтировать ручной механизм и установить мотор во внутреннюю часть жалюзи.

В качестве двигателя был использовал мотор-редуктор GM12-N20VA Micro Geared Motor:

Данный двигатель обладает следующими характеристиками:

  • Рабочее напряжение: 2 — 5 В
  • Номинальное напряжение: 5 В
  • Передаточное отношение: 100:1
  • Скорость без нагрузки: 145 об/мин
  • Ток без нагрузки: 40 мА
  • Скорость под нагрузкой: 100 об/мин
  • Ток под нагрузкой: не менее 150 мА
  • Крутящий момент под нагрузкой: 0,2 кг/см
  • Ток при блокировке: 520 мА
  • Крутящий момент: 0,78 кг/см
  • Размер (Д х Ш х В): 24 x 12 x 10 мм
  • Выходной вал: D-образный, d=3 мм, длина 10 мм.

Сам выходной вал мотора оказался немного меньше отверстия в механизме жалюзи, поэтому, для обеспечения плотного соединения, на вал была напаяна термоусадка.

Для управления мотором я использовал довольно распространенную, и давно зарекомендовавшую себя микросхему двухканального драйвера двигателей L293D.

К выходам Output 1 и Output 2 микросхемы подключен мотор, в зависимости от сигналов на ногах Input 1 и Input 2 двигатель крутится в одну или другую сторону, аналогично и для второго канала.

С датчиком положения оказалось все не так просто, как я предполагал ранее. Из всех вариантов его конструкции я остановился на потенциометре, установленным на одну ось с двигателем, который в последствие был подключен к АЦП контроллера.

К моему удивлению с датчиком освещенности проблем оказалось меньше всего. Я использовал солнечную батарею, извлеченную из недорогого светодиодного фонарика, купленного в хозяйственном магазине. Сама крышка фонарика послужила неплохим корпусом.

Для дистанционного управления я использовал ИК-приемник TSOP31236 с пультом из набора Мастер КИТ, но в данном случае можно использовать любой другой.

Целиком схема выглядит следующим образом:

В зависимости от данных, полученных на АЦП с датчика освещенности, створки жалюзи перемещаются в то или иное положение, при этом текущее положение створок контролируется датчиком, в качестве которого выступает потенциометр, подключенный к аналоговому входу Adruino.

Для работы с ИК пультом я не стал изобретать велосипед и воспользовался уже готовой библиотекой IRremote.

Вот собственно видео иллюстрирующее работу:

В виду отсутствия солнечной погоды, чувствительность датчика была снижена.

В перспективе хотелось бы перевести систему на более “серьезный” микроконтроллер, разместить все элементы компактно, на одной печатной плате и спрятать в корпус.

Источник: http://www.pvsm.ru/arduino/42652

Операции аналогового ввода—вывода, работа со звуком. Знакомство с Arduino. (часть 3)

Р/л технология

Главная  Радиолюбителю  Р/л технология

Хотя цифровые операции ввода-вывода позволяют решать широкий круг задач, однако наличие в микроконтроллере платы Arduino встроенного аналого-цифрового преобразователя (АЦП) и возможность вывода аналоговых сигналов с помощью широтно-импульсной модуляции (ШИМ) обеспечивают работу с аналоговыми датчиками и всевозможными исполнительными устройствами, воздействующими на объект пропорционально управляющему сигналу.

Строго говоря, в режиме вывода все линии портов Arduino могут передавать только дискретные сигналы, имеющие лишь два состояния. Но микроконтроллер способен изменять эти состояния очень быстро, генерируя прямоугольные импульсы.

Если подать эти импульсы на какое-либо устройство, обладающее инерционными свойствами, то оно станет вести себя так, будто подаваемое на него напряжение постоянное, равное среднему значению импульсного, и меняется плавно, а не скачками между высоким и низким логическими уровнями.

В режиме ШИМ порт формирует импульсный сигнал постоянной частоты и переменной скважности (это отношение периода следования импульсов к их длительности).

Часто вместо скважности оперируют обратной ей величиной — коэффициентом заполнения, который можно изменять от 0 (нет импульсов) до 100% (импульсы следуют, слившись, без пауз).

Следовательно, хотя в каждый отдельный момент выходное напряжение соответствует высокому или низкому логическому уровню, его среднее значение пропорционально коэффициенту заполнения. Если к этому выходу подключить обычный мультиметр, он покажет это значение (конечно, если частотаимпульсов достаточно высока).

В Arduino UNO в режиме ШИМ могут работать выходы D3, D5, D6, D9, D10 и D11. Обычно на плате они помечены знаками «~» или аббревиатурами «PWM». Следует заметить, что у плат Arduino других модификаций число таких выходов может быть больше или меньше.

В простейшем случае ШИМ можно применить для управления яркостью свечения светодиода. Этот прибор практически безынерционен, но человеческое зрение обладает достаточной инерционностью, чтобы последовательность быстрых вспышек светодиода воспринималась как непрерывное свечение с зависящей от коэффициента заполнения яркостью.

Дискретные выходы, способные формировать ШИМ, настроены на использование этого режима по умолчанию, поэтому вызывать функцию pinMode() для их работы в таком режиме не нужно.

Для установки коэффициента заполнения ШИМ-сигнала имеется стандартная функция analogWrite(N, M), где N — номер вывода, M — число, пропорциональное требуемому коэффициенту заполнения.

Оно должно лежать в интервале от 0 до 255, причём 0 соответствует нулевому коэффициенту заполнения (навыходе постоянный низкий уровень), 255 — коэффициенту заполнения 100 % (на выходе постоянный высокий уровень). Временные диаграммы выходного напряжения при некоторых значениях M и соответственно коэффициента заполнения Кз показаны на рис. 1.

Рис. 1. Временные диаграммы выходного напряжения

Для примера рассмотрим приведённую в табл. 1 программу, которая постепенно увеличивает яркость свечения светодиода, подключённого к цифровому выходу D9, а затем постепенно уменьшает её.

Она основана на стандартном примере examples3.AnalogFading из комплекта поставки Arduino IDE.

Перебор значений коэффициентазаполнения импульсов реализован здесь с помощью уже рассмотренных в [1] операторов цикла for.

Таблица 1.

Для приёма аналоговых сигналов от внешних устройств в Arduino предназначены входы A0-A5, по умолчанию установленные в нужное для этого состояние, так что дополнительной инициализации не требуется. АЦП, встроенный в Arduino UNO, формирует 10-разрядные двоичные коды и входное напряжение, лежащее в интервале от 0 до +5 В, преобразует в целое число от 0 до 1023 (210-1).

Для считывания результата преобразования служит функция analogRead(N), где N — номер аналогового входа.

К аналоговым входам Arduino можно подключать разнообразные датчики, выходное напряжение которых пропорционально измеряемой величине (переменные резисторы, терморезисторы, фоторезисторы и др.). Однако нужно помнить, что на аналоговый вход можно подавать напряжение лишь от 0 до +5 В.

Если выходное напряжение датчика лежит в другом интервале или оно отрицательной полярности, сигнал необходимо предварительно уложить в указанный интервал.

Опрос аналогового входа выполняется с частотой менее 10 кГц [2], что может оказаться недостаточным для анализа некоторых быстроизменяющихся сигналов.

Наличие аналоговых входов позволяет превратить Arduino в простейший цифровой вольтметр, измеряющий постоянное напряжение от 0 до +5 В и передающий результат измерения в компьютер. Для этого достаточно загрузить в Arduino программу, приведённую в табл. 2.

Таблица 2

Обратите внимание, что в программе константами заданы образцовое напряжение АЦП Uref (в милливольтах) и коэффициент пересчё-тавыходного кодаАЦП в напряжение Ku. Значение коэффициента вычисляется делением заданного образцового напряжения на 1023.

Коэффициент обычно дробный, поэтому константа Ки имеет тип float (число с плавающей запятой). Константа Uref имеет такой же тип для правильного вычисления коэффициента.

Поскольку в правой части формулы находятся только константы, вычисляет коэффициент не микроконтроллер, выполняя программу, а сам компилятор на этапе её трансляции.

Всё это позволяет повысить точность вольтметра, измерив мультиметром точное значение образцового напряжения на выводе Uref платы Arduino и записав его в программу, присвоив константе Uref. О других способах повысить точность аналого-цифрового преобразования можно прочитать в [3, 4].

При работе рассматриваемой программы на плате мигает светодиод TX, сигнализирующий о передаче информации через последовательный порт. Светодиод RX не светится, так как компьютер ничего не передаёт в ответ. Встроенный терминал Arduino IDE отображает принятую информацию (рис. 2) — результаты измерения напряжения гальванической батареи 3332.

Рис. 2. Окно программы

Arduino может подавать не только световые, но и звуковые сигналы. Для этого к одному из его выходов необходимо подключить пьезоизлучатель звука, например ЗП-1 (рис. 3).

Рис. 3. Подключение пьезоизлучателя звука

Для работы со звуком предусмотрена специальная функция tone(N, F, T), где N — номер вывода, на котором будут сформированы прямоугольные импульсы; F — частота звука, Гц; T — длительность звука, мс. Последний параметр не обязателен. В его отсутствие звук будет непрерывным. Чтобы выключить его, предусмотрена функция noTone(N).

Конечно, пьезокерамический излучатель звука сложно назвать устройством высококачественного воспроизведения, а формируемый микроконтроллером сигнал имеет прямоугольную форму, тем не менее использование этих функций позволяет исполнять несложные мелодии. Пример приведён в табл. 3. Это немного изменённая программа examples 02.

Digital oneMelody, входящая в комплект среды разработки Arduino IDE. Поскольку задавать вручную частоту каждой ноты мелодии неудобно, к программе в её заголовке директивой #include подключён файл pitches.h. Эта операция равносильна включению в программу полного текста этого файла.

В рассматриваемом случае он содержит список названий нот, которые можно воспроизвести, и их частот.

Таблица 3

Излучатель звука должен быть подключён к выходу D8.

Для программы мелодия — это последовательность однотипных констант (значений частоты), которые удобно объединить в массив — пронумерованный список однотипных элементов. При объявлении массива нужно либо перечислить все его элементы, либо указать их общее число. Учтите, что нумерация элементов массива всегда начинается с нуля.

В рассматриваемом примере использованы два массива: int melody[] содержит названия нот мелодии, int note Durations[] — их длительность в миллисекундах. Для обращения к элементу массива указывают его имя с заключённым в квадратные скобки порядковым номером.

Чтобы иметь возможность легко менять число нот в мелодии, оно вычисляется с использованием функций sizeof(V), возвращающих число байтов, занимаемых её аргументом (переменной или их массивом) в памяти микроконтроллера. В рассматриваемом случае массив melody занимает 16 байт, а длина его элементов типа int — два байта.

Поэтому переменная Note получает значение 8 и именно столько раз будет повторено тело цикла for, поочерёдно воспроизводящее ноты.

Если к массиву melody[] добавить несколько нот, соответственно изменится и значение Note. Нужно только не забыть дополнить массив noteDurations[] длительностями звучания этих нот.

Поскольку мелодия исполняется один раз, все необходимые для этого операции помещены внутрь функции setup().

Для повторного исполнения нужно привести микроконтроллер в исходное состояние, нажав на находящуюся на плате Arduino кнопку RESET

Рассмотренные в статье программы для Arduino можно скачать здесь.

Литература

1. Лекомцев Д. Arduino. Операции цифрового ввода-вывода. — Радио, 2016, № 8, с. 51-54.

2. Аналоговые измерения с Arduino. — URL: http://robotosha.ru/arduino/analog-measurements-arduino.html (02.06.16).

3. Arduino Language Reference. Analog I/O — analogReference(). — URL: https://www. arduino.cc/en/Reference/AnalogReference (02.06.16).

4. Функция analogReference(). — URL: http:// arduino.ru/Reference/AnalogReference (02.06.16).

Источник: http://www.radioradar.net/radiofan/radiofan_technology/introduction_arduino_part3.html

Ссылка на основную публикацию