ESP8266 NodeMCU PWM


12.05.2017

У попередній статті ми познайомились з NodeMCU і спробували керувати GPIO виводами. Тепер використаємо PWM для керування яскравістю світлодіода і спробуємо керувати сервомашинкою або сервоприводом. За роботу з PWM відповідає модуль PWM. Зверніть на це увагу, коли будите робити зборку NodeMCU. Як зібрати NodeMCU з потрібними модулями ми розглядали у попередній статті.

Документація по модулю PWM

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", данні будуть відправлятися тільки коли ви відпустите слайдер.

Для того, щоб слайдер не відправляв непотрібні пробіли між ключем і значенням, виконуємо пункт "don`t send space"

Тепер пересуванням слайдера можна змінювати яскравість світлодіода.

Керування сервоприводом

Сервоприводи, або сервомашинки керуються PWM сигналом спеціальної форми. Частота фіксована - 50 Гц. Тривалість імпульсів, від 0,9..2 мс до 2,0..2,1 мс.

Детальніше про сервопривод читайте тут: Управление сервоприводом (сервомашинкой) с помощью микроконтроллера ATMega Якщо перевести у числа, якими ми задаємо шпаруватість 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:

Потім виконуємо пункт "don`t send space":

Інтерфейс готовий:

Тепер нахилом мобільного телефону можна керувати сервоприводом.

Бажаю успіхів.

Дивись також:

ESP8266
Коментарі:
Сергей говорить:
25.04.2018 19:51
"Якщо перевести у числа, якими ми задаємо шпаруватість PWM сигналу, ці числа будуть у діапазоні від 50 до 100"

а откуда берутся эти числа?

Сергей говорить:
25.04.2018 19:55
Со светодиодом все получилось, а с сервой - ни в какую.
Машинки использовал: MG996R и SG 90. Только дергаются при подаче 5V, а дальше тишина. Сделать изменения после Led не забыл

Додати коментар
Code
* - обов'язкові поля

Архіви