ENIB 2026 : SmartVague : Différence entre versions
(→description (résumé)) |
|||
| (24 révisions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
| − | |||
==description (résumé)== | ==description (résumé)== | ||
| Ligne 10 : | Ligne 9 : | ||
==Introduction== | ==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. | ||
| + | |||
| + | [[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 | + | 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> | ||
| − | # | + | /* |
| − | #include < | + | * 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() { | ||
| − | // | + | // 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() { | ||
| − | + | 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 33 : | Ligne 253 : | ||
==étapes de fabrication== | ==étapes de fabrication== | ||
| − | |||
===é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=== | ||
| − | + | ||
| + | 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== | ||
Version actuelle datée du 20 janvier 2026 à 15:58
Sommaire
description (résumé)
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.
À 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
- Une ESP32-S expansion board 38-pin
- De la ficelle
- Un ordinateur avec le logiciel Arduino IDE installé
- 2 câbles mâle mâle
- 8 câbles femelle femelle
- Un bouton poussoir
- Un moteur pas à pas 28BYJ-48 avec un driver ULN2003
- 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.
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:
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:
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é.
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.
étape 3
Attacher le moteur à l'enrouleur avec de la colle.
étape 4
Faire un trou au centre d'une des deux pièces 140x70 afin d'y faire passer le bouton poussoir.
é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.
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.
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.