Самодельный таймер мытья рук на основе Arduino
31.03.2020 Занимательная робототехника
Название проекта: Wash-A-Lot-Bot на основе ArduinoПлатформа: Arduino
В нынешней ситуации с коронавирусом рекомендуется регулярно мыть руки в течение 20 секунд. Звучит достаточно просто, но вы действительно каждый раз соблюдаете эту рекомендацию? Сделайте автоматический таймер с датчиком для удобного визуального контроля.
Авторы проекта Гаутам Бозе и Лукас Очоа создали такое устройство, исопльзуя популярную платформу Arduino Uno. Проект назвали Wash-A-Lot-Bot. устройство обнаруживает руки человека с помощью ультразвукового датчика, а затем устанавливает таймер от 0 до 20, используя микро-сервопривод.
Эту простую настройку можно выполнить всего лишь с помощью ножниц и ленты, что делает ее отличным способом узнать об Arduino и программировании, находясь дома.
Использованные компоненты: Arduino UNO, SG-90 Micro Servo, ультразвуковой датчик HC-SR04, провода, бумагаСайт проекта: https://www.hackster.io/331510/wash-a-lot-bot-a-diy-hand-washing-timer-2df500
Другие проекты на этой платформе:
- Робот-миньон-копилка Arduino
- Говорящий робот-пылесос. Универсальное улучшение на Arduino
- Шагающая тыква. Arduino-робот для Хэллоуина
- Sourino — самодельная роботизированная мышь
- Двуногий робот из Arduino, LEGO и деталей 3D печати
- Шестиногий шагающий робот из Arduino, LEGO и деталей 3D печати
- Робот-художник на базе Arduino Uno
- Самодельный робот-собака Spot Micro
- Сферический четвероногий робот Arduino
- Виртуальная игра, управляемая настоящим велосипедом (Arduino)
- Четверногий Arduino-робот mechDOG
- Велосипед, подключенный к Google Street View через Arduino
- Учебный набор начинающего ситифермера
- Робот на Arduino, управляемый с помощью жестов
- Как сделать аниматронный хвост
- Вездеход из Lego с видео и bluetooth на Raspberry Pi
- Робот Juno: изучай Arduino и программирование
- Робот-манипулятор из настольной лампы IKEA
- Arduino-робот, объезжающий препятствия
- Роботизированная интеллектуальная система — РИС
- Серво-выключатель света для умного дома
- Робот-рыба на Arduino
- Сделай сам большого человекоподобного робота
- Сноуборд в виртуальной реальности с Arduino и Google Cardboard
- Open Source проект робота на Arduino
- Робот-компаньон на основе Arduino и Android-смартфона
- Робот миньон из яйца от Kinder-сюрприза и Arduino
- Робот-собака на Arduino
- Робот WALL-E на Arduino
- Робот-Железяка 1, управляемый по Bluetooth
- Собирай кубик Рубика с Arduino UNO
- ArGo — автомобиль из конструктора Lego Technic и Arduino
- Arduino робот-сортировщик Skittles, напечатанный на 3D-принтере
- Полноразмерный робот T-800 из фильма Терминатор
- Робот Гадкий утенок
- Робот-шлем для чистки зубов
- Noodlebot — шагающий робот на базе Arduino
- Робот телеприсутствия из arduino и нетбука
- Arduino-робот жук Ringo
- Arduino-Lego танк
- Робот для игры в воздушный хоккей из частей для 3D принтера
- Arduino драм машина (Yellow Drum Machine)
- Робот-гуманоид Halley: Ambassador Robot 001
- MobBob — шагающий робот-смартфон
- PopPet — оригинальный образовательный робот
- Робот, рисующий по фотографии
- Робот R2D2, напечатанный на 3D-принтере
- Робот, танцующий как Майкл Джексон
- Запускай кофе-машину, используя Twitter
- О’кей Google, Сезам, открой дверь
- Марсоход, напечатанный на 3D-принтере
- Шагающий робот из палочек от мороженого
Перейти в каталог DIY-проектов роботов
Как добавить робопроект в каталог? Теги: arduino проект, DIY, headline, сделай самКухонный таймер на Arduino (1)
Когда механический кухонный таймер пару раз совершил жесткую посадку на пол и начал заедать при отсчете времени, я понял: есть отличный шанс заменить его на что-то электронное.При нынешнем развитии микропроцессорной техники потенциально может существовать все, что душе угодно, но… Как назло — попадается либо не совсем то, что надо, либо что-то перенавороченное, где много лишнего. Логичный выход для тех, у кого есть свободное время — создать устройство самому.
Итак, прежде всего — подберем компоненты:
- дисплей для отображения времени
- пара кнопок для управления
- зуммер для привлечения внимания хозяйки
- корпус, в который все это поместится
- источник питания
Наиболее хорошо для этой цели подходит Arduino Pro: основные разъемы не установлены, можно поставить ровно столько, сколько надо (а также именно то, что требуется — вилки или колодки, нужный разъем питания):
За неимением такого замечательного девайса, придется собирать на макетке. Как обычно — ATmega8-16PU, кварц 16 МГц + 2 конденсатора 22пФ, притянуть сброс через 10К к Vcc, схема птиания на L7805. Поскольку я постоянно собираю Arduino / Freeduino, все это у меня имеется в избыточном количестве.
С эстетической точки зрения, лучше устанавливать часовой дисплей с «двоеточием» по центру, которое мигает раз в секунду при отсчете времени. В минимальном варианте достаточно просто двух цифр с числом оставшихся минут. Поглядывать на таймер надо издалека, поэтому размер и яркость цифр имеют значение — лучше всего подойдет светодиодный дисплей. Удобно использовать индикатор, у которого одноименные выводы уже соединены — все равно мы будем отображать методом мультепликсирования. У меня был красный семисегментный CA56-21EWA (Kingbright), с общим анодом:
В качестве зуммера можно использовать пьезоизлучатель. Часто на материнских платах можно встретить такой вариант:
Это пятивольтовый KPX-G1205B (Kepo Electronics).
В него встроен генератор, позволяющий издавать звуковое колебание заданной частоты простой подачей разности потенциалов на его выводы.
Кнопки могут быть как тактовые, так и с креплением на корпус. Идеально подойдут влагозащищенные, но это влетит в копеечку. Я выбрал компромиссные SWT-9 с разноцветными колпачками:
Для включения питания идеально подходит классический тумблер MTS-102:
Среди корпусов для РЭА, которые я мог заказать у поставщиков, мне приглянулись черные пластиковые, на защелках. Брать размер 70 х 40 мм я побоялся (как потом выяснилось, абсолютно верно), но вот 90 х 56 мм уже выглядело для такой схемы вполне комфортно, тем более, что в высоту он 30 мм, а значит — дисплей с кнопками и контроллер можно разместить на двух разных платах, соединив их при помощи PLS/PBS:
Правда, придется изрядно поработать напильником, чтобы вытащить наружу кнопки и индикатор (разъем питания и тумблер легко размещаются сбоку, надо вырезать заранее заготовленные утоньшения для ввода кабеля).
Настало время рисовать схему в Eagle, но прежде подсчитаем, сколько потребуется портов ввода/вывода.
Семисегментная шина требует 7+1=8 выходов: восьмой в данном случае управляет двумя точками по центру. Один сигнал на каждое знакоместо: +4, итого уже 12. Один выход потребуется для пьезоизлучателя, два — для подключения кнопок. В сумме надо 15, а у Arduino всего 13 цифровых выходов, из которых категорически не хотелось бы занимать 0 и 1 — там UART, через которую заливается скетч.
На наше счастье, аналоговые выходы можно перепрограммировать в цифровые оператором
Для начала соберем такую схему на мактной плате:
Продолжение следует…
Таймер обратного отсчета Arduino с настройками
Элементы, используемые в этом проекте
Аппаратные компоненты
DFRobot Gravity: цифровая кнопка (желтая) | х 2 | ||
Перемычки (общие) | х 1 | ||
Макет (общий) | х 1 | ||
Светодиод (общий) | х 1 | ||
Резистор 1кОм | х 1 | ||
Светодиодный дисплей TM1637 | х 1 | ||
Ардуино УНО | х 1 |
Приложения и онлайн-сервисы
Визуино | ||
Ардуино IDE |
Story
В этом уроке мы научимся делать таймер обратного отсчета, в котором вы можете установить время одной кнопкой и запустить таймер другой кнопкой. Когда таймер достигнет нуля, светодиод начнет мигать. Вместо светодиода можно подключить что угодно, например, реле или любой другой модуль.
Смотри видео!
Шаг 1: Что вам понадобится
Шаг 2: Схема
- Подключите контакт светодиодного дисплея [CLK] к цифровому контакту Arduino [10]
- Подключите контакт светодиодного дисплея [DI0] к цифровому контакту [9] Arduino
- Подключите контакт светодиодного дисплея [GND] к контакту Arduino [GND]
- Подключите контакт светодиодного дисплея [VCC] к контакту Arduino [5V]
- Подключите контакты модуля кнопок 1 и модуля кнопок 2 [Vcc] к контактам Arduino [5 В]
- Подключите контакты модуля кнопок 1 и модуля кнопок 2 [GND] к контактам Arduino [GND]
- Подключите контакт модуля кнопки 1 [Out] к цифровому контакту Arduino [4]
- Подключите контакт модуля 2 кнопки [Out] к цифровому контакту Arduino [5]
- Подключите цифровой контакт Arduino [7] к резистору 1 кОм
- Подключите другую сторону резистора к положительному контакту светодиода [+]
- Подключите отрицательный контакт светодиода [-] к контакту Arduino [GND]
Шаг 3: Запустите Visuino и выберите тип платы Arduino UNO.
Загрузите бесплатную версию или зарегистрируйтесь для получения бесплатной пробной версии.Запустите Visuino, как показано на первом рисунке. Нажмите кнопку «Инструменты» на компоненте Arduino (рисунок 1) в Visuino. Когда появится диалоговое окно, выберите «Arduino UNO», как показано на рисунке 2
Шаг 4. В Visuino добавьте компоненты 0113
- Добавить » TM1637 7-сегментный дисплей 4-значный модуль + 2 вертикальные точки ( CATALEX) » компонент
- Добавить « Счетчик прямого/обратного счета » компонент
- Добавить « Генератор импульсов » компонент
- Добавить » Разделить целое число на значение » компонент
- Добавить « Умножение целого числа на значение » компонент
- Добавить » Вычесть целое значение » компонент
- Добавить « Счетчик » компонент
- Добавить « Toggle(T) Flip-Flop » компонент
- Добавить 2X » Кнопка «Debounce» » Компоненты
- Добавить компонент « Сравнить целочисленное значение »
Шаг 5.
Компоненты Visuino Connect1 / 5
- Подключите « PulseGenerator1 » вывод к « UpDownCounter1 » контакт вниз
- Подключите вывод « UpDownCounter1 » к выводу « DivideByValue1 » и выводу « SubtractValue1 » к входу .
- Подключите контакт « DivideByValue1 » к контакту « MultiplyByValue1 » In и контакту « Display1 » > «Integer Display 7 Segments1» In
- Подключить » MultiplyByValue1 » вывод на » SubtractValue1 » значение контакта
- Подключите вывод « SubtractValue1 » к выводу « Display1 » > «Integer Display 7 Segments2» на входе
- Подсоедините контакт « Display1 » Clock к цифровому контакту Arduino 10
- Подключите данные контакта « Display1 » к цифровому контакту 9 Arduino
- Подключите цифровой выход Arduino [4] к контакту « Button1 » [In] .
- Соединить Цифровой выход Arduino , контакт [5] на контакт « Button2 » [In]
- Подключите контакт « Button1 » [Out] к контакту « Counter1 » [In] и контакту « TFlipFlop1 » [Reset]
- Подключите контакт « Button2 » [Out] к контакту « TFlipFlop1 » [Clock]
- Подключите контакт « TFlipFlop1 » [Out] к контакту « PulseGenerator1 » [Enabled]
- Подключите контакт « Counter1 » [Out] к « UpDownCounter1 » сначала к контакту [Reset], а затем также к контакту [Initial Value]
- Подключите « UpDownCounter1 » к контакту « CompareValue1 » [In]
- Подключите контакт « CompareValue1 » [выход] к цифровому контакту « Arduino » [7], этот контакт будет использоваться для включения светодиода на .
- Подключите контакт « CompareValue1 » [Out] сначала к контакту « Counter1 » [Reset], а также к контакту « UpDownCounter1 » [Reset]
Шаг 6: Сгенерируйте, скомпилируйте и загрузите код Arduino
В Visuino внизу щелкните вкладку «Сборка», убедитесь, что выбран правильный порт, затем нажмите кнопку «Скомпилировать/создать и загрузить».
Шаг 7: Воспроизведение
Если вы включите модуль Arduino, светодиодный дисплей покажет 00:00, если вы начнете нажимать кнопку .a (подключена к контакту 4), время на дисплее будет увеличиваться на 1 секунду каждый раз, как только вы установите время, нажмите другую кнопку, чтобы начать обратный отсчет. При нулевом обратном отсчете загорится светодиод.
Поздравляем! Вы завершили свой проект с Visuino. Также прилагается проект Visuino, который я создал для этого урока, вы можете скачать его и открыть в Visuino: https://www.visuino.eu
Шаг 8: В Visuino Set Components
- Выберите «Display1» и в окне свойств установите для «Points» значение True .
- Дважды щелкните компонент «Display1» и в окне «Digits»
- перетащите «Целочисленный дисплей 7 сегментов» на левую сторону
- В левой части окна «Цифры» выберите «Целочисленное отображение 7 сегментов 1» и в окне свойств установите «Количество цифр» на 2
- перетащите другой «целочисленный дисплей 7 сегментов» на левую сторону
- В левой части окна «Цифры» выберите «Целочисленное отображение 7 сегментов2» и в окне свойств установите «Счетчик цифр» на 2 и «Ведущие нули» на «Истина»
- Закрыть окно «Цифры»
- Выберите «UpDownCounter1» и в окне свойств установите: «Исходное значение», щелкните значок булавки и выберите «Целое SinkPin» «Макс. > Перевернуть» на «Ложь» «Мин. > Перевернуть» на «Ложь» и «Минимальное значение» на 0.
- Выберите «DivideByValue1» и в окне свойств установите значение 60
- Выберите «MultiplyByValue1» и в окне свойств установите значение 60
- Выберите «SubtractValue1», а в окне свойств выберите «Значение», щелкните значок булавки и выберите «Integer SinkPin».
- Выберите «PulseGenerator1» и в окне свойств выберите «Enabled» и щелкните значок булавки, выберите «Boolean SinkPin» и установите для параметра «Enabled» значение False
CAD, корпуса и нестандартные детали
Visuino File
Перейти к загрузке
Код
Файл Visuino
Загрузите файл Visuino нижеКредиты
Рон
Разработчик Arduino
Подписаться Your feed can be found by clicking on ‘Your account’. We will also email you (max twice a week) to notify you of any new content that is available in your feed. This can be disabled within your account settings.»/>
Программный таймер FreeRTOS с Arduino
Оставить комментарий / 11 апреля 2022 г.
В этом сообщении блога мы узнаем о программном таймере в FreeRTOS и используем программный таймер для отправки данных в Serial Monitor каждую 1 секунду. Ранее мы узнали, что можно использовать функцию vTaskDelay() для перевода задачи в заблокированное состояние на определенный период времени. Вместо того, чтобы переводить задачу в состояние «Заблокировано», мы научимся планировать выполнение фрагмента кода в определенный интервал с помощью таймера.
Программный таймер freeRTOSПрежде чем мы начнем использовать программный таймер, нам нужно изучить несколько понятий. Во-первых, мы кратко поговорим о функции обратного вызова программного таймера. Функция обратного вызова выполняется, когда таймер истекает. Прототип функции выглядит как void ATimerCallback(TimerHandle_t xTimer). Мы знакомы со способом использования дескриптора для ссылки на сущность, вот дескриптор таймера. Ожидается, что этот дескриптор является значением, возвращаемым при создании таймера, что мы скоро увидим. Функция обратного вызова может быть вызвана только один раз или многократно в зависимости от типа таймеров. Для однократного таймера функция обратного вызова вызывается только один раз, когда таймер истекает. Для таймера с автоматической перезагрузкой функция обратного вызова вызывается снова и снова каждый раз, когда таймер истекает, пока таймер не будет остановлен вызовом xTimerStop().
Программный таймер может находиться в одном из состояний: бездействующем или работающем. Если таймер создан, но не запущен, он находится в неактивном состоянии. В противном случае таймер работает и считает, когда он истекает, выполняется функция обратного вызова. Обратите внимание, что таймер учитывает количество тактов ядра. Помимо двух доступных состояний программного таймера, также важно знать контекст, в котором работает программный таймер. Программный таймер запускается в задаче, называемой задачей демона. Задача демона — это задача, которая создается автоматически при запуске планировщика. Она аналогична любым другим задачам приложения, то есть имеет собственный стек и приоритет. Время запуска задачи демона зависит от ее приоритета, который определяется параметром configTIMER_TASK_PRIORITY. Задача демона и задача приложения взаимодействуют друг с другом через очередь. Когда задача приложения вызывает функцию API программного таймера, например xTimerStart(), задача приложения выполняет запись в очередь команд таймера. Когда задача демона переходит в очередь на запуск, она считывает очередь и обрабатывает команду.
Программный таймер API s Создание таймераКак и ожидалось, для использования программного таймера его необходимо сначала создать. Таким образом, мы можем ожидать функцию xTimerCreate, которая возвращает дескриптор таймера, на который мы можем ссылаться. Какие параметры нам нужно передать в функцию xTimerCreate для инициализации таймера? Если следовать приведенному выше обсуждению, нам потребуются как минимум следующие параметры: количество тиков, определяющее период таймера, тип таймера (одиночный выстрел или автоматическая перезагрузка) и функция обратного вызова. На самом деле нам все еще нужно передать еще два аргумента, как показано ниже:
Имя pcTimerName является описательным именем для целей отладки и должно быть удобочитаемым именем. pvTimerID — это значение идентификатора таймера. Функция xTimerCreate возвращает NULL, если таймер не может быть создан, и возвращает дескриптор таймера, если он успешно создан.
В нашем примере мы хотим создать таймер с периодом в 1 секунду, и в функции обратного вызова мы будем отправлять данные в Serial Monitor. Чтобы создать таймер, мы можем использовать xTimerCreate следующим образом:
Запуск таймераДля запуска таймера используется функция xTimerStart(). Функция xTimerStart() принимает два аргумента. Первый аргумент — это дескриптор таймера для запуска, второй аргумент — это xTicksToWait, который указывает, как долго вызывающая задача должна находиться в состоянии Blocked для ожидания, если очередь команд таймера уже заполнена. Чтобы запустить наш timer1, мы можем вызвать xTimerStart(timer1, 0). xTimerStart() возвращает pdPASS, если таймер может работать, или pdFAIL, если таймер не может быть запущен из-за того, что очередь команд таймера уже заполнена.
В нашем примере мы будем использовать только две функции API: xTimerCreate и xTimerStart для реализации функции отправки данных в Serial Monitor каждую секунду. Все, что нам нужно сделать, это инициализировать таймер на прерывание каждую 1 секунду, а в функции обратного вызова таймера мы отправляем данные в Serial Monitor. Код показан ниже
Скомпилируйте и загрузите этот код с помощью Arduino IDE и откройте Serial Monitor, вы увидите следующий вывод:
Serial Monitor output with Software Timer прерывает каждую 1 секунду Другие функции APIКроме xTimerCreate и xTimerStart существуют и другие функции API
- xTimerStop() для остановки таймера
- xTimerReset() для сброса таймера
- xTimerChange Period() для изменения периода таймера
Как только вы поймете основной принцип программного таймера, описанный выше, использование этих функций API станет относительно простым.