C'est l'hiver ! Hiver.gif

ENIB 2026 : SmartVague : Différence entre versions

De Les Fabriques du Ponant
Aller à : navigation, rechercher
 
(5 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é)==
  
Ligne 24 : Ligne 23 :
  
 
[[Fichier:Schéma_marnage_v2.jpg|500px]]
 
[[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==
Ligne 68 : Ligne 71 :
 
Le code complet à utiliser pour ce projet est accessible ici:
 
Le code complet à utiliser pour ce projet est accessible ici:
  
[[Fichier:SmartVague.ino|vignette|SmartVague.ino]]
+
[[Fichier:SmartVagueV2.ino|vignette|SmartVague.ino]]
  
 
Il est aussi disponible à la suite du wiki en copier coller.
 
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===
Ligne 103 : Ligne 110 :
 
// FIN CONFIGURATION
 
// FIN CONFIGURATION
  
String url_base = "https://services.data.shom.fr/maregraphie/observation/json/3?sources=1";  
+
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;
 
WiFiUDP ntpUDP;
 
NTPClient timeClient(ntpUDP, "pool.ntp.org", 0);
 
NTPClient timeClient(ntpUDP, "pool.ntp.org", 0);
Ligne 149 : Ligne 157 :
 
   if (WiFi.status() == WL_CONNECTED) {
 
   if (WiFi.status() == WL_CONNECTED) {
 
     unsigned long epoch = timeClient.getEpochTime();
 
     unsigned long epoch = timeClient.getEpochTime();
     String url = url_base + "&dtStart=" + getFormattedDate(epoch - 600) + "&dtEnd=" + getFormattedDate(epoch + 60);
+
     String url = url_base + Ville_ID + "?sources=1&dtStart=" + getFormattedDate(epoch - 600) + "&dtEnd=" + getFormattedDate(epoch + 60);
 
      
 
      
 
     HTTPClient http;
 
     HTTPClient http;
Ligne 245 : 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===
Ligne 267 : Ligne 274 :
 
[[Fichier:Tambour.jpeg|200px]]
 
[[Fichier:Tambour.jpeg|200px]]
  
==étape 4==
+
===étape 4===
 
Faire un trou au centre d'une des deux pièces 140x70 afin d'y faire passer le bouton poussoir.
 
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]]
 
[[Fichier:Bouton_poussoir.jpeg|200px]]
  
==étape 5==
+
===étape 5===
 
Coller les morceaux de carton ensembles afin d'obtenir le résultat suivant.
 
Coller les morceaux de carton ensembles afin d'obtenir le résultat suivant.
  
==étape 6==
+
===étape 6===
 
Enrouler la ficelle dans l'enrouleur et attacher le haut de la vague à l'extrémité de la ficelle.
 
Enrouler la ficelle dans l'enrouleur et attacher le haut de la vague à l'extrémité de la ficelle.
  
==étape 7==
+
===étape 7===
 
Réaliser le câblage suivant.
 
Réaliser le câblage suivant.
  
Ligne 290 : Ligne 297 :
 
* IN4 du driver à la broche P17
 
* IN4 du driver à la broche P17
  
==étape 8==
+
===é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.
 
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==
+
===é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.
 
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.
  
Ligne 301 : Ligne 308 :
  
 
===Troubleshouting===
 
===Troubleshouting===
Quelles sont les 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.
  
  

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