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 не забыл
Недавні записи
- Комп'ютерний зір (Машинний зір)
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
- DC-DC для IGBT драйверів ізольований 2 W +15 -8 вольт
- U-FOC - Векторне керування безколекторними моторами
- FOC - своя реалізація векторного керування. Підбиваю підсумки 2022 року
- Конструктор регуляторів моторів. Підбиваю підсумки 2022 року.
Tags
ngnix flash flask i2c servo dma gpio avr solar bme280 docker eeprom sms java-script barometer rtc dht11 ssd1306 bldc motor raspberry-pi ssd1331 mpu-9250 dc-dc rfid foc st-link usb remap pwm capture soldering nodemcu lcd eb-500 esp8266 mpu-6050 nvic usart books mpx4115a timer adc bluetooth tim programmator meteo sensors led python websocket hih-4000 html pmsm mongodb bmp280 gps encoder displays smd stm32 css git examples rs-232 ethernet brushless 3d-printer watchdog max1674 exti atmega options battery uart wifi bkp piezo web
Архіви