使用树莓派Pico W的DIY无线伺服开关控制器

diy无线开关控制项目
DIY无线开关控制项目的概述

我遇到的最大问题之一是从床上爬起来关掉卧室的灯。

当你舒适地躺在床上时,就很难做到这一点。

几年前,我用Arduino和一个红外遥控器建立了一个无线解决方案。

它的效果相当好,因为它很可靠,而且解决了我的问题。

不过,这也不是没有缺点。

首先,与Raspberry Pi Pico W相比,Arduino Uno非常庞大。

第二,它依赖于红外信号,这意味着当我想把灯关掉时,我需要知道我的红外遥控器在哪里。

而这正是Raspberry Pi Pico W的优势所在。你可以直接从你的手机上控制舵机。

为什么要费心做这个DIY项目?

它是丑陋的。它很乏味。

但它也涉及到为你的问题制定自己的解决方案的喜悦和乐趣。

现代问题需要现代的解决方案,而 你可以在这里看到人们如何用Raspberry Pi解决他们的问题。.

此外,你可能需要这样做,因为你不被允许修改公寓里的电器。

或者你不想花钱雇一个专业人员来做。

另一个原因是这个项目是如此的可扩展和可移植。你不必把它用在电灯开关上,你可以把它用在键盘上,例如用来停止屏幕保护程序。

视频

双向开关控制是可能的,但单向开关最容易。

diy无线伺服开关控制
舵机启动,关闭电灯开关
diy无线伺服开关控制
伺服机处于全速旋转状态,关闭开关

如果有一件事你肯定能做到,世界上所有的开关,无论是欧洲的还是北美的,你总能用一个伺服机来关闭或打开它。

但如果你想双向控制开关,就会成为一个更大的工程挑战,因为伺服机可能会碍事。

例如,如果你需要能够手动打开或关闭开关,你可能会发现伺服臂挡住了路。你不能在不破坏电机的情况下把它强行拉开,因为伺服机的程序是要全力保持自己的位置。

广播网络或连接到网络?

Raspberry Pi Pico W可以连接到你的家庭网络,或者它可以广播自己的网络。

我两种方法都试过了,发现两种方法都有一些优点和缺点。

作为一个站点(即连接到一个网络上)

在最初的设计中,我让我的Pico W连接到我的家庭网络,它在其IP地址192.168.0.70上提供了一个带有按钮的HTML文件。

这样做的好处是,我很容易就能启动我的浏览器,按下关灯的按钮。

然而,缺点是网络上的任何人也能够这样做,除非你实施某种形式的认证。

另一个缺点是,如果你的家庭网络断电,Raspberry Pi Pico W不会重新连接到网络,除非你实现了重启Pico W或重新连接到网络的代码。

作为一个接入点

连接到这里后,伺服机将旋转,关闭开关。

目前,我正在使用我的Pico W作为一个接入点,尽管我并不是说这是最好的方法。

它广播了一个网络,我必须单独连接到这个网络,以便我控制伺服机。这是一个不方便的缺点。

这样做的好处是,与站式方法不同,你在网络上有一个密码,所以只有你能连接到它。

最初,我有一个接入点,它提供了一个带有按钮的网页来触发伺服。我发现这太麻烦了,因为你需要1)连接到网络,2)进入Pico W的IP地址,3)按下按钮

我发现最好的解决办法是,一旦Pico W检测到有客户连接到接入点,就触发伺服装置。这样,你所要做的就是把任何设备连接到Pico W上,你的灯(或开关)就会关闭。

将Pico W连接到一个伺服机上

这是一个简单的项目,你应该能在初学者的套件中找到零件。如果没有,这里有一个零件清单。

我还使用了一个可选的面包板,用公-母跳线将伺服机与Pico W连接起来,但你也可以用公-母跳线将伺服机直接连接到Pico W的针座上。

你还需要双面胶把你的伺服机粘在灯光开关外壳上。

接线

将Pico W连接到一个伺服机上。(图中用 Wokwi)

一般来说,所有的伺服机都有一条红色、黑色/棕色和第三条线。

将一根红色跳线连接到来自伺服机的红线上。这就是你要通过VBUS发送5V的地方。

将一条黑线连接到黑/棕线上。你将把它连接到Pico W上的GND。

将另一条线连接到第三条线上。我的线是橙色的,所以我用了一条橙色的跳线。这是我连接到GPIO16的信号线。

准则

这段代码将允许你在客户端连接到Pico W的SoftAP接入点时触发伺服。

输入网络
导入机器
从机器中导入PWM
从时间中导入睡眠

#Pin param = 伺服系统GPIO引脚编号
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:
  通过

print('连接成功')
print(ap.ifconfig())

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    睡眠(0.5)

    pwm.duty_ns(1500000)

#ap.status是一个空白数组,直到有人连接,然后它将有一个条目
#当ap.status = true时,它将触发rotateServo()
#然后它将关闭自己,把用户踢出网络。
#允许设备重新连接到其通常的网络上

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

某些重要的代码行需要解释。

这段代码假设你把信号线连接到GPIO16。如果不是,把这一行中的 "16 "整数改为你所连接的GPIO引脚。

#Pin param = 伺服系统GPIO针脚编号
pwm = PWM(machine.Pin(16))

这就设置了SoftAP,宣布了SSID名称和密码。

进口网络
...
ssid = 'Lights-Out'
密码 = 'sleeptime

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

Pico W上的伺服控制

这控制着伺服机。你可能需要修改这个。

对于我的伺服机,我可以使用500000(500K)到2000000(2mil)的值。这将提供伺服机的全部范围。

然而,我只需要小幅旋转。因此,我把舵机放到它的全速旋转,用 pwm.duty_ns(2000000) 然后让它返回到 pwm.duty_ns(1500000).

最好是在你的伺服机自由浮动时进行测试,这样你就可以看到它的旋转方向是否正确,然后你就可以对旋转度进行微调。

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    睡眠(0.5)

    pwm.duty_ns(1500000)

广播一个AP,连接时触发旋转Servo

这行代码反复运行。

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

如果 ap.status('stations') 检测到无线网络的连接,它将返回一个包含一个项目的数组。

ap.status('stations') 如果没有人连接到AP,则返回一个空数组。

因此,如果代码不是一个空数组,就会启动 旋转伺服 并在再次开机前关闭AP。

开启和关闭AP的想法是将连接的客户端踢出网络。这样它就可以通过互联网连接到其习惯的网络上。

安卓系统自动重新连接关闭
安卓系统中的自动重新连接被关闭

只要确保在你的手机或电脑中关闭自动重新连接。

为什么我们需要在调用ap.active()之间设置sleep(x)?这是因为我了解到,如果我关闭和开启AP的速度太快,我的手机就不会放弃连接。

了解更多关于Raspberry Pi Pico W的信息

我们专门写了一篇关于Raspberry Pi Pico W的文章,将帮助你充分利用你的Pico W。 点击这里,了解你所不知道的事情。

发表评论