сайт для палких паяльників

В предыдущей статье мы познакомились с 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”, данные будут отправляться только, когда вы отпустите слайдер.

Для того, чтобы слайдер не отправлял ненужные пробелы между ключом и значением, выполняем пункт “do not send space”

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

Управление сервоприводом

Сервоприводы, или сервомашинки управляются PWM сигналом специальной формы. Частота фиксированная – 50 Гц. Длительность импульсов, от 0,9..2 мс до 2,0..2,1 мс.

Подробнее о сервопривод читайте здесь: http://www.avislab.com/blog/serva/

Если перевести в числа, которыми мы задаем скважность 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:

Затем выполняем пункт “do not send space“:

Интерфейс готов:

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

Желаю успехов.

Смотри также:

3 комментария: ESP8266 NodeMCU PWM

  • Коля говорить:

    А как зделать для 4 шим, я так и не могу понять. можно пример скрипта пожалуста.

    • andre говорить:

      pwm.setup(1, 5, 10)
      pwm.setup(2, 5, 100)
      pwm.setup(3, 5, 500)
      pwm.setup(5, 5, 700)
      pwm.start(1)
      pwm.start(2)
      pwm.start(3)
      pwm.start(5)

      Примечание из документации:
      Set PWM frequency. Note: Setup of the PWM frequency will synchronously change other setups as well if there are any. Only one PWM frequency can be allowed for the system.

      Т.е. На всех ногах может быть только одна частота.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

 
Translate
Архіви

© 2011-2018 Андрій Корягін, Кременчук - Київ, Україна