В предыдущей статье мы познакомились с NodeMCU и попытались управлять GPIO выводами. Теперь будем использовать PWM для управления яркостью светодиода и попробуем управлять сервомашинками или сервоприводом. За работу с PWM отвечает модуль PWM. Обратите на это внимание, когда будете делать сборку NodeMCU. Как собрать NodeMCU с нужными модулями мы рассматривали в предыдущей статье.
NodeMCU позволяет использовать одновременно не более 6 PWM выходов на пинах от 1 до 12. Частота PWM может быть от 1 до 1000 Гц. Скважность задается 10 битным числом, то есть от 0 до 1023.
Управление яркостью светодиода
Подключим светодиод как показано на схеме:
Теперь настроим D2 как PWM выход. Зададим частоту 50 Гц, и скважностью 50%. Скважность задается числом от 0 до 1023, для 50% это будет 512.
pwm.setup(2, 50, 512) pwm.start(2)
После команды pwm.start (2) PWM выход начнет работать, а светодиод загорится вполсилы. Изменять скважность можно командой pwm.setduty.
Пример:
pwm.setduty(2, 1023)
Напишем и сохраним на ESP8266 lua скрипт. Этот скрипт даст возможность управлять яркостью светодиода с мобильного телефона с помощью приложения RoboRemoFree. Об этой программе говорилось в предыдущей статье. Текст скрипта:
--WiFi AP Settup wifi.setmode(wifi.STATIONAP) cfg={} cfg.ssid="ESPWIFI" cfg.pwd="1234567890" wifi.ap.config(cfg) --PWM init pwm.setup(2, 50, 0) pwm.start(2) --Create Server sv=net.createServer(net.TCP) function receiver(sck, data) --// Parse data for k, v in string.gmatch(data, "(%w+)=([%-%d]+)") do if k == 'led1' then pwm.setduty(2, tonumber(v)) end end end if sv then sv:listen(333, function(conn) conn:on("receive", receiver) end) end
Немного о работе функции receiver. Она получает и разбирает данные. Данные должны поступать в формате key=value
Например: led1=815
Таким образом, мы можем обеспечить передачу данных для нескольких каналов. Это могут быть различные данные, не только информация для управления каналами PWM. Функция receiver содержит единственный оператор if для одного светодиода:
if k == 'led1' then
Вы можете расширить функционал по мере необходимости.
Теперь в программе RoboRemoFree сделаем интерфейс для управления яркостью светодиода. Как создать подключение к ESP8266 рассматривалось в предыдущей статье, поэтому сейчас мы сосредоточимся на деталях реализации интерфейса.
Для управления яркостью светодиода будем использовать Slider. Установим его на свободное место.
В параметрах слайдера укажем ID “led1=”
И укажем диапазон, то есть минимальное и максимальное значение.
Для того, чтобы данные отправлялись во время передвижения слайдера, выполняем команду “send when moved“. Иначе, если оставить “send when released”, данные будут отправляться только, когда вы отпустите слайдер.
Для того, чтобы слайдер не отправлял ненужные пробелы между ключом и значением, выполняем пункт “do not send space”
Теперь передвижением слайдера можно менять яркость светодиода.
Управление сервоприводом
Сервоприводы, или сервомашинки управляются PWM сигналом специальной формы. Частота фиксированная – 50 Гц. Длительность импульсов, от 0,9..2 мс до 2,0..2,1 мс.
Подробнее о сервопривод читайте здесь: http://www.avislab.com/blog/serva/
Если перевести в числа, которыми мы задаем скважность PWM сигнала, эти числа будут в диапазоне от 50 до 100 Соответственно, в среднюю позицию сервомашинка устанавливается числом – 75.
Немного переделаем скрипт. Изменим ID led1 на servo1, и во время инициализации PWM зададим начальную (среднюю) позицию сервомашинки:
--WiFi AP Settup wifi.setmode(wifi.STATIONAP) cfg={} cfg.ssid="ESPWIFI" cfg.pwd="1234567890" wifi.ap.config(cfg) --PWM init pwm.setup(2, 50, 75) pwm.start(2) --Create Server sv=net.createServer(net.TCP) function receiver(sck, data) --// Parse data for k, v in string.gmatch(data, "(%w+)=([%-%d]+)") do if k == 'servo1' then pwm.setduty(2, tonumber(v)) end end end if sv then sv:listen(333, function(conn) conn:on("receive", receiver) end) end
Подключим сервомашинку как показано на схеме:
Скорректируем интерфейс для работы с сервой.
Во-первых, изменим ID. Вместо led1 укажем servo1:
Во-вторых, изменим диапазон:
Теперь передвигая слайдер мы можем управлять сервомашинкой.
В мобильных гаджетах есть акселерометр, который обычно используется для определения угла наклона мобильного телефона или планшета. Мы можем использовать акселерометр для управления сервоприводом. То есть, будем управлять сервой наклоняя мобильный телефон. В программе RoboRemoFree делаем новый интерфейс и устанавливаем на него акселерометр:
В настройках “x axis config” указываем ID “servo1 =“, и задаем диапазон от 50 до 100:
Затем выполняем пункт “do not send space“:
Интерфейс готов:
Теперь наклоном мобильного телефона можно управлять сервоприводом.
Желаю успехов.
Смотри также:
- ESP8266 NodeMCU Первое знакомство. Делаем WiFi розетку
- ESP8266 NodeMCU. PWM
- ESP8266 NodeMCU. ADC
- ESP8266 NodeMCU. timer, rtc, SNTP, cron
- ESP8266 NodeMCU. Файловая система + SD карточка
- ESP8266 NodeMCU. UART
- GPS-трекер на базе ESP8266
- GPS-трекер + Дисплей SSD1306
- ESP8266 NodeMCU. SSD1306. U8G
- ESP-01 (ESP8266) upgrade flash memory to 4MB
- ESP8266 NodeMCU. I2C. BME280/
- Метеостанция на ESP8266
Быстро разобрался – очень крутая статья! Спасибо автору.
А как зделать для 4 шим, я так и не могу понять. можно пример скрипта пожалуста.
pwm.setup(1, 5, 10)
pwm.setup(2, 5, 100)
pwm.setup(3, 5, 500)
pwm.setup(5, 5, 700)
pwm.start(1)
pwm.start(2)
pwm.start(3)
pwm.start(5)
Примечание из документации:
Set PWM frequency. Note: Setup of the PWM frequency will synchronously change other setups as well if there are any. Only one PWM frequency can be allowed for the system.
Т.е. На всех ногах может быть только одна частота.
День добрый, статья хорошая
Подскажите как подключить регулятор скорости(у них похожее подключение с сервоприводом, но возможно есть отличия)
Если Вы имеете в виду ESC для BLDC моторов, которые используют для RC-моделей, тогда отличий нет. Все тоже самое как и для серв, только при включении нужно устанавливать минимальную скважность а не среднее значение как у серв.
всё разобрался сам спасибо
Здравствуйте приведите пожалуйста пример как сделать так чтобы на двух выходах была одна и та-же частота шим но со сдвигом фаз в 90 градусов
Боюсь, что для ESP под NodeMCU эта задача не под силу.
>
> примерно так