Bezprzewodowy sterownik serwonapędów DIY z Raspberry Pi Pico W

Pico W Servo Switch Controller Obraz tytułowy

Jednym z moich największych problemów jest wstawanie z łóżka, aby wyłączyć światło w sypialni. Jest to bardzo trudne, gdy leżysz wygodnie w łóżku. Dlatego tutaj chcę powiedzieć, jak rozwiązać ten problem za pomocą kontrolera przełączników Pico W Servo.

Kilka lat temu zbudowałem bezprzewodowe rozwiązanie z Arduino i pilotem na podczerwień. Sprawdziło się całkiem nieźle, ponieważ było niezawodne i rozwiązało mój problem. Nie obyło się jednak bez wad.

Po pierwsze, Arduino Uno było masywne w porównaniu z Raspberry Pi Pico W.

Po drugie, zależało to od sygnału IR, co oznaczało, że musiałem wiedzieć, gdzie jest mój pilot IR, gdy chciałem wyłączyć światło.

I tu właśnie Raspberry Pi Pico W ma swoją przewagę. Można sterować serwomechanizmem bezpośrednio z telefonu.

Kontroler przełącznika serwo Pico W
Przegląd projektu bezprzewodowego sterowania przełącznikami DIY

Dlaczego warto zawracać sobie głowę tym projektem DIY?

Jest brzydki. Nużące.

Ale to także radość i zabawa z tworzenia własnych rozwiązań problemów.

Nowoczesne problemy wymagają nowoczesnych rozwiązań, a możesz zobaczyć jak ludzie rozwiązują swoje problemy z Raspberry Pi tutaj.

Co więcej, być może będziesz musiał to zrobić, ponieważ nie możesz modyfikować instalacji elektrycznej w swoim domu.

Lub nie chcesz przejść przez koszt wynajęcia profesjonalisty, aby to zrobić.

Innym powodem jest to, że ten projekt jest tak rozszerzalny i przenośny. Nie musisz używać go na przełączniku światła, możesz go użyć na klawiaturze, aby zatrzymać wygaszacze ekranu, na przykład.

Wideo

Możliwe jest sterowanie dwukierunkowe, ale najłatwiejsze jest sterowanie jednokierunkowe

Kontroler przełącznika serwo Pico W
Serwo przygotowane do wyłączenia wyłącznika światła
Kontroler przełącznika serwo Pico W
Serwo na pełnych obrotach, wyłączenie wyłącznika

Jeśli jest jedna rzecz, którą na pewno można zrobić ze wszystkimi przełącznikami na świecie, czy to europejskimi czy północnoamerykańskimi, zawsze można użyć serwomechanizmu do wyłączenia lub włączenia.

Ale jeśli chcesz kontrolować przełącznik w obie strony, staje się to większym wyzwaniem inżynierskim, ponieważ serwo może wejść w drogę.

Na przykład, jeśli musisz być w stanie ręcznie włączyć lub wyłączyć przełącznik, może się okazać, że ramiona serwo są w drodze. Nie można go zmusić do usunięcia z drogi bez zniszczenia silnika, ponieważ serwomechanizm jest zaprogramowany, aby utrzymać się w miejscu z całej siły.

Rozgłaszać sieć czy łączyć się z siecią?

Raspberry Pi Pico W może połączyć się z siecią domową lub rozgłosić własną sieć.

Próbowałem obu i znalazłem kilka plusów i minusów obu metod.

Jako stacja (tzn. łączy się z siecią)

W początkowym projekcie sprawiłem, że mój Pico W połączył się z moją siecią domową i na swoim adresie IP 192.168.0.70 serwował plik HTML z przyciskiem.

Korzyść z tego była taka, że bez problemu mogłem uruchomić przeglądarkę i nacisnąć przycisk, który wyłączał światło.

Jednak minusem jest to, że każdy w sieci był również w stanie to zrobić, chyba że wdrożyłeś jakąś formę uwierzytelniania.

Kolejnym minusem jest to, że jeśli sieć domowa straciła zasilanie, Raspberry Pi Pico W nie połączy się ponownie z siecią, chyba że masz zaimplementowany kod, który restartuje Pico W lub ponownie łączy go z siecią.

Jako punkt dostępu

Po podłączeniu do niego, serwo będzie się obracać, wyłączając przełącznik

Obecnie używam mojego Pico W jako punktu dostępu, choć nie twierdzę, że to najlepsze rozwiązanie.

Rozgłasza sieć, do której muszę się osobno podłączyć, aby móc sterować serwem. Jest to niewygodny minus.

Plusem tego jest to, że w przeciwieństwie do metody stacyjnej, masz hasło na sieć, więc tylko ty możesz się z nią połączyć.

Początkowo miałem punkt dostępu, który serwował stronę internetową z przyciskiem do wyzwalania serwa. Stwierdziłem, że jest to zbyt uciążliwe, ponieważ trzeba będzie 1) połączyć się z siecią, 2) wejść na adres IP Pico W i 3) nacisnąć przycisk

Znalazłem najlepsze rozwiązanie, aby wyzwolić serwo, gdy Pico W wykryje klienta łączącego się z punktem dostępu. W ten sposób wystarczy, że podłączysz dowolne urządzenie do Pico W, a twoje światła (lub przełącznik) będą wyłączone.

Podłączenie Pico W do serwa

Jest to prosty projekt i powinieneś być w stanie znaleźć części w zestawie dla początkujących. Jeśli nie, oto lista części.

Użyłem również opcjonalnego breadboardu, aby podłączyć serwo do Pico W za pomocą przewodów zworkowych męsko-męskich, ale możesz podłączyć serwo bezpośrednio do głowic Pico W za pomocą przewodów zworkowych męsko-żeńskich.

Potrzebna będzie również taśma dwustronna do przyklejenia serwa na obudowę przełącznika świateł.

Podłączenie

Kontroler przełącznika serwo Pico W
Podłączenie Pico W do serwomechanizmu. (schemat wykonany przy użyciu Wokwi)

Generalnie wszystkie serwa mają przewód czerwony, czarny/brązowy i trzeci.

Podłącz czerwony przewód zworki do czerwonego przewodu wychodzącego z serwa. W tym miejscu będziesz przesyłał 5V, poprzez VBUS.

Podłącz czarny przewód do czarnego/brązowego przewodu. Podłączysz go do GND na Pico W.

Podłącz kolejny przewód do trzeciego przewodu. Mój jest koloru pomarańczowego, więc użyłem pomarańczowej zworki. Jest to przewód sygnałowy, który podłączyłem do GPIO16.

Kodeks

Ten kod pozwoli na wyzwolenie serwa po podłączeniu się klienta do punktu dostępu 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')

Niektóre ważne linie kodu do wyjaśnienia:

Kod zakłada, że podłączyłeś przewód sygnałowy do GPIO16. Jeśli nie, zmień liczbę całkowitą "16" w tej linii na pin GPIO, do którego jesteś podłączony.

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

To ustawia SoftAP, deklaruje nazwę SSID i hasło,

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

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

Serwosterowanie na Pico W

To steruje serwomechanizmem. Prawdopodobnie będziesz musiał to zmodyfikować.

Dla mojego serwa mógłbym użyć wartości od 500000 (500K) do 2000000 (2 mil). To dałoby pełny zakres działania serwa.

Ja jednak potrzebowałem tylko niewielkich obrotów. Dlatego też ustawiłem serwo na pełny obrót za pomocą pwm.duty_ns(2000000) a potem niech wróci do pwm.duty_ns(1500000).

Prawdopodobnie najlepiej przetestować to, gdy twoje serwo jest swobodnie pływające, dzięki czemu można zobaczyć, czy obraca się we właściwym kierunku, a następnie można dostroić stopnie obrotu.

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

Nadawanie AP, wyzwalanie rotateServo przy połączeniu

Ta linia kodu działa wielokrotnie.

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

Jeśli ap.status('stacje') wykryje połączenie do sieci bezprzewodowej, zwróci tablicę z jednym elementem.

ap.status('stacje') zwraca pustą tablicę, jeśli nikt nie jest podłączony do AP

Stąd, jeśli kod nie jest pustą tablicą, to uruchomi rotateServo i wyłączyć AP przed ponownym włączeniem.

Ideą włączania i wyłączania AP jest wyrzucenie podłączonego klienta z sieci. Dzięki temu może on podłączyć się do swojej zwyczajowej sieci z połączeniem internetowym.

android auto reconnect off
Automatyczne ponowne połączenie wyłączone w systemie Android

Upewnij się tylko, że wyłączyłeś auto-reconnect w swoim telefonie lub komputerze.

Dlaczego potrzebujemy sleep(x) pomiędzy wywołaniami ap.active()? To dlatego, że nauczyłem się, że jeśli wyłączę i włączę AP zbyt szybko, mój telefon nie zrzuci połączenia.

Dowiedz się więcej o Raspberry Pi Pico W

Napisaliśmy artykuł specjalnie o Raspberry Pi Pico W, który pomoże Ci w pełni wykorzystać możliwości Twojego Pico W. Kliknij tutaj, aby dowiedzieć się o rzeczach, których nigdy nie wiedziałeś.

Komentarzy: 2

  1. Udo luty 24, 2023 o 3:47 pm

    Sehr interessant,
    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.
    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.
    Mit der hid library ist es wohl möglich eine Keyboard zu emulieren.
    So könnte ich z.B. zu einer gewissen Zeit den PC automatisch per Tasturbefehl fernsteuern.
    Der Vorteil an der hid emulation: Es läuft quasi überall ohne Treiber und Software auf dem PC. Egal welches 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.
    Ohne Wlan geht das wohl: https://www.heise.de/tests/Ausprobiert-Raspberry-Pico-mit-USB-HID-als-Tastatur-oder-Maus-benutzen-6011697.html
    Ob das auch mit dem pico w per wlan geht?

    • raspi berry marzec 11, 2023 o 7:02 am

      Hi Udo, ich sehe nicht warum man das nicht mit dem Pico W realisieren könnte. die Ausgabe per USB HID funktioniert genauso, es müsste im Prinzip nur ein Webinterface geschrieben werden.
      Ich habe das als Anregung für PiCockpit aufgenommen, als eine neue App für den Pico W. (PiCockpit unterstützt ja auch den Pico W!).
      Wir arbeiten gerade daran, dass der Pico W auch PiControl unterstützt - damit könnte man bspw. auf dem Pico W ein Python Skript hinterlegen und bestimmte fest definierte Sequenzen bereits ausgeben.
      (Falls es per Python auch geht - ich habe den Heise Artikel gerade nicht angeschaut).

      Dziękuję za pytanie i odpowiedź!
      Max

Pozostaw komentarz