Contrôleur de servocommutateur sans fil DIY avec Raspberry Pi Pico W

projet de commande d'interrupteur sans fil
Aperçu du projet de commande d'interrupteur sans fil DIY

L'un des plus gros problèmes que j'ai est de me lever du lit pour éteindre la lumière de la chambre.

C'est très difficile de le faire quand on est bien au chaud dans son lit.

Il y a quelques années, j'ai construit une solution sans fil avec un Arduino et une télécommande IR.

Cela a plutôt bien fonctionné car il était fiable et a résolu mon problème.

Mais ce n'était pas sans inconvénients.

Tout d'abord, l'Arduino Uno était massif par rapport au Raspberry Pi Pico W.

Deuxièmement, elle dépendait d'un signal IR, ce qui signifiait que je devais savoir où se trouvait ma télécommande IR lorsque je voulais éteindre la lumière.

Et c'est là que le Raspberry Pi Pico W a son avantage. Vous pouvez contrôler le servo directement depuis votre téléphone.

Pourquoi s'embêter avec ce projet de bricolage ?

C'est moche. C'est ennuyeux.

Mais cela implique également la joie et le plaisir de créer votre propre solution à vos problèmes.

Les problèmes modernes exigent des solutions modernes, et vous pouvez voir comment les gens résolvent leurs problèmes avec le Raspberry Pi ici.

En outre, vous devrez peut-être le faire parce que vous n'avez pas le droit de modifier les installations électriques de votre appartement.

Ou bien vous ne voulez pas faire appel à un professionnel pour le faire.

Une autre raison est que ce projet est tellement extensible et portable. Vous n'êtes pas obligé de l'utiliser sur un interrupteur, vous pouvez l'utiliser sur un clavier, pour arrêter les écrans de veille, par exemple.

Vidéo

Il est possible de commander un interrupteur à deux voies, mais le plus simple est de le faire à une seule voie.

commande de servocommutateur sans fil diy
Servo amorcé pour éteindre l'interrupteur
commande de servocommutateur sans fil diy
Servo à pleine rotation, arrêt de l'interrupteur

S'il y a une chose que vous pouvez définitivement faire avec tous les interrupteurs du monde, qu'ils soient européens ou nord-américains, c'est d'utiliser un servo pour les mettre en marche ou les arrêter.

Mais si vous voulez contrôler l'interrupteur dans les deux sens, cela devient un plus grand défi d'ingénierie car le servo pourrait se mettre en travers du chemin.

Par exemple, si vous devez être en mesure d'activer ou de désactiver manuellement l'interrupteur, les bras du servomoteur peuvent vous gêner. Vous ne pouvez pas le forcer à s'écarter sans détruire le moteur, car le servo est programmé pour se maintenir en place de toutes ses forces.

Diffuser le réseau ou se connecter à un réseau ?

Le Raspberry Pi Pico W peut se connecter à votre réseau domestique ou diffuser son propre réseau.

J'ai essayé les deux et j'ai trouvé des avantages et des inconvénients aux deux méthodes.

En tant que station (c'est-à-dire qu'elle se connecte à un réseau)

Dans la conception initiale, j'ai fait en sorte que mon Pico W se connecte à mon réseau domestique et qu'il serve un fichier HTML avec un bouton sur son adresse IP 192.168.0.70.

L'avantage est que j'ai pu facilement démarrer mon navigateur et appuyer sur le bouton qui éteint la lumière.

Cependant, l'inconvénient est que n'importe qui sur le réseau pouvait également le faire, à moins que vous ne mettiez en place une forme d'authentification.

Un autre inconvénient est que, si votre réseau domestique perd de l'énergie, le Raspberry Pi Pico W ne se reconnectera pas au réseau, à moins que vous n'ayez implémenté un code qui redémarre votre Pico W ou le reconnecte au réseau.

En tant que point d'accès

En se connectant à cela, le servo tournera, éteignant l'interrupteur.

Actuellement, j'utilise mon Pico W comme point d'accès, mais je ne dis pas que c'est la meilleure solution.

Il diffuse un réseau auquel je dois me connecter séparément pour pouvoir contrôler le servo. C'est un inconvénient gênant.

L'avantage de cette méthode est que, contrairement à la méthode de la station, vous avez un mot de passe sur le réseau, de sorte que vous êtes le seul à pouvoir vous y connecter.

Au départ, j'avais un point d'accès qui servait une page web avec un bouton pour déclencher le servo. J'ai trouvé que c'était trop lourd car il faut 1) se connecter au réseau, 2) aller à l'adresse IP du Pico W et 3) appuyer sur le bouton.

J'ai trouvé que la meilleure solution est de déclencher le servo dès que le Pico W détecte un client se connectant au point d'accès. De cette façon, il vous suffit de connecter n'importe quel appareil au Pico W pour que vos lumières (ou votre interrupteur) soient éteintes.

Connecter le Pico W à un servo

Il s'agit d'un projet simple et vous devriez pouvoir trouver des pièces dans un kit pour débutants. Sinon, voici une liste de pièces.

J'ai également utilisé un breadboard optionnel pour connecter le servo au Pico W avec des fils de liaison mâle-mâle, mais vous pouvez connecter le servo directement aux connecteurs du Pico W avec des fils de liaison mâle-femelle.

Vous aurez également besoin de ruban adhésif double face pour coller votre servo sur le boîtier de l'interrupteur de lumière.

Le câblage

Connexion d'un Pico W à un servo. (schéma réalisé avec Wokwi)

En général, tous les servos ont un fil rouge, noir/marron et un troisième fil.

Connectez un fil de liaison rouge au fil rouge provenant du servo. C'est ici que vous enverrez le 5V, via VBUS.

Connectez un fil noir au fil noir/marron. Vous le connecterez à GND sur le Pico W.

Connectez un autre fil au troisième fil. Le mien est de couleur orange, j'ai donc utilisé un fil de liaison orange. C'est le fil de signal que j'ai connecté à GPIO16.

Le code

Ce code vous permettra de déclencher le servo lorsqu'un client se connectera au point d'accès SoftAP du Pico W.

réseau d'importation
import machine
from machine import PWM
from time import sleep

#Pin param = numéro de la broche GPIO du servo
pwm = PWM(machine.Pin(16))

ssid = 'Lights-Out' (éteint)
password = 'sleeptime' (mot de passe)

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

while ap.active() == False :
  passer

print('Connexion réussie')
print(ap.ifconfig())

def rotateServo () :
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

#ap.status est un tableau vide jusqu'à ce que quelqu'un se connecte, alors il aura une entrée
#quand ap.status = true, alors il déclenchera rotateServo()
# puis il s'éteindra pour virer l'utilisateur du réseau,
# permettant à l'appareil de se reconnecter à son réseau habituel.

while True :
    essayez :
        if ap.status('stations') :
            print('client connecté')
            rotateServo()
            sleep(5)
            ap.active(False)
            sleep(2)
            ap.active(True)
        
    except OSError comme e :
        print('Connexion fermée')

Certaines lignes de code importantes à expliquer :

Le code suppose que vous avez connecté le fil du signal à GPIO16. Si ce n'est pas le cas, remplacez l'entier "16" de cette ligne par la broche GPIO à laquelle vous êtes connecté.

#Pin param = numéro de la broche GPIO du servo
pwm = PWM(machine.Pin(16))

Ceci configure le SoftAP, déclare le nom SSID et le mot de passe,

réseau d'importation
...
ssid = 'Lights-Out' (Lumière éteinte)
password = 'sleeptime' (mot de passe)

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

Servocommande sur le Pico W

Ceci contrôle le servo. Vous devrez probablement le modifier.

Pour mon servo, je pourrais utiliser une valeur de 500000 (500K) à 2000000 (2 mil). Cela donnerait la gamme complète du servo.

Cependant, je n'avais besoin que d'une petite rotation. Donc, j'ai mis le servo à sa pleine rotation avec pwm.duty_ns(2000000) et ensuite le laisser revenir à pwm.duty_ns(1500000).

Il est probablement préférable de tester ceci pendant que votre servo est en flottaison libre afin de voir s'il tourne dans la bonne direction et ensuite vous pouvez affiner les degrés de rotation.

def rotateServo () :
    pwm.freq(50)

    pwm.duty_ns(2000000)

    sleep(0.5)

    pwm.duty_ns(1500000)

Diffusion d'un AP, déclenchement de rotateServo à la connexion

Cette ligne de code s'exécute de manière répétée.

while True :
    essayez :
        if ap.status('stations') :
            print('client connecté')
            rotateServo()
            sleep(10)
            ap.active(False)
            sleep(2)
            ap.active(True)

Si ap.status('stations') détecte une connexion au réseau sans fil, il renvoie un tableau contenant un élément.

ap.status('stations') renvoie un tableau vide si personne n'est connecté à l'AP

Par conséquent, si le code n'est pas un tableau vide, il lancera rotateServo et éteindre le PA avant de le rallumer.

L'idée d'allumer et d'éteindre le PA est de faire sortir le client connecté du réseau. Cela lui permet de se connecter à son réseau habituel avec une connexion Internet.

reconnexion automatique android désactivée
La reconnexion automatique est désactivée dans Android

Veillez simplement à désactiver la reconnexion automatique dans votre téléphone ou votre ordinateur.

Pourquoi avons-nous besoin du sleep(x) entre les appels ap.active() ? C'est parce que j'ai appris que si j'éteins et rallume le PA trop rapidement, mon téléphone ne coupera pas la connexion.

En savoir plus sur le Raspberry Pi Pico W

Nous avons rédigé un article spécifique sur le Raspberry Pi Pico W qui vous aidera à tirer le meilleur parti de votre Pico W. Cliquez ici pour apprendre des choses que vous ne saviez pas.

Laissez un commentaire