ESP32: ПОДКЛЮЧАЕМ ДАТЧИК С ДИСКРЕТНЫМ ВЫХОДОМ
Что нам понадобится?
Для экспериментов с подключением дискретного датчика к ESP32 нам понадобится сама плата ESP32 DEVKIT V1, макетная плата, соединительные проводники штекер-гнездо DuPont и кабель micro USB для подключения ESP32 к компьютеру. В качестве дискретного датчика используем популярный модуль инфракрасного датчика обхода препятствий.
Виды датчиков
Все датчики делятся на аналоговые, дискретные и цифровые. Это зависит от типа выходной величины (выходного сигнала) датчика.
Дискретные датчики выдают дискретный (прерывистый) выходной сигал, который может иметь только два значения. Чаще всего это логический "0" (LOW LEVEL) и логическая "1" (HIGH LEVEL). Примером такого датчика может являться обычная кнопка, имеющая состояния замкнута и незамкнута.
Аналоговые датчики выдают выходной сигнал в виде непрерывно изменяющейся величины. Например, аналоговый звуковой датчик может иметь выходной аналоговый сигнал в виде изменяющегося напряжения в диапазоне от 0 до 5 вольт. Аналоговые датчики более точны, но аналоговый сигнал более подвержен помехам. Преобразование аналогового сигнала в цифровой влечет за собой частичную потерю данных.
Цифровые датчики генерируют на выходе сигналы, состоящие из битов. Примером цифрового датчика может быть датчик влажности и температуры DHT11 или цифровой микрофон INMP441 с интерфейсом I2S.
Дискретные датчики выдают дискретный (прерывистый) выходной сигал, который может иметь только два значения. Чаще всего это логический "0" (LOW LEVEL) и логическая "1" (HIGH LEVEL). Примером такого датчика может являться обычная кнопка, имеющая состояния замкнута и незамкнута.
Аналоговые датчики выдают выходной сигнал в виде непрерывно изменяющейся величины. Например, аналоговый звуковой датчик может иметь выходной аналоговый сигнал в виде изменяющегося напряжения в диапазоне от 0 до 5 вольт. Аналоговые датчики более точны, но аналоговый сигнал более подвержен помехам. Преобразование аналогового сигнала в цифровой влечет за собой частичную потерю данных.
Цифровые датчики генерируют на выходе сигналы, состоящие из битов. Примером цифрового датчика может быть датчик влажности и температуры DHT11 или цифровой микрофон INMP441 с интерфейсом I2S.
Модуль инфракрасного датчика обхода препятствий
Расположение выводов модуля инфракрасного датчика
Чем ближе к датчику находится объект, от которого отражается инфракрасное излучение, тем выше интенсивность отраженного потока на фототранзисторе. Количество отраженного излучения зависит от цвета и фактуры поверхности, от которой оно отражается. Чем поверхность более гладкая и светлая, тем больше излучения от нее отражается. От черных и матовых поверхностей отражение минимальное. Таким образом, расстояние обнаружения препятствий может колебаться от 2 до 15 сантиметров.
Схема подключения модуля инфракрасного датчика
Монтажная схема подключения приведена в начале статьи. Соединяем контакты GND на плате микроконтроллера и плате модуля при помощи соединительного кабеля DuPont. Контакт VCC модуля соединяем с контактом 3V3 микроконтроллера. А контакт OUT на модуле соединяем, например, с выводом D18 (GPIO18) микроконтроллера.О том, к каким еще выводам платы микроконтроллера можно подключать датчики, читайте на wiki-странице "ESP32 распиновка (pinout)".
Проверяем срабатывание датчика в цикле
Когда происходит срабатывание датчика, на выводе D18 (GPIO18) появляется сигнал низкого уровня (логический "0"). Этот сигнал мы будем проверять в цикле нашей программы и включать светодиод, расположенный на плате ESP32 и подключенный к выводу GPIO2. Программа на языке MicroPython очень похожа на программу для проверки нажатия кнопки, приведенную в статье "ESP32: Подключаем кнопку", и может выглядеть следующим образом:# из модуля machine импортируем класс Pin
from machine import Pin
# создаем объект Pin с именем led,
# указываем идентификатор контакта GPIO2
# и задаем для контакта режим выхода Pin.OUT
led = Pin(2, Pin.OUT)
# создаем объект Pin с именем sensor и идентификатором 27,
# задаем для контакта режим входа Pin.IN
# и подключаем подтягивающий резистор Pin.PULL_UP
sensor = Pin(18, Pin.IN, Pin.PULL_UP)
# организуем бесконечный цикл
while True:
# проверяем значение sensor
if sensor.value() == 0:
# включаем светодиод
led.on()
else:
# иначе выключаем светодиод
led.off()
Запустим Iguana IDE. Скопируем в нее текст программы. Подключим микроконтроллер к компьютеру с помощью USB-кабеля. Откроем соединение с помощью кнопки "Open" и нажмем кнопку "DOWNLOAD & RUN". Светодиод будет загораться при срабатывании датчика (настроить оптимальное срабатывание можно вращением оси переменного резистора с помощью небольшой отвертки). Подробнее о загрузке и запуске программ можно прочитать в статье "ПЕРВЫЙ ПРОЕКТ НА МИКРОКОНТРОЛЛЕРЕ ESP32".
Проверка срабатывания датчика в цикле не всегда удобное решение. Если скрипт выполняет другие задачи в цикле, он может не успеть обнаружить кратковременное срабатывание и возникнут необработанные срабатывания.
Для того, чтобы не зависеть от цикла, лучше использовать внешнее прерывание. Прерывание — это сигнал, посылаемый процессору, чтобы указать, что важная задача должна быть выполнена немедленно, тем самым прерывая выполнение текущей программы. Преимущество использования внешнего прерывания в том, что обнаружение срабатывания будет полностью отделено от скрипта, крутящегося в цикле while. Работа с прерываниями описана в статье "ESP32: Подключаем кнопку".
Обрабатываем срабатывание датчика с помощью прерывания (Interrupt)
Благодаря прерываниям нет необходимости постоянно сканировать значение контакта. Когда сигнал на контакте изменяется, вызывается прерывание и запускается программа обработки прерывания. Мы можем использовать следующие варианты обнаружения изменения сигнала для прерываний:- Pin.IRQ_RISING : Запускает прерывание, как только сигнал переходит от LOW к HIGH (от 0 до 3,3 В)
- Pin.IRQ_FALLING запускает прерывание, как только сигнал изменяется с HIGH нa LOW (с 3,3 В на 0)
- Pin.IRQ_RISING | Pin.IRQ_FALLING запускает прерывание при изменении от LOW к HIGH или при изменении от HIGH к LOW
# из модуля machine импортируем класс Pin
from machine import Pin
# организуем функцию, которая будет запускаться прерыванием
def sensor_isr(pin):
# переключаем светодиод в состояние обратное сигналу датчика
# (сигнал от датчика у нас низкого уровня,
# а светодиод включается высоким уровнем)
led.value(not sensor.value())
# создаем объект Pin для светодиода
led = Pin(2, Pin.OUT)
# создаем объект Pin для датчика
sensor = Pin(18, Pin.IN, Pin.PULL_UP)
# создаем запрос прерывания для датчика
# в handler указываем функцию, запускающуюся по прерыванию
sensor.irq(trigger=Pin.IRQ_FALLING, handler=sensor_isr)
# организуем бесконечный цикл
while True:
# что-то делаем или ничего не делаем
pass
Остановить прерывание можно с помощью команды sensor.irq(handler=None)
Фиксируем срабатывание датчика
Чтобы зафиксировать срабатывание датчика можно использовать глобальную переменную. Назовем ее, например motion. Будем включать светодиод на 3 секунды при срабатывании датчика. Код программы может выглядеть, например, так:# из модуля machine импортируем класс Pin
from machine import Pin
# из модуля time импортируем функцию задержки sleep
from time import sleep
# функция, которая будет запускаться прерыванием
def sensor_isr(pin):
# добавляем переменную motion в область видимости функции
global motion
# устанавливаем значение motion в True при срабатывании датчика
motion = True
# инициализируем начальное значение для переменной motion
motion = False
# создаем объект Pin для светодиода
led = Pin(2, Pin.OUT)
# создаем объект Pin для датчика
sensor = Pin(18, Pin.IN, Pin.PULL_UP)
# создаем запрос прерывания для датчика
# в handler указываем функцию, запускающуюся по прерыванию
sensor.irq(trigger=Pin.IRQ_FALLING, handler=sensor_isr)
# организуем бесконечный цикл
while True:
# проверяем значение motion
if motion:
# если motion истинна, включаем светоиод
led.value(1)
# ждем 3 секунды
sleep(3)
# выключаем светодиод
led.value(0)
# сбрасываем значение motion в False
motion = False
Удачный Вам экспериментов!
Это оригинальная статья myROBOT.ru
| ПОПУЛЯРНЫЕ СТАТЬИ |

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

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

Первые проекты на микроконтроллере ESP32
В качестве первых проектов на ESP32 рассмотрим примеры мигания светодиодами и напишем программу "бегущие огни". Это классика при изучении микроконтроллеров.

Как сделать простого робота на микроконтроллере (Часть 1). Управляем электромоторами
Как самому сделать робота, используя драйвер управления двигателями L293D и микроконтроллер ATmega8. Схема робота и примеры простейших программ для управления моторами.
| НОВЫЕ СТАТЬИ |

Можно ли сделать BEAM-робота на Raspberry Pi?
Ответ Марка Тилдена с уникальной фотографией одной из новых работ маэстро.

Изучаем Python: TOP-5 лучших сайтов для изучения Питона
Самоучитель, интерактивный учебник, наглядные задачи и примеры программ.

Роботы на одной микросхеме своими руками
Подборками статей myROBOT.ru. Практика создания роботов: схемы и советы по изготовлению. Чтобы сделать роботов, нет необходимости даже писать программы. Все роботы начнут работать сразу же, как только Вы подключите к ним питание.
| ПОПУЛЯРНОЕ НА САЙТЕ |

Iguana — удобная и функциональная IDE для MicroPython
Iguana IDE позволяет программировать популярные микроконтроллерные платы как через USB, так и через Wi-Fi.

Учимся программировать.
Среда программирования на ЛОГО
GAME LOGO — бесплатная среда программирования для увлекательного путешествия в мир программирования и информатики. Программирование на русском языке, удобный и красивый интерфейс, продуманный синтаксис.
