ESP8266 NodeMCU PWM
У попередній статті ми познайомились з 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", данні будуть відправлятися тільки коли ви відпустите слайдер.
Для того, щоб слайдер не відправляв непотрібні пробіли між ключем і значенням, виконуємо пункт "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 NodeMCU Перше знайомство. Робимо WiFi розетку
- ESP8266 NodeMCU. PWM
- ESP8266 NodeMCU. ADC
- ESP8266 NodeMCU. timer, rtc, SNTP, cron
- ESP8266 NodeMCU. файлова система, SD Card
- ESP8266 NodeMCU. UART
- GPS-трекер на базі ESP8266
- GPS-трекер + Дисплей SSD1306
- ESP8266 NodeMCU. SSD1306. U8G
- ESP-01 (ESP8266) upgrade flash memory to 4MB
- ESP8266 NodeMCU. I2C. BME280/
- Метеостанція на ESP8266
"Якщо перевести у числа, якими ми задаємо шпаруватість PWM сигналу, ці числа будуть у діапазоні від 50 до 100" а откуда берутся эти числа?
Со светодиодом все получилось, а с сервой - ни в какую. Машинки использовал: MG996R и SG 90. Только дергаются при подаче 5V, а дальше тишина. Сделать изменения после Led не забыл
Tags
dma dc-dc lcd eb-500 raspberry-pi tim wifi eeprom gpio piezo rfid usb encoder capture avr mongodb adc soldering ngnix gps css python options examples ethernet motor atmega sensors bkp exti led meteo mpu-9250 remap solar smd html docker hih-4000 programmator displays mpx4115a battery brushless web pmsm nodemcu watchdog rtc servo uart i2c mpu-6050 pwm usart sms git ssd1331 3d-printer flash nvic books websocket st-link ssd1306 max1674 foc stm32 java-script esp8266 timer bmp280 barometer dht11 rs-232 bluetooth bldc flask bme280
Архіви













