Controllore di servointerruttori wireless fai da te con Raspberry Pi Pico W

Controllore per servointerruttore Pico W Titolo immagine

Uno dei problemi più grandi che ho è quello di alzarmi dal letto per spegnere la luce della camera. È molto difficile farlo quando si è comodamente a letto. Per questo motivo, voglio spiegarvi come risolvere questo problema con un controller per interruttori Pico W Servo.

Qualche anno fa ho costruito una soluzione wireless con un Arduino e un telecomando IR. Ha funzionato abbastanza bene perché era affidabile e ha risolto il mio problema. Tuttavia, non era priva di aspetti negativi.

Per prima cosa, Arduino Uno era enorme rispetto a Raspberry Pi Pico W.

In secondo luogo, dipendeva da un segnale IR, il che significava che dovevo sapere dove si trovava il mio telecomando IR quando volevo spegnere la luce.

Ed è qui che il Raspberry Pi Pico W ha il suo vantaggio. È possibile controllare il servo direttamente dal telefono.

Controllore per servointerruttore Pico W
Panoramica del progetto di controllo degli interruttori wireless fai da te

Perché preoccuparsi di questo progetto fai-da-te?

È brutto. È noioso.

Ma comporta anche la gioia e il divertimento di creare la propria soluzione ai problemi.

I problemi moderni richiedono soluzioni moderne e è possibile vedere come le persone risolvono i loro problemi con il Raspberry Pi qui.

Inoltre, potrebbe essere necessario farlo perché non è consentito modificare l'impianto elettrico della casa.

Oppure non si vuole affrontare la spesa di assumere un professionista per farlo.

Un altro motivo è che questo progetto è così estensibile e portatile. Non è necessario usarlo su un interruttore della luce, ma si può usare su una tastiera, per fermare gli screensaver, ad esempio.

Video

È possibile controllare l'interruttore a due vie, ma la via più semplice è quella a una via.

Controllore per servointerruttore Pico W
Il servo è stato innescato per spegnere l'interruttore della luce
Controllore per servointerruttore Pico W
Servo a rotazione completa, spegnendo l'interruttore

Se c'è una cosa che si può fare con tutti gli interruttori del mondo, sia europei che nordamericani, è che si può sempre usare un servo per spegnerli o accenderli.

Ma se si vuole controllare l'interruttore in entrambi i sensi, la sfida ingegneristica diventa più ardua, perché il servo potrebbe intralciare il passaggio.

Ad esempio, se è necessario poter accendere o spegnere manualmente l'interruttore, è possibile che i bracci del servo siano d'intralcio. Non è possibile forzarlo senza distruggere il motore, poiché il servo è programmato per mantenersi in posizione con tutte le sue forze.

Rete broadcast o connessione a una rete?

Raspberry Pi Pico W può collegarsi alla rete domestica o trasmettere la propria rete.

Ho provato entrambi e ho riscontrato alcuni pro e contro di entrambi i metodi.

Come stazione (cioè si connette a una rete)

Nel progetto iniziale, ho fatto in modo che il mio Pico W si connettesse alla mia rete domestica e che servisse un file HTML con un pulsante al suo indirizzo IP 192.168.0.70.

Il vantaggio era che potevo facilmente avviare il mio browser e premere il pulsante che spegneva la luce.

Tuttavia, l'aspetto negativo è che chiunque sulla rete può farlo, a meno che non venga implementata una qualche forma di autenticazione.

Un altro aspetto negativo è che, se la rete domestica perde l'alimentazione, il Raspberry Pi Pico W non si riconnette alla rete, a meno che non si sia implementato un codice che riavvia il Pico W o lo riconnette alla rete.

Come punto di accesso

Collegandosi a questo, il servo ruoterà, spegnendo l'interruttore.

Attualmente utilizzo il mio Pico W come punto di accesso, anche se non dico che sia la soluzione migliore.

Trasmette una rete a cui devo collegarmi separatamente per poter controllare il servo. Questo è uno svantaggio scomodo.

L'aspetto positivo è che, a differenza del metodo della stazione, si dispone di una password per la rete, in modo che solo voi possiate connettervi.

Inizialmente avevo un punto di accesso che serviva una pagina web con un pulsante per attivare il servo. Ho trovato questa soluzione troppo macchinosa perché è necessario 1) connettersi alla rete, 2) andare all'indirizzo IP di Pico W e 3) premere il pulsante

Ho scoperto che la soluzione migliore consiste nell'attivare il servo quando il Pico W rileva la connessione di un client al punto di accesso. In questo modo, basta collegare un qualsiasi dispositivo al Pico W e le luci (o l'interruttore) saranno spente.

Collegamento del Pico W a un servo

Si tratta di un progetto semplice e i pezzi dovrebbero essere reperibili in un kit per principianti. In caso contrario, ecco l'elenco dei componenti.

Ho utilizzato anche una breadboard opzionale per collegare il servo al Pico W con fili di collegamento maschio-maschio, ma è possibile collegare il servo direttamente agli header del Pico W con fili di collegamento maschio-femmina.

È inoltre necessario del nastro biadesivo per attaccare il servo all'alloggiamento dell'interruttore della luce.

Cablaggio

Controllore per servointerruttore Pico W
Collegamento di un Pico W a un servo. (schema realizzato con Wokwi)

In genere, tutti i servo hanno un filo rosso, uno nero/marrone e un terzo.

Collegare un ponticello rosso al filo rosso proveniente dal servo. Questo è il punto in cui verranno inviati i 5 V, tramite VBUS.

Collegare un filo nero al filo nero/marrone. Lo si collegherà a GND sul Pico W.

Collegare un altro filo al terzo filo. Il mio è di colore arancione, quindi ho usato un cavo di collegamento arancione. Questo è il filo del segnale che ho collegato a GPIO16.

Il codice

Questo codice consente di attivare il servo quando un client si connette al punto di accesso SoftAP di 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')

Alcune linee di codice importanti da spiegare:

Il codice presuppone che il filo del segnale sia collegato a GPIO16. In caso contrario, cambiare il numero intero "16" in questa riga con il pin GPIO a cui si è collegati.

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

Imposta il SoftAP, dichiara il nome SSID e la password,

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

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

Servocomando su Pico W

Questo controlla il servo. Probabilmente sarà necessario modificarlo.

Per il mio servo, potrei utilizzare un valore compreso tra 500000 (500K) e 2000000 (2 mil). In questo modo si otterrebbe l'intera gamma del servo.

Tuttavia, avevo bisogno solo di una piccola rotazione. Pertanto, ho messo il servo alla sua rotazione completa con pwm.duty_ns(2000000) e poi lasciarlo tornare a pwm.duty_ns(1500000).

Probabilmente la cosa migliore da fare è testare il servo mentre è libero di fluttuare, in modo da poter vedere se ruota nella direzione giusta e quindi poter regolare con precisione i gradi di rotazione.

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

Trasmissione di un AP, attivazione di rotateServo alla connessione

Questa riga di codice viene eseguita ripetutamente.

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

Se ap.status('stazioni') rileva una connessione alla rete wireless, restituisce un array con un elemento.

ap.status('stazioni') restituisce un array vuoto se nessuno è connesso all'AP

Perciò, se il codice non è un array vuoto, verrà lanciato ruotaServo e spegnere l'AP prima di riaccenderlo.

L'idea di accendere e spegnere l'AP è di allontanare dalla rete il client collegato. In questo modo è possibile connettersi alla rete abituale con una connessione a Internet.

Ricollegamento automatico di Android disattivato
Riconnessione automatica disattivata in Android

Assicuratevi di disattivare la connessione automatica sul telefono o sul computer.

Perché abbiamo bisogno di sleep(x) tra le chiamate ap.active()? Perché ho imparato che se spengo e riaccendo l'AP troppo velocemente, il telefono non interrompe la connessione.

Per saperne di più su Raspberry Pi Pico W

Abbiamo scritto un articolo specifico per il Raspberry Pi Pico W che vi aiuterà a ottenere il massimo dal vostro Pico W. Cliccate qui per scoprire cose che non avete mai saputo.

2 commenti

  1. Udo in Febbraio 24, 2023 il 3:47 pm

    Molto interessante,
    Sono convinto che ci siano molte ricerche su pico w.
    Vielleicht ist meine Idee auch zu selten, deshalb bin ich nur auf eine ähnliches Projekt mit dem Pi Zero gestossen.
    Così blicke ich bei dem Pico noch nicht durch.
    Mein Ziel: Den Pico W als Keyboard Remote eingabe zu nutzen.
    Importante: Io prendo da casa mia Smarthome per Handy o Script Tastaturbefehle, che il Pico alimenta e quasi i Tasten sul PC.
    Con la libreria Hid è possibile emulare una tastiera.
    In questo modo è possibile, ad esempio, utilizzare il PC in modo automatico per il disturbo del tempo.
    Il punto di forza dell'emulazione di un hid: Es è quasi del tutto privo di periferiche e software sul PC. A prescindere dal sistema. Così l'uomo può gestire da solo il Bios.
    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
    È possibile farlo anche con il pico w per wlan?

    • raspi berry in Marzo 11, 2023 il 7:02 am

      Ciao Udo, non capisco perché l'uomo non possa realizzarlo con la Pico W. L'apparecchio per USB HID funziona in modo analogo, ma nel suo principio deve essere realizzata solo un'interfaccia web.
      L'ho acquistato come integrazione per PiCockpit, come nuova app per il Pico W. (PiCockpit è compatibile anche con il Pico W!).
      Lavoriamo già da tempo per capire se il Pico W può essere utilizzato anche come PiControl - in questo modo l'uomo può inserire un Python Skript in un foglio di testo e creare delle sequenze definite in modo preciso.
      (Se anche per Python - ich habe den Heise Artikel gerade nicht angeschaut).

      Grazie per la domanda e la risposta!
      Max

Lascia un commento