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

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

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

Это очень трудно сделать, когда вы уютно устроились в постели.

Несколько лет назад я создал беспроводное решение с помощью Arduino и ИК-пульта.

Это сработало довольно хорошо, потому что было надежным и решило мою проблему.

Однако это было не без недостатков.

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

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

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

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

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

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

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

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

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

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

Видео

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

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

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

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

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

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

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 к сервоприводу. (схема сделана с помощью 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(16))

Здесь настраивается 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. Нажмите здесь, чтобы узнать о том, чего вы никогда не знали.

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