DIY draadloze servo schakelaar controller met Raspberry Pi Pico W

Servoschakelaarcontroller Pico W Titelafbeelding

Een van de grootste problemen die ik heb, is opstaan om het licht in de slaapkamer uit te doen. Het is erg moeilijk om dat te doen als je lekker in bed ligt. En dus wil ik je hier vertellen hoe je dat probleem kunt oplossen met een Pico W Servo schakelaarcontroller.

Een paar jaar geleden heb ik namelijk een draadloze oplossing gebouwd met een Arduino en een IR-afstandsbediening. Het werkte vrij goed omdat het betrouwbaar was en mijn probleem oploste. Het was echter niet zonder nadelen.

Ten eerste, de Arduino Uno was massief in vergelijking met de Raspberry Pi Pico W.

Ten tweede was het afhankelijk van een IR-signaal, wat betekende dat ik moest weten waar mijn IR-afstandsbediening was als ik het licht wilde uitschakelen.

En dit is waar de Raspberry Pi Pico W zijn voordeel heeft. Je kunt de servo direct vanaf je telefoon besturen.

Pico W Servoschakelaarregelaar
Overzicht van het DIY draadloze schakelaar controle project

Waarom moeite doen voor dit doe-het-zelf project?

Het is lelijk. Het is vervelend.

Maar het is ook leuk om je eigen oplossing voor je problemen te bedenken.

Moderne problemen vragen om moderne oplossingen, en kunt u hier zien hoe mensen hun problemen met de Raspberry Pi oplossen.

Bovendien moet je dit misschien doen omdat je de elektrische installatie in je huis niet mag aanpassen.

Of u wilt niet de kosten van het inhuren van een professional om het te doen.

Een andere reden is dat dit project zo uitbreidbaar en draagbaar is. Je hoeft het niet te gebruiken op een lichtschakelaar, je kunt het gebruiken op een toetsenbord, om bijvoorbeeld screensavers te stoppen.

Video

Twee-weg schakelaarbediening mogelijk, maar één weg is het makkelijkst

Pico W Servoschakelaarregelaar
Servo klaar om lichtschakelaar uit te zetten
Pico W Servoschakelaarregelaar
Servo op volle toeren, de schakelaar uitzetten

Als er één ding is dat je zeker kunt doen met alle schakelaars in de wereld, of het nu Europese of Noord-Amerikaanse zijn, je kunt altijd een servo gebruiken om hem uit of aan te zetten.

Maar als je de schakelaar in beide richtingen wilt bedienen, wordt het een grotere technische uitdaging omdat de servo in de weg kan zitten.

Als u bijvoorbeeld de schakelaar met de hand aan of uit moet kunnen zetten, kan het zijn dat de servoarmen in de weg zitten. U kunt ze niet uit de weg krijgen zonder de motor te vernielen, omdat de servo is geprogrammeerd om zichzelf met alle macht op zijn plaats te houden.

Broadcast netwerk of verbinding maken met een netwerk?

De Raspberry Pi Pico W kan verbinding maken met uw thuisnetwerk of het kan zijn eigen netwerk uitzenden.

Ik heb beide geprobeerd en vond enkele voor- en nadelen van beide methodes.

Als een station (d.w.z. verbonden met een netwerk)

In het aanvankelijke ontwerp, maakte ik mijn Pico W verbinding met mijn thuisnetwerk en het diende een HTML bestand met een knop op zijn IP adres 192.168.0.70.

Het voordeel hiervan was dat ik gemakkelijk mijn browser kon opstarten en op de knop kon drukken die het licht uitschakelde.

Het nadeel is echter dat iedereen op het netwerk dat ook kon doen, tenzij je een vorm van authenticatie implementeerde.

Een ander nadeel is dat, als uw thuisnetwerk geen stroom meer heeft, de Raspberry Pi Pico W niet opnieuw verbinding zal maken met het netwerk, tenzij u code hebt geïmplementeerd die uw Pico W opnieuw opstart of opnieuw verbinding maakt met het netwerk.

Als toegangspunt

Als de servo hierop wordt aangesloten, gaat hij draaien en schakelt de schakelaar uit.

Momenteel gebruik ik mijn Pico W als toegangspunt, hoewel ik niet zeg dat dit de beste manier is.

Het zendt een netwerk uit waarmee ik apart verbinding moet maken om de servo te kunnen besturen. Dit is een onhandig nadeel.

Het voordeel hiervan is dat je, in tegenstelling tot de stationmethode, een wachtwoord hebt voor het netwerk, zodat alleen jij er verbinding mee kunt maken.

Aanvankelijk had ik een access point dat een webpagina bediende met een knop om de servo te triggeren. Ik vond dit te omslachtig omdat je 1) verbinding moet maken met het netwerk, 2) naar het IP adres van de Pico W moet gaan en 3) op de knop moet drukken

De beste oplossing is om de servo te activeren zodra de Pico W een client detecteert die verbinding maakt met het access point. Op deze manier hoef je alleen maar een willekeurig apparaat op de Pico W aan te sluiten en je lichten (of schakelaar) zijn uit.

Aansluiten van de Pico W op een servo

Dit is een eenvoudig project en u zou onderdelen moeten kunnen vinden in een kit voor beginners. Zo niet, dan is hier een onderdelenlijst.

Ik heb ook een optioneel breadboard gebruikt om de servo op de Pico W aan te sluiten met male-to-male jumperdraden, maar je kunt de servo ook rechtstreeks op de headers van de Pico W aansluiten met male-to-female jumperdraden.

U hebt ook dubbelzijdige tape nodig om uw servo op de behuizing van de lichtschakelaar te plakken.

Bedrading aanleggen

Pico W Servoschakelaarregelaar
Aansluiten van een Pico W op een servo. (diagram gemaakt met Wokwi)

In het algemeen heeft elke servo een rode, zwart/bruine en een derde draad.

Verbind een rode brugdraad met de rode draad die van de servo komt. Dit is waar je 5V naartoe stuurt, via VBUS.

Verbind een zwarte draad met de zwart/bruine draad. Deze verbindt u met GND op de Pico W.

Verbind een andere draad met de derde draad. Die van mij is oranje, dus ik heb een oranje jumperdraad gebruikt. Dit is de signaaldraad die ik op GPIO16 heb aangesloten.

De code

Met deze code kunt u de servo activeren wanneer een client verbinding maakt met het SoftAP-toegangspunt van de 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')

Enkele belangrijke regels code om uit te leggen:

De code gaat ervan uit dat je de signaaldraad op GPIO16 hebt aangesloten. Zo niet, verander dan het gehele getal "16" in deze regel in de GPIO-pin waarop u bent aangesloten.

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

Dit stelt de SoftAP in, geeft de SSID naam en wachtwoord op,

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

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

Servobesturing op de Pico W

Dit bestuurt de servo. U zult dit waarschijnlijk moeten aanpassen.

Voor mijn servo zou ik een waarde van 500000 (500K) tot 2000000 (2 mil) kunnen gebruiken. Dit zou het volledige bereik van de servo geven.

Ik had echter maar een kleine rotatie nodig. Daarom zette ik de servo op zijn volledige rotatie met pwm.duty_ns(2000000) en laat het dan terugkeren naar pwm.duty_ns(1500000).

Het is waarschijnlijk het beste om dit te testen terwijl je servo vrij zweeft, zodat je kunt zien of hij in de juiste richting draait en dan kun je de rotatiegraden fijn afstellen.

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

Een AP uitzenden, rotateServo bij verbinding triggeren

Deze regel code wordt herhaaldelijk uitgevoerd.

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

Als ap.status('stations') een verbinding met het draadloze netwerk detecteert, zal het een matrix met één item terugsturen.

ap.status('stations') geeft een lege array terug als er niemand met het AP is verbonden

Dus, als de code geen lege array is, zal het rotateServo en zet de AP uit voordat u hem weer aanzet.

Het idee van het aan- en uitschakelen van het AP is om de aangesloten client van het netwerk te halen. Hierdoor kan hij verbinding maken met zijn gebruikelijke netwerk met een internetverbinding.

android auto reconnect off
Automatisch opnieuw verbinden uitgeschakeld in Android

Zorg er wel voor dat je auto-reconnect uitschakelt op je telefoon of computer.

Waarom hebben we de sleep(x) nodig tussen de ap.active() aanroepen? Dat is omdat ik geleerd heb dat als ik het AP te snel uit en aan zet, mijn telefoon de verbinding niet zal verbreken.

Meer informatie over de Raspberry Pi Pico W

We hebben een artikel geschreven speciaal over de Raspberry Pi Pico W dat u zal helpen het meeste uit uw Pico W te halen. Klik hier om dingen te weten te komen die je nooit wist.

2 Opmerkingen

  1. Udo op februari 24, 2023 op 3:47 pm

    Sehr interessant,
    Ik betreibe gerade viel Recherche zum pico w.
    Vielleicht ist meine Idee auch zu selten, deshalb bin ich nur auf einen ähnliches Projekt mit dem Pi Zero gestossen.
    Dus ganz blicke ich bei dem Pico noch nicht durch.
    Mein Ziel: Den Pico W als Keyboard Remote eingabe zu nutzen.
    Bedeutet: Ich schicke von meinem Smarthome per Handy oder Script Tastaturbefehle, die der Pico empfängt und quasi die Tasten am PC drückt.
    Met de verborgen bibliotheek is het goed mogelijk een toetsenbord te emulieren.
    Zo kan ik z.B. zu einer gewissen Zeit den PC automatisch per Tasturbefehl fernsteuern.
    Het voordeel van verborgen emulatie: Het werkt bijna overal zonder hardware en software op de PC. Ongeacht welk systeem. Zo kan men zelf de bios besturen.
    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
    Is dat ook mogelijk met de pico per wlan?

    • raspi berry op maart 11, 2023 op 7:02 am

      Hallo Udo, ik zie niet in waarom dit niet met de Pico W kan worden gerealiseerd. Die Ausgabe per USB HID functioneert ook zo, het is in principe alleen mogelijk een Webinterface te maken.
      Ik heb dit als aanvulling op PiCockpit gemaakt, als een nieuwe app voor de Pico W. (PiCockpit maakt inderdaad gebruik van de Pico W).
      We werken altijd zo dat de Pico W ook PiControl ondersteunt - daardoor kan men op de Pico W een Python-script schrijven en bestimmte fest definierte Sequenzen bereits ausgeben.
      (Als het per Python gaat - ik heb het Heise artikel gerade nicht angeschaut).

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

Laat een reactie achter