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
bme280 mpu-6050 encoder examples adc lcd python wifi bluetooth rtc pwm piezo ngnix watchdog books rfid web st-link eeprom bkp usart led nodemcu flash websocket uart 3d-printer options html git meteo gpio soldering flask tim servo rs-232 raspberry-pi programmator stm32 sms dma battery dht11 hih-4000 css ssd1331 pmsm bmp280 avr brushless motor usb barometer max1674 displays esp8266 docker java-script ssd1306 i2c capture nvic bldc atmega exti ethernet timer mpu-9250 smd mpx4115a sensors dc-dc mongodb eb-500 remap solar foc gps
Архіви













