ENIB 2025 :Tassive Mits : Différence entre versions
(→Troubleshooting) |
(→Code Arduino) |
||
Ligne 66 : | Ligne 66 : | ||
===Code Arduino=== | ===Code Arduino=== | ||
<syntaxhighlight lang="Arduino" line> | <syntaxhighlight lang="Arduino" line> | ||
− | + | /////////////// | |
− | # | + | // Petit Bot // |
+ | /////////////// | ||
+ | // MAJ 250121 | ||
+ | // Un programme pédagogique des petits débrouillards ?=+ pour gérer le robot "Petit Bot" | ||
+ | // Voir sur http://ancien.wikidebrouillard.org/index.php?title=Petit_Bot_un_robot_controlable_en_Wifi | ||
+ | // Ce programme est inspire de : http://www.esp8266.com/viewtopic.php?f=29&t=6419#sthash.gd1tJhwU.dpuf | ||
+ | // Sous licence CC-By-Sa | ||
+ | // Par des gens bien | ||
− | + | /* Schéma | |
− | // | + | Lolin (Wemos) D1 mini |
+ | |||
+ | _________________ | ||
+ | / D1 mini \ | ||
+ | |[ ]RST TX[ ]| | ||
+ | |[ ]A0 -GPIO RX[ ]| | ||
+ | |[ ]D0-16 5-D1[X]|----\ | ||
+ | |[ ]D5-14 4-D2[X]|--\ \ | ||
+ | |[ ]D6-12 0-D3[ ]| | | | ||
+ | |[ ]D7-13 2-D4[ ]| | | | ||
+ | |[ ]D8-15 GND[X]| | | | ||
+ | |[ ]3V3 5V[ ]| | | | ||
+ | _ | +---+ | | | | ||
+ | | | |_______|USB|_______| | / _ | ||
+ | | | _ / / _ | | | ||
+ | | | _| |_________ _____/ / _________| |_ | | | ||
+ | | | | ______ |_data D1______________/ |_data D2_| ______ | | | | ||
+ | | | __| | SG90 | |_______________GND_______________________| | SG90 | |___ | | | ||
+ | | |_| |Servo | |_______________Vin_______________________| |Servo | |_| | | ||
+ | | |_| |Gauche| | | |Droit | |_| | | ||
+ | | | |__ |______| | | |______| ___| | | | ||
+ | | | |__ ________| |_________ __| | | | ||
+ | | | |_| |_| | | | ||
+ | | | | | | ||
+ | |_| |_| | ||
+ | |||
+ | ___ | ||
+ | / ___ \ | ||
+ | |_| | | | ||
+ | /_/ | ||
+ | _ ___ _ | ||
+ | |_| |___|_| |_ | ||
+ | ___|_ _| | ||
+ | |___| |_| | ||
+ | Les petits Débrouillards - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/ | ||
+ | Antony Le Goïc-Auffret janvier 2025 | ||
+ | */ | ||
+ | // on appelle la bibliothèque qui gère le Wemos D1 mini | ||
+ | #include <ESP8266WiFi.h> | ||
+ | |||
+ | // Gestion du Wifi | ||
+ | #include <ESP8266WebServer.h> | ||
+ | #include <DNSServer.h> | ||
+ | #include <ESP8266mDNS.h> | ||
+ | #include <WiFiClient.h> | ||
+ | |||
+ | // Definition du WiFi | ||
+ | const char *nomDuReseau = "kill_me"; // Nom du réseau wifi du petit bot | ||
+ | const char *motDePasse = ""; // Mot de passe du réseau wifi du petit bot | ||
+ | // ATTENTION - le mot de passe doit faire soit 0 caractères soit 8 ou plus sinon | ||
+ | // La configuration de votre réseau wifi ne se fera pas (ni mot de passe, ni nom de réseau !). | ||
+ | //création du monServeur | ||
+ | ESP8266WebServer monServeur(80); // Création de l'objet monServeur | ||
+ | |||
+ | //Gestion des servomoteurs | ||
+ | #include <Servo.h> //appel de la bibliothèque qui gère les servomoteurs | ||
+ | |||
+ | // création des servomoteurs | ||
+ | Servo servo1; // Nom du servo qui gère la première roue | ||
+ | Servo servo2; // Seconde roue | ||
+ | |||
+ | //déclaration des Variables | ||
+ | int val = -1; // Val nous sert à stocker la commande de l'utilisateur (stop, avance, ...). | ||
+ | int curseurValue = 20; | ||
+ | |||
+ | void setup(){ | ||
+ | delay(1000); | ||
+ | Serial.begin(115200); // Ouvre une connexion série pour monitorer le fonctionnement du code quand on reste branché a l'ordinateur | ||
+ | Serial.println(); | ||
+ | Serial.println(); | ||
+ | configDuWifi(); | ||
+ | servo1.detach(); // Place les servos hors tension | ||
+ | servo2.detach(); | ||
+ | pinMode(LED_BUILTIN, OUTPUT); //met la led du Wemos en sortie | ||
+ | digitalWrite(LED_BUILTIN, LOW); //met la led du Wemos sur le niveau bas ce qui l'allume. | ||
+ | |||
+ | servo1.attach(D1); | ||
+ | servo2.attach(D2); | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | val = -1; | ||
+ | monServeur.handleClient(); | ||
+ | } | ||
+ | |||
+ | ///////////////////////GESTION DES INSTRUCTIONS/////////////////////////// | ||
+ | void GestionDesClics() { | ||
+ | monServeur.on("/verser", HTTP_GET, []() { | ||
+ | val = 1; | ||
+ | Serial.println("verser"); | ||
+ | redactionPageWeb(); | ||
+ | }); | ||
+ | |||
+ | monServeur.on("/", HTTP_GET, []() { | ||
+ | val = -1; | ||
+ | if (monServeur.hasArg("curseur")) { | ||
+ | curseurValue = monServeur.arg("curseur").toInt(); | ||
+ | Serial.println(curseurValue); | ||
+ | } | ||
+ | redactionPageWeb(); | ||
+ | }); | ||
+ | |||
+ | } | ||
+ | |||
+ | ///////////////////////////LA PAGE WEB DE CONROLE DU PETIT BOT///////////////////////////////////////// | ||
+ | void redactionPageWeb(){ | ||
+ | // Prépare la page web de réponse (le code HTML sera écrit dans la chaine de caractère "pageWeb"). | ||
+ | String pageWeb = "<!DOCTYPE HTML>\r\n"; | ||
+ | pageWeb += "<html>\r\n"; | ||
+ | pageWeb += "<head>\r\n"; | ||
+ | pageWeb += "<meta charset=\"utf-8\">\r\n"; | ||
+ | pageWeb += "<title>Petit bot</title>\r\n"; | ||
+ | pageWeb += "</head>\r\n"; | ||
+ | pageWeb += "<body>\r\n"; | ||
+ | pageWeb += "<center>"; //On ouvre la balise qui va centrer les boutons | ||
+ | pageWeb += "<h1 style=\"font-size:300%;\"\> La Tassive Mits Machine "; | ||
+ | pageWeb += "<style type=\"text/css\"> body { color: #212121; background-color: #FFFFFF } </style>"; | ||
+ | |||
+ | // On finalise l'écriture de la page Web et on donne les instructions aux servos | ||
+ | instruction(val, curseurValue); // pour cela on appelle la fonction "instruction" | ||
+ | |||
+ | // On termine l'écriture de la page Web | ||
+ | pageWeb += "</h1>"; | ||
+ | pageWeb += "<br>"; //aller à la ligne | ||
+ | pageWeb += "<br>"; //aller à la ligne | ||
+ | |||
+ | //curseur | ||
+ | pageWeb += "<form action=\"/\" method=\"get\">\r\n"; // Formulaire pour envoyer la valeur | ||
+ | pageWeb += "rapport dilué/quantité totale en % : <input type=\"range\" name=\"curseur\" min=\"0\" max=\"100\" value=\"" + String(curseurValue) + "\">\r\n"; | ||
+ | pageWeb += "<input type=\"submit\" value=\"Envoyer\">\r\n"; | ||
+ | pageWeb += "</form>\r\n"; | ||
+ | |||
+ | pageWeb += "<br><br>"; | ||
+ | pageWeb += "<a href=\"/verser\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Verser </button></a>\r\n"; // créer un bouton "Stop", qui envoie sur l'URL /stop | ||
+ | pageWeb += "</center>"; // tout est centré sur la page | ||
+ | pageWeb += "</body>\r\n"; | ||
+ | pageWeb += "</html>\n"; //Fin de la page Web | ||
+ | |||
+ | // On envoie la page web | ||
+ | monServeur.send(200, "text/html", pageWeb); | ||
+ | delay(1); | ||
} | } | ||
− | void | + | ///////////////////INSTRUCTIONS///////////////////////////////////////////////////////// |
− | // | + | void instruction(int valeur, int curseurValue){ //Cette fonction traite les instructions qui sont reçues |
+ | if (valeur == 1){ | ||
+ | Serial.println(curseurValue); | ||
+ | Serial.println(2000*curseurValue / 100); | ||
+ | Serial.println(2000*(100-curseurValue) / 100); | ||
+ | Serial.println("pouring..."); //////////////////////// | ||
+ | servo1.write(0); | ||
+ | delay(1000); | ||
+ | servo1.write(90); | ||
+ | delay(2000*curseurValue / 100); | ||
+ | servo1.write(180); | ||
+ | delay(1000); | ||
+ | servo1.write(90); | ||
+ | delay(1000); | ||
+ | servo2.write(0); | ||
+ | delay(1000); | ||
+ | servo2.write(90); | ||
+ | delay(2000*(100-curseurValue) / 100); | ||
+ | servo2.write(180); | ||
+ | delay(1000); | ||
+ | servo2.write(90); | ||
+ | delay(1000); | ||
+ | Serial.println("done pouring, enjoy ! \n"); | ||
+ | } | ||
+ | } | ||
+ | ////////////////////////CONFIGURATION WIFI/////////////////////////////////////////////// | ||
+ | void configDuWifi(){ // Fonction de configuratio du Wifi | ||
+ | WiFi.mode(WIFI_AP); // le wemos est en mode "Point d'Accès" (il déploie un réseau wifi) | ||
+ | WiFi.softAP(nomDuReseau, motDePasse, 2); // on démarre le "Point d'Accès". | ||
+ | MDNS.begin(nomDuReseau); // gérer les DNS ce qui rendra votre petit bot accessible | ||
+ | MDNS.addService("http", "tcp", 80); // via http://nomDuReseau.local | ||
+ | IPAddress monIP = WiFi.softAPIP(); // on récupère l'adresse IP du petit Bot | ||
+ | Serial.print("Adresse IP de ce Point d'Accès : "); | ||
+ | Serial.println(monIP); // on l'écrit sur le moniteur série | ||
+ | GestionDesClics(); | ||
+ | monServeur.begin(); //Démarrage du monServeur | ||
+ | Serial.println("Serveur HTTP démarré"); | ||
+ | return; // on retourne à l'endroit ou la fonction a été appelée. | ||
} | } | ||
Version du 23 janvier 2025 à 16:26
Titre de la fiche expérience :
Sommaire
Description
Tassive Mits est un dispositif innovant qui permet de verser dans un verre deux liquides préalablement sélectionnés, avec des doses précisément ajustées selon les besoins. Grâce à son système de dosage automatisé, il garantit une précision optimale et une expérience utilisateur fluide.
Introduction
Base du projet
Nous sommes partis du matériel disponible pour le petit robot et avons imaginez un prototype présent sur le papier ci-dessus.
Prototype
Outil et matériel
**Quantité** | **Matériel/Outil** |
---|---|
2 | Servomoteur à rotation continue |
1 | ESP8266 |
1 | Shield pour servomoteur Petit débrouillard |
1 | Batterie externe pour l'alimentation |
1 | Câble USB-A vers USB-B mini |
3 | Bouteilles de taille similaire |
2 | Support à bouteilles |
1 ou plus | Grand tube (selon la taille requise) |
* | Clous |
* | Vis |
1 ou plus | Carton, bois, ... |
1 | Scotch |
1 | Pistolet à colle |
Fichiers à joindre
Code Arduino
1
2 ///////////////
3 // Petit Bot //
4 ///////////////
5 // MAJ 250121
6 // Un programme pédagogique des petits débrouillards ?=+ pour gérer le robot "Petit Bot"
7 // Voir sur http://ancien.wikidebrouillard.org/index.php?title=Petit_Bot_un_robot_controlable_en_Wifi
8 // Ce programme est inspire de : http://www.esp8266.com/viewtopic.php?f=29&t=6419#sthash.gd1tJhwU.dpuf
9 // Sous licence CC-By-Sa
10 // Par des gens bien
11
12 /* Schéma
13 Lolin (Wemos) D1 mini
14
15 _________________
16 / D1 mini \
17 |[ ]RST TX[ ]|
18 |[ ]A0 -GPIO RX[ ]|
19 |[ ]D0-16 5-D1[X]|----\
20 |[ ]D5-14 4-D2[X]|--\ \
21 |[ ]D6-12 0-D3[ ]| | |
22 |[ ]D7-13 2-D4[ ]| | |
23 |[ ]D8-15 GND[X]| | |
24 |[ ]3V3 5V[ ]| | |
25 _ | +---+ | | |
26 | | |_______|USB|_______| | / _
27 | | _ / / _ | |
28 | | _| |_________ _____/ / _________| |_ | |
29 | | | ______ |_data D1______________/ |_data D2_| ______ | | |
30 | | __| | SG90 | |_______________GND_______________________| | SG90 | |___ | |
31 | |_| |Servo | |_______________Vin_______________________| |Servo | |_| |
32 | |_| |Gauche| | | |Droit | |_| |
33 | | |__ |______| | | |______| ___| | |
34 | | |__ ________| |_________ __| | |
35 | | |_| |_| | |
36 | | | |
37 |_| |_|
38
39 ___
40 / ___ \
41 |_| | |
42 /_/
43 _ ___ _
44 |_| |___|_| |_
45 ___|_ _|
46 |___| |_|
47 Les petits Débrouillards - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/
48 Antony Le Goïc-Auffret janvier 2025
49 */
50
51 // on appelle la bibliothèque qui gère le Wemos D1 mini
52 #include <ESP8266WiFi.h>
53
54 // Gestion du Wifi
55 #include <ESP8266WebServer.h>
56 #include <DNSServer.h>
57 #include <ESP8266mDNS.h>
58 #include <WiFiClient.h>
59
60 // Definition du WiFi
61 const char *nomDuReseau = "kill_me"; // Nom du réseau wifi du petit bot
62 const char *motDePasse = ""; // Mot de passe du réseau wifi du petit bot
63 // ATTENTION - le mot de passe doit faire soit 0 caractères soit 8 ou plus sinon
64 // La configuration de votre réseau wifi ne se fera pas (ni mot de passe, ni nom de réseau !).
65 //création du monServeur
66 ESP8266WebServer monServeur(80); // Création de l'objet monServeur
67
68 //Gestion des servomoteurs
69 #include <Servo.h> //appel de la bibliothèque qui gère les servomoteurs
70
71 // création des servomoteurs
72 Servo servo1; // Nom du servo qui gère la première roue
73 Servo servo2; // Seconde roue
74
75 //déclaration des Variables
76 int val = -1; // Val nous sert à stocker la commande de l'utilisateur (stop, avance, ...).
77 int curseurValue = 20;
78
79 void setup(){
80 delay(1000);
81 Serial.begin(115200); // Ouvre une connexion série pour monitorer le fonctionnement du code quand on reste branché a l'ordinateur
82 Serial.println();
83 Serial.println();
84 configDuWifi();
85 servo1.detach(); // Place les servos hors tension
86 servo2.detach();
87 pinMode(LED_BUILTIN, OUTPUT); //met la led du Wemos en sortie
88 digitalWrite(LED_BUILTIN, LOW); //met la led du Wemos sur le niveau bas ce qui l'allume.
89
90 servo1.attach(D1);
91 servo2.attach(D2);
92 }
93
94 void loop(){
95 val = -1;
96 monServeur.handleClient();
97 }
98
99 ///////////////////////GESTION DES INSTRUCTIONS///////////////////////////
100 void GestionDesClics() {
101 monServeur.on("/verser", HTTP_GET, []() {
102 val = 1;
103 Serial.println("verser");
104 redactionPageWeb();
105 });
106
107 monServeur.on("/", HTTP_GET, []() {
108 val = -1;
109 if (monServeur.hasArg("curseur")) {
110 curseurValue = monServeur.arg("curseur").toInt();
111 Serial.println(curseurValue);
112 }
113 redactionPageWeb();
114 });
115
116 }
117
118 ///////////////////////////LA PAGE WEB DE CONROLE DU PETIT BOT/////////////////////////////////////////
119 void redactionPageWeb(){
120 // Prépare la page web de réponse (le code HTML sera écrit dans la chaine de caractère "pageWeb").
121 String pageWeb = "<!DOCTYPE HTML>\r\n";
122 pageWeb += "<html>\r\n";
123 pageWeb += "<head>\r\n";
124 pageWeb += "<meta charset=\"utf-8\">\r\n";
125 pageWeb += "<title>Petit bot</title>\r\n";
126 pageWeb += "</head>\r\n";
127 pageWeb += "<body>\r\n";
128 pageWeb += "<center>"; //On ouvre la balise qui va centrer les boutons
129 pageWeb += "<h1 style=\"font-size:300%;\"\> La Tassive Mits Machine ";
130 pageWeb += "<style type=\"text/css\"> body { color: #212121; background-color: #FFFFFF } </style>";
131
132 // On finalise l'écriture de la page Web et on donne les instructions aux servos
133 instruction(val, curseurValue); // pour cela on appelle la fonction "instruction"
134
135 // On termine l'écriture de la page Web
136 pageWeb += "</h1>";
137 pageWeb += "<br>"; //aller à la ligne
138 pageWeb += "<br>"; //aller à la ligne
139
140 //curseur
141 pageWeb += "<form action=\"/\" method=\"get\">\r\n"; // Formulaire pour envoyer la valeur
142 pageWeb += "rapport dilué/quantité totale en % : <input type=\"range\" name=\"curseur\" min=\"0\" max=\"100\" value=\"" + String(curseurValue) + "\">\r\n";
143 pageWeb += "<input type=\"submit\" value=\"Envoyer\">\r\n";
144 pageWeb += "</form>\r\n";
145
146 pageWeb += "<br><br>";
147 pageWeb += "<a href=\"/verser\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Verser </button></a>\r\n"; // créer un bouton "Stop", qui envoie sur l'URL /stop
148 pageWeb += "</center>"; // tout est centré sur la page
149 pageWeb += "</body>\r\n";
150 pageWeb += "</html>\n"; //Fin de la page Web
151
152 // On envoie la page web
153 monServeur.send(200, "text/html", pageWeb);
154 delay(1);
155 }
156
157 ///////////////////INSTRUCTIONS/////////////////////////////////////////////////////////
158 void instruction(int valeur, int curseurValue){ //Cette fonction traite les instructions qui sont reçues
159 if (valeur == 1){
160 Serial.println(curseurValue);
161 Serial.println(2000*curseurValue / 100);
162 Serial.println(2000*(100-curseurValue) / 100);
163 Serial.println("pouring..."); ////////////////////////
164 servo1.write(0);
165 delay(1000);
166 servo1.write(90);
167 delay(2000*curseurValue / 100);
168 servo1.write(180);
169 delay(1000);
170 servo1.write(90);
171 delay(1000);
172
173 servo2.write(0);
174 delay(1000);
175 servo2.write(90);
176 delay(2000*(100-curseurValue) / 100);
177 servo2.write(180);
178 delay(1000);
179 servo2.write(90);
180 delay(1000);
181 Serial.println("done pouring, enjoy ! \n");
182 }
183 }
184 ////////////////////////CONFIGURATION WIFI///////////////////////////////////////////////
185 void configDuWifi(){ // Fonction de configuratio du Wifi
186 WiFi.mode(WIFI_AP); // le wemos est en mode "Point d'Accès" (il déploie un réseau wifi)
187 WiFi.softAP(nomDuReseau, motDePasse, 2); // on démarre le "Point d'Accès".
188 MDNS.begin(nomDuReseau); // gérer les DNS ce qui rendra votre petit bot accessible
189 MDNS.addService("http", "tcp", 80); // via http://nomDuReseau.local
190 IPAddress monIP = WiFi.softAPIP(); // on récupère l'adresse IP du petit Bot
191 Serial.print("Adresse IP de ce Point d'Accès : ");
192 Serial.println(monIP); // on l'écrit sur le moniteur série
193 GestionDesClics();
194 monServeur.begin(); //Démarrage du monServeur
195 Serial.println("Serveur HTTP démarré");
196 return; // on retourne à l'endroit ou la fonction a été appelée.
197 }
Étapes de fabrication
Cette section décrit les différentes étapes nécessaires pour assembler et faire fonctionner le dispositif. Chaque étape est illustrée par des images pour faciliter la compréhension.
Étape 1 : Préparation des matériaux
1. Rassemblez les éléments listés dans la section "Outil et matériel".
2. Vérifiez que tous les composants fonctionnent :
- Testez rapidement les servomoteurs pour vérifier qu’ils tournent. - Assurez-vous que l’ESP8266 s’allume et est détecté par votre ordinateur.
3. Préparez un espace de travail propre et dégagé :
- Éliminez tout ce qui pourrait gêner. - Assurez-vous d’avoir suffisamment de lumière et de place pour manipuler les outils.
Étape 2 : Assemblage de la structure
1. Assemblez les plaques en carton ou bois pour créer la base du dispositif.
2. Fixez les supports à bouteilles avec des clous ou des vis.
3. Placez les bouteilles sur leurs supports pour vérifier l’équilibre.
Étape 3 : Installation des servomoteurs
1. Fixez les servomoteurs sur la structure à l’aide de vis ou d’un adhésif solide ou de ficelle.
2. Reliez les servomoteurs au shield "Petit débrouillard".
3. Vérifiez que les servomoteurs peuvent tourner librement sans frottement.
Étape 4 : Branchement de l'ESP8266 et alimentation
1. Connectez l’ESP8266 au shield avec les câbles appropriés.
- Vérifiez que les connexions sont solides et qu’il n’y a pas de court-circuit.
2. Branchez la batterie externe pour alimenter le système.
- Assurez-vous que la batterie est chargée.
3. Effectuez un test d’alimentation pour vérifier que tout fonctionne correctement.
Étape 5 : Calibration et tests
1. Calibrez les servomoteurs :
- Testez leur vitesse de rotation et leur direction. - Ajustez dans le code si nécessaire pour qu’ils fonctionnent de manière synchronisée.
2. Ajoutez les tubes ou autres éléments mécaniques nécessaires.
- Assurez-vous qu’ils sont bien fixés et qu’ils ne bloquent pas les servomoteurs.
3. Testez le système complet pour valider son bon fonctionnement.
- Simulez un cycle complet pour repérer les éventuels problèmes.
Étape 6 : Sécurisation et finalisation (Optionnel)
1. Fixez tous les composants solidement pour éviter qu’ils ne se détachent.
- Ajoutez de la colle ou du ruban adhésif si nécessaire.
2. Nettoyez les câblages pour éviter tout problème.
- Utilisez des colliers de serrage ou des guides pour organiser les fils.
3. Ajoutez un boîtier ou une protection si possible.
- Cela protégera les composants et donnera un aspect plus professionnel.
Troubleshooting
Cette section fournit des solutions aux problèmes courants que vous pourriez rencontrer lors de l’assemblage ou de l’utilisation du dispositif.
- Problème : Le servomoteur ne tourne pas.
- Solution : Vérifiez les connexions entre le servomoteur, le shield et l’alimentation. Assurez-vous que l’ESP8266 est bien programmé.
- Problème : Les bouteilles tombent de leurs supports.
- Solution : Ajustez les supports pour mieux maintenir les bouteilles ou utilisez un adhésif léger pour les stabiliser.
- Problème : Le dispositif n’est pas stable.
- Solution : Ajoutez du poids à la base ou élargissez les supports pour améliorer l’équilibre.
- Problème : Problème d'étanchéité.
- Solution : Vérifier s'il n'y a pas de trou puis sinon même à grosse dose essayer avec scotch, colle ou autre jusqu'à que ça soit hermétique
- Astuce : Simplifiez le câblage.
- Truc : Utilisez des connecteurs rapides ou des guides pour éviter que les fils ne s’emmêlent.