1
2 ///////////////
3 // Petit Bot //
4 ///////////////
5 // Un programme pédagogique des petits débrouillards ?=+ pour gérer le robot "Petit Bot"
6 // Voir sur http://ancien.wikidebrouillard.org/index.php?title=Petit_Bot_un_robot_controlable_en_Wifi
7 // Ce programme est inspire de : http://www.esp8266.com/viewtopic.php?f=29&t=6419#sthash.gd1tJhwU.dpuf
8 // Sous licence CC-By-Sa
9 // Par des gens bien
10
11 /* Schéma
12 Lolin (Wemos) D1 mini
13
14 _________________
15 / D1 mini \
16 |[ ]RST TX[ ]|
17 |[ ]A0 -GPIO RX[ ]|
18 |[ ]D0-16 5-D1[X]|----\
19 |[ ]D5-14 4-D2[X]|--\ \
20 |[ ]D6-12 0-D3[ ]| | |
21 |[ ]D7-13 2-D4[ ]| | |
22 |[ ]D8-15 GND[X]| | |
23 |[ ]3V3 5V[ ]| | |
24 _ | +---+ | | |
25 | | |_______|USB|_______| | / _
26 | | _ / / _ | |
27 | | _| |_________ _____/ / _________| |_ | |
28 | | | ______ |_data D1______________/ |_data D2_| ______ | | |
29 | | __| | SG90 | |_______________GND_______________________| | SG90 | |___ | |
30 | |_| |Servo | |_______________Vin_______________________| |Servo | |_| |
31 | |_| |Gauche| | | |Droit | |_| |
32 | | |__ |______| | | |______| ___| | |
33 | | |__ ________| |_________ __| | |
34 | | |_| |_| | |
35 | | | |
36 |_| |_|
37
38 */
39
40 // on appelle la bibliothèque qui gère le Wemos D1 mini
41 #include <ESP8266WiFi.h>
42
43 // Gestion du Wifi
44 #include <ESP8266WebServer.h>
45 #include <DNSServer.h>
46 #include <ESP8266mDNS.h>
47 #include <WiFiClient.h>
48
49 // Definition du WiFi
50 const char *nomDuReseau = "petitbota"; // Nom du réseau wifi du petit bot
51 const char *motDePasse = ""; // Mot de passe du réseau wifi du petit bot
52 // ATTENTION - le mot de passe doit faire soit 0 caractères soit 8 ou plus sinon
53 // La configuration de votre réseau wifi ne se fera pas (ni mot de passe, ni nom de réseau !).
54 //création du monServeur
55 ESP8266WebServer monServeur(80); // Création de l'objet monServeur
56
57 //Gestion des servomoteurs
58 #include <Servo.h> //appel de la bibliothèque qui gère les servomoteurs
59 // création des servomoteurs
60 Servo servogauche; // Nom du servo qui gère la première roue
61 Servo servodroit; // Seconde roue
62
63 //déclaration des Variables
64 //int --- en cours
65 int val = -1; // Val nous sert à stocker la commande de l'utilisateur (stop, avance, ...).
66
67 void setup(){
68 delay(1000);
69 Serial.begin(9600); // Ouvre une connexion série pour monitorer le fonctionnement du code quand on reste branché a l'ordinateur
70 Serial.println();
71 Serial.println();
72 configDuWifi();
73 servodroit.detach(); // Place les servos hors tension
74 servogauche.detach();
75 pinMode(LED_BUILTIN, OUTPUT); //met la led du Wemos en sortie
76 digitalWrite(LED_BUILTIN, LOW); //met la led du Wemos sur le niveau bas ce qui l'allume.
77 }
78
79 void loop(){
80 val = -1;
81 monServeur.handleClient();
82 }
83
84 ///////////////////////GESTION DES INSTRUCTIONS///////////////////////////
85 void GestionDesClics() {
86 monServeur.on("/avance", HTTP_GET, []() {
87 val = 1;
88 Serial.println("avance");
89 redactionPageWeb();
90 });
91
92 monServeur.on("/recule", HTTP_GET, []() {
93 val = 2;
94 Serial.println("recule");
95 redactionPageWeb();
96 });
97
98 monServeur.on("/gauche", HTTP_GET, []() {
99 val = 4;
100 Serial.println("gauche");
101 redactionPageWeb();
102 });
103
104 monServeur.on("/droite", HTTP_GET, []() {
105 val = 3;
106 Serial.println("droite");
107 redactionPageWeb();
108 });
109
110 monServeur.on("/stop", HTTP_GET, []() {
111 val = 0;
112 Serial.println("stop");
113 redactionPageWeb();
114 });
115
116 monServeur.on("/", HTTP_GET, []() {
117 val = -1;
118 redactionPageWeb();
119 });
120
121 }
122
123 ///////////////////////////LA PAGE WEB DE CONROLE DU PETIT BOT/////////////////////////////////////////
124 void redactionPageWeb(){
125 // Prépare la page web de réponse (le code HTML sera écrit dans la chaine de caractère "pageWeb").
126 String pageWeb = "<!DOCTYPE HTML>\r\n";
127 pageWeb += "<html>\r\n";
128 pageWeb += "<center>"; //On ouvre la balise qui va centrer les boutons
129 pageWeb += "<h1 style=\"font-size:300%;\"\> Le petit bot ";
130 pageWeb += "<style type=\"text/css\"> body { color: #212121; background-color: #CC0C59 } </style>";
131
132 // On finalise l'écriture de la page Web et on donne les instructions aux servos
133 pageWeb += instruction(val); // 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 pageWeb += "<a href=\"/stop\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Stop </button></a>\r\n"; // créer un bouton "Stop", qui envoie sur l'URL /stop
140 pageWeb += "<a href=\"/avance\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Avance </button></a>\r\n"; // créer un bouton "Avance"...
141 pageWeb += "<a href=\"/recule\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Recule </button></a>\r\n";
142 pageWeb += "<a href=\"/droite\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Droite </button></a>\r\n";
143 pageWeb += "<a href=\"/gauche\"\"><button style=\"font-size:200%; width: 18%; background-color:#0CCC16; border-radius: 12px\"\>Gauche </button></a><br />\r\n";
144 pageWeb += "</center>"; // tout est centré sur la page
145 pageWeb += "</html>\n"; //Fin de la page Web
146
147 // On envoie la page web
148 monServeur.send(200, "text/html", pageWeb);
149 delay(1);
150 }
151
152 ///////////////////INSTRUCTIONS/////////////////////////////////////////////////////////
153 String instruction(int valeur){ //Cette fonction traite les instructions qui sont reçues
154 int gauche; // Variable dont la valeur 180 ou 0 fera tourner le servo gauche dans un sens ou l'autre
155 int droite; // Idem pour le servo droit
156 String completePage; // Déclaration de la chaine de caractère qui sera renvoyée par cette fonction pour compléter la page web
157 switch(valeur){ // En fonction de la variable valeur on va donner un ordre aux servos
158 case 0 : // et un texte à la chaine de caractère "completePage"
159 completePage = " est a l’arrêt ";
160 droite = 90;
161 gauche = 90;
162 break;
163 case 1 :
164 completePage = " avance ";
165 droite = 180;
166 gauche = 0;
167 break;
168 case 2 :
169 completePage = " recule ";
170 droite = 0;
171 gauche = 180;
172 break;
173 case 3 :
174 completePage = " tourne a gauche ";
175 droite = 180;
176 gauche = 180;
177 break;
178 case 4 :
179 completePage = " tourne a droite ";
180 droite = 0;
181 gauche = 0;
182 break;
183 // que faire du cas ou val = -1 ? marquer ici ce qui doit être fait.
184 }
185 servogauche.attach(D1); // Broche D1
186 servodroit.attach(D2); // Broche D2
187 servogauche.write(gauche);
188 servodroit.write(droite);
189 return completePage; // on renvoie la chaine de caractère pour compléter la page web
190 }
191 ////////////////////////CONFIGURATION WIFI///////////////////////////////////////////////
192 void configDuWifi(){ // Fonction de configuratio du Wifi
193 WiFi.mode(WIFI_AP); // le wemos est en mode "Point d'Accès" (il déploie un réseau wifi)
194 WiFi.softAP(nomDuReseau, motDePasse, 2); // on démarre le "Point d'Accès".
195 MDNS.begin(nomDuReseau); // gérer les DNS ce qui rendra votre petit bot accessible
196 MDNS.addService("http", "tcp", 80); // via http://nomDuReseau.local
197 IPAddress monIP = WiFi.softAPIP(); // on récupère l'adresse IP du petit Bot
198 Serial.print("Adresse IP de ce Point d'Accès : ");
199 Serial.println(monIP); // on l'écrit sur le moniteur série
200 GestionDesClics();
201 monServeur.begin(); //Démarrage du monServeur
202 Serial.println("Serveur HTTP démarré");
203 return; // on retourne à l'endroit ou la fonction a été appelée.
204 }