Controlador de servo interruptor inalámbrico DIY con Raspberry Pi Pico W

Pico W Servo Switch Controller Título de la imagen

Uno de los mayores problemas que tengo es levantarme de la cama para apagar la luz del dormitorio. Es muy difícil hacerlo cuando estás cómodamente en la cama. Por eso, aquí quiero contarte cómo resolver ese problema con un controlador de interruptor Pico W Servo.

Verás, hace unos años construí una solución inalámbrica con un Arduino y un mando a distancia por infrarrojos. Funcionó bastante bien porque era fiable y resolvía mi problema. Sin embargo, tenía sus inconvenientes.

Por un lado, el Arduino Uno era enorme en comparación con la Raspberry Pi Pico W.

En segundo lugar, dependía de una señal de infrarrojos, lo que significaba que tenía que saber dónde estaba mi mando de infrarrojos cuando quería apagar la luz.

Y aquí es donde la Raspberry Pi Pico W tiene su ventaja. Puedes controlar el servo directamente desde tu teléfono.

Controlador de servoconmutadores Pico W
Resumen del proyecto de control de interruptores inalámbricos DIY

¿Por qué molestarse con este proyecto de bricolaje?

Es feo. Es tedioso.

Pero también implica la alegría y la diversión de elaborar tu propia solución a tus problemas.

Los problemas modernos requieren soluciones modernas, y puedes ver cómo la gente resuelve sus problemas con la Raspberry Pi aquí.

Además, es posible que tengas que hacerlo porque no se te permite modificar la instalación eléctrica de tu casa.

O bien no quiere hacer el gasto de contratar a un profesional para que lo haga.

Otra razón es porque este proyecto es tan extensible y portátil. No tienes que usarlo en un interruptor de luz, puedes usarlo en un teclado, para detener los salvapantallas, por ejemplo.

Vídeo

Es posible el control de un interruptor de dos vías, pero es más fácil el de una vía

Controlador de servoconmutadores Pico W
Servo preparado para apagar el interruptor de la luz
Controlador de servoconmutadores Pico W
Servo a plena rotación, apagando el interruptor

Si hay algo que definitivamente se puede hacer con todos los interruptores del mundo, ya sean europeos o norteamericanos, es utilizar siempre un servo para apagarlo o encenderlo.

Pero si quieres controlar el interruptor en ambos sentidos, se convierte en un reto de ingeniería mayor porque el servo podría estorbar.

Por ejemplo, si necesitas poder encender o apagar manualmente el interruptor, puede que los brazos del servo te estorben. No puedes forzarlos sin destruir el motor ya que el servo está programado para mantenerse en su sitio con todas sus fuerzas.

¿Red de difusión o conexión a una red?

La Raspberry Pi Pico W puede conectarse a su red doméstica o puede emitir su propia red.

He probado ambos y he encontrado algunos pros y contras de ambos métodos.

Como estación (es decir, se conecta a una red)

En el diseño inicial, hice que mi Pico W se conectara a mi red doméstica y sirviera un archivo HTML con un botón en su dirección IP 192.168.0.70.

La ventaja de esto era que podía arrancar fácilmente mi navegador y pulsar el botón que apagaba la luz.

Sin embargo, el inconveniente es que cualquier persona de la red también podía hacerlo, a menos que se implementara alguna forma de autenticación.

Otra desventaja es que, si tu red doméstica se queda sin energía, la Raspberry Pi Pico W no se reconectará a la red, a menos que hayas implementado un código que reinicie tu Pico W o la reconecte a la red.

Como punto de acceso

Al conectarlo, el servo girará, apagando el interruptor

Actualmente, estoy utilizando mi Pico W como punto de acceso, aunque no digo que sea lo mejor.

Emite una red a la que tengo que conectarme por separado para poder controlar el servo. Esto es un inconveniente.

La ventaja de esto es que, a diferencia del método de la estación, tienes una contraseña en la red para que sólo tú puedas conectarte a ella.

Inicialmente, tenía un punto de acceso que servía una página web con un botón para activar el servo. Me pareció demasiado engorroso porque hay que 1) conectarse a la red, 2) ir a la dirección IP del Pico W y 3) pulsar el botón

Encontré que la mejor solución es disparar el servo una vez que el Pico W detecta un cliente que se conecta al punto de acceso. De este modo, basta con conectar cualquier dispositivo al Pico W para que las luces (o el interruptor) se apaguen.

Conexión del Pico W a un servo

Este es un proyecto sencillo y debería poder encontrar piezas en un kit para principiantes. Si no, aquí hay una lista de piezas.

También utilicé una protoboard opcional para conectar el servo al Pico W con cables de puente macho a macho, pero puedes conectar el servo directamente a los cabezales del Pico W con cables de puente macho a hembra.

También necesitarás cinta adhesiva de doble cara para pegar el servo en la carcasa del interruptor de la luz.

Cableado

Controlador de servoconmutadores Pico W
Conexión de un Pico W a un servo. (diagrama realizado con Wokwi)

Generalmente, todos los servos tienen un cable rojo, negro/marrón y un tercer cable.

Conecta un cable de puente rojo al cable rojo que viene del servo. Aquí es donde enviarás 5V, a través de VBUS.

Conecte un cable negro al cable negro/marrón. Lo conectarás a GND en el Pico W.

Conecta otro cable al tercer cable. El mío es de color naranja, así que usé un cable de puente naranja. Este es el cable de señal que conecté a GPIO16.

El código

Este código le permitirá activar el servo cuando un cliente se conecte al punto de acceso SoftAP del 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')

Algunas líneas de código importantes para explicar:

El código asume que has conectado el cable de señal a GPIO16. Si no es así, cambia el entero "16" de esta línea por el pin GPIO al que estés conectado.

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

Esto configura el SoftAP, declara el nombre del SSID y la contraseña,

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

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

Servocontrol en el Pico W

Esto controla el servo. Probablemente tendrá que modificar esto.

Para mi servo, podría utilizar un valor de 500000 (500K) a 2000000 (2 mil). Esto daría el rango completo del servo.

Sin embargo, sólo necesitaba una pequeña rotación. Por lo tanto, puse el servo a su rotación completa con pwm.duty_ns(2000000) y luego dejar que vuelva a pwm.duty_ns(1500000).

Probablemente es mejor probar esto mientras su servo está flotando libremente para que pueda ver si está girando en la dirección correcta y luego puede afinar los grados de rotación.

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

Difusión de un AP, activación de rotateServo en la conexión

Esta línea de código se ejecuta repetidamente.

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

Si ap.status('estaciones') detecta una conexión a la red inalámbrica, devolverá un array con un elemento.

ap.status('estaciones') devuelve un array vacío si no hay nadie conectado al AP

Por lo tanto, si el código no es una matriz vacía, lanzará rotateServo y apagar el PA antes de volver a encenderlo.

La idea de encender y apagar el AP es sacar al cliente conectado de la red. Esto le permite conectarse a su red habitual con conexión a Internet.

reconexión automática de android desactivada
La reconexión automática se desactiva en Android

Sólo asegúrate de desactivar la reconexión automática en tu teléfono u ordenador.

¿Por qué necesitamos el sleep(x) entre las llamadas a ap.active()? Esto es porque aprendí que si apago y enciendo el AP muy rápido, mi teléfono no perderá la conexión.

Más información sobre la Raspberry Pi Pico W

Hemos escrito un artículo específicamente sobre la Raspberry Pi Pico W que le ayudará a sacar el máximo provecho de su Pico W. Haga clic aquí para conocer cosas que no sabía.

2 Comentarios

  1. Udo el febrero 24, 2023 a las 3:47 pm

    Sehr interessant,
    ich betreibe gerade viel Recherche zum pico w.
    Puede que mi idea sea demasiado rara, pero sólo estoy trabajando en un proyecto similar con la Pi Zero.
    So ganz blicke ich bei dem Pico noch nicht durch.
    Mi objetivo: Utilizar el Pico W como mando a distancia con teclado.
    Bedeutet: Ich schicke von meinem Smarthome per Handy oder Script Tastaturbefehle, die der Pico empfängt und quasi die Tasten am PC drückt.
    Con la biblioteca oculta es posible emular un teclado.
    So könnte ich z.B. zu einer gewissen Zeit den PC automatisch per Tasturbefehl fernsteuern.
    La ventaja de la emulación hid: Funciona prácticamente sin necesidad de cables ni software en el PC. Independientemente del sistema. Así se puede controlar la 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
    ¿Qué pasa con el pico w por wlan?

    • raspi berry el marzo 11, 2023 a las 7:02 am

      Hola Udo, no entiendo por qué no se puede realizar con un Pico W. La versión por USB HID funciona igual, en principio sólo se puede crear una interfaz web.
      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!)
      Hasta ahora hemos trabajado para que Pico W también funcione con PiControl, por lo que es posible insertar en Pico W un script de Python y crear secuencias definidas con anterioridad.
      (Falls es per Python auch geht - ich habe den Heise Artikel gerade nicht angeschaut).

      Gracias por la pregunta y la respuesta.
      Max

Deja un comentario