Давайте рассмотрим алгоритм работы нашей программы!
- Подсчёт импульсов:
- Переменная pulse_count используется для хранения количества сработок.
- Каждый раз, когда происходит срабатывание, эта переменная увеличивается на 1.
- Антидребезг:
- Введена переменная interrupt_time, которая хранит время последнего срабатывания.
- При каждом срабатывании проверяется, прошло ли достаточно времени с последнего срабатывания (drebezg_time).
- Если прошло, увеличиваем счётчик импульсов и включаем светодиод.
- Мигание светодиода без задержек:
- Вместо time.sleep для выключения светодиода используется таймер (Timer), который позволяет избежать блокировки основного потока выполнения.
- Основной цикл печатает количество импульсов каждую секунду, что позволяет наблюдать за изменениями в реальном времени.
Перейдем к написанию программы и рисованию электрической схемы!
И так схема у нас есть, на ней обозначены микроконтроллер,ножки gnd и питания 3,3В, к порту D4 подключена кнопка КН1, вернемся к программе.
Практически к каждому материалу есть видеоролик на YouTube и RUTUBE каналах, теорию можно прочитать в статье, а как работает устройство в железе, посмотреть в видеоролике!
Датчик функционирует следующим образом: сигнал от фотодетектора поступает на один из входов LM393, а на другой вход подается опорное напряжение. Если сигнал от фотодетектора становится выше опорного напряжения, компаратор переключается, генерируя выходной импульс.
Области применения:
- Автомобили: измерение скорости вращения колес.
- Машиностроение: мониторинг вращения валов и других движущихся деталей.
- Робототехника: отслеживание скорости и направления движения.
- Датчик имеет ширину паза 5 мм.
- Выходной ток сигнала DO превышает 15 мА.
- Работает при напряжении 3,3–5 В.
- Выход представлен логическими значениями 0 и 1.
- Размеры: 40 мм х 26 мм х 32 мм
Датчик подключен к порту D5 и питанию. Сначала импортируем нужные классы для работы с таймером и портами: from machine import Pin, Timer.
Затем подключим функции для задержек: import time.
Настроим D5 на вход encoder_pin = Pin(5, Pin.IN) и D2 на выход led = Pin(2, Pin.OUT), к которому подключен светодиод на плате. Создадим три переменные: pulse_count = 0 для счетчика импульсов, interrupt_time = 0 для времени последнего прерывания и drebezg_time = 50 для подавления дребезга в миллисекундах.
Создадим функцию `def encoder_back(pin)`. Объявим переменные глобальными, чтобы они были доступны внутри функции: `global pulse_count, interrupt_time`. Получим текущее время: `current_time = time.ticks_ms()`. Проверим, прошло ли достаточно времени, чтобы избежать дребезга: `if current_time - interrupt_time > drebezg_time:`. Увеличим счётчик импульсов на единицу: `pulse_count += 1`. Включим светодиод: `led.on()`. Используем таймер для выключения светодиода: `Timer(0).init(period=100, mode=Timer.ONE_SHOT, callback=lambda t: led.off())`. Вместо `time.sleep` для выключения светодиода применяется таймер (`Timer`), который не блокирует основной поток выполнения. Обновим время последнего прерывания: `interrupt_time = current_time`. Настроим прерывания по фронту сигнала: `encoder_pin.irq(trigger=Pin.IRQ_RISING, handler=encoder_back)`.
Начинаем основной цикл программы: `while True:`. Каждую секунду выводим в терминал количество импульсов: `print("Number of pulses:", pulse_count)`. Задержка вывода — одна секунда: `time.sleep(1)`.
Работать с оптическим датчиком несложно. В этом примере мы разобрали базовый метод считывания импульсов с него.
Исходный код программы Скачать архив
Понравился проект? Не забудь поделиться им с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube и RUTUBE !
- СПАСИБО ЗА ПРОСМОТР.
- С уважением.
- Электроника и Робототехника!