// Librairies utilisées dans le code : #include #include #include // Définition des ports pour contrôler les moteurs // Moteur gauche : #define IN1a 27 #define IN2a 14 #define IN3a 12 #define IN4a 13 // Moteur droit : #define IN1b 5 #define IN2b 18 #define IN3b 19 #define IN4b 21 // Paramètres de connexion wifi : const char *ssid = "ESP32"; const char *password = "test12345"; // Temps d'attente entre deux impulsions : int delayTime = 3; // Variables de commande : bool commandRunning = false; // Une commande doit être exécutée bool stopCommand = false; // La commande doit être stoppée String globalCommand; // Nom de la commande int globalValue; // Valeur (nombre de pas à effectuer) // Création du serveur asynchrone : AsyncWebServer server(80); // Code exécuté au démarrage (paramétrage) : void setup() { // On indique que les ports de contrôle des moteurs sont des sorties (output) pinMode(IN1a, OUTPUT); pinMode(IN2a, OUTPUT); pinMode(IN3a, OUTPUT); pinMode(IN4a, OUTPUT); pinMode(IN1b, OUTPUT); pinMode(IN2b, OUTPUT); pinMode(IN3b, OUTPUT); pinMode(IN4b, OUTPUT); Serial.begin(115200); // Démarrage d'une communication Série avec l'ordinateur s'il est connecté connectWiFi(); // Connexion au wifi serverConfig(); // Configuration du serveur server.begin(); // Démarrage du serveur } // Code exécuté en boucle jusqu'à l'extinction du robot void loop() { if (commandRunning) { if (!stopCommand) { chooseCommand(); // Appeler la fonction "chooseCommand()" if (globalValue > 0) { // S'il reste des pas à effectuer alors on l'affiche et on enlève un pas Serial.print(globalCommand); Serial.print(": "); Serial.println(globalValue); globalValue--; } else { // Sinon on stoppe les moteurs Serial.println("stop"); commandRunning = false; stopCommand = false; stopMotors(); } } else { Serial.println("stop"); commandRunning = false; stopCommand = false; stopMotors(); } } } // Configuration du serveur asynchrone void serverConfig() { server.on("/get", HTTP_GET, [](AsyncWebServerRequest *request) { String command; float value; if (request->hasParam("command")) { command = request->getParam("command")->value(); if (request->hasParam("value")){ value = request->getParam("value")->value().toFloat(); } else{ value = 0; } requestCheck(command,value); } else { command = "Not the good command"; } Serial.print(command); Serial.print(": "); Serial.println(value); request->send(200, "text/plain", command); }); } // Fonction pour convertir une longueur en cm vers un nombre de pas moteur. int convertLengthToSteps(float length) { float result = length * 512 / (4 * 3.1415); return int(result); } // fonction pour convertir une rotation en degrés vers un nombre de pas moteur int convertRotToSteps(int rotation) { int result = convertLengthToSteps(rotation * 3.1415 / 180 * 7.8); return result; } // Lorsqu'une commande arrive au serveur, cette fonction permet void requestCheck(String command, float value) { if (command == "forward") { globalCommand = "forward"; commandRunning = true; stopCommand = false; globalValue = convertLengthToSteps(value); } else if (command == "backward") { globalCommand = "backward"; commandRunning = true; stopCommand = false; globalValue = convertLengthToSteps(value); } else if (command == "left") { globalCommand = "left"; commandRunning = true; stopCommand = false; globalValue = convertRotToSteps(value); } else if (command == "right") { globalCommand = "right"; commandRunning = true; stopCommand = false; globalValue = convertRotToSteps(value); } else if (command == "stop") { globalCommand = "stop"; commandRunning = true; stopCommand = true; } if (value == 0) { globalValue = 474; } } void connectWiFi() { WiFi.mode(WIFI_AP); WiFi.softAP(ssid, password); Serial.print("[+] AP Created with IP Gateway "); Serial.println(WiFi.softAPIP()); Serial.println(""); } void chooseCommand() { if (globalCommand == "forward") { forward(); } else if (globalCommand == "left") { left(); } else if (globalCommand == "right") { right(); } else if (globalCommand == "backward") { backward(); } } void forward() { digitalWrite(IN4a, HIGH); digitalWrite(IN3a, LOW); digitalWrite(IN2a, LOW); digitalWrite(IN1a, LOW); digitalWrite(IN4b, LOW); digitalWrite(IN3b, LOW); digitalWrite(IN2b, LOW); digitalWrite(IN1b, HIGH); delay(delayTime); digitalWrite(IN4a, LOW); digitalWrite(IN3a, HIGH); digitalWrite(IN2a, LOW); digitalWrite(IN1a, LOW); digitalWrite(IN4b, LOW); digitalWrite(IN3b, LOW); digitalWrite(IN2b, HIGH); digitalWrite(IN1b, LOW); delay(delayTime); digitalWrite(IN4a, LOW); digitalWrite(IN3a, LOW); digitalWrite(IN2a, HIGH); digitalWrite(IN1a, LOW); digitalWrite(IN4b, LOW); digitalWrite(IN3b, HIGH); digitalWrite(IN2b, LOW); digitalWrite(IN1b, LOW); delay(delayTime); digitalWrite(IN4a, LOW); digitalWrite(IN3a, LOW); digitalWrite(IN2a, LOW); digitalWrite(IN1a, HIGH); digitalWrite(IN4b, HIGH); digitalWrite(IN3b, LOW); digitalWrite(IN2b, LOW); digitalWrite(IN1b, LOW); delay(delayTime); } void backward() { digitalWrite(IN4a, LOW); digitalWrite(IN3a, LOW); digitalWrite(IN2a, LOW); digitalWrite(IN1a, HIGH); digitalWrite(IN4b, HIGH); digitalWrite(IN3b, LOW); digitalWrite(IN2b, LOW); digitalWrite(IN1b, LOW); delay(delayTime); digitalWrite(IN4a, LOW); digitalWrite(IN3a, LOW); digitalWrite(IN2a, HIGH); digitalWrite(IN1a, LOW); digitalWrite(IN4b, LOW); digitalWrite(IN3b, HIGH); digitalWrite(IN2b, LOW); digitalWrite(IN1b, LOW); delay(delayTime); digitalWrite(IN4a, LOW); digitalWrite(IN3a, HIGH); digitalWrite(IN2a, LOW); digitalWrite(IN1a, LOW); digitalWrite(IN4b, LOW); digitalWrite(IN3b, LOW); digitalWrite(IN2b, HIGH); digitalWrite(IN1b, LOW); delay(delayTime); digitalWrite(IN4a, HIGH); digitalWrite(IN3a, LOW); digitalWrite(IN2a, LOW); digitalWrite(IN1a, LOW); digitalWrite(IN4b, LOW); digitalWrite(IN3b, LOW); digitalWrite(IN2b, LOW); digitalWrite(IN1b, HIGH); delay(delayTime); } void right() { digitalWrite(IN4a, HIGH); digitalWrite(IN3a, LOW); digitalWrite(IN2a, LOW); digitalWrite(IN1a, LOW); digitalWrite(IN4b, HIGH); digitalWrite(IN3b, LOW); digitalWrite(IN2b, LOW); digitalWrite(IN1b, LOW); delay(delayTime); digitalWrite(IN4a, LOW); digitalWrite(IN3a, HIGH); digitalWrite(IN2a, LOW); digitalWrite(IN1a, LOW); digitalWrite(IN4b, LOW); digitalWrite(IN3b, HIGH); digitalWrite(IN2b, LOW); digitalWrite(IN1b, LOW); delay(delayTime); digitalWrite(IN4a, LOW); digitalWrite(IN3a, LOW); digitalWrite(IN2a, HIGH); digitalWrite(IN1a, LOW); digitalWrite(IN4b, LOW); digitalWrite(IN3b, LOW); digitalWrite(IN2b, HIGH); digitalWrite(IN1b, LOW); delay(delayTime); digitalWrite(IN4a, LOW); digitalWrite(IN3a, LOW); digitalWrite(IN2a, LOW); digitalWrite(IN1a, HIGH); digitalWrite(IN4b, LOW); digitalWrite(IN3b, LOW); digitalWrite(IN2b, LOW); digitalWrite(IN1b, HIGH); delay(delayTime); } void left() { digitalWrite(IN4a, LOW); digitalWrite(IN3a, LOW); digitalWrite(IN2a, LOW); digitalWrite(IN1a, HIGH); digitalWrite(IN4b, LOW); digitalWrite(IN3b, LOW); digitalWrite(IN2b, LOW); digitalWrite(IN1b, HIGH); delay(delayTime); digitalWrite(IN4a, LOW); digitalWrite(IN3a, LOW); digitalWrite(IN2a, HIGH); digitalWrite(IN1a, LOW); digitalWrite(IN4b, LOW); digitalWrite(IN3b, LOW); digitalWrite(IN2b, HIGH); digitalWrite(IN1b, LOW); delay(delayTime); digitalWrite(IN4a, LOW); digitalWrite(IN3a, HIGH); digitalWrite(IN2a, LOW); digitalWrite(IN1a, LOW); digitalWrite(IN4b, LOW); digitalWrite(IN3b, HIGH); digitalWrite(IN2b, LOW); digitalWrite(IN1b, LOW); delay(delayTime); digitalWrite(IN4a, HIGH); digitalWrite(IN3a, LOW); digitalWrite(IN2a, LOW); digitalWrite(IN1a, LOW); digitalWrite(IN4b, HIGH); digitalWrite(IN3b, LOW); digitalWrite(IN2b, LOW); digitalWrite(IN1b, LOW); delay(delayTime); } void stopMotors(void) { digitalWrite(IN4a, LOW); digitalWrite(IN3a, LOW); digitalWrite(IN2a, LOW); digitalWrite(IN1a, LOW); digitalWrite(IN4b, LOW); digitalWrite(IN3b, LOW); digitalWrite(IN2b, LOW); digitalWrite(IN1b, LOW); }