C'est l'hiver ! Hiver.gif

ENIB 2026 : SmartVague : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
(description (résumé))
 
(29 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
Titre de la fiche expérience :
 
 
==description (résumé)==
 
==description (résumé)==
Nous allons réaliser un appareil permettant de connaître la hauteur des vagues au large d'un port quelconque de puis chez soit.
 
  
 
[[Fichier:Blue_wave.png|200px]]
 
[[Fichier:Blue_wave.png|200px]]
 +
 +
Nous sommes une équipe de quatre étudiants de l'ENIB et nous allons réaliser un appareil permettant de connaître l'état de la marée de la rade de Brest ou d'un autre port tout en étant chez soit. Nous avons décidé d'appeler ce dispositif le '''SmartVague'''.
 +
 +
Ce wiki vous permettra de reproduire ce projet chez vous en autonomie avec les différentes étapes de montage, le code à implémenter dans la carte, le matériel et les logiciels à utiliser ainsi que les éventuelles difficultés rencontrées au cours du prototypage.
  
 
==Introduction==
 
==Introduction==
  
éventuelle vidéo
+
'''Une marée''' est un mouvement périodique et journalier du niveau de la mer, de plus ou moins grande amplitude selon le '''coefficient de marée''', dû à l'attraction de la Lune ainsi qu'à celle du système solaire.
 +
 
 +
Voici une vidéo d'introduction expliquant ce qui provoque les marées.
 +
 
 +
[[Fichier:Quest-ce qui provoque les marées.mp4]]
 +
 
 +
Pour un pêcheur, il est important de connaître la marée avant d'aller en mer pour plusieurs raisons:
 +
* '''La sécurité de navigation''' : la marée influence la profondeur de l'eau. À marée basse, certains passages peuvent devenir dangereux ou impraticables à cause des bancs de sable, des rochers ou des récifs qui peuvent causer un risque d'échouement du bateau.
 +
* '''Les courants marins''' : Les marées créent des courants parfois très forts, surtout dans des passes. Ces courants peuvent compliquer la manœuvre du bateau, augmenter la consommation de carburant ou rendre le retour difficile.
 +
*'''L'efficacité de la pêche''' : Le comportement des poissons dépend souvent de la marée. Certaines espèces se nourrissent davantage à marée montante ou descendante. Connaître la marée améliore donc les chances de prises.
 +
 
 +
C'est pourquoi le dispositif '''SmartVague''' est conçu. Il permet connaître le '''marnage''', c'est-à-dire la différence entre la marée haute et la marée basse et cela en temps réel depuis chez soit.
 +
 
 +
[[Fichier:Schéma_marnage_v2.jpg|500px]]
 +
 
 +
À la fin de ce wiki, vous serez capable d'obtenir le projet fonctionnel comme montré ci-dessous.
 +
 
 +
[[Fichier:Demo_SmartVague.mp4]]
 +
 
 
==outil et matériel==
 
==outil et matériel==
 +
 +
* Du carton
 +
* Une paire de ciseaux
 +
* Un pistolet à colle
 +
* Une carte ESP32 ainsi que son câble
 +
 +
[[Fichier:ESP32.jpg|200px]]
 +
 +
* Une ESP32-S expansion board 38-pin
 +
 +
[[Fichier:Expansion_board.jpg|200px]]
 +
 +
* De la ficelle
 +
* Un ordinateur avec le logiciel '''Arduino IDE''' installé
 +
* 2 câbles mâle mâle
 +
 +
[[Fichier:Cable_male.jpeg|200px]]
 +
 +
* 8 câbles femelle femelle
 +
 +
[[Fichier:Cable_femelle.jpeg|200px]]
 +
 +
* Un bouton poussoir
 +
* Un moteur pas à pas 28BYJ-48 avec un driver ULN2003
 +
 +
[[Fichier:Stepper_motor.png|200px]]
 +
 +
* Un enrouleur à fil
 +
 +
 +
===Installation et configuration du logiciel Arduino IDE===
 +
Tout d'abord, télécharger le logiciel via [https://docs.arduino.cc/software/ide/ ce lien] sur votre ordinateur et suivre les procédures d'installation de l'application.
 +
Lancer ensuite le logiciel, vous devez arriver ici.
 +
 +
[[Fichier:Accueil_arduino.png|300px]]
 +
 +
Pour la suite, il faut installer plusieurs drivers pour pouvoir utiliser l'ESP32 avec le logiciel Arduino. Un wiki existe déjà à ce sujet, il suffit donc de se rendre [https://www.wikidebrouillard.org/wiki/Utiliser_l%27ESP32_avec_le_logiciel_Arduino ici] et de suivre les étapes.
 +
Il faut ensuite configurer le réseau Wifi sur un ESP32. En se rendant sur [https://www.wikidebrouillard.org/wiki/Configurez_le_r%C3%A9seau_Wifi_sur_un_ESP ce wiki] vous avez toutes les étapes de configuration. Si tout s'est bien passé, le logiciel est désormais prêt à l'emploi.
  
 
==fichiers à joindre==
 
==fichiers à joindre==
code, ficher d'impression 3D, de découpe laser ou vinyle, ...
+
Le code complet à utiliser pour ce projet est accessible ici:
 +
 
 +
[[Fichier:SmartVagueV2.ino|vignette|SmartVague.ino]]
 +
 
 +
Il est aussi disponible à la suite du wiki en copier coller.
 +
 
 +
Un pdf donnant la liste des ID des différents ports est disponible ci-dessous:
 +
 
 +
[[Fichier:Tableau.pdf|vignette|Tableau.pdf]]
 +
 
 
===Mettre du code Arduino===
 
===Mettre du code Arduino===
 
<syntaxhighlight lang="Arduino" line>  
 
<syntaxhighlight lang="Arduino" line>  
#define PIN 9
+
/*
#include <Arduino_GFX_Library.h>
+
* PROJET : SMART VAGUE
 +
*/
 +
 
 +
#include <WiFi.h>
 +
#include <HTTPClient.h>
 +
#include <ArduinoJson.h>
 +
#include <NTPClient.h>
 +
#include <WiFiUdp.h>
 +
#include <Stepper.h>
 +
 
 +
#include "soc/soc.h"
 +
#include "soc/rtc_cntl_reg.h"
 +
 
 +
const int PAS_PAR_TOUR = 2048;
 +
const float PAS_PAR_METRE = PAS_PAR_TOUR / 7.0;
 +
const float HAUTEUR_MAX = 7.0;
 +
 
 +
// --- 1. CONFIGURATION ---
 +
 
 +
const char* ssid    = "NOM_DU_RESEAU"; //-> à modifier pour correspondre à votre réseau
 +
const char* password = "MOT_DE_PASSE_RESEAU"; //-> IDEM
 +
 +
// Câblage : IN1->19, IN3->5, IN2->18, IN4->17
 +
Stepper myStepper(PAS_PAR_TOUR, 19, 5, 18, 17); //-> vous pouvez modifiez les Pins de branchement pour le Moteur
 +
const int boutonPin = 14; //-> IDEM pour le Bouton Poussoir
 +
 
 +
// FIN CONFIGURATION
 +
 
 +
String url_base = "https://services.data.shom.fr/maregraphie/observation/json/";
 +
String Ville_ID = "3";                                          //-> voir Tableau.pdf pour modifier la ville (Brest par défaut = 3)
 +
WiFiUDP ntpUDP;
 +
NTPClient timeClient(ntpUDP, "pool.ntp.org", 0);
  
 
void setup() {
 
void setup() {
   // put your setup code here, to run once:
+
   // Désactive le détecteur de Brownout
 +
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
  
 +
  Serial.begin(115200);
 +
  pinMode(boutonPin, INPUT_PULLUP);
 +
  myStepper.setSpeed(10); // Vitesse modérée pour voir l'ondulation
 +
 +
  Serial.print("Connexion au WiFi");
 +
  WiFi.begin(ssid, password);
 +
 
 +
  int timeout = 0;
 +
  while (WiFi.status() != WL_CONNECTED && timeout < 20) {
 +
    delay(500);
 +
    Serial.print(".");
 +
    timeout++;
 +
  }
 +
 
 +
  if (WiFi.status() == WL_CONNECTED) {
 +
    Serial.println("\nWiFi Connecté !");
 +
  } else {
 +
    Serial.println("\nEchec WiFi");
 +
  }
 +
 
 +
  timeClient.begin();
 +
  Serial.println("Pret.");
 
}
 
}
  
 
void loop() {
 
void loop() {
   // put your main code here, to run repeatedly:
+
   timeClient.update();
  
 +
  if (digitalRead(boutonPin) == LOW) {
 +
    Serial.println("Bouton detecté !");
 +
    lancerAnimationMaree();
 +
    delay(1000);
 +
  }
 +
}
 +
 +
// --- FONCTION PRINCIPALE ---
 +
void lancerAnimationMaree() {
 +
  if (WiFi.status() == WL_CONNECTED) {
 +
    unsigned long epoch = timeClient.getEpochTime();
 +
    String url = url_base + Ville_ID + "?sources=1&dtStart=" + getFormattedDate(epoch - 600) + "&dtEnd=" + getFormattedDate(epoch + 60);
 +
   
 +
    HTTPClient http;
 +
    http.begin(url);
 +
    int code = http.GET();
 +
   
 +
    if (code == 200) {
 +
      String payload = http.getString();
 +
      JsonDocument doc;
 +
      deserializeJson(doc, payload);
 +
 +
      if (doc["data"].size() > 0) {
 +
        int dernierIndex = doc["data"].size() - 1;
 +
        float niveau = doc["data"][dernierIndex]["value"];
 +
        Serial.print("Hauteur SHOM : "); Serial.println(niveau);
 +
 +
        // Limitation Sécurité
 +
        if (niveau > HAUTEUR_MAX) niveau = HAUTEUR_MAX;
 +
 +
        // Calcul des pas pour aller à la hauteur de marée
 +
        long pasAfaire = (long)(niveau * PAS_PAR_METRE);
 +
 +
        // 1. ALLER À LA HAUTEUR DE MARÉE
 +
        Serial.println("Deplacement vers la hauteur...");
 +
        if (pasAfaire > 0) myStepper.step(-pasAfaire); // (Négatif = monter)
 +
       
 +
        // 2. ANIMATION VAGUE AMORTIE
 +
        Serial.println("Animation Vague...");
 +
        simulerVague(); // <--- C'est ici que ça bouge !
 +
 +
        // 3. RETOUR À ZÉRO
 +
        Serial.println("Retour a zero...");
 +
        if (pasAfaire > 0) myStepper.step(pasAfaire);
 +
       
 +
        extinctionMoteur();
 +
      }
 +
    }
 +
    http.end();
 +
  }
 +
}
 +
 +
// --- FONCTION QUI FAIT L'OSCILLATION ---
 +
void simulerVague() {
 +
  // Réglages de l'animation
 +
  int amplitude = 200; // Amplitude de départ (en pas). Env. 50cm sur votre échelle.
 +
  float amortissement = 0.60; // Chaque vague est 40% plus petite que la précédente
 +
 +
  // On fait 4 rebonds
 +
  for(int i=0; i<4; i++) {
 +
   
 +
    // Si l'amplitude devient trop petite (invisible), on arrête
 +
    if (amplitude < 10) break;
 +
 +
    // A. Monte (Crête)
 +
    // On monte de 'amplitude'
 +
    myStepper.step(-amplitude);
 +
 +
    // B. Descend (Creux)
 +
    // On descend de 2x amplitude pour traverser le centre et aller en bas
 +
    myStepper.step(amplitude * 2);
 +
 +
    // C. Remonte au centre
 +
    // On remonte de 'amplitude' pour revenir au niveau exact de la marée
 +
    myStepper.step(-amplitude);
 +
 +
    // D. Réduit l'amplitude pour le prochain tour
 +
    amplitude = (int)(amplitude * amortissement);
 +
   
 +
    // Petite pause pour ne pas brusquer le moteur
 +
    delay(50);
 +
  }
 +
 
 +
  // On s'assure que le moteur est éteint à la fin de l'oscillation
 +
  extinctionMoteur();
 +
  delay(10000); // Pause finale pour lire la valeur avant de redescendre à zéro
 +
}
 +
 +
void extinctionMoteur() {
 +
  digitalWrite(19, LOW); digitalWrite(18, LOW);
 +
  digitalWrite(5, LOW); digitalWrite(17, LOW);
 +
}
 +
 +
String getFormattedDate(unsigned long epoch) {
 +
  time_t rawtime = epoch;
 +
  struct tm * ti;
 +
  ti = gmtime (&rawtime);
 +
  char buffer[25];
 +
  sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02dZ",
 +
          ti->tm_year + 1900, ti->tm_mon + 1, ti->tm_mday,
 +
          ti->tm_hour, ti->tm_min, ti->tm_sec);
 +
  return String(buffer);
 
}
 
}
  
Ligne 30 : Ligne 253 :
  
 
==étapes de fabrication==
 
==étapes de fabrication==
indiquer autant d'étape que nécessaire, chacune illustrée par des images (photo, dessins, ...)
 
  
 
===étape 1===
 
===étape 1===
 +
Découper le carton en plusieurs rectangles dont les dimensions (en mm) ainsi que la quantité sont données ci-dessous:
 +
* 240x140 (x1)
 +
* 70x70 (x2)
 +
* 70x140 (x2)
 +
Une vague est à découper aussi. Voici le modèle que l'on a réalisé.
 +
 +
[[Fichier:Vague.jpeg|300px]]
 +
 +
Vous pouvez bien sûr réaliser votre propre modèle. La seule contrainte à respecter est que la largeur de la vague doit être inférieure à 140mm.
 
===étape 2===
 
===étape 2===
===étape ...===
+
Réaliser un trou dans le grand morceau de carton afin de pouvoir passer le moteur à travers.
 +
 
 +
[[Fichier:Trou_carton.jpeg|300px]]
 +
 
 +
===étape 3===
 +
Attacher le moteur à l'enrouleur avec de la colle.
 +
 
 +
[[Fichier:Tambour.jpeg|200px]]
 +
 
 +
===étape 4===
 +
Faire un trou au centre d'une des deux pièces 140x70 afin d'y faire passer le bouton poussoir.
 +
 
 +
[[Fichier:Bouton_poussoir.jpeg|200px]]
 +
 
 +
===étape 5===
 +
Coller les morceaux de carton ensembles afin d'obtenir le résultat suivant.
 +
 
 +
===étape 6===
 +
Enrouler la ficelle dans l'enrouleur et attacher le haut de la vague à l'extrémité de la ficelle.
 +
 
 +
===étape 7===
 +
Réaliser le câblage suivant.
 +
 
 +
[[Fichier:Wiring.jpeg|200px]]
 +
 
 +
Afin d'être en adéquation avec le code fournit, il faut brancher:
 +
* le bouton poussoir à la broche P14
 +
* IN1 du driver à la broche P19
 +
* IN2 du driver à la broche P18
 +
* IN3 du driver à la broche P5
 +
* IN4 du driver à la broche P17
 +
 
 +
===étape 8===
 +
Réaliser la graduation en partant de 0 et tracer un trait tout les 15mm d'écart, ce qui correspond à un mètre de marnage.
 +
 
 +
===étape 9===
 +
Connecter la carte à l'ordinateur et téléverser le code fournit. Si tout est correct, un appui sur le bouton poussoir fera bouger la vague, avec des petites oscillations, jusqu'au marnage réel.
 +
 
 +
Voici le POCL fini.
 +
 
 +
[[Fichier:Proto_fini.jpeg|400px]]
 +
 
 
===Troubleshouting===
 
===Troubleshouting===
Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?
+
 
 +
Il est possible qu'il y ait des problèmes et que la SmartVague ne fonctionne pas du premier coup, ça a été le cas pour nous. Nous allons exposer les difficultés que nous avons rencontré et quelle solution nous avons trouvé.
 +
* Le câble de connexion ordinateur-ESP32. Il s'avère que certains câbles ne permettent pas la connexion, d'autres ne fournissent pas assez de courant pour alimenter le moteur ainsi que la carte, ce qui donne un problème dans l'exécution du programme. Après avoir testé plusieurs câbles, nous avons finalement trouvé un qui fonctionnait correctement, donc il faut penser à avoir plusieurs câbles pour tester le meilleur.
 +
* Pour le tracé de l'échelle, il a fallut faire un deuxième programme permettant de commander manuellement le moteur afin de définir combien de tours il devait faire pour une montée d'un mètre du marnage.
 +
* La vague en carton était trop légère car elle ne tenait pas à plat contre le mur en carton. Nous l'avons donc lesté avec quelques fils d'étain pour y remédier.
 +
 
  
 
==Sources et documentation complémentaire==
 
==Sources et documentation complémentaire==
Ligne 53 : Ligne 330 :
  
 
==Elément de présentation==
 
==Elément de présentation==
je met ici le document de présentation de mon projet
+
[[Fichier:SmartVague_présentation.png|500px]]
  
 
==ne pas modifier sous cette ligne==
 
==ne pas modifier sous cette ligne==
 
[[Catégorie:Enib2026]]
 
[[Catégorie:Enib2026]]

Version actuelle datée du 20 janvier 2026 à 15:58

description (résumé)

Blue wave.png

Nous sommes une équipe de quatre étudiants de l'ENIB et nous allons réaliser un appareil permettant de connaître l'état de la marée de la rade de Brest ou d'un autre port tout en étant chez soit. Nous avons décidé d'appeler ce dispositif le SmartVague.

Ce wiki vous permettra de reproduire ce projet chez vous en autonomie avec les différentes étapes de montage, le code à implémenter dans la carte, le matériel et les logiciels à utiliser ainsi que les éventuelles difficultés rencontrées au cours du prototypage.

Introduction

Une marée est un mouvement périodique et journalier du niveau de la mer, de plus ou moins grande amplitude selon le coefficient de marée, dû à l'attraction de la Lune ainsi qu'à celle du système solaire.

Voici une vidéo d'introduction expliquant ce qui provoque les marées.

Pour un pêcheur, il est important de connaître la marée avant d'aller en mer pour plusieurs raisons:

  • La sécurité de navigation : la marée influence la profondeur de l'eau. À marée basse, certains passages peuvent devenir dangereux ou impraticables à cause des bancs de sable, des rochers ou des récifs qui peuvent causer un risque d'échouement du bateau.
  • Les courants marins : Les marées créent des courants parfois très forts, surtout dans des passes. Ces courants peuvent compliquer la manœuvre du bateau, augmenter la consommation de carburant ou rendre le retour difficile.
  • L'efficacité de la pêche : Le comportement des poissons dépend souvent de la marée. Certaines espèces se nourrissent davantage à marée montante ou descendante. Connaître la marée améliore donc les chances de prises.

C'est pourquoi le dispositif SmartVague est conçu. Il permet connaître le marnage, c'est-à-dire la différence entre la marée haute et la marée basse et cela en temps réel depuis chez soit.

Schéma marnage v2.jpg

À la fin de ce wiki, vous serez capable d'obtenir le projet fonctionnel comme montré ci-dessous.

outil et matériel

  • Du carton
  • Une paire de ciseaux
  • Un pistolet à colle
  • Une carte ESP32 ainsi que son câble

ESP32.jpg

  • Une ESP32-S expansion board 38-pin

Expansion board.jpg

  • De la ficelle
  • Un ordinateur avec le logiciel Arduino IDE installé
  • 2 câbles mâle mâle

Cable male.jpeg

  • 8 câbles femelle femelle

Cable femelle.jpeg

  • Un bouton poussoir
  • Un moteur pas à pas 28BYJ-48 avec un driver ULN2003

Stepper motor.png

  • Un enrouleur à fil


Installation et configuration du logiciel Arduino IDE

Tout d'abord, télécharger le logiciel via ce lien sur votre ordinateur et suivre les procédures d'installation de l'application. Lancer ensuite le logiciel, vous devez arriver ici.

Accueil arduino.png

Pour la suite, il faut installer plusieurs drivers pour pouvoir utiliser l'ESP32 avec le logiciel Arduino. Un wiki existe déjà à ce sujet, il suffit donc de se rendre ici et de suivre les étapes. Il faut ensuite configurer le réseau Wifi sur un ESP32. En se rendant sur ce wiki vous avez toutes les étapes de configuration. Si tout s'est bien passé, le logiciel est désormais prêt à l'emploi.

fichiers à joindre

Le code complet à utiliser pour ce projet est accessible ici:

Fichier:SmartVagueV2.ino

Il est aussi disponible à la suite du wiki en copier coller.

Un pdf donnant la liste des ID des différents ports est disponible ci-dessous:

Fichier:Tableau.pdf

Mettre du code Arduino

  1  
  2 /*
  3  * PROJET : SMART VAGUE
  4  */
  5 
  6 #include <WiFi.h>
  7 #include <HTTPClient.h>
  8 #include <ArduinoJson.h>
  9 #include <NTPClient.h>
 10 #include <WiFiUdp.h>
 11 #include <Stepper.h>
 12 
 13 #include "soc/soc.h"
 14 #include "soc/rtc_cntl_reg.h"
 15 
 16 const int PAS_PAR_TOUR = 2048;
 17 const float PAS_PAR_METRE = PAS_PAR_TOUR / 7.0;
 18 const float HAUTEUR_MAX = 7.0;
 19 
 20 // --- 1. CONFIGURATION ---
 21 
 22 const char* ssid     = "NOM_DU_RESEAU"; 			//-> à modifier pour correspondre à votre réseau
 23 const char* password = "MOT_DE_PASSE_RESEAU";			//-> IDEM
 24  
 25 // Câblage : IN1->19, IN3->5, IN2->18, IN4->17
 26 Stepper myStepper(PAS_PAR_TOUR, 19, 5, 18, 17);			//-> vous pouvez modifiez les Pins de branchement pour le Moteur
 27 const int boutonPin = 14; 					//-> IDEM pour le Bouton Poussoir
 28 
 29 // FIN CONFIGURATION
 30 
 31 String url_base = "https://services.data.shom.fr/maregraphie/observation/json/"; 
 32 String Ville_ID = "3";                                          //-> voir Tableau.pdf pour modifier la ville (Brest par défaut = 3)
 33 WiFiUDP ntpUDP;
 34 NTPClient timeClient(ntpUDP, "pool.ntp.org", 0);
 35 
 36 void setup() {
 37   // Désactive le détecteur de Brownout
 38   WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); 
 39 
 40   Serial.begin(115200);
 41   pinMode(boutonPin, INPUT_PULLUP);
 42   myStepper.setSpeed(10); // Vitesse modérée pour voir l'ondulation
 43 
 44   Serial.print("Connexion au WiFi");
 45   WiFi.begin(ssid, password);
 46   
 47   int timeout = 0;
 48   while (WiFi.status() != WL_CONNECTED && timeout < 20) { 
 49     delay(500); 
 50     Serial.print("."); 
 51     timeout++;
 52   }
 53   
 54   if (WiFi.status() == WL_CONNECTED) {
 55     Serial.println("\nWiFi Connecté !");
 56   } else {
 57     Serial.println("\nEchec WiFi");
 58   }
 59   
 60   timeClient.begin();
 61   Serial.println("Pret.");
 62 }
 63 
 64 void loop() {
 65   timeClient.update(); 
 66 
 67   if (digitalRead(boutonPin) == LOW) {
 68     Serial.println("Bouton detecté !");
 69     lancerAnimationMaree();
 70     delay(1000); 
 71   }
 72 }
 73 
 74 // --- FONCTION PRINCIPALE ---
 75 void lancerAnimationMaree() {
 76   if (WiFi.status() == WL_CONNECTED) {
 77     unsigned long epoch = timeClient.getEpochTime();
 78     String url = url_base + Ville_ID + "?sources=1&dtStart=" + getFormattedDate(epoch - 600) + "&dtEnd=" + getFormattedDate(epoch + 60);
 79     
 80     HTTPClient http;
 81     http.begin(url);
 82     int code = http.GET(); 
 83     
 84     if (code == 200) { 
 85       String payload = http.getString();
 86       JsonDocument doc;
 87       deserializeJson(doc, payload);
 88 
 89       if (doc["data"].size() > 0) {
 90         int dernierIndex = doc["data"].size() - 1;
 91         float niveau = doc["data"][dernierIndex]["value"];
 92         Serial.print("Hauteur SHOM : "); Serial.println(niveau); 
 93 
 94         // Limitation Sécurité
 95         if (niveau > HAUTEUR_MAX) niveau = HAUTEUR_MAX;
 96 
 97         // Calcul des pas pour aller à la hauteur de marée
 98         long pasAfaire = (long)(niveau * PAS_PAR_METRE);
 99 
100         // 1. ALLER À LA HAUTEUR DE MARÉE
101         Serial.println("Deplacement vers la hauteur...");
102         if (pasAfaire > 0) myStepper.step(-pasAfaire); // (Négatif = monter)
103         
104         // 2. ANIMATION VAGUE AMORTIE
105         Serial.println("Animation Vague...");
106         simulerVague(); // <--- C'est ici que ça bouge !
107 
108         // 3. RETOUR À ZÉRO
109         Serial.println("Retour a zero...");
110         if (pasAfaire > 0) myStepper.step(pasAfaire); 
111         
112         extinctionMoteur();
113       }
114     }
115     http.end();
116   }
117 }
118 
119 // --- FONCTION QUI FAIT L'OSCILLATION ---
120 void simulerVague() {
121   // Réglages de l'animation
122   int amplitude = 200; // Amplitude de départ (en pas). Env. 50cm sur votre échelle.
123   float amortissement = 0.60; // Chaque vague est 40% plus petite que la précédente
124 
125   // On fait 4 rebonds
126   for(int i=0; i<4; i++) {
127     
128     // Si l'amplitude devient trop petite (invisible), on arrête
129     if (amplitude < 10) break;
130 
131     // A. Monte (Crête)
132     // On monte de 'amplitude'
133     myStepper.step(-amplitude);
134 
135     // B. Descend (Creux)
136     // On descend de 2x amplitude pour traverser le centre et aller en bas
137     myStepper.step(amplitude * 2);
138 
139     // C. Remonte au centre
140     // On remonte de 'amplitude' pour revenir au niveau exact de la marée
141     myStepper.step(-amplitude);
142 
143     // D. Réduit l'amplitude pour le prochain tour
144     amplitude = (int)(amplitude * amortissement);
145     
146     // Petite pause pour ne pas brusquer le moteur
147     delay(50);
148   }
149   
150   // On s'assure que le moteur est éteint à la fin de l'oscillation
151   extinctionMoteur();
152   delay(10000); // Pause finale pour lire la valeur avant de redescendre à zéro
153 }
154 
155 void extinctionMoteur() {
156   digitalWrite(19, LOW); digitalWrite(18, LOW);
157   digitalWrite(5, LOW); digitalWrite(17, LOW);
158 }
159 
160 String getFormattedDate(unsigned long epoch) {
161   time_t rawtime = epoch;
162   struct tm * ti;
163   ti = gmtime (&rawtime);
164   char buffer[25];
165   sprintf(buffer, "%04d-%02d-%02dT%02d:%02d:%02dZ", 
166           ti->tm_year + 1900, ti->tm_mon + 1, ti->tm_mday, 
167           ti->tm_hour, ti->tm_min, ti->tm_sec);
168   return String(buffer);
169 }

étapes de fabrication

étape 1

Découper le carton en plusieurs rectangles dont les dimensions (en mm) ainsi que la quantité sont données ci-dessous:

  • 240x140 (x1)
  • 70x70 (x2)
  • 70x140 (x2)

Une vague est à découper aussi. Voici le modèle que l'on a réalisé.

Vague.jpeg

Vous pouvez bien sûr réaliser votre propre modèle. La seule contrainte à respecter est que la largeur de la vague doit être inférieure à 140mm.

étape 2

Réaliser un trou dans le grand morceau de carton afin de pouvoir passer le moteur à travers.

Trou carton.jpeg

étape 3

Attacher le moteur à l'enrouleur avec de la colle.

Tambour.jpeg

étape 4

Faire un trou au centre d'une des deux pièces 140x70 afin d'y faire passer le bouton poussoir.

Bouton poussoir.jpeg

étape 5

Coller les morceaux de carton ensembles afin d'obtenir le résultat suivant.

étape 6

Enrouler la ficelle dans l'enrouleur et attacher le haut de la vague à l'extrémité de la ficelle.

étape 7

Réaliser le câblage suivant.

Wiring.jpeg

Afin d'être en adéquation avec le code fournit, il faut brancher:

  • le bouton poussoir à la broche P14
  • IN1 du driver à la broche P19
  • IN2 du driver à la broche P18
  • IN3 du driver à la broche P5
  • IN4 du driver à la broche P17

étape 8

Réaliser la graduation en partant de 0 et tracer un trait tout les 15mm d'écart, ce qui correspond à un mètre de marnage.

étape 9

Connecter la carte à l'ordinateur et téléverser le code fournit. Si tout est correct, un appui sur le bouton poussoir fera bouger la vague, avec des petites oscillations, jusqu'au marnage réel.

Voici le POCL fini.

Proto fini.jpeg

Troubleshouting

Il est possible qu'il y ait des problèmes et que la SmartVague ne fonctionne pas du premier coup, ça a été le cas pour nous. Nous allons exposer les difficultés que nous avons rencontré et quelle solution nous avons trouvé.

  • Le câble de connexion ordinateur-ESP32. Il s'avère que certains câbles ne permettent pas la connexion, d'autres ne fournissent pas assez de courant pour alimenter le moteur ainsi que la carte, ce qui donne un problème dans l'exécution du programme. Après avoir testé plusieurs câbles, nous avons finalement trouvé un qui fonctionnait correctement, donc il faut penser à avoir plusieurs câbles pour tester le meilleur.
  • Pour le tracé de l'échelle, il a fallut faire un deuxième programme permettant de commander manuellement le moteur afin de définir combien de tours il devait faire pour une montée d'un mètre du marnage.
  • La vague en carton était trop légère car elle ne tenait pas à plat contre le mur en carton. Nous l'avons donc lesté avec quelques fils d'étain pour y remédier.


Sources et documentation complémentaire

  • Rédаctiоn et illustratiоn :

Pоur tоus vоs trаvauх, qu'ils sоient écrits оu visuels, l'utilisatiоn de l'intеlligеnce artificiеllе générativе, que сe sоit pоur le teхte оu les images, n'еst pas conseillé.

  • Prоgrammаtiоn :

En сe qui cоncernе la prоgrаmmatiоn, il est еssentiеl de ne pаs faire dе l'IA vоtrе prеmier rеcоurs. Cоncеntrеz-vоus d'abоrd sur vоtre prоpre lоgiquе, votre experience еt lеs ressоurcеs disponibles.

  • Transpаrence et dосumеntatiоn :

Si vоus utilisеz l'IA pоur déblоquer оu améliоrеr une pаrtiе de vоtre cоdе, il est cruciаl de l'indiquеr сlairеmеnt dans vоtre dосumentatiоn tеchniquе.

  • Traçabilité :

Chаque ехtrait de cоde généré avес l'аidе de l'IA dоit êtrе accоmpagné de la sоurce, ainsi que du prоmpt eхact qui a été utilisé pоur sа créatiоn, afin d'аssurеr une évaluatiоn clаire dе vоtre prоcessus.

Elément de présentation

SmartVague présentation.png

ne pas modifier sous cette ligne