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

projekt för trådlös strömbrytare
Översikt över DIY-projektet för trådlös växelstyrning

Ett av mina största problem är att resa mig upp ur sängen för att släcka ljuset i sovrummet.

Det är mycket svårt att göra det när du ligger i din säng.

För några år sedan byggde jag 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.

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 elutrustningen i din lägenhet.

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.

trådlös trådlös servokontroll för servokontakter
Servo förberedd för att stänga av ljusbrytaren
trådlös trådlös servokontroll för servokontakter
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

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.

importnätverk
importera maskiner
från maskin importera PWM
från tid importera sömn

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

ssid = "Lights-Out
lösenord = "sleeptime

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

while ap.active() == False:
  pass

print('Anslutning lyckad')
print(ap.ifconfig())

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

#ap.status är en tom array tills någon ansluter, då kommer den att ha en post.
1TP4När ap.status = true kommer det att utlösa rotateServo().
# sedan stänger den av sig själv för att sparka ut användaren från nätverket,
# så att enheten kan återansluta sig till sitt vanliga nätverk.

while True:
    försök:
        if ap.status('stations'):
            print('klient ansluten')
            rotateServo()
            sov(5)
            ap.active(False)
            sov(2)
            ap.active(True)
        
    utom OSError as e:
        print('Anslutning stängd')

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-pinnnummer
pwm = PWM(machine.Pin(16))

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

importnätverk
...
ssid = 'Lights-Out'
lösenord = "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.

medan det är sant:
    försök:
        if ap.status('stations'):
            print('klient ansluten')
            rotateServo()
            sov(10)
            ap.active(False)
            sov(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.

Lämna en kommentar