[DefiDIY25] Robot piscine

Bonjour à tous,

En voyant le nombre de robots de piscine HS traîner sur Leboncoin et eBay, je me suis posé la question “mais pourquoi tous ces engins hors de prix finissent-ils à la poubelle au bout de quelques saisons ? »

J’ai donc fait l’acquisition d’un modèle en panne (Hayward TigerShark) et j’ai ouvert la bête pour comprendre. Et là, pas besoin de chercher longtemps :

Le boîtier moteur étanche contenant toute l’électronique est immergé, les moteurs chauffent, l’eau de la piscine étant plus fraîche, ça condense à gogo sur les parois

Bref, tout ce petit monde baigne allègrement dans les eaux de condensation accumulées car le sachet de dessiccant d’origine a dû être rapidement saturé.

Pour pousser les tests et sans trop y croire, je vide, je sèche, je referme… et là miracle : le robot repart comme si de rien n’était ! Sauf que… la corrosion avait déjà fait son œuvre. Quelques heures plus tard, retour à la case départ.

C’est là que j’ai décidé de jeter la carte électronique d’origine et de repartir sur une base saine.

J’ai donc greffé un ESP8266 (Wemos D1 Mini) et un pont en H pour piloter l’inversion de sens des chenilles plus quelques bigailles que je détaillerai plus bas.

Présentation du robot:

En gros, le robot est constitué d’

1 moteur qui actionne les chenilles (droite et gauche !)

1 moteur qui actionne une turbine qui a pour effet de plaquer le robot au fond ou à la paroi et d’aspirer les saletés dans le filtre.

Le décalage du robot pour nettoyer la “bande” suivante est assuré par la poignée-flotteur qui est a un angle ce qui fait que lorsque le robot grimpe a la paroi, une fois arrivé a la ligne d’eau, il se décale naturellement et le robot repart dans l’autre sens.

Pour plus de précisions aller voir la vidéo ici à 1:48

Tout le reste c’est … du plastique!

BOM:

1 pont en H (driver de puissance) BTS7960

1 wemos D1 mini

1 transistor IRL 540N

1 step down LM2596 qui sera réglé a 5V en sortie (attention! La tension d’alimentation d’origine du robot varie beaucoup et dépasse les 33 V a vide, le premier step down que j’avais choisi buggait au delà de 25V (données de la plaque constructeur de l’alim !)

1 diode 1N5822 (diode de roue libre): Protection contre les retours de tension lorsque le moteur de la turbine s’arrête.

2 interrupteurs au mercure de ce type (pour détecter lorsque le robot grimpe aux parois)

Le schéma

en direct sur cirkitdesigner

Les deux contacts mercure sont soudés en série et je me sers d’eux pour détecter que le robot monte a la paroi gauche ou droite de la piscine. Comme un dessin vaut mieux qu’un long discours voilà quelques vues qui vous permettront de mieux appréhender leur positionnement:

( A noter que l’ensemble est représenté a l’envers, la partie noire sur laquelle reposent tous les éléments est imprimée en 3D pour sécuriser l’angle précis des interrupteurs mercure : Menteur tu as foutu un angle au pif ! :rofl: )

Ainsi, quand le robot est au sol, les 2 contact mercure sont fermés mais dès que le robot va prendre un peu d’angle pour grimper à une paroi, un des 2 contacts s’ouvrira permettant la détection de bord.

Les puristes hurleront devant cet infâme assemblage mais c’est un proto, promis-juré-craché, cet hiver je fais un PCB digne de ce nom !

le lien vers la bidouille infâme qui tient lieu de PCB

Le code :

esphome:
  name: robot-piscine
  friendly_name: Robot Piscine

  # Démarrage immédiat même sans Wi-Fi
  on_boot:
    priority: 200
    then:
      - logger.log: "Boot immédiat même sans Wi-Fi"
      - delay: 5s
      - if:
          condition:
            binary_sensor.is_on: contact_capteur
          then:
            - logger.log: "Contact ON → Mode Travail"
            - text_sensor.template.publish:
                id: etat_robot
                state: "Mode Travail"
            - script.execute: cycle_travail
          else:
            - logger.log: "Contact OFF → Mode Maintenance"
            - text_sensor.template.publish:
                id: etat_robot
                state: "Mode Maintenance"

esp8266:
  board: d1_mini

wifi:
  networks:
    - ssid: "XXXX"
      password: "xxxxxxxxx"
    - ssid: "XXXX"
      password: "xxxxxxxxx"
    - ssid: "XXXX"
      password: "xxxxxxxxx"

  # ✅ Démarrage rapide sans attendre le Wi-Fi
  fast_connect: true
  reboot_timeout: 0s        # Ne redémarre jamais en cas d'échec Wi-Fi
  power_save_mode: none

  ap:
    ssid: "Robot-Piscine Fallback"
    password: "12345678"

logger:

api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

ota:
  platform: esphome
  password: "ota_password"

# === Variables globales ===
globals:
  - id: cycle_active
    type: bool
    restore_value: no
    initial_value: 'false'

# === Capteur mercure ===
binary_sensor:
  - platform: gpio
    pin:
      number: D7
      mode: INPUT_PULLUP
    id: contact_capteur
    name: "Contact Mercure"
    device_class: motion
    filters:
      - invert

# === Text sensor ===
text_sensor:
  - platform: template
    name: "État du Robot"
    id: etat_robot
    icon: "mdi:robot"

# === Sorties (moteurs et turbine) ===
switch:
  # --- Chenilles avant ---
  - platform: gpio
    pin: D5
    id: moteur_avant
    name: "Chenilles Avant"
    interlock: [moteur_arriere]
    interlock_wait_time: 1000ms

  # --- Chenilles arrière ---
  - platform: gpio
    pin: D6
    id: moteur_arriere
    name: "Chenilles Arrière"
    interlock: [moteur_avant]
    interlock_wait_time: 1000ms

  # --- Turbine ---
  - platform: gpio
    pin: D3
    id: turbine
    name: "Turbine"

# === Script principal ===
script:
  - id: cycle_travail
    mode: restart
    then:
      - logger.log: "Cycle Travail démarré"
      - text_sensor.template.publish:
          id: etat_robot
          state: "Cycle en cours"
      - globals.set:
          id: cycle_active
          value: 'true'
      - switch.turn_on: turbine
      - delay: 5s
      - switch.turn_on: moteur_avant
      - script.execute: boucle_travail

  - id: boucle_travail
    mode: restart
    then:
      # 1️⃣ Paroi gauche
      - wait_until:
          binary_sensor.is_off: contact_capteur
      - logger.log: "Robot sur paroi gauche"
      - delay: 30s
      - switch.turn_off: moteur_avant
      - delay: 1s
      - switch.turn_on: moteur_arriere

      # Retour au fond
      - wait_until:
          binary_sensor.is_on: contact_capteur
      - logger.log: "Robot au fond"

      # 2️⃣ Paroi droite
      - wait_until:
          binary_sensor.is_off: contact_capteur
      - logger.log: "Robot sur paroi droite"
      - delay: 30s
      - switch.turn_off: moteur_arriere
      - delay: 1s
      - switch.turn_on: moteur_avant

      # Reboucle tant que cycle actif
      - if:
          condition:
            lambda: 'return id(cycle_active);'
          then:
            - script.execute: boucle_travail

# === Fin automatique du cycle après 30 min ===
interval:
  - interval: 30min
    then:
      - if:
          condition:
            lambda: 'return id(cycle_active);'
          then:
            - logger.log: "Fin du cycle (30 min)"
            - switch.turn_off: moteur_avant
            - switch.turn_off: moteur_arriere
            - switch.turn_off: turbine
            - globals.set:
                id: cycle_active
                value: 'false'
            - text_sensor.template.publish:
                id: etat_robot
                state: "Cycle terminé"

La logique du robot:

:one: A la mise sous tension:

Si contact mercure fermés ON (fermé) → “Mode Travail” → Démarrage automatique du cycle complet

Si contact OFF (ouvert) → “Mode Maintenance” → aucune action automatique, tu pilotes manuellement depuis Home Assistant

:two: Mode Maintenance

On a 3 interrupteurs visibles dans Home Assistant :

Chenilles Avant

Chenilles Arrière

Turbine

On peut activer manuellement chaque sortie pour faire des tests.

L’interlock empêche “Avant” et “Arrière” d’être ON simultanément ce qui grillerait instantanément le driver du moteurs des chenilles.

:three: Mode Travail (automatique)

Le robot :

Démarre turbine → attend 5 s

Active la marche avant

Alterne avant/arrière selon les capteurs mercure

  • Lorsqu’ 1 interrupteur mercure passe OFF → “Robot sur paroi gauche”
  • Continue 30 s → inverse sens → descend de la paroi(J’ai réglé arbitrairement 30 S car chez moi j’ai une coque avec une marche périphérique mais chacun peut ajuster cette durée pour sa piscine)
  • Attend que les interrupteurs mercure repassent ON → “Robot au fond”
  • attend qu’1 interrupteur mercure passe OFF → “Robot sur paroi droite”
  • Continue 30 s → inverse sens → descend de la paroi → reboucle

Continue pendant 30 minutes puis une fois ce temps écoulé, Coupe tout et affiche :

“Cycle terminé”

En prime une carte pour votre dashboard:

type: vertical-stack
cards:
  - type: markdown
    content: |
      ## 🤖 **Robot Piscine**
      **Mode actuel :** `{{ states('text_sensor.robot_piscine_etat_du_robot') }}`
      _Dernière mise à jour : {{ now().strftime('%d/%m/%Y %H:%M') }}_

  - type: grid
    title: Contrôle Manuel
    columns: 3
    square: false
    cards:
      - type: button
        entity: switch.robot_piscine_chenilles_avant
        name: Avant
        icon: mdi:arrow-up-bold
        tap_action:
          action: toggle
      - type: button
        entity: switch.robot_piscine_turbine
        name: Turbine
        icon: mdi:fan
        tap_action:
          action: toggle
      - type: button
        entity: switch.robot_piscine_chenilles_arriere
        name: Arrière
        icon: mdi:arrow-down-bold
        tap_action:
          action: toggle

  - type: entity
    entity: binary_sensor.robot_piscine_contact_mercure
    name: Capteur Mercure (Paroi/Fond)
    icon: mdi:angle-acute

  - type: history-graph
    title: Historique Capteurs & Moteurs (2h)
    hours_to_show: 2
    refresh_interval: 0
    entities:
      - entity: text_sensor.robot_piscine_etat_du_robot
        name: Mode
      - entity: switch.robot_piscine_chenilles_avant
        name: Avant
      - entity: switch.robot_piscine_chenilles_arriere
        name: Arrière
      - entity: switch.robot_piscine_turbine
        name: Turbine

Ce montage à base de Wemos permet de faire durer un robot (qui est hors de prix une fois démonté et au vu de ce que contient la bête) mais il ne résout en aucun cas le problème de condensation qui se forme sur le caisson des moteurs.

Aussi, je pense qu’un démontage-séchage par an lors de l’hivernage permettra d’économiser les 800€ d’un robot neuf (et en prime vous aurez moins l’impression de passer pour un pigeon! )

Merci de m’avoir lu!

Manu

15 « J'aime »

Excellent, bravo !! Je n’aurai pas du me débarrasser de mon vieux robot Tigger Shark…

Question : on est d’accord qu’on ne peut bien entendu pas communiquer quand le robot est dans l’eau, et que l’intégration HA est juste pour la mise au point ?

Bonjour très bon chois d’être partie sur le shark car il a 2 moteurs de traction, c’est plus facile pour gérer les virage.

J’ai fait le même chose avec un dolphin, mais sans capteur de niveau. Comme le fait un robot de base, je gère les aller/retour/virage avec des tempo aléatoire, ça marche très bien ( je mettrais mon code a l’occasion). Pour les robots avec un seul moteur de traction c’est plus compliqué, chez dolphin ils font démarrer très vite le moteur le moteur ce qui a pour effet de faire tourner une chenille (celle qui est directement entraîné par le moteur) plus vite que l’autre et ainsi fait tourner le robot. Avec un esp j’ai pas réussi à reproduire ce phénomène.

Si l’esp est dans le robot, alors en effet pas de communication wifi quand il est dans l’eau. Si tu as 4 fil entre le robot et le transfo alors tu peux mettre l’esp dans le transfo et dans ce cas tu peux piloter ton robot en direct dans ha! Mais ça reste gadget.

( Il faut 4 fils pour pouvoir piloter le moteur de la Turbine+ les 2 moteurs de traction)

En effet, le wifi ne passe pas sous l’eau… Du coup, à moins d’avoir un câble avec un nombre de brins suffisant pour amener la puissance aux moteurs et récupérer le signal des interrupteurs mercure, on ne peut pas le commander depuis la surface. J’ai été voir le prix des câbles et ça m’a définitivement calmé pour cette solution !

Oui le mode maintenance était juste pour la mise a jour du wemos et les tests moteurs sans avoir à tout ouvrir.

1 « J'aime »

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.