Sommaire |
Tutoriel pour construire et un petit robot contrôlable en Wifi.
Il sera contrôlable depuis un ordinateur mais aussi tablette ou smartphone, quelque soit l'appareil.
A imprimer avec une imprimante 3D
Pour imprimer partiellement (moins et ça marche aussi) :
A réaliser dans du carton rigide :
Coller les différentes pièces du petit bot.
1 - l'axe des servomoteurs aux roues (en carton, imprimées en 3D, ou autre...).
2 - Les servomoteurs sont à fixer au châssis (avec du pistolet à colle par exemple.
3 - installez un marqueur à l'avant, ou une roue-bille
/////////////// // Petit Bot // /////////////// // Un programme pedagogique des petits debrouillards ?=+ pour gerer le robot "Petit Bot" // Voir sur http://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 #include <ESP8266WiFi.h> // on appelle la bibliotheque qui gere le WemosD1 mini ////////////////////////// // Definition du WiFi // ////////////////////////// const char WiFiAPPSK[] = "1234567890"; //C'est le mot de passe du wifi "petit bot" ///////////////////////////// // Attribution des broches // ///////////////////////////// #include <Servo.h> //on appelle la bibliotheque qui gere les servomoteurs Servo monservo1; //nom du servo qui gere la premiere roue Servo monservo2; //seconde roue WiFiServer server(80); void setup() { initHardware(); setupWiFi(); server.begin(); monservo1.attach(5); monservo2.attach(4); monservo1.write(91); //pour mettre les servomoteur à l'arret, on leur donne une valeur au milieu entre 0 et 180. monservo2.write(93); } void loop() { // Vérifie si il y a navigateur connecte WiFiClient client = server.available(); if (!client) { return; } // Lit la premiere ligne de la requete String req = client.readStringUntil('\r'); client.flush(); // affecte une valeur a "val" suivant la requete int val = -1; if (req.indexOf("/stop") != -1) val = 0; else if (req.indexOf("/avance") != -1) val = 1; else if (req.indexOf("/recule") != -1) val = 2; else if (req.indexOf("/gauche") != -1) val = 3; else if (req.indexOf("/droite") != -1) val = 4; // Prepare la page web de réponse. on commence par le "header" commun; (le code HTML sera ecrit dans la chaine de carcatere s). String s = "HTTP/1.1 200 OK\r\n"; s += "Content-Type: text/html\r\n\r\n"; s += "<!DOCTYPE HTML>\r\n"; s += "<html>\r\n"; s += "<center>"; s += "<h1 style=\"font-size:300%;\"\> Le petit bot "; // on va finaliser la chaine de caracteres et envoyer les instructions if (val == 2 ) //Recule { s += " recule "; //comme les servomoteurs sont colles un dans un sens et le second dans l'autre sens, il faut leur donner a chacun des instructions inverses. monservo2.write(0); //servo 2 roule vers l'arriere. monservo1.write(180); //servo 1 roule vers l'arriere. } if (val == 1)//Avance { s += " avance "; monservo2.write(180); //vers l'avant. monservo1.write(0); //vers l'avant. } if (val == 0)//stop { s += " est a l'arret "; monservo1.write(91); //stop monservo2.write(93); //stop } if (val == 3)//tourne a gauche { s += " tourne a gauche "; //Pour faire tourner, il suffit qu'une roue tourne dans un sens et la seconde dans le sens inverse monservo1.write(180); //vers l'avant. monservo2.write(180); //vers l'arriere. } if (val == 4)//tourne a droite { s += " tourne a droite "; monservo1.write(0); //vers l'arriere. monservo2.write(0); //vers l'avant. } s += "</h1>"; s += "<br>"; //aller a la ligne s += "<br>"; //aller a la ligne s += "<a href=\"/stop\"\"><button style=\"font-size:200%; width: 18%\"\>Stop </button></a>\r\n";// creer un boutton "Stop" s += "<a href=\"/avance\"\"><button style=\"font-size:200%; width: 18%\"\>Avance </button></a>\r\n"; s += "<a href=\"/recule\"\"><button style=\"font-size:200%; width: 18%\"\>Recule </button></a>\r\n"; s += "<a href=\"/droite\"\"><button style=\"font-size:200%; width: 18%\"\>Droite </button></a>\r\n"; s += "<a href=\"/gauche\"\"><button style=\"font-size:200%; width: 18%\"\>Gauche </button></a><br />\r\n"; s += "</center>"; s += "</html>\n"; //Fin de la page Web // Envoie de la reponse au navigateur client.print(s); delay(1); Serial.println("Client disconnected"); client.flush(); } void setupWiFi() //reglage du reseau wifi emis par le WemosD1 mini { WiFi.mode(WIFI_AP); uint8_t mac[WL_MAC_ADDR_LENGTH]; WiFi.softAPmacAddress(mac); String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) + String(mac[WL_MAC_ADDR_LENGTH - 1], HEX); macID.toUpperCase(); String AP_NameString = "PetitBot"; //nom du reseau char AP_NameChar[AP_NameString.length() + 1]; memset(AP_NameChar, 0, AP_NameString.length() + 1); for (int i = 0; i < AP_NameString.length(); i++) AP_NameChar[i] = AP_NameString.charAt(i); WiFi.softAP(AP_NameChar, WiFiAPPSK, 7); } void initHardware() { Serial.begin(115200); //ouvre une connection serie pour monitorer le fonctionnement du code quand on reste branche a l'ordinateur }
Un autre code, un peu différent :
/////////////// // Petit Bot // /////////////// // Un programme pedagogique des petits debrouillards ?=+ pour gerer le robot "Petit Bot" // Voir sur http://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 #include <ESP8266WiFi.h> // on appelle la bibliotheque qui gere le WemosD1 mini ////////////////////////// // Definition du WiFi // ////////////////////////// const char WiFiAPPSK[] = "1234567890"; //C'est le mot de passe du wifi "petit bot" ///////////////////////////// // Attribution des broches // ///////////////////////////// #include <Servo.h> //on appelle la bibliotheque qui gere les servomoteurs Servo monservo1; //nom du servo qui gere la premiere roue Servo monservo2; //seconde roue WiFiServer server(80); void setup() { initHardware(); setupWiFi(); server.begin(); monservo1.attach(5); monservo2.attach(4); monservo1.write(91); //pour mettre les servomoteur à l'arret, on leur donne une valeur au milieu entre 0 et 180. monservo2.write(93); } void loop() { // Vérifie si il y a navigateur connecte WiFiClient client = server.available(); if (!client) { return; } // Lit la premiere ligne de la requete String req = client.readStringUntil('\r'); client.flush(); // affecte une valeur a "val" suivant la requete int val = -1; if (req.indexOf("/stop") != -1) val = 0; else if (req.indexOf("/avance") != -1) val = 1; else if (req.indexOf("/recule") != -1) val = 2; else if (req.indexOf("/gauche") != -1) val = 3; else if (req.indexOf("/droite") != -1) val = 4; // Prepare la page web de réponse. on commence par le "header" commun; (le code HTML sera ecrit dans la chaine de carcatere s). String s = "HTTP/1.1 200 OK\r\n"; s += "Content-Type: text/html\r\n\r\n"; s += "<!DOCTYPE HTML>\r\n"; s += "<html>\r\n"; s += "<center>"; s += "<h1 style=\"font-size:300%;\"\> Le petit bot "; // on va finaliser la chaine de caracteres et envoyer les instructions if (val !=0 ) { monservo1.attach(5); monservo2.attach(4); } if (val == 2 ) //Recule { s += " recule "; //comme les servomoteurs sont colles un dans un sens et le second dans l'autre sens, il faut leur donner a chacun des instructions inverses. monservo2.write(0); //servo 2 roule vers l'arriere. monservo1.write(180); //servo 1 roule vers l'arriere. } if (val == 1)//Avance { s += " avance "; monservo2.write(180); //vers l'avant. monservo1.write(0); //vers l'avant. } if (val == 0)//stop { s += " est a l'arret "; monservo1.detach(); //stop monservo2.detach(); //stop } if (val == 3)//tourne a gauche { s += " tourne a gauche "; //Pour faire tourner, il suffit qu'une roue tourne dans un sens et la seconde dans le sens inverse //monservo1.write(180); //vers l'avant. monservo1.detach(); monservo2.write(180); //vers l'arriere. } if (val == 4)//tourne a droite { s += " tourne a droite "; monservo1.write(0); //vers l'arriere. monservo2.detach(); //monservo2.write(0); //vers l'avant. } s += "</h1>"; s += "<br>"; //aller a la ligne s += "<br>"; //aller a la ligne s += "<a href=\"/stop\"\"><button style=\"font-size:200%; width: 18%\"\>Stop </button></a>\r\n";// creer un boutton "Stop" s += "<a href=\"/avance\"\"><button style=\"font-size:200%; width: 18%\"\>Avance </button></a>\r\n"; s += "<a href=\"/recule\"\"><button style=\"font-size:200%; width: 18%\"\>Recule </button></a>\r\n"; s += "<a href=\"/droite\"\"><button style=\"font-size:200%; width: 18%\"\>Droite </button></a>\r\n"; s += "<a href=\"/gauche\"\"><button style=\"font-size:200%; width: 18%\"\>Gauche </button></a><br />\r\n"; s += "</center>"; s += "</html>\n"; //Fin de la page Web // Envoie de la reponse au navigateur client.print(s); delay(1); Serial.println("Client disconnected"); client.flush(); } void setupWiFi() //reglage du reseau wifi emis par le WemosD1 mini { WiFi.mode(WIFI_AP); uint8_t mac[WL_MAC_ADDR_LENGTH]; WiFi.softAPmacAddress(mac); String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) + String(mac[WL_MAC_ADDR_LENGTH - 1], HEX); macID.toUpperCase(); String AP_NameString = "PetitBot"; //nom du reseau char AP_NameChar[AP_NameString.length() + 1]; memset(AP_NameChar, 0, AP_NameString.length() + 1); for (int i = 0; i < AP_NameString.length(); i++) AP_NameChar[i] = AP_NameString.charAt(i); WiFi.softAP(AP_NameChar, WiFiAPPSK, 7); } void initHardware() { Serial.begin(115200); //ouvre une connection serie pour monitorer le fonctionnement du code quand on reste branche a l'ordinateur }
Un autre programme avec la led qui s'allume lorsque le petit bot est allumé !
/////////////// // Petit Bot // /////////////// // Un programme pedagogique des petits debrouillards ?=+ pour gerer le robot "Petit Bot" // Voir sur http://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 #include <ESP8266WiFi.h> // on appelle la bibliotheque qui gere le WemosD1 mini ////////////////////////// // Definition du WiFi // ////////////////////////// const char WiFiAPPSK[] = ""; //C'est le mot de passe du wifi "petit bot" String macID; ///////////////////////////// // Attribution des broches // ///////////////////////////// #include <Servo.h> //on appelle la bibliotheque qui gere les servomoteurs Servo monservo1; //nom du servo qui gere la premiere roue Servo monservo2; //seconde roue int ledPin = 2; // assign pin 2 for LED (GPIO2) WiFiServer server(80); void setup() { initHardware(); setupWiFi(); server.begin(); monservo2.detach(); monservo1.detach(); pinMode(LED_BUILTIN, OUTPUT); // pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); } void loop() { // Vérifie si il y a navigateur connecte WiFiClient client = server.available(); if (!client) { return; } // allume la led intgrée (qui devrait rester allumée) digitalWrite(ledPin, LOW); // Lit la premiere ligne de la requete String req = client.readStringUntil('\r'); client.flush(); // affecte une valeur a "val" suivant la requete int val = -1; if (req.indexOf("/stop") != -1) val = 0; else if (req.indexOf("/avance") != -1) val = 1; else if (req.indexOf("/recule") != -1) val = 2; else if (req.indexOf("/gauche") != -1) val = 3; else if (req.indexOf("/droite") != -1) val = 4; // Prepare la page web de réponse. on commence par le "header" commun; (le code HTML sera ecrit dans la chaine de carcatere s). String s = "HTTP/1.1 200 OK\r\n"; s += "Content-Type: text/html\r\n\r\n"; s += "<!DOCTYPE HTML>\r\n"; s += "<html>\r\n"; s += "<center>"; s += "<h1 style=\"font-size:300%;\"\> Le petit bot "; // on va finaliser la chaine de caracteres et envoyer les instructions if (val !=0 ) { monservo1.attach(5); monservo2.attach(4); } if (val == 2 ) //Recule { s += " recule "; //comme les servomoteurs sont colles un dans un sens et le second dans l'autre sens, il faut leur donner a chacun des instructions inverses. monservo2.write(0); //servo 2 roule vers l'arriere. monservo1.write(180); //servo 1 roule vers l'arriere. } if (val == 1)//Avance { s += " avance "; monservo2.write(180); //vers l'avant. monservo1.write(0); //vers l'avant. } if (val == 0)//stop { s += " est a l'arret "; monservo1.detach(); //stop monservo2.detach(); //stop } if (val == 3)//tourne a gauche { s += " tourne a gauche "; //Pour faire tourner, il suffit qu'une roue tourne dans un sens et la seconde dans le sens inverse monservo1.write(180); monservo2.write(180); //vers l'arriere. } if (val == 4)//tourne a droite { s += " tourne a droite "; monservo1.write(0); //vers l'arriere. monservo2.write(0); } s += "</h1>"; s += "<br>"; //aller a la ligne s += "<br>"; //aller a la ligne s += "<a href=\"/stop\"\"><button style=\"font-size:200%; width: 18%\"\>Stop </button></a>\r\n";// creer un boutton "Stop" s += "<a href=\"/avance\"\"><button style=\"font-size:200%; width: 18%\"\>Avance </button></a>\r\n"; s += "<a href=\"/recule\"\"><button style=\"font-size:200%; width: 18%\"\>Recule </button></a>\r\n"; s += "<a href=\"/droite\"\"><button style=\"font-size:200%; width: 18%\"\>Droite </button></a>\r\n"; s += "<a href=\"/gauche\"\"><button style=\"font-size:200%; width: 18%\"\>Gauche </button></a><br />\r\n"; s += "</center>"; s += "</html>\n"; //Fin de la page Web // Envoie de la reponse au navigateur client.print(s); delay(1); Serial.println("Client disconnected"); uint8_t macAddr[6]; WiFi.macAddress(macAddr); Serial.printf("Connected, mac address: %02x:%02x:%02x:%02x:%02x:%02x\n", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]); client.flush(); } void setupWiFi() //reglage du reseau wifi emis par le WemosD1 mini { WiFi.mode(WIFI_AP); uint8_t mac[WL_MAC_ADDR_LENGTH]; WiFi.softAPmacAddress(mac); String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) + String(mac[WL_MAC_ADDR_LENGTH - 1], HEX); macID.toUpperCase(); String AP_NameString = "petitbot-emmeline"; //nom du reseau char AP_NameChar[AP_NameString.length() + 1]; memset(AP_NameChar, 0, AP_NameString.length() + 1); for (int i = 0; i < AP_NameString.length(); i++) AP_NameChar[i] = AP_NameString.charAt(i); WiFi.softAP(AP_NameChar, WiFiAPPSK, 7); } void initHardware() { Serial.begin(115200); //ouvre une connection serie pour monitorer le fonctionnement du code quand on reste branche a l'ordinateur }
Voir la Catégorie
C'est sur le site "Let's make robots" qu'il a été décrit initialement : http://robotshop.com/letsmakerobots/node/48201
On le trouve également sur le super site Libreduc
le wifi peut être utilisé pour diverses applications, ici, contrôler un robot.
Fablab, dans l'atelier de bidouille électronique le plus proche ?
© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique