Mortal robot : Différence entre versions
(→Membres de l'équipe) |
(→Code Robot) |
||
| Ligne 41 : | Ligne 41 : | ||
==Code Robot== | ==Code Robot== | ||
| + | ////////////////// | ||
| + | // Mortal Robot // | ||
| + | ////////////////// | ||
| + | |||
| + | // Ce programme est inspire de : http://www.esp8266.com/viewtopic.php?f=29&t=6419#sthash.gd1tJhwU.dpuf, http://wikidebrouillard.org/index.php?title=Petit_Bot_un_robot_controlable_en_Wifi | ||
| + | // Sous licence CC-By-Sa | ||
| + | // Par des gens bien | ||
| + | |||
| + | // 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 = "mortalRobot"; // Nom du réseau wifi | ||
| + | const char *motDePasse = ""; // Mot de passe du réseau wifi | ||
| + | // 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 | ||
| + | |||
| + | //déclaration des Variables | ||
| + | //int --- en cours | ||
| + | int val = -1; // Val nous sert à stocker la commande de l'utilisateur (stop, avance, ...). | ||
| + | int life = 3; //point de vie du robot | ||
| + | bool shoot = false; | ||
| + | long shootStartTime = 0;; | ||
| + | long shootDuration = 2000; | ||
| + | int light = 0; | ||
| + | int prevLight = 0; | ||
| + | |||
| + | void setup() { | ||
| + | delay(1000); | ||
| + | Serial.begin(9600); // Ouvre une connexion série pour monitorer le fonctionnement du code quand on reste branché a l'ordinateur | ||
| + | Serial.println(); | ||
| + | Serial.println(); | ||
| + | configDuWifi(); | ||
| + | pinMode(D0, OUTPUT); | ||
| + | pinMode(D1, OUTPUT); | ||
| + | pinMode(D2, OUTPUT); | ||
| + | pinMode(D3, OUTPUT); | ||
| + | pinMode(D4, OUTPUT); | ||
| + | pinMode(D5, OUTPUT); | ||
| + | pinMode(D6, OUTPUT); | ||
| + | pinMode(D7, OUTPUT); | ||
| + | pinMode(D8, OUTPUT); | ||
| + | //Moteur à l'arrêt | ||
| + | // analogWrite(D6, LOW); | ||
| + | // analogWrite(D7, LOW); | ||
| + | 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. | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | val = -1; | ||
| + | monServeur.handleClient(); | ||
| + | // lifeManage(); | ||
| + | shootManage(); | ||
| + | light = analogRead(A0); | ||
| + | digitalWrite(D0, (light > prevLight+40)); | ||
| + | prevLight = light; | ||
| + | Serial.println(analogRead(A0)); | ||
| + | // digitalWrite(D0,analogRead(A0)); | ||
| + | } | ||
| + | |||
| + | void shootManage() | ||
| + | { | ||
| + | if (shoot) | ||
| + | { | ||
| + | if ((millis() - shootStartTime) > shootDuration) { | ||
| + | digitalWrite(D8, false); | ||
| + | shoot = false; | ||
| + | } else { | ||
| + | digitalWrite(D8, true); | ||
| + | |||
| + | } | ||
| + | } else | ||
| + | { | ||
| + | digitalWrite(D8, false); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | bool isShoot() | ||
| + | { | ||
| + | // Serial.println("slt"); | ||
| + | // Serial.println(analogRead(A0)); | ||
| + | return (analogRead(A0) > 800); | ||
| + | } | ||
| + | |||
| + | void lifeManage() //gere les points de vie et l'affichage | ||
| + | { | ||
| + | if (isShoot()) | ||
| + | { | ||
| + | life--; | ||
| + | } | ||
| + | switch (life) { | ||
| + | case (3) : | ||
| + | digitalWrite(D0, true); | ||
| + | digitalWrite(D5, false); | ||
| + | break; | ||
| + | case (2) : | ||
| + | analogWrite(D0, 135); | ||
| + | digitalWrite(D5, false); | ||
| + | break; | ||
| + | case (1) : | ||
| + | analogWrite(D0, 90); | ||
| + | digitalWrite(D5, false); | ||
| + | break; | ||
| + | case (0) : | ||
| + | digitalWrite(D0, false); | ||
| + | digitalWrite(D5, true); | ||
| + | break; | ||
| + | case (5) : //shoot | ||
| + | Serial.println("shoot"); | ||
| + | shoot = true; | ||
| + | shootStartTime = millis(); | ||
| + | break; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | ///////////////////////GESTION DES INSTRUCTIONS/////////////////////////// | ||
| + | void GestionDesClics() { | ||
| + | monServeur.on("/avance", HTTP_GET, []() { | ||
| + | val = 1; | ||
| + | Serial.println("avance"); | ||
| + | redactionPageWeb(); | ||
| + | }); | ||
| + | |||
| + | monServeur.on("/recule", HTTP_GET, []() { | ||
| + | val = 2; | ||
| + | Serial.println("recule"); | ||
| + | redactionPageWeb(); | ||
| + | }); | ||
| + | |||
| + | monServeur.on("/droite", HTTP_GET, []() { | ||
| + | val = 4; | ||
| + | Serial.println("droite"); | ||
| + | redactionPageWeb(); | ||
| + | }); | ||
| + | |||
| + | monServeur.on("/gauche", HTTP_GET, []() { | ||
| + | val = 3; | ||
| + | Serial.println("gauche"); | ||
| + | redactionPageWeb(); | ||
| + | }); | ||
| + | |||
| + | monServeur.on("/stop", HTTP_GET, []() { | ||
| + | val = 0; | ||
| + | Serial.println("stop"); | ||
| + | redactionPageWeb(); | ||
| + | }); | ||
| + | |||
| + | monServeur.on("/shoot", HTTP_GET, []() { | ||
| + | val = 5; | ||
| + | Serial.println("shoot"); | ||
| + | redactionPageWeb(); | ||
| + | }); | ||
| + | |||
| + | monServeur.on("/", HTTP_GET, []() { | ||
| + | val = -1; | ||
| + | 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 += "<center>"; //On ouvre la balise qui va centrer les boutons | ||
| + | pageWeb += "<style type=\"text/css\"> body { color: #212121; background-color: #F08D29 } </style>"; | ||
| + | instruction(val); // pour cela on appelle la fonction "instruction" | ||
| + | |||
| + | // On termine l'écriture de la page Web | ||
| + | pageWeb += "<br>"; //aller à la ligne | ||
| + | pageWeb += "<br>"; //aller à la ligne | ||
| + | pageWeb += "<a href=\"/avance\"\"><button style=\"font-size:200%; width: 45%; height:20%; background-color:#6B6764;\"\>Avance </button></a></br>\r\n"; // créer un bouton "Avance"... | ||
| + | pageWeb += "<a href=\"/gauche\"\"><button style=\"font-size:200%; width: 45%; background-color:#6B6764;\"\>Gauche </button></a>\r\n"; | ||
| + | pageWeb += "<a href=\"/droite\"\"><button style=\"font-size:200%; width: 45%; background-color:#6B6764;\"\>Droite </button></a></br>\r\n"; | ||
| + | pageWeb += "<a href=\"/recule\"\"><button style=\"font-size:200%; width: 45%; background-color:#6B6764;\"\>Recule </button></a></br></br>\r\n"; | ||
| + | pageWeb += "<a href=\"/stop\"\"><button style=\"font-size:200%; width: 45%; background-color:#6B6764;\"\>Stop </button></a></br>\r\n"; // créer un bouton "Stop", qui envoie sur l'URL /stop | ||
| + | pageWeb += "<a href=\"/shoot\"\"><button style=\"font-size:200%; width: 45%; background-color:#6B6764;\"\>Shoot </button></a></br>\r\n"; | ||
| + | pageWeb += "</center>"; // tout est centré sur la page | ||
| + | pageWeb += "</html>\n"; //Fin de la page Web | ||
| + | |||
| + | // On envoie la page web | ||
| + | monServeur.send(200, "text/html", pageWeb); | ||
| + | delay(1); | ||
| + | } | ||
| + | |||
| + | ///////////////////INSTRUCTIONS///////////////////////////////////////////////////////// | ||
| + | void instruction(int valeur) { //Cette fonction traite les instructions qui sont reçues | ||
| + | switch (valeur) { // En fonction de la variable valeur on va donner un ordre aux servos | ||
| + | case 0 : //stop | ||
| + | digitalWrite(D1, false); | ||
| + | digitalWrite(D2, false); | ||
| + | digitalWrite(D3, false); | ||
| + | digitalWrite(D4, false); | ||
| + | break; | ||
| + | case 1 : //avance | ||
| + | digitalWrite(D1, true); | ||
| + | digitalWrite(D2, false); | ||
| + | digitalWrite(D3, true); | ||
| + | digitalWrite(D4, false); | ||
| + | // analogWrite(D6, true); | ||
| + | // analogWrite(D7, true); | ||
| + | break; | ||
| + | case 2 : //recule | ||
| + | digitalWrite(D1, false); | ||
| + | digitalWrite(D2, true); | ||
| + | digitalWrite(D3, false); | ||
| + | digitalWrite(D4, true); | ||
| + | // analogWrite(D6, 100); | ||
| + | // analogWrite(D7, 100); | ||
| + | break; | ||
| + | case 3 : //gauche | ||
| + | digitalWrite(D1, true); | ||
| + | digitalWrite(D2, false); | ||
| + | digitalWrite(D3, false); | ||
| + | digitalWrite(D4, false); | ||
| + | // analogWrite(D7, 180); | ||
| + | break; | ||
| + | case 4 : //droite | ||
| + | digitalWrite(D1, false); | ||
| + | digitalWrite(D2, false); | ||
| + | digitalWrite(D3, true); | ||
| + | digitalWrite(D4, false); | ||
| + | // analogWrite(D6, 180); | ||
| + | break; | ||
| + | case 5 : //shoot | ||
| + | shoot = true; | ||
| + | shootStartTime = millis(); | ||
| + | break; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | ////////////////////////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. | ||
| + | } | ||
[[catégorie:enib2018]] | [[catégorie:enib2018]] | ||
Version du 19 janvier 2018 à 16:04
Sur la base des petits bots, il s'agit d'ajouter un laser et un récepteur avec un système de point de vie.
Sommaire
Pédagogie
- construire
- programmer
Membres de l'équipe
- Prouteau Antonin
- Jegou Gergaud Nils
- Kerouanton Jeremy
- Ridae Hamdani
- Asaad ALAKOUM
Matériel pour le 1er robot
- Carte wemos D1 mini
- 1 interrupteur
- 4 piles + son socle
- 2 LED
- 3 Résistances
- 2 Roues + 1 petite roue à l'avant
- 2 Moteurs à courant continu
- 1 pont en H
- 1 photo résistance
- 1 émetteur lazer KY008
Avancement du projet
Le 1er robot est terminé. Le 2ème est en cours, nous avons imprimé le châssis ainsi que les roues et le socle des piles .
Fichier
Fichier:Diaporama-HackENIB2018.odp
Code Robot
////////////////// // Mortal Robot // //////////////////
// Ce programme est inspire de : http://www.esp8266.com/viewtopic.php?f=29&t=6419#sthash.gd1tJhwU.dpuf, http://wikidebrouillard.org/index.php?title=Petit_Bot_un_robot_controlable_en_Wifi // Sous licence CC-By-Sa // Par des gens bien
// 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 = "mortalRobot"; // Nom du réseau wifi const char *motDePasse = ""; // Mot de passe du réseau wifi // 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
//déclaration des Variables //int --- en cours int val = -1; // Val nous sert à stocker la commande de l'utilisateur (stop, avance, ...). int life = 3; //point de vie du robot bool shoot = false; long shootStartTime = 0;; long shootDuration = 2000; int light = 0; int prevLight = 0;
void setup() {
delay(1000); Serial.begin(9600); // Ouvre une connexion série pour monitorer le fonctionnement du code quand on reste branché a l'ordinateur Serial.println(); Serial.println(); configDuWifi(); pinMode(D0, OUTPUT); pinMode(D1, OUTPUT); pinMode(D2, OUTPUT); pinMode(D3, OUTPUT); pinMode(D4, OUTPUT); pinMode(D5, OUTPUT); pinMode(D6, OUTPUT); pinMode(D7, OUTPUT); pinMode(D8, OUTPUT); //Moteur à l'arrêt // analogWrite(D6, LOW); // analogWrite(D7, LOW); 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.
}
void loop() {
val = -1; monServeur.handleClient(); // lifeManage(); shootManage(); light = analogRead(A0); digitalWrite(D0, (light > prevLight+40)); prevLight = light; Serial.println(analogRead(A0)); // digitalWrite(D0,analogRead(A0));
}
void shootManage() {
if (shoot)
{
if ((millis() - shootStartTime) > shootDuration) {
digitalWrite(D8, false);
shoot = false;
} else {
digitalWrite(D8, true);
}
} else
{
digitalWrite(D8, false);
}
}
bool isShoot() {
// Serial.println("slt");
// Serial.println(analogRead(A0));
return (analogRead(A0) > 800);
}
void lifeManage() //gere les points de vie et l'affichage {
if (isShoot())
{
life--;
}
switch (life) {
case (3) :
digitalWrite(D0, true);
digitalWrite(D5, false);
break;
case (2) :
analogWrite(D0, 135);
digitalWrite(D5, false);
break;
case (1) :
analogWrite(D0, 90);
digitalWrite(D5, false);
break;
case (0) :
digitalWrite(D0, false);
digitalWrite(D5, true);
break;
case (5) : //shoot
Serial.println("shoot");
shoot = true;
shootStartTime = millis();
break;
}
}
///////////////////////GESTION DES INSTRUCTIONS/////////////////////////// void GestionDesClics() {
monServeur.on("/avance", HTTP_GET, []() {
val = 1;
Serial.println("avance");
redactionPageWeb();
});
monServeur.on("/recule", HTTP_GET, []() {
val = 2;
Serial.println("recule");
redactionPageWeb();
});
monServeur.on("/droite", HTTP_GET, []() {
val = 4;
Serial.println("droite");
redactionPageWeb();
});
monServeur.on("/gauche", HTTP_GET, []() {
val = 3;
Serial.println("gauche");
redactionPageWeb();
});
monServeur.on("/stop", HTTP_GET, []() {
val = 0;
Serial.println("stop");
redactionPageWeb();
});
monServeur.on("/shoot", HTTP_GET, []() {
val = 5;
Serial.println("shoot");
redactionPageWeb();
});
monServeur.on("/", HTTP_GET, []() {
val = -1;
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 += "\r\n"; pageWeb += ""; //On ouvre la balise qui va centrer les boutons pageWeb += ""; instruction(val); // pour cela on appelle la fonction "instruction" // On termine l'écriture de la page Web pageWeb += " "; // tout est centré sur la page pageWeb += "\n"; //Fin de la page Web
"; //aller à la ligne pageWeb += "
"; //aller à la ligne pageWeb += "\r\n"; // créer un bouton "Avance"... pageWeb += "\r\n"; pageWeb += "\r\n"; pageWeb += "\r\n"; pageWeb += "\r\n"; // créer un bouton "Stop", qui envoie sur l'URL /stop pageWeb += "\r\n"; pageWeb += "
// On envoie la page web monServeur.send(200, "text/html", pageWeb); delay(1);
}
///////////////////INSTRUCTIONS///////////////////////////////////////////////////////// void instruction(int valeur) { //Cette fonction traite les instructions qui sont reçues
switch (valeur) { // En fonction de la variable valeur on va donner un ordre aux servos
case 0 : //stop
digitalWrite(D1, false);
digitalWrite(D2, false);
digitalWrite(D3, false);
digitalWrite(D4, false);
break;
case 1 : //avance
digitalWrite(D1, true);
digitalWrite(D2, false);
digitalWrite(D3, true);
digitalWrite(D4, false);
// analogWrite(D6, true);
// analogWrite(D7, true);
break;
case 2 : //recule
digitalWrite(D1, false);
digitalWrite(D2, true);
digitalWrite(D3, false);
digitalWrite(D4, true);
// analogWrite(D6, 100);
// analogWrite(D7, 100);
break;
case 3 : //gauche
digitalWrite(D1, true);
digitalWrite(D2, false);
digitalWrite(D3, false);
digitalWrite(D4, false);
// analogWrite(D7, 180);
break;
case 4 : //droite
digitalWrite(D1, false);
digitalWrite(D2, false);
digitalWrite(D3, true);
digitalWrite(D4, false);
// analogWrite(D6, 180);
break;
case 5 : //shoot
shoot = true;
shootStartTime = millis();
break;
}
} ////////////////////////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.
}
