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