Controlador de servo interruptor sem fios DIY com Raspberry Pi Pico W

Pico W Servo Switch Controller Título da imagem

Um dos maiores problemas que tenho é levantar-me da cama para apagar a luz do quarto. É muito difícil fazê-lo quando se está aconchegado na cama. Por isso, aqui, quero dizer-vos como resolver esse problema com um controlador de interrutor Pico W Servo.

Há alguns anos, construí uma solução sem fios com um Arduino e um controlo remoto por infravermelhos. Funcionou bastante bem porque era fiável e resolveu o meu problema. No entanto, tinha as suas desvantagens.

Para um, o Arduino Uno era maciço em comparação com o Raspberry Pi Pico W.

Em segundo lugar, dependia de um sinal IR, o que significava que eu precisava de saber onde estava o meu comando IR quando queria apagar a luz.

E é aqui que o Raspberry Pi Pico W tem a sua vantagem. Pode controlar o servo directamente a partir do seu telefone.

Controlador de servo-comutador Pico W
Visão geral do projecto de controlo do comutador sem fios DIY

Porquê preocupar-se com este projecto de bricolage?

É feio. É enfadonho.

Mas também envolve a alegria e o divertimento de elaborar a sua própria solução para os seus problemas.

Os problemas modernos exigem soluções modernas, e pode ver aqui como as pessoas resolvem os seus problemas com o Raspberry Pi.

Além disso, poderá ter de o fazer porque não está autorizado a modificar a instalação eléctrica da sua casa.

Ou não quer passar pela despesa de contratar um profissional para o fazer.

Outra razão é porque este projecto é tão extensível e portátil. Não é necessário utilizá-lo num interruptor de luz, pode utilizá-lo num teclado, para parar os protectores de ecrã, por exemplo.

Vídeo

Controlo de interruptor bidireccional possível, mas de uma forma mais fácil

Controlador de servo-comutador Pico W
Servo preparado para desligar o interruptor de luz
Controlador de servo-comutador Pico W
Servo em rotação completa, desligando o interruptor

Se há uma coisa que pode definitivamente fazer com todos os interruptores do mundo, seja europeu ou norte-americano, pode sempre usar um servo para o desligar ou ligar.

Mas se se quiser controlar o interruptor de ambas as maneiras, torna-se um desafio de engenharia maior porque o servo pode ficar no caminho.

Por exemplo, se precisar de ser capaz de ligar ou desligar manualmente o interruptor, poderá encontrar os servo braços no caminho. Não pode forçá-lo a sair do caminho sem destruir o motor, pois o servo está programado para se manter no lugar com todas as suas forças.

Rede de radiodifusão ou ligação a uma rede?

O Raspberry Pi Pico W pode ligar-se à sua rede doméstica ou pode transmitir a sua própria rede.

Tentei ambos e encontrei alguns prós e contras de ambos os métodos.

Como uma estação (ou seja, liga-se a uma rede)

No desenho inicial, fiz a ligação do meu Pico W à minha rede doméstica e servi um ficheiro HTML com um botão no seu endereço IP 192.168.0.70.

O benefício disto foi poder facilmente arrancar o meu navegador e premir o botão que desligava a luz.

No entanto, a desvantagem é que qualquer pessoa na rede também foi capaz de o fazer, a menos que tenha implementado alguma forma de autenticação.

Outra desvantagem é que, se a sua rede doméstica perder energia, o Raspberry Pi Pico W não voltará a ligar-se à rede, a menos que tenha implementado um código que reinicie o seu Pico W ou o volte a ligar à rede.

Como um ponto de acesso

Ao ligar-se a isto, o servo irá rodar, desligando o interruptor

Actualmente, estou a utilizar o meu Pico W como ponto de acesso, embora não esteja a dizer que é o melhor caminho a seguir.

Transmite uma rede à qual tenho de me ligar separadamente para poder controlar o servo. Esta é uma desvantagem inconveniente.

O lado positivo disto é que, ao contrário do método da estação, tem uma palavra-passe na rede para que só você possa ligar-se a ela.

Inicialmente, eu tinha um ponto de acesso que servia uma página web com um botão para accionar o servo. Achei isto demasiado complicado porque será necessário 1) ligar à rede, 2) ir para o endereço IP do Pico W e 3) premir o botão

Descobri que a melhor solução é accionar o servo assim que o Pico W detecta um cliente a ligar-se ao ponto de acesso. Desta forma, tudo o que tem de fazer é ligar qualquer dispositivo ao Pico W e as suas luzes (ou interruptor) estarão apagadas.

Ligação do Pico W a um servo

Este é um projecto simples e deverá ser capaz de encontrar peças num kit para principiantes. Caso contrário, aqui está uma lista de peças.

Também utilizei uma tábua de pão opcional para ligar o servo ao Pico W com fios de saltadores macho-para-fêmea, mas é possível ligar o servo directamente aos cabeçalhos do Pico W com fios de saltadores macho-para-fêmea.

Também precisará de fita adesiva de dupla face para colar o seu servo na caixa do interruptor de luz.

Ligá-lo

Controlador de servo-comutador Pico W
Ligação de um Pico W a um servo. (diagrama feito com Wokwi)

Geralmente, todos os servo têm um fio vermelho, preto/castanho e terceiro fio.

Ligar um fio vermelho do jumper ao fio vermelho proveniente do servo. É para aqui que enviará 5V, via VBUS.

Ligar um fio preto ao fio preto/castanho. Irá ligar isto à GND no Pico W.

Ligar outro fio ao terceiro fio. O meu é de cor laranja, por isso usei um fio de salta laranja. Este é o fio de sinal que eu liguei ao GPIO16.

O código

Este código permitir-lhe-á accionar o servo sobre um cliente que se ligue ao ponto de acesso SoftAP do 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')

Algumas linhas de código importantes a explicar:

O código assume que ligou o fio de sinal à GPIO16. Caso contrário, altere o "16" inteiro nesta linha para o pino GPIO ao qual está ligado.

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

Isto cria o SoftAP, declara o nome SSID e a palavra-passe,

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

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

Controlo de servos no Pico W

Isto controla o servo. Provavelmente, terá de modificar isto.

Para o meu servo, poderia usar um valor de 500000 (500K) a 2000000 (2 mil). Isto daria a gama completa do servo.

No entanto, eu só precisava de uma pequena rotação. Assim, coloquei o servo na sua rotação completa com pwm.duty_ns(2000000) e depois deixá-lo regressar a pwm.duty_ns(1500000).

É provavelmente melhor testar isto enquanto o seu servo está a flutuar livremente para que possa ver se está a rodar na direcção certa e depois pode afinar os graus de rotação.

def rotateServo ():
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

Transmissão de um AP, accionando o rotateServo em ligação

Esta linha de código corre repetidamente.

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

Se ap.status('estações') detecta uma ligação à rede sem fios, devolve uma matriz com um item.

ap.status('estações') devolve uma matriz vazia se ninguém estiver ligado ao AP

Assim, se o código não for um conjunto vazio, será lançado rotateServo e desligar o AP antes de o voltar a ligar.

A ideia de ligar e desligar o AP é expulsar o cliente ligado da rede. Isto permite-lhe ligar-se à sua rede habitual com uma ligação à Internet.

androide auto reconectar
Reconexão automática desligada no Android

Certifique-se apenas de desligar a ligação automática no seu telefone ou computador.

Porque precisamos do sono(x) entre ap.active() chamadas? Isso porque aprendi que se eu desligar e ligar o AP demasiado depressa, o meu telefone não deixará cair a ligação.

Saiba mais sobre o Raspberry Pi Pico W

Escrevemos um artigo especificamente sobre o Raspberry Pi Pico W que o ajudará a tirar o máximo partido do seu Pico W. Clique aqui para aprender sobre coisas que nunca soube.

2 comentários

  1. Udo em Fevereiro 24, 2023 às 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.
    Assim, 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. Sistema de furos iguais. 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 em Março 11, 2023 às 7:02 am

      Olá 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).

      Danke jedenfalls für die Frage und die Anregung!
      Max

Deixe um comentário