роботы робототехника микроконтроллеры

ESP32: ПОДКЛЮЧАЕМ ДАТЧИК С ДИСКРЕТНЫМ ВЫХОДОМ

Монтажная схема подключения инфракрасного датчика

Что нам понадобится?

Для экспериментов с подключением дискретного датчика к ESP32 нам понадобится сама плата ESP32 DEVKIT V1, макетная плата, соединительные проводники штекер-гнездо DuPont и кабель micro USB для подключения ESP32 к компьютеру. В качестве дискретного датчика используем популярный модуль инфракрасного датчика обхода препятствий.
Виды датчиков
Все датчики делятся на аналоговые, дискретные и цифровые. Это зависит от типа выходной величины (выходного сигнала) датчика.

Дискретные датчики выдают дискретный (прерывистый) выходной сигал, который может иметь только два значения. Чаще всего это логический "0" (LOW LEVEL) и логическая "1" (HIGH LEVEL). Примером такого датчика может являться обычная кнопка, имеющая состояния замкнута и незамкнута.

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

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

Модуль инфракрасного датчика обхода препятствий

Модуль инфракрасного датчика обхода препятствий

Расположение выводов модуля инфракрасного датчика

Модуль датчика состоит из инфракрасного светодиода с излучением примерно 700-760 нм (этот свет не виден человеческим глазом, но его можно увидеть, например, камерой телефона) и фототранзистора, который принимает отраженное инфракрасное излучение. Сигнал от фототранзистора подается на вход компаратора LM393, который сравнивает его с пороговым уровнем напряжения, задаваемым переменным резистором. Когда интенсивность сигнала достигает попрогового уровня, датчик срабатывает: загорается светодиод индикации срабатывания и состояние вывода OUT на плате изменяется с высокого уровня (HIGH) на низкий (LOW).

Чем ближе к датчику находится объект, от которого отражается инфракрасное излучение, тем выше интенсивность отраженного потока на фототранзисторе. Количество отраженного излучения зависит от цвета и фактуры поверхности, от которой оно отражается. Чем поверхность более гладкая и светлая, тем больше излучения от нее отражается. От черных и матовых поверхностей отражение минимальное. Таким образом, расстояние обнаружения препятствий может колебаться от 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
Мы используем режим Pin.IRQ_RISING | Pin.IRQ_FALLING для включения светодиода во время обнаружения препятствия датчиком и выключения, когда препятствие отсутствует. Программа может выглядеть следующим образом:
# из модуля 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
Это оригинальная статья myROBOT.ru
Как сделать робота
ПОПУЛЯРНЫЕ СТАТЬИ
Драйвер двигателей L293D
Драйвер двигателей L293D
Для управления двигателями мини робота необходимо устройство, которое бы преобразовывало управляющие сигналы малой мощности в токи, достаточные для управления моторами. Такое устройство называют драйвером двигателей.
Как сделать простейшего робота
Как сделать простейшего робота
О том, как сделать робота в домашних условиях, используя лишь микросхему драйвера моторов и пару фотоэлементов. В зависимости от способа соединения моторов, микросхемы и фотоэлементов робот будет двигаться на свет или, наоборот, прятаться в темноту, следовать по линии или бежать за вашей рукой.
Первые проекты на микроконтроллере ESP32
Первые проекты на микроконтроллере ESP32
В качестве первых проектов на ESP32 рассмотрим примеры мигания светодиодами и напишем программу "бегущие огни". Это классика при изучении микроконтроллеров.
Как сделать простого робота на микроконтроллере (Часть 1). Управляем электромоторами
Как сделать простого робота на микроконтроллере (Часть 1). Управляем электромоторами
Как самому сделать робота, используя драйвер управления двигателями L293D и микроконтроллер ATmega8. Схема робота и примеры простейших программ для управления моторами.
НОВЫЕ СТАТЬИ
Можно ли сделать BEAM-робота на Raspberry Pi?
Можно ли сделать BEAM-робота на Raspberry Pi?
Ответ Марка Тилдена с уникальной фотографией одной из новых работ маэстро.
Изучаем Python: TOP-5 лучших сайтов для изучения Питона
Изучаем Python: TOP-5 лучших сайтов для изучения Питона
Самоучитель, интерактивный учебник, наглядные задачи и примеры программ.
Роботы на одной микросхеме своими руками
Роботы на одной микросхеме своими руками
Подборками статей myROBOT.ru. Практика создания роботов: схемы и советы по изготовлению. Чтобы сделать роботов, нет необходимости даже писать программы. Все роботы начнут работать сразу же, как только Вы подключите к ним питание.
ПОПУЛЯРНОЕ НА САЙТЕ
Iguana — удобная и функциональная IDE для MicroPython
Iguana — удобная и функциональная IDE для MicroPython
Iguana IDE позволяет программировать популярные микроконтроллерные платы как через USB, так и через Wi-Fi.
Учимся программировать.<BR>Среда программирования на ЛОГО
Учимся программировать.
Среда программирования на ЛОГО
GAME LOGO — бесплатная среда программирования для увлекательного путешествия в мир программирования и информатики. Программирование на русском языке, удобный и красивый интерфейс, продуманный синтаксис.




Copyright © myrobot.ru, 2005-2023


Яндекс.Метрика   Рейтинг@Mail.ru