Gör-det-själv trådlös servokontroll med Raspberry Pi Pico W

Pico W Servo Switch Controller Titelbild

Ett av de största problemen jag har är att gå upp ur sängen för att släcka ljuset i sovrummet. Det är väldigt svårt att göra det när man ligger och myser i sängen. Så här vill jag berätta för dig hur du löser det problemet med en Pico W Servo brytarkontroll.

För några år sedan byggde jag nämligen en trådlös lösning med en Arduino och en IR-fjärrkontroll. Det fungerade ganska bra eftersom det var pålitligt och löste mitt problem. Det var dock inte utan nackdelar.

För det första var Arduino Uno massiv jämfört med Raspberry Pi Pico W.

För det andra var den beroende av en IR-signal, vilket innebar att jag behövde veta var min IR-fjärrkontroll var när jag ville släcka lampan.

Och det är här som Raspberry Pi Pico W har sin fördel. Du kan styra servon direkt från din telefon.

Styrenhet för servobrytare Pico W
Översikt över DIY-projektet för trådlös växelstyrning

Varför göra det här DIY-projektet?

Den är ful. Det är tråkigt.

Men det handlar också om glädjen och nöjet att skapa sin egen lösning på sina problem.

Moderna problem kräver moderna lösningar, och Här kan du se hur folk löser sina problem med Raspberry Pi..

Dessutom kan du behöva göra detta eftersom du inte får ändra den elektriska installationen i ditt hem.

Eller så vill du inte gå igenom kostnaderna för att anlita en professionell person för att göra det.

Ett annat skäl är att projektet är så utbyggbart och portabelt. Du behöver inte bara använda det på en strömbrytare, du kan använda det på ett tangentbord, för att stoppa skärmsläckare, till exempel.

Video

Det är möjligt att styra tvåvägsbrytare, men det är enklast med ett sätt.

Styrenhet för servobrytare Pico W
Servo förberedd för att stänga av ljusbrytaren
Styrenhet för servobrytare Pico W
Servo vid full rotation, stänga av strömbrytaren

Om det finns en sak som du definitivt kan göra med alla strömbrytare i världen, oavsett om de är europeiska eller nordamerikanska, kan du alltid använda en servo för att stänga av eller sätta på den.

Men om du vill styra strömbrytaren åt båda hållen blir det en större teknisk utmaning eftersom servotorn kan komma i vägen.

Om du till exempel behöver kunna slå av eller på strömbrytaren manuellt kan du tycka att servoarmarna är i vägen. Du kan inte tvinga den ur vägen utan att förstöra motorn, eftersom servoarmarna är programmerade att hålla sig på plats med all sin kraft.

Sända nätverk eller ansluta till ett nätverk?

Raspberry Pi Pico W kan anslutas till ditt hemnätverk eller sända ut sitt eget nätverk.

Jag har prövat båda metoderna och funnit för- och nackdelar med dem.

Som en station (dvs. ansluter till ett nätverk)

I den ursprungliga designen fick jag min Pico W att ansluta till mitt hemnätverk och den serverade en HTML-fil med en knapp på IP-adressen 192.168.0.70.

Fördelen med detta var att jag enkelt kunde starta upp min webbläsare och trycka på knappen som släckte ljuset.

Nackdelen är dock att vem som helst i nätverket också kunde göra det, om du inte införde någon form av autentisering.

En annan nackdel är att Raspberry Pi Pico W inte kan återanslutas till nätverket om ditt hemnätverk förlorar strömmen, såvida du inte har implementerat kod som startar om Pico W eller återansluter den till nätverket.

Som en åtkomstpunkt

När du ansluter till denna kommer servot att rotera och stänga av strömbrytaren.

För närvarande använder jag min Pico W som åtkomstpunkt, även om jag inte säger att det är det bästa sättet.

Den sänder ut ett nätverk som jag måste ansluta till separat för att kunna styra servot. Detta är en obekväm nackdel.

Fördelen med detta är att du, till skillnad från stationsmetoden, har ett lösenord för nätverket så att bara du kan ansluta till det.

Från början hade jag en åtkomstpunkt som visade en webbsida med en knapp för att utlösa servot. Jag tyckte att detta var för omständligt eftersom du måste 1) ansluta till nätverket, 2) gå till Pico W:s IP-adress och 3) trycka på knappen.

Jag kom fram till att den bästa lösningen är att utlösa servon när Pico W upptäcker att en klient ansluter till åtkomstpunkten. På så sätt behöver du bara ansluta en enhet till Pico W och lamporna (eller strömbrytaren) kommer att vara släckta.

Anslutning av Pico W till en servo

Detta är ett enkelt projekt och du bör kunna hitta delar i en nybörjarsats. Om inte, finns här en reservdelslista.

Jag använde också ett valfritt brödbräda för att ansluta servot till Pico W med hane-till-hane-överbrytarkablar, men du kan ansluta servot direkt till Pico W:s huvudkontakter med hane-till-hona-överbrytarkablar.

Du behöver också dubbelhäftande tejp för att fästa servot på ljusomkopplarhuset.

Koppling av kablar

Styrenhet för servobrytare Pico W
Anslutning av en Pico W till en servo. (schema gjort med Wokwi)

Generellt sett har alla servon en röd, svart/brun och en tredje tråd.

Anslut en röd bryggkabel till den röda kabeln som kommer från servot. Det är dit du skickar 5V via VBUS.

Anslut en svart tråd till den svart/bruna tråden. Du ansluter den till GND på Pico W.

Anslut en annan tråd till den tredje tråden. Min är orangefärgad, så jag använde en orange brytartråd. Detta är signaltråden som jag kopplade till GPIO16.

Koden

Med den här koden kan du utlösa servotrycket när en klient ansluter till Pico W:s SoftAP-åtkomstpunkt.

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')

Vissa viktiga kodrader att förklara:

Koden förutsätter att du har anslutit signalkabeln till GPIO16. Om inte ändrar du heltalet "16" i den här raden till den GPIO-stift som du är ansluten till.

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

Detta ställer in SoftAP, anger SSID-namn och lösenord,

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

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

Servostyrning på Pico W

Detta styr servot. Du kommer förmodligen att behöva ändra den.

För min servo kan jag använda ett värde på 500000 (500K) till 2000000 (2 mil). Detta skulle ge hela servoens räckvidd.

Jag behövde dock bara en liten rotation. Därför satte jag servon i full rotation med pwm.duty_ns(2000000) och sedan låta den återgå till pwm.duty_ns(1500000).

Det är förmodligen bäst att testa detta medan servot är fritt svävande så att du kan se om det roterar i rätt riktning och sedan kan du finjustera rotationsgraderna.

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

Sänder ut en AP, utlöser rotateServo vid anslutning

Denna kodrad körs upprepade gånger.

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

Om ap.status('stations') upptäcker en anslutning till det trådlösa nätverket, returnerar den en array med ett objekt.

ap.status('stations') returnerar en tom array om ingen är ansluten till AP:n.

Om koden inte är en tom array kommer den därför att starta rotateServo och stänger av AP innan du slår på den igen.

Tanken med att sätta på och stänga av AP:n är att sparka bort den anslutna klienten från nätverket. På så sätt kan den ansluta till sitt vanliga nätverk med en internetanslutning.

android auto reconnect off
Automatisk återanslutning avstängd i Android

Se bara till att stänga av automatisk återanslutning i din telefon eller dator.

Varför behöver vi sleep(x) mellan ap.active()? Det är för att jag har lärt mig att om jag stänger av och sätter på AP:n för snabbt så kommer min telefon inte att bryta anslutningen.

Läs mer om Raspberry Pi Pico W

Vi har skrivit en artikel om Raspberry Pi Pico W som hjälper dig att få ut det mesta av din Pico W. Klicka här för att få veta saker som du inte visste.

2 Kommentarer

  1. Udo den februari 24, 2023 kl 3:47 e m

    Mycket intressant,
    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.
    So ganz blicke ich bei dem Pico noch nicht durch.
    Mitt mål: Att använda Pico W som Keyboard Remote eingabe.
    Bedeutet: Ich schicke von meinem Smarthome per Handy oder Script Tastaturbefehle, die der Pico empfängt und quasi die Tasten am PC drückt.
    Med det gömda biblioteket är det möjligt att använda ett tangentbord för att emulera.
    So könnte ich z.B. zu einer gewissen Zeit den PC automatiskt per Tasturbefehl fernsteuern.
    Fördelarna med en gömd emulering: Det fungerar nästan överallt utan drivrutiner och programvara på datorn. Egal vilket system. So könnte man selbst das Bios steuern.
    Vielleicht hast du ja eine Idee, ob sich das mit dem Pico W realisieren lässt.
    Utan Wlan går det bra: https://www.heise.de/tests/Ausprobiert-Raspberry-Pico-mit-USB-HID-als-Tastatur-oder-Maus-benutzen-6011697.html
    Är det också möjligt att använda pico w per wlan?

    • raspi berry den mars 11, 2023 kl 7:02 f m

      Hej Udo, jag förstår inte varför man inte skulle kunna realisera detta med Pico W. Den här utgåvan per USB HID fungerar på samma sätt, men i princip måste det bara vara ett webbgränssnitt som skrivs.
      Ich habe das als Anregung für PiCockpit aufgenommen, als eine neue App für den Pico W. (PiCockpit stöder ju också den Pico W!)
      Vi arbetar just nu med tanken att Pico W också stöder PiControl - därmed skulle man kunna lägga in en Python Skript på Pico W och få vissa fasta definierade sekvenser redan utarbetade.
      (Om Python också används - jag hade den artikel i Heise artikel just inte beskriven).

      Danke jedenfalls für die Frage und die Anregung!
      Max

Lämna en kommentar