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

proyecto de control de interruptores inalámbricos diy
Resumen del proyecto de control de interruptores inalámbricos DIY

Uno de los mayores problemas que tengo es levantarme de la cama para apagar la luz del dormitorio.

Es muy difícil hacerlo cuando se está cómodamente en la cama.

Hace unos años, construí una solución inalámbrica con un Arduino y un control remoto IR.

Funcionó bastante bien porque era fiable y resolvió mi problema.

Sin embargo, no estuvo exento de 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.

¿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 piso.

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

control inalámbrico de servo interruptor diy
Servo preparado para apagar el interruptor de la luz
control inalámbrico de servo interruptor diy
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

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.

importar red
importar máquina
from máquina import PWM
from tiempo import sueño

#Pin param = número de pin GPIO del servo
pwm = PWM(machine.Pin(16))

ssid = 'Lights-Out'
contraseña = 'sleeptime'

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

while ap.active() == False:
  pass

print('Conexión exitosa')
print(ap.ifconfig())

def rotarServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

#ap.status es un array en blanco hasta que alguien se conecta, entonces tendrá una entrada
1TP4Cuando ap.status = true, entonces activará rotateServo()
#entonces se apagará para expulsar al usuario de la red,
# permitiendo que el dispositivo se vuelva a conectar a su red habitual

mientras sea True:
    try:
        if ap.status('stations'):
            print('cliente conectado')
            girarServo()
            sleep(5)
            ap.active(False)
            sleep(2)
            ap.active(True)
        
    except OSError as e:
        print('Conexión cerrada')

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 = número de pin GPIO del servo
pwm = PWM(máquina.Pin(16))

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

red de importación
...
ssid = 'Lights-Out'
contraseña = 'sleeptime'

ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=contraseña)
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 rotarServo ():
    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.

mientras que True:
    try:
        if ap.status('stations'):
            print('cliente conectado')
            girarServo()
            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.

Deja un comentario