DIY беспроводной контроллер сервопереключателей с Raspberry Pi Pico W

Контроллер сервопереключателей Pico W Изображение заголовка

Одна из самых больших проблем, с которой я сталкиваюсь, - это встать с кровати, чтобы выключить свет в спальне. Это очень трудно сделать, когда вы уютно устроились в постели. И вот здесь я хочу рассказать вам, как решить эту проблему с помощью контроллера выключателя Pico W Servo.

Несколько лет назад я создал беспроводное решение на базе Arduino и ИК-пульта. Это решение оказалось довольно эффективным, поскольку было надежным и решало мою проблему. Однако это было не без недостатков.

Во-первых, Arduino Uno был массивным по сравнению с Raspberry Pi Pico W.

Во-вторых, он зависел от ИК-сигнала, что означало, что мне нужно было знать, где находится мой ИК-пульт, когда я хотел выключить свет.

И здесь у Raspberry Pi Pico W есть свое преимущество. Вы можете управлять сервоприводом прямо с телефона.

Контроллер сервопереключателей Pico W
Обзор проекта DIY по беспроводному управлению выключателями

Зачем заниматься этим проектом "Сделай сам"?

Это уродливо. Это утомительно.

Но это также включает в себя радость и удовольствие от создания собственного решения проблем.

Современные проблемы требуют современных решений, и вы можете посмотреть, как люди решают свои проблемы с помощью Raspberry Pi здесь.

Кроме того, это может понадобиться, поскольку вы не имеете права изменять электрооборудование в своем доме.

Или вы не хотите тратиться на то, чтобы нанять для этого профессионала.

Другая причина заключается в том, что этот проект настолько расширяемый и портативный. Вам не обязательно использовать его на выключателе света, вы можете использовать его на клавиатуре, для остановки заставок, например.

Видео

Возможно управление двухсторонним переключателем, но проще всего односторонним

Контроллер сервопереключателей Pico W
Сервопривод приведен в действие для отключения выключателя света
Контроллер сервопереключателей Pico W
Сервопривод на полном обороте, выключение выключателя

Если есть одна вещь, которую вы точно можете сделать со всеми выключателями в мире, будь то европейские или североамериканские, вы всегда можете использовать сервопривод для выключения или включения.

Но если вы хотите управлять переключателем в обоих направлениях, это становится более сложной инженерной задачей, поскольку сервопривод может мешать.

Например, если вам нужно иметь возможность вручную включать и выключать выключатель, вы можете обнаружить, что кронштейны сервопривода мешают. Вы не сможете сдвинуть его с места, не разрушив двигатель, поскольку сервопривод запрограммирован на то, чтобы всеми силами удерживать себя на месте.

Широковещательная сеть или подключение к сети?

Raspberry Pi Pico W может подключаться к вашей домашней сети или транслировать свою собственную сеть.

Я пробовал оба метода и нашел некоторые плюсы и минусы обоих методов.

Как станция (т.е. подключается к сети)

В первоначальном проекте я заставил свой Pico W подключиться к моей домашней сети, и он обслуживал HTML-файл с кнопкой на своем IP-адресе 192.168.0.70.

Преимуществом этого было то, что я легко мог загрузить браузер и нажать кнопку, которая выключала свет.

Однако обратная сторона заключается в том, что любой человек в сети также мог это сделать, если только вы не внедрили какую-либо форму аутентификации.

Еще один недостаток заключается в том, что если в вашей домашней сети пропадет питание, Raspberry Pi Pico W не сможет снова подключиться к сети, если только вы не внедрите код, который перезагрузит Pico W или снова подключит его к сети.

В качестве точки доступа

При подключении к нему сервопривод будет вращаться, выключая выключатель

В настоящее время я использую свой Pico W в качестве точки доступа, хотя я не утверждаю, что это лучший способ продвижения вперед.

Он передает сеть, к которой я должен подключиться отдельно, чтобы управлять сервоприводом. Это неудобный недостаток.

Преимущество этого метода в том, что, в отличие от метода станции, у вас есть пароль на сеть, поэтому только вы можете подключиться к ней.

Первоначально у меня была точка доступа, которая обслуживала веб-страницу с кнопкой для запуска сервопривода. Мне показалось, что это слишком громоздко, поскольку вам нужно 1) подключиться к сети, 2) перейти к IP-адресу Pico W и 3) нажать кнопку.

Я нашел лучшее решение - запускать сервопривод, как только Pico W обнаружит клиента, подключающегося к точке доступа. Таким образом, достаточно подключить любое устройство к Pico W, и свет (или выключатель) будет выключен.

Подключение Pico W к сервоприводу

Это простой проект, и вы должны быть в состоянии найти детали в наборе для начинающих. Если нет, вот список деталей.

Я также использовал дополнительную макетную плату для подключения сервопривода к Pico W с помощью проводов-перемычек, но вы можете подключить сервопривод непосредственно к разъемам Pico W с помощью проводов-перемычек.

Вам также понадобится двухсторонний скотч, чтобы приклеить сервопривод к корпусу выключателя света.

Подключение

Контроллер сервопереключателей Pico W
Подключение Pico W к сервоприводу. (схема сделана с помощью Wokwi)

Как правило, все сервоприводы имеют красный, черный/коричневый и третий провод.

Подключите красный провод перемычки к красному проводу, идущему от сервопривода. Именно сюда вы будете подавать 5 В, через VBUS.

Подключите черный провод к черно-коричневому проводу. Вы подключите его к GND на Pico W.

Подключите другой провод к третьему проводу. Мой провод оранжевого цвета, поэтому я использовал оранжевый провод с перемычкой. Это сигнальный провод, который я подключил к GPIO16.

Код

Этот код позволит вам запустить сервопривод при подключении клиента к точке доступа SoftAP Pico W.

import network
import machine
from machine import PWM
from time import sleep

#Pin param = servo GPIO pin number
pwm = PWM(machine.Pin(16))

ssid = 'Lights-Out'
password = 'sleeptime'

ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)

while ap.active() == False:
  pass

print('Connection successful')
print(ap.ifconfig())

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

#ap.status is a blank array until someone connects, then it will have one entry
#when ap.status = true, then it will trigger rotateServo()
# then it will shut itself off to kick the user off the network,
# allowing the device to reconnect to its usual network

while True:
    try:
        if ap.status('stations'):
            print('client connected')
            rotateServo()
            sleep(5)
            ap.active(False)
            sleep(2)
            ap.active(True)
        
    except OSError as e:
        print('Connection closed')

Некоторые важные строки кода для объяснения:

Код предполагает, что вы подключили сигнальный провод к GPIO16. Если это не так, измените целое число "16" в этой строке на вывод GPIO, к которому вы подключены.

#Pin param = servo GPIO pin number
pwm = PWM(machine.Pin(<strong>16</strong>))

Здесь настраивается SoftAP, объявляется имя SSID и пароль,

import network
...
ssid = 'Lights-Out'
password = 'sleeptime'

ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)

Сервоуправление на Pico W

Это управляет сервоприводом. Вероятно, вам придется модифицировать его.

Для моего сервопривода я мог бы использовать значение от 500000 (500K) до 2000000 (2 mil). Это обеспечит полный диапазон работы сервопривода.

Однако мне требовалось лишь небольшое вращение. Следовательно, я установил сервопривод на полное вращение с помощью pwm.duty_ns(2000000) а затем пусть возвращается в pwm.duty_ns(1500000).

Вероятно, лучше всего проверить это, когда сервопривод находится в свободном плавании, чтобы вы могли видеть, вращается ли он в правильном направлении, а затем вы можете точно настроить градусы вращения.

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

Трансляция точки доступа, запуск rotateServo при подключении

Эта строка кода выполняется многократно.

while True:
    try:
        if ap.status('stations'):
            print('client connected')
            rotateServo()
            sleep(10)
            ap.active(False)
            sleep(2)
            ap.active(True)

Если ap.status('stations') обнаруживает подключение к беспроводной сети, он возвращает массив с одним элементом.

ap.status('stations') возвращает пустой массив, если к точке доступа никто не подключен

Следовательно, если код не является пустым массивом, он запустит rotateServo и выключите точку доступа, прежде чем снова включить ее.

Идея включения и выключения точки доступа заключается в том, чтобы выкинуть подключенного клиента из сети. Это позволяет ему подключиться к привычной сети с подключением к Интернету.

android auto reconnect off
Автоматическое повторное подключение отключено в Android

Только не забудьте отключить автоподключение в телефоне или компьютере.

Зачем нам нужен sleep(x) между вызовами ap.active()? Потому что я узнал, что если я буду выключать и включать точку доступа слишком быстро, мой телефон не будет разрывать соединение.

Узнайте больше о Raspberry Pi Pico W

Мы написали статью специально для Raspberry Pi Pico W, которая поможет вам получить максимальную отдачу от вашего Pico W. Нажмите здесь, чтобы узнать о том, чего вы никогда не знали.

2 комментариев

  1. Udo Февраль 24, 2023 в 3:47 пп

    Очень интересно,
    ich betreibe gerade viel Recherche zum pico w.
    Vielleicht ist meine Idee auch zu selten, deshalb bin ich nur auf eine ähnliches Projekt mit dem Pi Zero gestossen.
    Так ганц-блик я не могу быть с Пико.
    Моя цель: Den Pico W als Keyboard Remote eingabe zu nutzen.
    Это необходимо: Ich schicke von meinem Smarthome per Handy oder Script Tastaturbefehle, die der Pico empfängt und quasi die Tasten am PC drückt.
    С помощью библиотеки hid можно эмулировать клавиатуру.
    Таким образом, можно автоматически отключить ПК за один разрыв связи.
    Преимущество эмуляции hid: Es läuft quasi überall ohne Treiber und Software auf dem PC. Независимо от системы. Таким образом, человек может самостоятельно управлять Bios.
    Vielleicht hast du ja eine Idee, ob sich das mit dem Pico W realisieren lässt.
    Ohne Wlan geht das wohl: https://www.heise.de/tests/Ausprobiert-Raspberry-Pico-mit-USB-HID-als-Tastatur-oder-Maus-benutzen-6011697.html
    Ob das auch mit dem pico w per wlan geht?

    • raspi berry Март 11, 2023 в 7:02 дп

      Hi Udo, ich sehe nicht warum man das nicht mit dem Pico W realisieren könnte. die Ausgabe per USB HID funktioniert genauso, es müsste im Prinzip nur ein Webinterface geschrieben werden.
      Я сделал это как дополнение для PiCockpit, как новое приложение для Pico W (PiCockpit unterstützt ja auch den Pico W!).
      Мы работаем над тем, чтобы сделать Pico W и PiControl незаметными - это позволяет человеку использовать на Pico W Python-скрипт и использовать его для определения последовательности действий.
      (Falls es per Python auch geht - ich habe den Heise Artikel gerade nicht angeschaut).

      Спасибо, пожалуйста, за вопрос и за ответ!
      Макс

Комментировать