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

Progetto di controllo degli interruttori wireless fai da te
Panoramica del progetto di controllo degli interruttori wireless fai da te

Uno dei problemi maggiori che ho è quello di alzarmi dal letto per spegnere la luce della camera da letto.

È molto difficile farlo quando si è comodamente a letto.

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 privo 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.

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 dell'appartamento.

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.

controllo senza fili del servocomando
Il servo è stato innescato per spegnere l'interruttore della luce
controllo senza fili del servocomando
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

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.

importare la rete
importare la macchina
da macchina importare PWM
da time import sleep

#Pin param = numero del pin GPIO del servo
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:
  passa

print('Connessione riuscita')
print(ap.ifconfig())

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    dormire(0,5)

    pwm.duty_ns(1500000)

#ap.status è un array vuoto finché qualcuno non si connette, allora avrà una voce
#quando ap.status = true, si attiverà rotateServo()
# poi si spegnerà per allontanare l'utente dalla rete,
# permettendo al dispositivo di riconnettersi alla rete abituale

mentre Vero:
    prova:
        if ap.status('stations'):
            print('client connesso')
            ruotaServo()
            dormire(5)
            ap.active(False)
            dormire(2)
            ap.active(True)
        
    tranne OSError as e:
        print('Connessione chiusa')

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 = numero del pin GPIO del servo
pwm = PWM(machine.Pin(16))

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

rete di importazione
...
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)

    dormire(0,5)

    pwm.duty_ns(1500000)

Trasmissione di un AP, attivazione di rotateServo alla connessione

Questa riga di codice viene eseguita ripetutamente.

mentre Vero:
    prova:
        if ap.status('stazioni'):
            print('client connesso')
            ruotaServo()
            dormire(10)
            ap.active(False)
            dormire(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.

Lascia un commento