Работа с контактами и двигателями в ESP32-S3 с помощью ESP-IDF (урок 2)


Цели урока:

  • Разобраться в работе с контактами ввода/вывода общего назначения  (GPIO) в ESP32-S3.
  • Разобраться в работе с двигателями в ESP32-S3.

Контакты ввода/вывода общего назначения (GPIO)

Контакты ввода/вывода общего назначения (General Purpose Input/Output, GPIO) позволяют ESP32-S3 подключаться к внешнему миру и обмениваться с ним данными. В зависимости от потребностей проекта, эти контакты могут быть сконфигурированы как входы или выходы.

ESP32-S3 обладает очень гибкой матрицей GPIO, предоставляя до 45 физических контактов GPIO (точное количество зависит от конкретного комплекта разработчика). Эти контакты разделены на два основных функциональных назначения.

  • Цифровые контакты: используются для чтения или записи цифровых сигналов высокого (1) или низкого (0) уровня.
  • Аналоговые контакты: используются для считывания аналоговых сигналов, захватывая диапазон значений напряжения с помощью внутренних АЦП (аналого-цифровых преобразователей).

Контакты ввода/вывода общего назначения (GPIO) ESP32-S3

Цифровые контакты GPIO

В отличие от более простых микроконтроллеров, ESP32-S3 позволяет настроить практически любой контакт для цифровых входных или выходных функций. Эти контакты обрабатывают только два состояния: ВЫСОКИЙ (3,3 В) и НИЗКИЙ (0 В). Это означает, что они могут либо отправлять, либо принимать цифровые сигналы, например, включать или выключать светодиод или считывать состояние кнопки.

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

Цифровые функции GPIO в ESP-IDF

При программировании на языке C с использованием фреймворка ESP-IDF мы используем специальные функции драйвера для управления цифровыми выводами. Для доступа к ним необходимо подключить соответствующий заголовочный файл #include "driver/gpio.h".

gpio_set_direction()- эта функция используется для настройки режима работы цифрового контакта. Она позволяет установить контакт либо в качестве входа, либо в качестве выхода. Принимает два аргумента:

  • Номер контакта (с использованием макроса GPIO_NUM_x, например, GPIO_NUM_13)
  • Режим, который мы хотим установить (GPIO_MODE_INPUT или GPIO_MODE_OUTPUT)

gpio_set_pull_mode() - эта функция используется для установки внутреннего резистора, чтобы избежать нестабильных показаний (например, при использовании кнопок). Она принимает два аргумента: номер контакта и состояние, например GPIO_PULLUP_ONLY, или GPIO_PULLDOWN_ONLY.

gpio_set_level()- эта функция используется для отправки цифрового сигнала на контакт. Она позволяет установить контакт в состояние ВЫСОКИЙ или НИЗКИЙ и принимает два аргумента:

  • номер контакта
  • Состояние сигнала -  1 (высокий) или 0 (низкий) уровень

gpio_get_level()- наконец , эта функция используется для считывания состояния цифрового контакта. Она возвращает либо 1 (HIGH), либо 0 (LOW) в зависимости от входного сигнала. Она принимает один аргумент:

  • номер контакта.

Цифровые устройства вывода и ввода

Теперь, когда мы знаем основные функции работы с цифровыми контактами GPIO, давайте рассмотрим работу в ESP32-S3 с некоторыми распространенными и наиболее часто используемыми цифровыми датчиками и устройствами.

Светодиоды и кнопки

Светодиоды (LED) — это цифровые выходные компоненты, излучающие свет при прохождении через них электрического тока. Они поляризованы, то есть пропускают ток только в одном направлении. Светодиоды имеют два состояния: ВКЛ и ВЫКЛ. Мы можем включить светодиод, отправив высокий сигнал с цифрового контакта, и выключить его, отправив низкий сигнал. Светодиоды часто используются в качестве индикаторов для отображения состояния системы.

Кнопки используются в качестве устройств ввода. Они также имеют два состояния: нажаты и отпущены. При нажатии кнопка посылает сигнал (высокий или низкий, в зависимости от схемы) на микроконтроллер ESP32-S3. Микроконтроллер считывает этот сигнал и выполняет действие в зависимости от состояния кнопки.

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

В этом проекте мы будем использовать GPIO 4 для управления светодиодом и GPIO 1 для кнопки. Для светодиода мы будем использовать резистор на 220 Ом, а для кнопки настроим вывод GPIO с подтягивающим резистором.

Схема управления светодиодом с помощью кнопки на ESP32-S3

Теперь давайте создадим нашу программу. Начнём с подключения необходимых библиотек. После этого объявим переменную для отслеживания состояния светодиода.

В функции app_main мы сначала сбрасываем контакты. Затем настраиваем GPIO 2 как выход для светодиода и GPIO 4 как вход для кнопки. Мы также настраиваем GPIO 4 на использование подтягивающего резистора, поэтому его состояние по умолчанию — НИЗКОЕ (0). Это гарантирует, что контакт будет считывать стабильный 0, когда кнопка не нажата.

После этого мы создаем бесконечный цикл, в котором непрерывно считываем состояние GPIO 4. Если контакт находится в ВЫСОКОМ состоянии, это означает, что пользователь нажал кнопку. Затем мы переключаем переменную LedState и соответствующим образом обновляем светодиод.

Наконец, мы добавляем задержку в 500 мс, чтобы предотвратить эффект дребезга кнопок, гарантируя, что одно нажатие не будет распознано несколько раз.

Зуммеры

Зуммер — это специальный компонент, издающий звук при подаче на него высокого сигнала. Он широко используется в электронных устройствах в качестве оповещателя, например, в сигнализациях, таймерах и системах предупреждения. Существует два основных типа зуммеров:

  • Активный зуммер: этот тип имеет встроенный генератор, который издает звук на заданной частоте. Для его включения или выключения достаточно подать сигнал ВЫСОКОГО или НИЗКОГО уровня. Он прост в использовании, но предоставляет ограниченные возможности управления звуком.
  • Пассивный зуммер: этот тип не имеет встроенного генератора. Вместо этого он позволяет генерировать звук на разных частотах, посылая сигналы ШИМ (широтно-импульсной модуляции) с микроконтроллера ESP32-S3. Это дает нам больший контроль над тоном, что позволяет воспроизводить мелодии или различные звуковые сигналы оповещения.

Более подробно про типы зуммеров вы можете прочитать в этой статье.

Давайте создадим простой проект, в котором светодиод мигает, а активный зуммер издает звук при нажатии кнопки. Мы подключим светодиод к GPIO 2, зуммер к GPIO 20, а кнопку к GPIO 5.

Схема подключения зуммера к ESP32-S3

Теперь давайте создадим нашу программу на языке C с использованием ESP-IDF. Начнём с подключения необходимых библиотек. В этом примере нам не нужно отслеживать состояние, поэтому мы сразу перейдём к функции app_main. Сначала мы сбрасываем используемые контакты, затем настраиваем GPIO 4 как вход, а GPIO 2 и GPIO 20 как выходы. Далее мы устанавливаем GPIO 5 в режим подтяжки к земле, чтобы он по умолчанию считывал низкий уровень (0), когда кнопка не нажата.

Наконец, мы создаём бесконечный цикл. Внутри этого цикла мы используем вложенный цикл, который выполняется, пока нажата кнопка (когда GPIO 5 находится в высоком состоянии). В этом случае мы устанавливаем GPIO 20 в высокое состояние, чтобы активировать зуммер, а также мигаем светодиодом, подключенным к GPIO 2, включая его, ожидая 500 мс, выключая и ожидая ещё 500 мс. Это создаёт эффект мигания.

Вне внутреннего контура мы устанавливаем GPIO 20 в низкое состояние, что отключает зуммер, когда кнопка не нажата.

Датчик препятствия (инфракрасный датчик)

Еще одним важным датчиком является датчик препятствий. Он позволяет обнаруживать наличие препятствий с помощью инфракрасных (ИК) сигналов. Датчик имеет светодиод, излучающий инфракрасный свет, и приемник, который улавливает отраженные ИК-сигналы. Когда перед датчиком находится объект, инфракрасный свет отражается обратно к приемнику, позволяя датчику обнаружить препятствие. На нашем сайте посмотреть все проекты с использованием инфракрасных датчиков вы можете по следующей ссылке.

Датчик также включает в себя внутренний переменный резистор (потенциометр), который позволяет регулировать расстояние обнаружения. Датчик препятствий имеет три контакта: VCC, GND и OUT (выход). Выходной контакт становится НИЗКИМ (0) при обнаружении препятствия и ВЫСОКИМ (1) при отсутствии препятствия.

Для регулировки дальности обнаружения датчика препятствий мы используем встроенный потенциометр.

При повороте потенциометра по часовой стрелке расстояние обнаружения увеличивается, что повышает чувствительность датчика. При повороте против часовой стрелки расстояние обнаружения уменьшается, что снижает чувствительность датчика.

Компоненты инфракрасного датчика

Давайте создадим простой проект, в котором зуммер издает звук, когда датчик препятствий обнаруживает объект. Мы будем использовать GPIO 20 для управления зуммером и GPIO 4 для считывания сигнала с датчика препятствий.

Схема подключения зуммера и инфракрасного датчика к ESP32-S3

Теперь давайте создадим программу. Как и прежде, начнём с подключения необходимых нашей программе библиотек. В функции app_main мы сбрасываем контакты GPIO 4 и 20. Затем мы настраиваем GPIO 4 как вход, а GPIO 20 как выход. Мы также устанавливаем GPIO 4 в режим подтяжки к земле.

Далее мы создаём бесконечный цикл, в котором программа выполняется непрерывно. Внутри этого цикла мы проверяем состояние GPIO 4. Если оно низкое (0), это означает, что объект обнаружен, поэтому мы устанавливаем GPIO 20 в высокое (1), чтобы включить зуммер. В противном случае мы устанавливаем GPIO 20 в низкое (0), чтобы выключить зуммер.

Реле

Цифровые контакты ESP32-S3 работают строго в режиме логики 3,3 В и могут обеспечивать максимальный ток около 40 мА на вывод. Этого достаточно для управления небольшими электронными компонентами, такими как светодиоды, зуммеры и логические входы для других модулей.

Однако при создании более крупных проектов может потребоваться управление устройствами, работающими при более высоких напряжениях (например, 12 В постоянного тока или 220 В переменного тока) или больших токах, такими как лампы, вентиляторы, насосы или двигатели. Контакты ESP32-S3 не могут напрямую подавать питание на эти устройства, а их подключение без защиты приведет к необратимому выходу микроконтроллера из строя.

Для решения этой проблемы мы используем реле. Реле — это электрически управляемый переключатель, который позволяет сигналу малой мощности 3,3 В от ESP32-S3 безопасно управлять мощными устройствами. Внутри реле находится катушка, играющая ключевую роль. Когда ESP32-S3 посылает управляющий сигнал, через катушку протекает небольшой ток, создающий магнитное поле. Это магнитное поле притягивает металлический якорь, заставляя внутренний переключатель замыкаться и позволяя току протекать в цепи большой мощности. Когда микроконтроллер перестает посылать сигнал, ток в катушке прекращается, магнитное поле исчезает, и пружина возвращает якорь в исходное положение, снова размыкая переключатель.

Принцип действия реле

Давайте создадим простой проект с использованием реле и инфракрасного датчика. В этом проекте мы будем использовать датчик препятствий для включения света, когда пользователь проводит рукой перед датчиком, и выключения света, когда пользователь снова проводит рукой.

Сначала подключаем датчик препятствий:

  • VCC → 3,3 В на DevKit
  • GND → GND на DevKit
  • Выходной контакт → GPIO 10

Далее подключаем релейный модуль. Убедитесь, что ваш релейный модуль может срабатывать от логического сигнала 3,3 В, что большинство стандартных оптически изолированных релейных модулей могут. Сторона управления, низкое напряжение:

  • VCC → 3,3 В
  • GND → GND
  • IN (Управляющий контакт) → GPIO 1

Сторона высокой мощности: на стороне высокой мощности реле имеет три клеммы: COM (общий контакт), NO (нормально разомкнутый контакт) и NC (нормально замкнутый контакт). Для управления лампой:

  • Подключите фазный провод от источника питания к COM.
  • Подключите клемму NO к одному из проводов лампы.
  • Подключите второй провод лампы обратно к нейтральному проводу.

Схема подключения реле к ESP32-S3

Теперь давайте создадим программу на языке C для нашего проекта.

Ультразвуковой датчик

Ультразвуковые датчики — одни из самых полезных датчиков, используемых с микроконтроллерами. Они помогают нам измерять расстояние с помощью звуковых волн. Когда мы хотим рассчитать глубину колодца или длину пещеры, мы часто полагаемся на звук. Например, в прошлом люди бросали камень в колодец и слушали звук, когда он ударялся о землю. Измеряя время, необходимое для возвращения звука, они могли оценить глубину колодца.

Тот же принцип применим и при исследовании пещеры. Искатель приключений может кричать и прислушиваться к эху. Время, необходимое для того, чтобы эхо вернулось, дает представление о расстоянии до стен пещеры.

Аналогичным образом, ультразвуковой датчик, такой как HC-SR04, излучает высокочастотные звуковые волны и измеряет время, необходимое для возвращения эха. Используя это время, ESP32-S3 вычисляет расстояние до объекта.

Принцип работы ультразвукового датчика

Ультразвуковой датчик HC-SR04 имеет четыре контакта: VCC и GND используются для питания датчика. Контакт TRIG используется для отправки короткого импульса высокого уровня (около 10 микросекунд), который заставляет датчик излучать ультразвуковую волну. Затем контакт ECHO переходит в состояние высокого уровня и остается в нем до тех пор, пока отраженная звуковая волна не вернется к датчику. Длительность этого сигнала высокого уровня представляет собой время, необходимое для распространения звука до объекта и обратно.

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

Давайте создадим проект, в котором мы будем использовать три светодиода для индикации расстояния:

  • Красный светодиод загорается, когда объект находится на расстоянии 60 см или более.
  • Желтый светодиод загорается, когда объект находится на расстоянии не менее 30 см.
  • Зеленый светодиод загорается, когда объект находится ближе, чем в 30 см.

Каждый светодиод подключен к выводу GPIO через резистор сопротивлением 220 Ом:

  • GPIO 13 → Красный светодиод
  • GPIO 12 → Желтый светодиод
  • GPIO 11 → Зеленый светодиод

Ультразвуковой датчик HC-SR04 имеет четыре контакта:

  1. Подключите VCC к выводу 5 В.
  2. GND Подключитесь к контакту GND на DevKit
  3. Trig (триггер) используется для отправки ультразвукового импульса, мы подключаем его к GPIO 20.
  4. Эхо-сигнал используется для приема отраженного сигнала, мы подключаем его к GPIO 19.

На выводе Echo выдается напряжение 5 В, что может повредить микроконтроллеры, работающие на логических уровнях 3,3 В.

Для безопасного подключения используйте делитель напряжения:

  • Один резистор 220 Ом
  • Один резистор 330 Ом

Схема подключения ультразвукового датчика к ESP32-S3

После завершения сборки схемы настало время написать программу. Мы будем использовать функцию esp_timer_get_time() для измерения микросекунд.

Начнём с подключения необходимых библиотек: одна для управления выводами GPIO, а другие — для обработки задач и функций синхронизации. Внутри функции app_main мы настраиваем выводы GPIO (11, 12, 13, 20) как выходы (для светодиодов и триггерного вывода) и вывод GPIO 19 как вход (для вывода эхо-сигнала). Также объявляем две переменные для хранения длительности сигнала и вычисленного расстояния.

Далее мы попадаем в бесконечный цикл. Начинаем с отправки короткого импульса с вывода GPIO 20: сначала устанавливаем его в низкий уровень, затем в высокий на 10 микросекунд, а затем снова в низкий. Этот импульс запускает ультразвуковой датчик HC-SR04, который излучает звуковую волну. После этого мы измеряем время, необходимое для возвращения эхо-сигнала. Время старта измерений start_time регистрируется, когда вывод эхо-сигнала переходит в высокий уровень, а время возвращения end_time — когда он снова переходит в низкий уровень, указывая на то, что звуковая волна вернулась к датчику.

Используя эту разницу во времени, мы вычисляем длительность эхо-импульса, а затем рассчитываем расстояние на основе скорости звука. Наконец, мы используем условные операторы для управления тремя светодиодами: один включается, если объект находится далеко (≥ 60 см), другой — на среднем расстоянии (≥ 30 см), а последний — на небольшом расстоянии. В конце каждой итерации цикла добавляется небольшая задержка перед повторением процесса.

Широтно-импульсная модуляция

Широтно-импульсная модуляция (ШИМ, на англ. - Pulse Width Modulation (PWM)) — это метод, используемый для имитации аналогового выходного сигнала с помощью цифрового сигнала. Принцип ШИМ основан на многократном включении и выключении выходного сигнала в течение постоянного периода времени T.

Этот фиксированный период T называется периодом ШИМ, и в течение этого периода сигнал остается включенным в течение определенного времени и выключенным в остальное время; процент времени, в течение которого сигнал остается включенным в течение одного периода, называется коэффициентом заполнения.

Выходное напряжение определяется средним значением сигнала за один полный период. Например:

  • Если выходной сигнал остается включенным в течение всего периода (100% коэффициент заполнения), среднее напряжение составит 3,3 В.
  • Если выходной сигнал никогда не включается (коэффициент заполнения 0%), среднее напряжение будет равно 0 В.
  • Если выходной сигнал остается включенным в течение половины периода (50% коэффициента заполнения), среднее напряжение составит 1,65 В.

Принцип работы широтно-импульсной модуляции

ESP32-S3 обладает очень гибкой матрицей GPIO. В отличие от более старых микроконтроллеров, которые ограничивают ШИМ-сигналы определенными аппаратными контактами, ESP32-S3 позволяет направлять ШИМ-сигналы на все контакты, которые могут выступать в качестве выходов, используя периферийное устройство управления светодиодами (LEDC).

Для работы с ШИМ в ESP-IDF мы используем периферийное устройство LEDC (контроллер светодиодов). Этот аппаратный модуль эффективно генерирует ШИМ-сигналы, не требуя больших затрат ресурсов процессора. Конфигурация выполняется в два основных этапа: сначала мы устанавливаем таймер, определяющий частоту и разрешение ШИМ-сигнала, а затем настраиваем канал, который подключает этот таймер к определенному выводу GPIO. После настройки мы можем управлять сигналом, регулируя коэффициент заполнения, который определяет, как долго сигнал остается в высоком состоянии в течение каждого периода ШИМ.

Настройки таймера определяют поведение ШИМ-сигнала. Поле freq_hz задает частоту повторения сигнала; в этом примере 5000 Гц означает, что сигнал совершает 5000 циклов в секунду. Поле duty_resolution определяет количество дискретных шагов, доступных для коэффициента заполнения. При 12-битном разрешении счетчик имеет диапазон значений от 0 до 4095, что обеспечивает точный контроль над сигналом. Эти два параметра связаны: увеличение частоты уменьшает максимально достижимое разрешение, а увеличение разрешения ограничивает максимальную частоту. Источник тактового сигнала ( clk_cfg) обычно устанавливается в режим автоматического выбора, что позволяет драйверу выбрать наиболее подходящий тактовый сигнал.

Конфигурация канала подключает таймер к физическому выводу GPIO. Поле channel выбирает один из доступных каналов LEDC, а поле timer_sel связывает этот канал с ранее настроенным таймером. Поле gpio_num определяет, какой вывод выдает ШИМ-сигнал. Поле duty устанавливает начальный коэффициент заполнения и hpoint определяет, когда сигнал переходит в высокое состояние в течение периода ШИМ (обычно оставляется равным 0 для стандартного поведения). На ESP32-S3 все каналы работают в низкоскоростном режиме, и изменения параметров ШИМ должны применяться программно.

После запуска ШИМ-сигнала мы управляем им, изменяя коэффициент заполнения. Коэффициент заполнения представляет собой долю времени, в течение которого сигнал находится в высоком состоянии (HIGH) в течение одного периода. При 12-битном разрешении допустимые значения находятся в диапазоне от 0 до 4095. Значение 0 соответствует 0% (всегда выключено), а 4095 — почти 100% (всегда включено). Например, значение 2047 соответствует приблизительно 50% коэффициенту заполнения. Чтобы применить новое значение коэффициента заполнения, сначала необходимо ledc_set_duty()обновить внутреннее значение, а затем ledc_update_duty()передать изменение в аппаратное обеспечение. Без вызова обновления новый коэффициент заполнения не вступит в силу. Постоянно регулируя коэффициент заполнения, мы можем управлять яркостью, скоростью вращения двигателя или любым другим поведением, управляемым ШИМ.

Аналоговые контакты GPIO

Мы рассмотрели цифровые сигналы и то, как они обрабатывают только два значения: ВЫСОКИЙ и НИЗКИЙ (0 В и 3,3 В), а также увидели, как можно использовать ШИМ (широтно-импульсную модуляцию) для имитации аналогового выхода. Однако при работе с электронными устройствами и датчиками нам часто необходимо считывать аналоговые сигналы, не только 0 В или 3,3 В, но и любые значения между ними.

Вот тут-то и пригодится аналого-цифровой преобразователь (АЦП). АЦП — это компонент, который преобразует непрерывное аналоговое напряжение в цифровое число, понятное микроконтроллеру. Проще говоря, он принимает напряжение (например, 1,2 В или 2,7 В) и преобразует его в числовое значение, чтобы ESP32-S3 мог обработать его в коде.

ESP32-S3 имеет два отдельных аналого-цифровых преобразователя: ADC1 и ADC2 . Эти АЦП могут считывать непрерывный диапазон значений напряжения от 0 В до 3,3 В, что делает их идеальными для работы с датчиками, генерирующими изменяющиеся сигналы, такими как датчики температуры, датчики освещенности и потенциометры.

Каждый аналоговый вывод подключен к встроенному АЦП, который преобразует входящее напряжение в цифровое значение. По умолчанию АЦП ESP32-S3 работает с 12-битным разрешением, то есть отображает входное напряжение в диапазоне от 0 до 4095:

  • 0 В → 0
  • 3.3 В→ 4095

Не все контакты GPIO подключены к АЦП. Только определенные контакты могут использоваться для считывания аналоговых сигналов на ESP32-S3, всего доступно 20 аналоговых контактов.

  • Контакты ADC1 (рекомендуемые): GPIO1–GPIO10
  • Контакты ADC2: GPIO11–GPIO20 (они могут конфликтовать с Wi-Fi и в этом случае менее надежны).

Контакты АЦП в ESP32-S3

Аналоговые датчики

Потенциометры

Потенциометр — это переменный резистор с тремя выводами, позволяющий вручную изменять напряжение, подаваемое на аналоговый вывод.

  • Два внешних контакта подключаются к VCC (3,3 В) и GND.
  • Средний контакт (ползунок) подключается к выводу GPIO с поддержкой АЦП, например, к выводу GPIO 1.

При повороте потенциометра напряжение на среднем выводе плавно изменяется от 0 В до 3,3 В. ESP32-S3 считывает это значение и выдает нам результат в диапазоне от 0 до 4095.

Давайте создадим проект для управления яркостью светодиода с помощью потенциометра. Для этого проекта нам понадобится потенциометр, светодиод и резистор на 220 Ом. Сначала подключите два крайних вывода потенциометра к GND и 3,3 В. Затем подключите средний вывод к GPIO 1. Далее подключите короткий вывод светодиода (катод) к GND, а длинный вывод (анод) к GPIO 9 через резистор на 220 Ом.

Схема подключения потенциометра к ESP32-S3

Начнём с включения необходимых для этого проекта библиотек. Поскольку наша цель — управление яркостью светодиода, мы будем использовать ШИМ (широтно-импульсную модуляцию). На ESP32 ШИМ обрабатывается драйвером LEDC, поэтому мы включаем необходимые заголовочные файлы для управления светодиодом, синхронизации FreeRTOS и функциональности АЦП. Поскольку мы также хотим считывать аналоговый сигнал (например, с потенциометра), мы включаем и драйвер одновибрационного АЦП.

Далее, внутри программы app_main() мы настраиваем ШИМ-таймер. Таймер определяет, как ШИМ-сигнал ведет себя с частотой и разрешением. В данном случае мы выбираем частоту 5 кГц, которая достаточно высока, чтобы избежать видимого мерцания, и 12-битное разрешение, которое обеспечивает точный контроль яркости (значения от 0 до 4095).

Затем мы настраиваем ШИМ-канал и подключаем его к GPIO 9, куда подключен наш светодиод. Изначально коэффициент заполнения установлен на 0, что означает, что светодиод выключен.

Теперь перейдём к настройке АЦП (аналого-цифрового преобразователя). АЦП позволяет ESP32 считывать аналоговые напряжения и преобразовывать их в цифровые значения, которые может обрабатывать наша программа.

Мы используем однократный режим, то есть каждое преобразование запускается вручную, когда нам нужно считать данные, а не выполняется непрерывно в фоновом режиме.

Сначала определим переменные, которые хранят его конфигурацию:

  • adc_oneshot_unit_handle_t adc1_handle; После инициализации сохраните дескриптор (ссылку) на АЦП. Мы будем использовать его позже для доступа к АЦП.
  • adc_oneshot_unit_init_cfg_t init_config1 = { .unit_id = ADC_UNIT_1 }; Эта структура определяет, какой АЦП мы хотим использовать. ESP32 имеет несколько АЦП, и здесь мы выбираем АЦП-блок 1.
  • adc_oneshot_chan_cfg_t config = { ... }; Эта структура определяет, как будет вести себя конкретный канал АЦП. Она включает в себя:
    • Разрядность ( .bitwidth = ADC_BITWIDTH_DEFAULT):
      Этот параметр задает разрешение АЦП. По умолчанию оно составляет 12 бит, что означает, что выходные значения находятся в диапазоне от 0 до 4095.
    • Коэффициент затухания ( .atten = ADC_ATTEN_DB_12):
      Этот параметр определяет диапазон измеряемых напряжений. При коэффициенте затухания 12 дБ АЦП может считывать напряжения приблизительно от 0 В до 3,3 В, что соответствует типичным уровням входного сигнала ESP32.

Далее мы создаём (инициализируем) блок АЦП, используя конфигурацию, adc_oneshot_new_unit которая настраивает аппаратное обеспечение АЦП и сохраняет полученный дескриптор в adc1_handle.

Наконец, мы указываем конкретный канал, из которого хотим считывать данные:

Мы выбираем ADC_CHANNEL_0 (который соответствует GPIO 1) и применяем конфигурацию канала, определенную ранее.

Здесь представлена ​​полная программа:

Наконец, мы переходим к основному циклу программы. Этот цикл выполняется непрерывно и состоит из трех простых шагов:

  1. Считайте аналоговое значение с потенциометра с помощью АЦП.
  2. Используйте это значение непосредственно в качестве коэффициента заполнения ШИМ.
  3. Обновите выходной сигнал ШИМ, чтобы яркость светодиода изменялась соответствующим образом.

Поскольку и АЦП, и ШИМ используют 12-битный диапазон (0–4095), мы можем напрямую сопоставить значение АЦП с яркостью светодиода без дополнительного масштабирования.

Для обеспечения стабильности системы и предотвращения чрезмерной нагрузки на процессор добавлена ​​небольшая задержка.

Светозависимый резистор

Фоторезистор (LDR) — это особый тип резистора, сопротивление которого изменяется в зависимости от количества света, которому он подвергается.

  • В темноте его сопротивление очень высокое.
  • При ярком свете его сопротивление становится очень низким.

Для измерения изменяющегося сопротивления мы соединяем его с фиксированным резистором (обычно 10 кОм), чтобы создать делитель напряжения. Выходное напряжение снимается в точке между двумя резисторами, и его значение зависит от соотношения сопротивлений.

Вот схема расположения проводников:

Схема делителя напряжения с фоторезистором

Давайте создадим автоматический ночник, который включает светодиод, когда стемнеет. Подключите один вывод фоторезистора к 3,3 В. Другой вывод подключите к выводу GPIO 1 (ADC1_CH0) и к одному из концов резистора 10 кОм. Другой конец резистора 10 кОм подключите к земле (GND). Наконец, подключите светодиод к выводу GPIO 9 через резистор 220 Ом.

Схема подключения фоторезистора к ESP32-S3

Поскольку нам нужен только стандартный цифровой выход для светодиода, мы будем использовать стандартный драйвер GPIO ( driver/gpio.h). Теперь давайте создадим нашу программу. Начнем с подключения необходимых библиотек, затем настроим GPIO 7 как цифровой выход для управления светодиодом. Настройка АЦП такая же, как и раньше, где мы считываем аналоговое значение с датчика.

Внутри основного цикла мы непрерывно считываем уровень освещенности и используем простое условие для управления светодиодом. Если измеренное значение превышает выбранный порог (1600), это означает, что в помещении ярко, поэтому мы включаем светодиод. В противном случае мы его выключаем. Это демонстрирует, как аналоговый вход может использоваться для запуска цифровых действий в зависимости от условий.

Датчик пламени

Датчик пламени/огня обнаруживает огонь, улавливая инфракрасное (ИК) излучение, испускаемое пламенем, поскольку пламя излучает свет в видимом и инфракрасном диапазонах длин волн. Датчик пламени предназначен для обнаружения инфракрасного света, как правило, в диапазоне 760–1100 нм. В отличие от схемы с фоторезистором (LDR), которая обычно требует внешнего делителя напряжения, модуль датчика пламени уже включает необходимые резисторы и схему обработки сигнала. Модуль обычно имеет четыре контакта: VCC, GND, DO (цифровой выход) и AO (аналоговый выход).

  • Контакт DO: Подает сигнал ВЫСОКОГО или НИЗКОГО уровня, указывающий на наличие пламени, на основе порогового значения встроенного компаратора, регулируемого потенциометром на модуле.
  • Вывод AO: выдает непрерывное напряжение в зависимости от интенсивности пламени.

Чувствительным элементом в модуле является инфракрасный фотодиод. Когда инфракрасное излучение от пламени достигает фотодиода, он генерирует небольшой электрический сигнал. Сила этого сигнала зависит от интенсивности пламени. Этот сигнал передается в две разные части модуля:

Вывод DO выдает простой сигнал ВЫСОКОГО или НИЗКОГО уровня, указывающий на обнаружение пламени. Внутри модуля находится схема компаратора, которая сравнивает сигнал датчика с опорным напряжением. Это опорное напряжение можно регулировать с помощью встроенного потенциометра. Поворот потенциометра по часовой стрелке повышает чувствительность датчика, позволяя ему обнаруживать более слабые или малые языки пламени. Поворот против часовой стрелки снижает чувствительность датчика, поэтому он будет обнаруживать только более сильные или крупные языки пламени.

  • При обнаружении пламени вывод DO переходит в низкое состояние.
  • При отсутствии пламени вывод DO переходит в состояние высокого уровня (HIGH).

На выводе AO выдается напряжение, которое непрерывно изменяется в зависимости от интенсивности регистрируемого инфракрасного излучения.

  • Если пламя слабое или находится далеко, выходное напряжение будет ниже.
  • Если пламя сильное или находится близко, выходное напряжение будет выше.

Датчик огня

Давайте создадим проект, в котором при обнаружении пламени срабатывает зуммер. Подключите вывод GND и VCC (3,3 В) датчика к ESP32-S3. Подключите вывод AO к GPIO 1 (ADC1_CH0). Подключите положительный вывод активного зуммера к GPIO 7, а его вывод GND — к земле.

Схема подключения датчика огня к ESP32-S3

Теперь давайте создадим нашу программу. Начнём с подключения необходимых библиотек, затем настроим GPIO 7 как выход. АЦП инициализируется так же, как и раньше, для считывания аналоговых значений с датчика пламени.

В основном цикле мы непрерывно считываем значение датчика. В отличие от фоторезистора, датчики пламени часто ведут себя обратно: более низкое значение АЦП указывает на более сильное инфракрасное излучение, что свидетельствует о наличии пламени. Поэтому вместо проверки высокого значения мы проверяем, падает ли показание ниже определенного порогового значения (1200). Если да, мы включаем зуммер; в противном случае он остается выключенным. Это простое условие превращает систему в базовый механизм оповещения о пожаре.

Датчик влажности почвы

Датчики влажности почвы измеряют уровень воды в почве. Они делятся на две основные группы:

  • Резистивный метод: используются два открытых электрода. По мере увеличения влажности проводимость возрастает, снижая сопротивление.
  • Емкостной метод: измеряет диэлектрическую проницаемость почвы. Менее подвержен коррозии.

Емкостной и резистивный датчики влажности почвы

Емкостной датчик измеряет диэлектрические свойства почвы. Благодаря этому он менее подвержен коррозии и обычно служит дольше. Он имеет три контакта: VCC, GND и OUT, выходной контакт выдает напряжение, изменяющееся в зависимости от уровня влажности почвы.

  • Когда почва очень влажная, датчик выдает более низкое напряжение.
  • Когда почва становится суше, датчик выдает более высокое напряжение.

Резистивный датчик имеет два открытых электрода, которые вставляются в почву. Когда в почве больше воды, она становится более проводящей, что означает уменьшение сопротивления между электродами. Когда почва сухая, сопротивление увеличивается. Этот тип датчика является наиболее распространенным и недорогим вариантом. Однако сам зонд обычно имеет только два контакта, поэтому его нельзя напрямую подключить к ESP32s3. Вместо этого требуется внешний модуль, который обрабатывает сигнал, выступая в качестве интерфейса между зондом и ESP32s3. Обычно он имеет четыре контакта: VCC, GND, AO (аналоговый выход) и DO (цифровой выход). Контакт AO обеспечивает непрерывное аналоговое напряжение, соответствующее измеренному сопротивлению.

  • Когда почва очень влажная, сопротивление низкое, и датчик выдает более низкое напряжение .
  • Когда почва становится суше и приобретает высокое сопротивление, датчик выдает более высокое напряжение.

На выводе DO выдается цифровой сигнал (ВЫСОКИЙ или НИЗКИЙ) в зависимости от заданного порогового значения, которое можно отрегулировать с помощью встроенного потенциометра; сигнал переходит в ВЫСОКИЙ уровень, когда измеренное значение превышает установленный порог, и в НИЗКИЙ уровень в противном случае.

Давайте создадим автоматизированную систему полива растений. Нам понадобится модуль датчика, водяной насос на 12 В, блок питания на 12 В и релейный модуль на 3,3 В.

Подключите вывод AO датчика влажности к выводу GPIO 1. Подключите вывод IN реле к выводу GPIO 8. Соедините высоковольтную сторону с питанием насоса 12 В через нормально разомкнутый (NO) и общий (COM) контакты реле.

Схема подключения резистивного датчика влажности почвы к ESP32-S3

Теперь давайте создадим нашу программу. Начнём с импорта необходимых библиотек, затем настроим АЦП для считывания уровня влажности почвы и установим GPIO 8 в качестве цифрового выхода для управления насосом.

Внутри контура система постоянно проверяет состояние почвы. Когда почва высыхает, насос автоматически включается для полива растения; как только обнаруживается достаточное количество влаги, он выключается. Таким образом, растение поливается только тогда, когда это необходимо, создавая простую автоматизированную систему полива растений, которая напрямую реагирует на окружающую среду.

Двигатели

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

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

Двигатель постоянного тока

Стандартный двигатель постоянного тока (DC) — наиболее распространенный тип двигателя, с которым мы столкнемся. Он обеспечивает непрерывное вращательное движение.

Двигатель постоянного тока работает по принципу электромагнетизма (принцип силы Лоренца). Внутри двигателя находится катушка проволоки (якорь), расположенная между полюсами постоянного магнита. Когда через катушку протекает электрический ток, он создает магнитное поле, которое воздействует на постоянный магнит, заставляя катушку вращаться. Механический компонент, называемый «коммутатором», постоянно меняет направление тока, чтобы двигатель непрерывно вращался в одном направлении. Скорость двигателя зависит от подаваемого напряжения, а направление вращения зависит от полярности напряжения, подаваемого на клеммы двигателя.

Устройство и принцип действия двигателя постоянного тока

Микроконтроллер ESP32-S3 может выдавать ток всего около 20 мА, чего недостаточно для прямого питания большинства двигателей постоянного тока. Для решения этой проблемы мы используем драйвер двигателя (например, L298N или L293D) или транзисторную схему.

В качестве драйвера используется интегральная схема, содержащая схему "H-моста", которая позволяет безопасно подавать высокий ток от внешней батареи и легко менять направление вращения двигателя.

Распиновка драйвера двигателя L298N и принцип его действия

Давайте создадим простой проект, в котором будем управлять двигателем постоянного тока с помощью драйвера L298N. Сначала подключим двигатель к выходным клеммам драйвера. Затем подключим выводы питания драйвера к батарее и земле. После этого подключим выводы управления драйвера к ESP32-S3.

  • Входы IN1 и IN2 управляют направлением вращения. Для выбора направления мы устанавливаем один вход в высокое состояние (HIGH) , а другой — в низкое (LOW). IN1 подключаем к GPIO 20, а IN2 — к GPIO 19.
  • ENA управляет скоростью двигателя с помощью ШИМ, для этого используется вывод GPIO 21.

Схема подключения двигателя постоянного тока к ESP32-S3 с помощью драйвера L298N

Для этой программы мы начнём с подключения необходимых библиотек. Затем мы создадим и настроим ШИМ-таймер и подключим его к выводу 21, чтобы управлять его сигналом. После этого мы настроим выводы 19 и 20 как выходные. Как только всё будет готово, мы войдём в бесконечный цикл, где будем чередовать состояния этих двух выводов, одновременно изменяя коэффициент заполнения ШИМ на выводе 21. Это позволит двигателю вращаться в одном направлении в течение одной секунды с половинной скоростью, а затем переключаться в противоположное направление на одну секунду с четвертью скорости.

Сервомотор

Сервомотор не вращается непрерывно, как обычный двигатель постоянного тока. Вместо этого он предназначен для точного позиционирования. Стандартные сервомоторы для любительского использования могут вращаться на определенный угол, обычно от 0 до 180 градусов. Они идеально подходят для рулевых механизмов, роботизированных манипуляторов и подвесов для камер.

Сервопривод представляет собой систему с замкнутым контуром управления. Внутри его корпуса находится небольшой двигатель постоянного тока, редуктор для его замедления и увеличения крутящего момента, а также потенциометр (переменный резистор), подключенный к выходному валу. По мере вращения двигателя потенциометр вращается вместе с ним, постоянно измеряя текущий угол и передавая эту информацию во внутреннюю схему управления. Схема управления получает ШИМ-сигнал и сравнивает желаемое положение с текущим положением, измеренным потенциометром. Если положения различаются, двигатель вращается до достижения нужного угла.

Внутреннее устройство сервомотора

Сервомотор обычно имеет три контакта: GND, VCC и управляющий контакт. Управляющий контакт принимает сигнал ШИМ (широтно-импульсной модуляции), который определяет положение вала.

Управляющий сигнал представляет собой ШИМ-сигнал с частотой 50 Гц, что соответствует периоду 20 мс. Положение сервопривода контролируется шириной импульса в течение этого периода.

Для стандартного сервомотора:

  • Импульс длительностью 0,5 мс поворачивает вал примерно на −90°.
  • Импульс длительностью 1,45 мс устанавливает вал в положение 0° (центральное положение).
  • Импульс длительностью 2,5 мс поворачивает вал примерно на +90°.

Если разрешение ШИМ составляет 4095 шагов (например, 12-битный таймер), а общий период равен 20 мс, то соответствующее цифровое значение для заданной ширины импульса можно рассчитать следующим образом:

Формула для расчета ширины импульса для управления сервомотором

где:

  • N — это цифровое значение счетчика, которое необходимо загрузить в регистр ШИМ.
  • Pwidth — это ширина импульса в миллисекундах.

Давайте создадим простой проект, в котором мы будем вращать сервопривод на 90° в течение 1 секунды , а затем на -90° в течение 1 секунды , и так повторять это несколько раз.

Сначала начнём с построения схемы. Подключите:

  • Заземление сервопривода к заземлению на плате.
  • Напряжение VCC сервопривода подается на вывод 5 В микроконтроллера ESP32-S3.
  • Контакт управления сервопривода подключен к GPIO 21.

Схема подключения сервомотора к ESP32-S3

Теперь давайте создадим нашу программу. Сначала подключим необходимые библиотеки для FreeRTOS и драйвер LEDC PWM. После этого настроим GPIO 21 для генерации ШИМ-сигнала с частотой 50 Гц, необходимого для управления сервомотором.

Внутри основного цикла мы чередуем два значения коэффициента заполнения, соответствующие +90° и −90° , удерживая каждое положение в течение 1 секунды перед переключением.

Значения коэффициента заполнения мы получаем, используя математические соотношения, которые мы обсуждали ранее.

Бесщеточный двигатель постоянного тока (BLDC)

Бесщеточный (бесколлекторный) двигатель постоянного тока, часто называемый двигателем BLDC, предназначен для непрерывного вращения, как и обычный двигатель постоянного тока, но без щеток, которые есть в традиционных двигателях. Вместо механической коммутации он использует электронную коммутацию, что делает его более эффективным, тихим и долговечным.

В стандартном двигателе постоянного тока постоянные магниты расположены снаружи (статор), а катушки электромагнита вращаются внутри (ротор). В бесколлекторном двигателе постоянного тока эта конструкция изменена: катушки остаются неподвижными снаружи, а постоянный магнит вращается внутри.

Поскольку в системе отсутствует механический коммутатор для переключения тока в катушках, она использует электронный регулятор скорости (ESC). ESC быстро и точно переключает питание катушек, чтобы вращать магнитный ротор. Это переключение создает вращающееся магнитное поле, которое заставляет ротор вращаться.

Управляющий сигнал представлен в виде ШИМ-сигнала, который определяет скорость этой последовательности. Более высокие коэффициенты заполнения увеличивают скорость, а более низкие — уменьшают ее.

В бесколлекторном двигателе постоянного тока обычно три входных провода, которые соответствуют трем фазам статора (часто обозначаемым A, B и C). Каждый провод подключается к одному комплекту обмоток внутри двигателя.

Внутреннее устройство BLDC двигателя

Давайте создадим простой проект для управления бесколлекторным двигателем с помощью ESP32-S3. Для этого проекта нам понадобится бесколлекторный двигатель постоянного тока (BLDC), электронный регулятор скорости (ESC) в качестве драйвера и подходящий аккумулятор, способный обеспечить достаточное питание двигателя.

Сначала подключите провода GND и VCC (5 В) от управляющего кабеля регулятора скорости (ESC) к контактам GND и 5 В микроконтроллера ESP32S3. Затем подключите сигнальный (управляющий) провод от ESC к GPIO 9, который будет передавать ШИМ-сигнал, используемый для управления скоростью двигателя. Далее подключите батарею к входу питания ESC для подачи необходимого питания. Наконец, подключите три провода бесколлекторного двигателя к трем выходным проводам ESC. Эти провода соответствуют трем фазам двигателя и позволяют ESC управлять двигателем, переключая ток между ними.

Схема подключения BLDC двигателя к ESP32-S3

Как и в случае с сервоприводом, стандартный управляющий сигнал ESC представляет собой ШИМ-сигнал с частотой 50 Гц, что соответствует периоду в 20 мс. Скорость двигателя регулируется шириной импульса в течение этого периода.

Для стандартного регулятора скорости:

  • Импульс длительностью 1 мс переводит двигатель в состояние 0% дроссельной заслонки (остановка).
  • Импульс длительностью 1,5 мс устанавливает двигатель в положение 50% дроссельной заслонки.
  • Импульс длительностью 2 мс устанавливает двигатель на 100% (максимальную скорость).

Если разрешение ШИМ составляет 4095 шагов (например, 12-битный таймер), а общий период равен 20 мс, то соответствующее цифровое значение для заданной ширины импульса можно рассчитать точно так же, как и для сервоприводов:

Формула для расчета ширины импульса для управления BLDC двигателем

где:

  • N — это цифровое значение счетчика, которое необходимо загрузить в регистр ШИМ.
  • Pwidth — это ширина импульса в миллисекундах.

Теперь воспользуемся приведенной выше информацией для создания нашей программы. Сначала подключим необходимые библиотеки для FreeRTOS и драйвер LEDC PWM. После этого настроим GPIO 9 для генерации ШИМ-сигнала с частотой 50 Гц, что необходимо для стандартных ESC.

Важно отметить, что для обеспечения безопасности регуляторам скорости (ESC) требуется «последовательность активации». При первом включении они должны получать сигнал 0% дроссельной заслонки (импульс длительностью 1 мс) в течение нескольких секунд, прежде чем начнут реагировать на команды скорости. Мы обрабатываем это в app_main перед контуром управления. Внутри основного контура мы чередуем значения коэффициента заполнения, соответствующие 50% и 0% дроссельной заслонки.

Шаговый двигатель

Шаговый двигатель — это двигатель, который вращается небольшими точными шагами, а не непрерывно; каждый электрический импульс перемещает двигатель на фиксированный угол. Если угол шага двигателя составляет 1,8 градуса, то для совершения одного полного оборота требуется ровно 200 шагов. Они отлично подходят для точного позиционирования без необходимости обратной связи, что делает их основой 3D-принтеров и станков с ЧПУ.

Шаговый двигатель содержит центральный, зубчатый, похожий на шестерню магнитный ротор, окруженный множеством электромагнитных катушек (статоров), организованных в «фазы». При последовательном включении питания на эти катушки зубья ротора магнитно притягиваются и выравниваются с питаемой катушкой, заставляя двигатель перемещаться вперед на долю градуса.

Внутреннее устройство шагового двигателя

Шаговые двигатели, как и бесщеточные, требуют для корректной работы специализированных драйверов. Драйвер выступает в роли «мозга» между системой управления (Esp32S3) и самим двигателем. Он принимает управляющие сигналы, обычно в виде импульсов шага и команд направления, и преобразует их в точные последовательности электрических сигналов, которые подают питание на обмотки двигателя в нужном порядке. Драйвер контролирует, какие обмотки получают питание в каждый момент времени, обеспечивая плавное и точное перемещение ротора в желаемое положение. Некоторые драйверы также обеспечивают такие функции, как ограничение тока, микрошаговое управление (разделение шагов на более мелкие приращения для более плавного движения) и защиту от перегрева. К распространенным драйверам шаговых двигателей относятся A4988, DRV8825 и ULN2003.

Распиновка драйвера A4988

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

  • VMOT  подключается к источнику питания двигателя (обычно 8–35 В). Обеспечивает питание обмоток шагового двигателя.
  • GND (рядом с VMOT)  подключается к отрицательной клемме источника питания двигателя.
  • VDD  подключается к источнику питания Arduino 5 В (логическое питание). Обеспечивает питание внутренних логических схем драйвера.
  • GND (логическая сторона)  Подключается к GND Arduino. Должен иметь общую землю с Arduino.
  • А1 и А2  подключаются к одной из обмоток шагового двигателя.
  • B1 и B2  подключаются к другой обмотке шагового двигателя.
  • Входной сигнал STEP  -импульса. Каждый импульс перемещает двигатель  на один шаг .
  • Входное значение DIR  (направление вращения). HIGH или LOW выбирает вращение по часовой стрелке или против часовой стрелки.
  • Включение при низком уровне (ENABLE  LOW) активирует драйвер, при высоком уровне (HIGH) отключает вывод сигнала на двигатели. При постоянном включении можно установить низкий уровень (LOW).
  • RESET  Сбрасывает логику драйвера. Обычно имеет высокий уровень, если не используется.
  • SLEEP  Переводит драйвер в режим сна с низким энергопотреблением. Подключите HIGH, чтобы разбудить драйвер.
  • MS1, MS2, MS3  — управление разрешением микрошага.
MS1 MS2 MS3 Режим микрошага
LOW LOW LOW Полный шаг
HIGH LOW LOW Полшага
LOW HIGH LOW Четверть шага
HIGH HIGH LOW Одна восьмая шага
HIGH HIGH HIGH Одна шестнадцатая шага

Рассмотрим простой пример с использованием шагового двигателя на 12 В и драйвера шагового двигателя A4988. Начнём с подключения катушки 1 шагового двигателя к выводам A1 и B1 на драйвере, а катушки 2 — к выводам B1 и B2. Затем подключим вывод VMOT к положительной клемме батареи 12 В, а вывод GND — к отрицательной клемме батареи.

После этого начнём подключать драйвер к Esp32s3. Подключим вывод GND на нижней части драйвера к GND Esp32s3, вывод VDD — к 5 В Esp32s3, и, наконец, подключим выводы DIR и STEP к выводам 19 и 20 Esp32s3.

Схема подключения шагового двигателя к ESP32-S3 с помощью драйвера A4988

Управляющие сигналы в основном представляются в виде STEP импульса и логического уровня для DIR (направления). Один импульс на STEP выводе перемещает двигатель на один шаг, а частота этих импульсов определяет скорость: более высокие частоты увеличивают скорость, а более низкие — уменьшают её.

Давайте создадим простую программу, которая заставит двигатель сделать 100 шагов в одном направлении, подождать 3 секунды, а затем сделать 100 шагов в противоположном направлении. Сначала подключим необходимые библиотеки. Затем настроим GPIO 19 и GPIO 20 как выходные контакты. GPIO 19 используется для управления направлением вращения двигателя, а GPIO 20 — для генерации шагового сигнала.

В программе мы сначала устанавливаем низкий уровень на выводе GPIO 19, чтобы выбрать одно направление движения, а затем перемещаем двигатель, генерируя 100 импульсов шага с помощью вывода GPIO 20. После небольшой задержки мы устанавливаем высокий уровень на выводе GPIO 19, чтобы изменить направление движения двигателя, и снова отправляем 100 импульсов шага. Эта последовательность непрерывно повторяется, заставляя двигатель попеременно двигаться вперед и назад.

 

(Проголосуй первым!)
Загрузка...
20 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *