Internet des objets l’ESP8266 et ma porte de garage

Logo

Dans ma maison, j’ai un garage dont la porte est motorisée ; avec une petite télécommande (433MHz) on peut l’ ouvrir ou la fermer depuis la voiture, ce qui est bien pratique en hiver. Mais il y a deux problèmes : le premier c’est que la télécommande fonctionne aléatoirement (ce qui n’est pas pratique), le second c’est la sécurité du 433MHz.

Ayant un Arduino UNO qui traîne dans un coin, ma maison étant domotisée (serveur fait-maison tournant sur du Python, du PHP, des scripts shell et le tout reposant sur xpl-perl) je me suis dit que le serveur domotique pourrait piloter la porte.
Il peut déjà lire l’état de la porte du garage avec un capteur d’ouverture.

Le moteur de la porte fournit un contact sec. Il suffit de ponter deux fils raccordés à un bornier pour actionner la porte : ouvrir si elle est fermée ou fermer si elle est ouverte.

Avec un Arduino et un relais on peut actionner sans problème la porte du garage. Je code vite fait un petit bout de script qui me permet d’activer un relais 1.5 seconde.
Le problème : il faut donner les ordres par un câble USB à l’Arduino donc je pars en recherche d’une carte WI-FI pour l’a
Arduino et c’est là que je tombe sur l’ESP8266.

Sommaire

Présentation de l’ESP8266

L’ESP8266 est un extraterrestre apparu dernièrement (vers 2014 me semble-t-il).
C’est une toute petite carte (de la taille d’une pièce de 2€ approximativement) qui contient un processeur tournant à 80MHz, une puce WI-FI avec son antenne, un port série et deux gpio (pour la version ESP-01) ; il existe d’autres versions qui peuvent contenir beaucoup plus de gpio mais elles sont légèrement plus chères et plus grandes. Bref, dans notre cas, la version ESP-01 coûte dans les 5€ environ.

ESP8266 version ESP-01

Il est semble-t-il opensource, compatible Arduino, vous pouvez le reflasher à votre guise, lui changer le bootloader. Vous pouvez lui faire tourner un firmware à base de Lua, ou de micro-Python (expérimental). Par défaut il se programme avec l’IDE de l’Arduino (attention à utiliser la dernière version depuis le site d’arduino). Vous pouvez même si vous le voulez ne pas le programmer et le configurer avec des commandes AT.

Premier essai avec l’ESP-01 (ESP8266)

Donc après avoir passer de longues soirées à chercher sur Internet (il y a tellement de possibilités) comment cela fonctionnait, je me décide à en commander un (comme je suis en Suisse j’en ai trouvé chez Chipandlove), pour 8,5 CHF, je ne prends pas beaucoup de risques.

La bête arrive le lendemain par la poste, le soir je le déballe et je commence à jouer avec.

Premier constat, l’Arduino fonctionne en 5V et l’ESP en 3.3V, c’est chiant il va falloir gérer une double alim (la sortie 3.3v de l’Arduino ne fournit que 30mA et l’ESP a besoin de 300mA environ), donc un montage avec un LF33CV fera l’affaire (régulateur de 3.3V).

Premier montage échec

Je modifie mon programme Arduino, à la mise sous tension il programme l’ESP avec une série de commande AT, puis il écoute ce qu’il vient depuis l’ESP. Quand je fais une requête via le WI-FI sur l’ESP, il émet bien quelque chose sur l’Arduino mais ça ne marche pas toujours, peu concluant, surtout que le tout pour être opérationnel prend pas mal de temps (le temps que l’Arduino programme l’ESP avec les commandes AT.

Deuxième essai concluant

On garde le même câblage mais je remets mon logiciel d’origine dans l’Arduino, il ne s’occupe plus de l’ESP. Je programme avec l’IDE de l’Arduino, l’ESP je pars des exemples fournis. Quand je fais une requête http://IP/garage il envoie sur le port série la commande d’ouverture que l’Arduino exécute. Youpi ça marche.

Montage commande garage avec arduino

Génial, mais l’Arduino ne sert à rien vu que l’ESP-01 a deux GPIO il pourrait bien piloter lui-même le garage.

Montage définitif

Donc je supprime l’Arduino, je modifie le soft de l’ESP pour qu’il commande lui-même le garage

Montage définitif

Problèmes techniques

L’ESP a au démarrage ses port gpio à +3.3V si vous l’utilisez pour la commande à niveau logique haut (+3.3V). Il suffirait d’une coupure de courant pour ouvrir le garage (sympa la sécurité). Donc j’utilise une commande inverse (mise à la masse).

L’ESP ne peut pas démarrer si la gpio est à la masse (même au travers d’une résistance et d’une diode (Base-Emetteur d’un transistor par exemple)) de ce fait nous allons utiliser un optocoupleur et la patte de masse de l’entrée de l’opto sera reliée à notre gpio. La patte d’entrée de l’opto étant reliée au travers d’une résistance au 3.3v. Comme ça lorsque l’ESP démarre la gpio est reliée au +3.3V

Schéma technique

Je vous ai mis le schéma technique, j’utilise un opto-triac parce que j’avais pas d’opto-coupleur en stock mais un opto-coupleur fera bien l’affaire.

Comme alimentation j’utilise une alim USB de 5V 2A. Pour alimenter l’ESP j’utilise un régulateur LF33CV qui me sort du +3.3V 500mA. Attention si vous faîtes votre 3.3V depuis une alim de 12V par exemple veuillez prévoir un refroidissement pour le LF33CV.

Schéma

Je travaille en +5V parce que j’ai une carte relais de +5V mais rien ne vous empêche d’utiliser d’autres relais sous d’autres tensions. Attention si vous attaquez un relais en direct n’oubliez pas de le piloter depuis un transistor (l’opto ne supportera pas le courant consommé par le relais) et de mettre une diode inverse sur votre relais pour éviter de bousiller votre électronique.

Programme ESP-01

Voici le programme que j’ai injecté dans l’ESP depuis l’IDE de l’Arduino (attention prenez la dernière version sur le site, celle contenue dans les dépôts d’ubuntu 14.04 est trop vieille).

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "lereseauwifi";
const char* password = "lacleewpa2";
const int relais = 2;
MDNSResponder mdns;

ESP8266WebServer server(80);

const int led = 13;

void handleRoot() {
  digitalWrite(led, 1);
  server.send(200, "text/plain", "hello from esp8266!");
  digitalWrite(led, 0);
}

void handleNotFound(){
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
  Serial.println("10");
}

void setup(void){
  pinMode(led, OUTPUT);
  pinMode(relais, OUTPUT);
  digitalWrite(relais, 1);
  digitalWrite(led, 0);
  Serial.begin(9600);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/garage", [](){
    server.send(200, "text/plain", "ok garage actionned");
    Serial.println("10");
    digitalWrite(relais, 0);
    delay(1500);
    digitalWrite(relais, 1);
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void){
  server.handleClient();
}

intégration dans la domotique existante

Mon serveur domotique (écrit en Python et PHP) utilise des scripts bash pour exécuter des actions (soit lancer depuis PHP pour la partie télécommande web ou depuis Python suite à une instruction reçue en xpl, voir depuis la crontab), voici mon script qui actionne la porte du garage:

#!/bin/sh
wget http://10.1.74.80/garage -O /dev/null

En fait c’est une simple requête http, j’ai mis /garage c’est pour éviter si quelqu’un dans mon réseau se connecte dessus par erreur qu’il ouvre la porte du garage (moi en l’occurrence)

Sécurité

Alors c’est clair que la partie réseau est minimaliste, il n’y a aucune sécurité, donc la sécurité doit se faire en amont, par exemple en utilisant un réseau wifi dédié avec une clé wap2 longue.
Ne pensez pas l’attaquer directement depuis Internet.

Conclusion

Voilà j’espère avoir réussi à vous donner l’envie d’essayer ce joli petit circuit. J’ai déjà plein d’idées pour la suite. Je vais à terme remplacer mon réseau 433 (intertechno, chacon, oregon…) par des montages faits avec des ESP. J’avais essayé enocean qui est prometteur mais affreusement cher.
J’espère que mon petit article pourra donner des réponses à certains qui butent sur des problèmes techniques. J’ai mis des liens sur quelques ressources qui m’ont aidé.

Lire les commentaires

(Source: LinuxFr.org : les dépêches)

Étiquettes: