Управление микроконтроллером и выводы микроконтроллера
Выводы микроконтроллера можно сравнить с нервной системой человека: они передают сигналы между микросхемой и внешним миром. Это точки подключения, через которые микроконтроллер получает информацию и посылает команды. С их помощью он может управлять двигателями, собирать данные с датчиков и общаться с другой электронной техникой. Все эти чудеса становятся возможными благодаря правильному управлению микроконтроллером и этими маленькими проводами, которые связывают микроконтроллер с окружающим его миром.
В этой статье мы разберёмся, как управлять микроконтроллером, как работают выводы микроконтроллера и какие возможности предоставляют.
На рисунке ниже представлена распиновка (pinout) микроконтроллерной платы ESP32 DevKit v1.
Контакты общего назначения GPIO (General Purpose Interput Output) могут быть сконфигурированы как входы или выходы и программно назначены на различные функции. Без каких-либо ограничений в качестве входов и выходов в ESP32 DevKit V1 можно использовать следующие 12 выводов GPIO: 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33. Эти выводы имеют встроенные программно-подключаемые резисторы подтяжки 45 кОм.
Выводы GPIO 34, 35, 36, 39 можно использовать только на ввод, у них отсутствуют встроенные подтягивающие резисторы.
Подробное описание назначения выводов можно посмотреть на вики-странице "ESP32 распиновка (pinout)".
Одно из ключевых преимуществ MicroPython – это удобство работы с выводами (пинами) микроконтроллера. Например, для включения или выключения цифрового пина достаточно указать пин и желаемое состояние (pin.on() или pin.off()). Инверсия состояния пина выполняется с такой же лёгкостью.
MicroPython предоставляет встроенную поддержку широтно-импульсной модуляции (ШИМ, PWM – Pulse Width Modulation), позволяющую управлять яркостью светодиодов, скоростью вращения двигателей и другими параметрами, требующими плавного регулирования. Для этого достаточно задать необходимую частоту и коэффициент заполнения импульса. Это значительно расширяет возможности управления периферией без необходимости погружения в сложные регистровые настройки.
Обработка аналоговых сигналов также значительно упрощается благодаря наличию в MicroPython библиотеки для работы с аналого-цифровыми преобразователями (АЦП). Удобные функции для чтения данных с АЦП позволяют легко реализовать системы мониторинга и управления, реагирующие на изменения в аналоговом окружении.
Рассмотрим использование MicroPython для управления выводами микроконтроллера.
Настройка направления
При настройке пина в качестве цифрового входа или выхода, необходимо указать направление передачи данных.
Основные этапы настройки выводов ESP32 с использованием MicroPython
Для работы с пинами ESP32 в MicroPython используется модуль machine. Добавьте этот модуль в начало вашей программы.
Настройте режим работы пина. В MicroPython режим работы пина задается при создании объекта Pin. Возможны следующие режимы:
machine.Pin.IN — Ввод: пин будет считывать данные извне.
machine.Pin.OUT — Вывод: пин будет выдавать сигнал наружу.
Пример настройки пина на вывод:
При создании объекта Pin можно указать начальное значение выходного контакта с помощью параметра value (0 — выключен, 1 — включен).
machine.Pin.PULL_UP — Включен резистор, подтягивающий вывод к питанию.
machine.Pin.PULL_DOWN — Включен понижающий резистор, подтягивающий вывод к земле.
Пример настройки пина на ввод:
Изменение дискретного сигнала на выводе (пине) — одна из основных операций, которую часто выполняют в проектах на основе микроконтроллеров. Это может понадобиться для управления такими устройствами, как светодиоды, реле, двигатели и многое другое. Рассмотрим несколько способов включения и выключения пина в MicroPython.
Обратите внимание, в примерах ниже мы импортируем из модуля machine класс Pin. Это позволит нам, обращаясь к классу Pin, писать вместо machine.Pin, просто Pin.
Простое включение и выключение пина
Самый простой способ включить или выключить пин — это использовать методы .on() и .off() класса Pin.
Метод .value() позволяет задать конкретное значение пину (0 или 1).
Состояние пина можно проверить напрямую в условном операторе if.
Использовать или не использовать внутренние подтягивающие резисторы зависит от того, что и как подключено к выводу, с которого мы считываем состояние.
Подтягивающие резистор в режиме pull-down необходим, чтобы при отсутствии положительного сигнала, на входе микроконтроллера присутствовал логический "0", обеспечиваемый подтягивающим резистором. При использовании подключения в режиме pull-down управляющим сигналом служит высокий уровень. Подтягивающий резистор в режиме pull-up необходим, чтобы при отсутствии отрицательного сигнала, на входе присутствовал высокий уровень. При использовании подключения в режиме pull-up управляющим сигналом служит низкий уровень. Если не использовать подтягивающий резистор, то вывод микроконтроллера будет "болтаться в воздухе", что не является хорошим решением. Подтягивающие резиторы могут быть внешними или внутренними (подключаемыми программно внутри микроконтроллера).
На рисунке ниже для примера рассмотрены способы подключения обычной кнопки с использовавнием внешних и внутренних подтягивающих резисторов.
Пример настройки пина в качестве входа с внутренним подтягивающим к питанию резистором:
Для автоматического переключения светодиода можно использовать оператор not.
За счет того, что с помощью ШИМ можно плавно изменять среднее напряжение на выводе, изменяя соотношение времени высокого и низкого уровней, ШИМ используют для регулировки яркости светодиодов, скорости двигателей и других аналогичных задач.
Для настройки PWM в MicroPython используется класс PWM.
Пример настройки PWM для регулирования яркости светодиода:
freq: Частота PWM в Гц. (freq=5000 — Частота 5 кГц)
duty: Значение скважности сигнала от 0 до 1023 (duty=512 — скважность 50%, duty=256 — скважность 25%)
Пример кода для управления яркостью светодиода:
Пример чтения значения с аналогового пина A1 0 (GPIO36):
Пример подключения фоторезистора к микроконтроллеру в качестве источника аналогового сигнала.
Удачный Вам экспериментов!
В этой статье мы разберёмся, как управлять микроконтроллером, как работают выводы микроконтроллера и какие возможности предоставляют.
Выводы микроконтроллера
Управление микроконтроллером начинается с выбора правильных выводов (пинов) и их настройки для выполнения нужных задач.Выбор выводов (пинов)
Каждый вывод микроконтроллера может выполнять различные функции, такие как цифровые входы/выходы, аналоговый ввод (ADC), ШИМ (широтно-импульсная модуляция), UART, SPI, I2C и другие. Вам нужно определить, какие функции требуются для вашего проекта. В зависимости от потребностей проекта выберите конкретные выводы для выполнения определенных задач. Например, если вам нужен цифровой выход для управления светодиодом, выберите подходящий контакт общего назначения GPIO.На рисунке ниже представлена распиновка (pinout) микроконтроллерной платы ESP32 DevKit v1.

Контакты общего назначения GPIO (General Purpose Interput Output) могут быть сконфигурированы как входы или выходы и программно назначены на различные функции. Без каких-либо ограничений в качестве входов и выходов в ESP32 DevKit V1 можно использовать следующие 12 выводов GPIO: 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33. Эти выводы имеют встроенные программно-подключаемые резисторы подтяжки 45 кОм.
Выводы GPIO 34, 35, 36, 39 можно использовать только на ввод, у них отсутствуют встроенные подтягивающие резисторы.
Подробное описание назначения выводов можно посмотреть на вики-странице "ESP32 распиновка (pinout)".
Управление микроконтроллером
Управление микроконтроллером традиционно считалось сложной задачей, требующей глубокого знания низкоуровневого программирования на языках типа C или ассемблера. Однако, появление MicroPython существенно упростило этот процесс. MicroPython – это интерпретируемый язык программирования, являющийся компактной реализацией Python 3, специально адаптированной для работы на микроконтроллерах. Благодаря своей простоте и интуитивному синтаксису, он позволяет разработчикам сосредоточиться на логике приложения, а не на деталях работы с аппаратным обеспечением.Одно из ключевых преимуществ MicroPython – это удобство работы с выводами (пинами) микроконтроллера. Например, для включения или выключения цифрового пина достаточно указать пин и желаемое состояние (pin.on() или pin.off()). Инверсия состояния пина выполняется с такой же лёгкостью.
MicroPython предоставляет встроенную поддержку широтно-импульсной модуляции (ШИМ, PWM – Pulse Width Modulation), позволяющую управлять яркостью светодиодов, скоростью вращения двигателей и другими параметрами, требующими плавного регулирования. Для этого достаточно задать необходимую частоту и коэффициент заполнения импульса. Это значительно расширяет возможности управления периферией без необходимости погружения в сложные регистровые настройки.
Обработка аналоговых сигналов также значительно упрощается благодаря наличию в MicroPython библиотеки для работы с аналого-цифровыми преобразователями (АЦП). Удобные функции для чтения данных с АЦП позволяют легко реализовать системы мониторинга и управления, реагирующие на изменения в аналоговом окружении.
Рассмотрим использование MicroPython для управления выводами микроконтроллера.
i |
Подробнее о том, как начать работать с микроконтроллером на языке MicroPython, можно прочитать в статье "Первый проект на микроконтроллере ESP32". |
Настройка (конфигурирование) выводов (пинов) микроконтроллера
Для вывода GPIO микроконтроллера можно настроить режим работы. Это может быть выход (output): пин будет выдавать сигнал наружу. Вход (input): пин будет считывать данные извне. Аналоговый вход (analog input): пин будет использоваться для измерения напряжения. Специальные функции (UART, SPI, I2C и т.д.).Настройка направления
При настройке пина в качестве цифрового входа или выхода, необходимо указать направление передачи данных.
Основные этапы настройки выводов ESP32 с использованием MicroPython
Для работы с пинами ESP32 в MicroPython используется модуль machine. Добавьте этот модуль в начало вашей программы.
import machine
Определите пин, который будут использоваться. В следующем примере мы будем использовать пин 27.
Настройте режим работы пина. В MicroPython режим работы пина задается при создании объекта Pin. Возможны следующие режимы:
machine.Pin.IN — Ввод: пин будет считывать данные извне.
machine.Pin.OUT — Вывод: пин будет выдавать сигнал наружу.
Пример настройки пина на вывод:
# Пин 27 настроен как выход
pin = machine.Pin(27, machine.Pin.OUT)
При выполнении данного кода будет создан объект с именем pin (имя может быть и другим). Дальнейшие действия с пином производятся уже с созданным объектом (то есть с объектом, который получил имя pin).
При создании объекта Pin можно указать начальное значение выходного контакта с помощью параметра value (0 — выключен, 1 — включен).
# Пин 27 настроен как выход
# с начальным значением 1 (включен, высокий уровень)
pin = machine.Pin(27, machine.Pin.OUT, value = 1)
При настройке пина в качестве входа, может указываться, следует ли подключить к контакту внутренний подтягивающий резистор. Для входа это может быть PULL_UP (внутренний подтягивающий резистор) или PULL_DOWN (внутренний понижающий резистор).
machine.Pin.PULL_UP — Включен резистор, подтягивающий вывод к питанию.
machine.Pin.PULL_DOWN — Включен понижающий резистор, подтягивающий вывод к земле.
Пример настройки пина на ввод:
# Пин 27 настроен как вход, с подтягивающим к питанию резистором
pin = machine.Pin(27, machine.Pin.IN, machine.Pin.PULL_UP)
Повторно инициализировать пин можно с помощью метода init(), указав те параметры, которые должны быть изменены. Пропущенные параметры при этом останутся без изменений.
pin.init(machine.Pin.OUT, value = 0)
Программное управление цифровыми выводами (пинами)
Установка состояния (значения) цифрового пина с помощью MicroPythonИзменение дискретного сигнала на выводе (пине) — одна из основных операций, которую часто выполняют в проектах на основе микроконтроллеров. Это может понадобиться для управления такими устройствами, как светодиоды, реле, двигатели и многое другое. Рассмотрим несколько способов включения и выключения пина в MicroPython.
Обратите внимание, в примерах ниже мы импортируем из модуля machine класс Pin. Это позволит нам, обращаясь к классу Pin, писать вместо machine.Pin, просто Pin.
Простое включение и выключение пина
Самый простой способ включить или выключить пин — это использовать методы .on() и .off() класса Pin.
from machine import Pin
pin = Pin(27, Pin.OUT) # Пин 27 настроен как выход
pin.on() # Включить пин (установить высокий уровень)
pin.off() # Выключить пин (установить низкий уровень)
Изменение состояния пина с помощью метода .value()
Метод .value() позволяет задать конкретное значение пину (0 или 1).
from machine import Pin
pin = Pin(27, Pin.OUT) # Пин 27 настроен как выход
pin.value(1) # Включить пин (установить высокий уровень)
pin.value(0) # Выключить пин (установить низкий уровень)
Чтение состояния цифрового пина
Читать значение пина необходимо тогда, когда речь идет о получении информации от внешних устройств или датчиков. Если пин настроен как вход, вы можете узнать его состояние с помощью метода .value(). При отсутствии аргумента этот метод получает цифровой логический уровень пина, возвращая 0 или 1, соответствующие низкому и высокому напряжению сигналов соответственно.from machine import Pin
pin = Pin(27, Pin.IN) # Пин 27 настроен как вход
state = pin.value() # Читаем состояние пина print(state)
print(state) # Выведем результат (0 или 1)
Будет напечатан 0 или 1 в зависимости от уровня сигнала на пине.
Состояние пина можно проверить напрямую в условном операторе if.
from machine import Pin
pin = Pin(27, Pin.IN) # Пин 27 настроен как вход
if pin.value():
print("Высокий уровень")
else:
print("Низкий уровень")
Иногда требуется непрерывно отслеживать изменение состояния пина. Для этого можно использовать бесконечный цикл while и функцию задержки sleep().
from machine import Pin
from time import sleep
pin = Pin(27, Pin.IN) # Пин 27 настроен как вход
while True: # Бесконечный цикл
state = pin.value()
print('Текущее состояние пина:', state)
sleep(0.1) # Задержка 100 мс перед следующим чтением
Еще раз вспомним, что при настроке пина в качестве входа, может указываться, следует ли подключить к контакту внутренний подтягивающий резистор (machine.Pin.PULL_UP — включен резистор, подтягивающий вывод к питанию; machine.Pin.PULL_DOWN — включен понижающий резистор, подтягивающий вывод к земле).
Использовать или не использовать внутренние подтягивающие резисторы зависит от того, что и как подключено к выводу, с которого мы считываем состояние.
Подтягивающие резистор в режиме pull-down необходим, чтобы при отсутствии положительного сигнала, на входе микроконтроллера присутствовал логический "0", обеспечиваемый подтягивающим резистором. При использовании подключения в режиме pull-down управляющим сигналом служит высокий уровень. Подтягивающий резистор в режиме pull-up необходим, чтобы при отсутствии отрицательного сигнала, на входе присутствовал высокий уровень. При использовании подключения в режиме pull-up управляющим сигналом служит низкий уровень. Если не использовать подтягивающий резистор, то вывод микроконтроллера будет "болтаться в воздухе", что не является хорошим решением. Подтягивающие резиторы могут быть внешними или внутренними (подключаемыми программно внутри микроконтроллера).
На рисунке ниже для примера рассмотрены способы подключения обычной кнопки с использовавнием внешних и внутренних подтягивающих резисторов.

Пример настройки пина в качестве входа с внутренним подтягивающим к питанию резистором:
pin = Pin(27, Pin.IN, Pin.PULL_UP)
Инвертирование состояния пина
Иногда бывает удобно инвертировать текущее состояние пина (изменить его с низкого уровня на высокий или наоборот) без необходимости проверять его текущее значение. Для этого можно воспользоваться оператором побитовой инверсии (~) вместе с методом .value():from machine import Pin
pin = Pin(27, Pin.OUT) # Пин 27 настроен как выход
current_state = pin.value() # Получаем текущее состояние пина
new_state = ~current_state & 1 # Инвертируем состояние
pin.value(new_state) # Устанавливаем новое состояние
Также можно использовать оператор not.
from machine import Pin
pin = Pin(27, Pin.OUT) # Пин 27 настроен как выход
pin.value(not pin.value())
Мигающий светодиод
Чтобы реализовать мигание светодиодом можно использовать цикл while и задержку между включением и выключением пина.from machine import Pin
from time import sleep_ms
pin = Pin(2, Pin.OUT) # Пин 2 настроен как выход
while True:
pin.on() # Включить светодиод
sleep_ms(500) # Задержка 500 мс
pin.off() # Выключить светодиод
sleep_ms(500) # Задержка 500 мс
Этот код будет включать и выключать встроенный светодиод, находящийся на плате ESP32 DEVKIT, каждые 500 миллисекунд (полсекунды).
Для автоматического переключения светодиода можно использовать оператор not.
from machine import Pin
from time import sleep
pin = Pin(2, Pin.OUT) # Пин 2 настроен как выход
while True:
pin.value(not pin.value()) # Инвертируем текущее состояние пина
sleep(0.5) # Задержка полсекунды
Использование ШИМ (PWM)
PWM (pulse-width modulation) — широтно-импульсная модуляция (ШИМ) управляет мощностью методом пульсирующего включения и выключения вывода. ESP32 имеет 16 независимых ШИМ-каналов. Практически все контакты, которые могут выступать в качестве выходов, могут использоваться в качестве выходов ШИМ (GPIO с 34 по 39 не могут генерировать ШИМ). Для генерации ШИМ-сигнала необходимо в программе задать GPIO, на который вы хотите вывести сигнал, частоту сигнала и скважность.За счет того, что с помощью ШИМ можно плавно изменять среднее напряжение на выводе, изменяя соотношение времени высокого и низкого уровней, ШИМ используют для регулировки яркости светодиодов, скорости двигателей и других аналогичных задач.
Для настройки PWM в MicroPython используется класс PWM.
Пример настройки PWM для регулирования яркости светодиода:
pwm = machine.PWM(pin, freq=5000, duty=512)
Где:freq: Частота PWM в Гц. (freq=5000 — Частота 5 кГц)
duty: Значение скважности сигнала от 0 до 1023 (duty=512 — скважность 50%, duty=256 — скважность 25%)
Пример кода для управления яркостью светодиода:
from machine import Pin, PWM
pin = Pin(2) # Пин 2 настроен как выход
pwm = PWM(pin, freq=1000) # Создаем объект PWM с частотой 1000 Гц
pwm.duty(256) # Устанавливаем скважность 25% (яркость 25%)
i |
Подробнее об использовании ШИМ (PWM), можно прочитать на страницах "ШИМ и PWM - что это такое?" и "ESP32: Управляем скоростью мотора с помощью ШИМ (PWM)". |
Чтение аналоговых значений
Управление микроконтроллером включает также чтение аналоговых значений напряжения на выводах с помощью аналого-цифрового преобразователями (АЦП, англ. — ADC, Analog to Digital Converter). АЦП преобразует непрерывный аналоговый сигнал в дискретное цифровое значение. Для этого в MicroPython используется класс ADC.Пример чтения значения с аналогового пина A1 0 (GPIO36):
from machine import ADC
adc = ADC(36) # Используем пин 36 для аналогового ввода
analog_value = adc.read() # Читаем значение с аналогового пина
print(analog_value) # Выводим результат (значение от 0 до 4095)
Пример подключения фоторезистора к микроконтроллеру в качестве источника аналогового сигнала.

i |
Подробнее об измерении аналоговых сигналов с помощью аналого-цифрового преобразователя (АЦП) можно прочитать в статье "ESP32: Используем АЦП (ADC) для измерения аналогового сигнала". |
Обработка прерываний по изменению состояния пина
Иногда требуется реагировать на изменение состояния пина немедленно, например, при нажатии кнопки. Для этого можно использовать прерывания. Пример использования прерывания (кнопка подключена к GPIO23 и земле):from machine import Pin
from time import sleep
# Функция, которая будет вызываться при прерывании
def button_handler(pin):
print("Кнопка нажата!")
# Настраиваем пин 23 как вход с подтяжкой вверх
button_pin = Pin(23, Pin.IN, Pin.PULL_UP)
# Настраиваем прерывание по спаду сигнала
button_pin.irq(trigger=Pin.IRQ_FALLING, handler=button_handler)
# Бесконечный цикл для предотвращения завершения программы
while True:
sleep(1)
В этом примере при нажатии кнопки (падении сигнала с высокого уровня на низкий) вызывается функция button_handler, которая выводит сообщение "Кнопка нажата!".
i |
О работе с прерываниями более подробно можно прочитать на странице "ESP32: Подключаем кнопку". |
Заключение
Используя описанные выше подходы, можно гибко управлять микроконтроллером и легко измерять и обрабатывать дискретные и аналоговые сигналы на выводах. Независимо от того, хотите ли вы просто включать и выключать пин, инвертировать его состояние или использовать PWM для более сложных задач, MicroPython предлагает удобные и простые средства для реализации этих функций. Всё это делает его отличным выбором для быстрого прототипирования и разработки приложений для микроконтроллеров.Удачный Вам экспериментов!


ПОПУЛЯРНЫЕ СТАТЬИ |

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

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

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

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

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

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

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

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

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