ENIB 2025 : LaGrueQuiDub

De Les Fabriques du Ponant
Révision datée du 21 janvier 2025 à 11:57 par Antonydbzh (discussion | contributions) (Sources et documentation complémentaire)
Aller à : navigation, rechercher

Titre de la fiche expérience :

Description

Faire une grue à partir du petit bot en rajoutant un servomoteur, un capteur ultrason et un haut parleur. La grue sera sur 3 axes comme une grue traditionnelle et fonctionnera avec un système de poulie.


Introduction

éventuelle vidéo

outil et matériel

fichiers à joindre

code, ficher d'impression 3D, de découpe laser ou vinyle, ...

Mettre du code Arduino

 1  
 2 #define PIN 9
 3 #include <Arduino_GFX_Library.h>
 4 
 5 void setup() {
 6   // put your setup code here, to run once:
 7 
 8 }
 9 
10 void loop() {
11   // put your main code here, to run repeatedly:
12 
13 }

étapes de fabrication

indiquer autant d'étape que nécessaire, chacune illustrée par des images (photo, dessins, ...)

étape 1

Connecter la carte au Wifi, trouver son adresse IP et créer un serveur Web dessus.

LaGrueQuiDobe1.jpg

étape 2

étape ...

Troubleshouting

Quelles sont difficultés, les problèmes, quelles sont les solutions, les trucs et astuces pour que ça marche ?

Sources et documentation complémentaire

Fiche servomoteur de wikidebrouilard

Elémlent de présentation

je met ici le document de présentation de mon projet

=============Annexe===============

CodeV1 contrôle servo avec graphique 2axes

  1  
  2 #include <ESP8266WiFi.h>
  3 #include <ESP8266WebServer.h>
  4 #include <Servo.h>
  5 
  6 const int pwmPin = 5; //(D1 sur l'ESP8266)
  7 Servo servoG;
  8 Servo servoD;
  9 
 10 // Crédential réseau
 11 const char* ssid = "*********";
 12 const char* password = "**********";
 13 
 14 // Lancer le serverWeb
 15 ESP8266WebServer server(80);
 16 
 17 // Coordonnées sliders et mémoire de détection de changement
 18 float xCoord = 0;
 19 float yCoord = 0;
 20 float lastXCoord = -1;
 21 float lastYCoord = -1;
 22 
 23 unsigned long previousMillis = 0;
 24 const long interval = 1000;
 25 const float deadZone = 50.0; 
 26 
 27 void setup() {
 28   Serial.begin(115200);
 29 
 30   initServos();
 31 
 32   connectToWiFi();
 33   server.on("/", handleRoot);
 34   server.on("/coords", handleCoords);
 35   server.begin();
 36   Serial.println("Serveur démarré");
 37 }
 38 
 39 void loop() {
 40   unsigned long currentMillis = millis();
 41   if (currentMillis - previousMillis >= interval) {
 42     previousMillis = currentMillis;
 43 
 44     if (abs(xCoord - lastXCoord) > deadZone || abs(yCoord - lastYCoord) > deadZone) {
 45       Serial.print("Coordonnées X: ");
 46       Serial.print(xCoord);
 47       Serial.print(", Y: ");
 48       Serial.println(yCoord);
 49 
 50       createServoMovement(xCoord, yCoord);
 51 
 52       lastXCoord = xCoord;
 53       lastYCoord = yCoord;
 54     }
 55   }
 56   server.handleClient();
 57 }
 58 
 59 void initServos() {
 60   servoG.attach(5); // (D1 sur l'ESP8266)
 61   servoD.attach(4); // (D2 sur l'ESP8266)
 62 }
 63 
 64 void connectToWiFi() {
 65   Serial.println("Connexion au Wi-Fi...");
 66   WiFi.begin(ssid, password);
 67   while (WiFi.status() != WL_CONNECTED) {
 68     delay(500);
 69     Serial.print(".");
 70   }
 71   Serial.println("\nConnecté !");
 72   Serial.print("Adresse IP : ");
 73   Serial.println(WiFi.localIP());
 74 }
 75 
 76 void handleRoot() {
 77   String html = generateHTML();
 78   server.send(200, "text/html", html);
 79 }
 80 
 81 String generateHTML() {
 82   return R"rawliteral(
 83     <!DOCTYPE html>
 84     <html>
 85     <head>
 86       <title>ESP8266 Interactive Page</title>
 87       <style>
 88         body { margin: 0; display: flex; justify-content: center; align-items: center; height: 100vh; background: #f3f3f3; }
 89         canvas { border: 1px solid black; }
 90       </style>
 91     </head>
 92     <body>
 93       <canvas id="canvas" width="500" height="500"></canvas>
 94       <script>
 95         const canvas = document.getElementById('canvas');
 96         const ctx = canvas.getContext('2d');
 97         canvas.addEventListener('mousemove', (event) => {
 98           const rect = canvas.getBoundingClientRect();
 99           const x = event.clientX - rect.left;
100           const y = event.clientY - rect.top;
101           ctx.clearRect(0, 0, canvas.width, canvas.height);
102           ctx.fillStyle = "blue";
103           ctx.beginPath();
104           ctx.arc(x, y, 5, 0, 2 * Math.PI);
105           ctx.fill();
106           // Envoyer les coordonnées au serveur
107           fetch(`/coords?x=${x}&y=${y}`)
108             .then(response => response.text())
109             .then(data => console.log(data))
110             .catch(error => console.error('Erreur:', error));
111         });
112       </script>
113     </body>
114     </html>
115   )rawliteral";
116 }
117 
118 void handleCoords() {
119   xCoord = server.arg("x").toFloat();
120   yCoord = server.arg("y").toFloat();
121 
122   server.send(200, "text/plain", "Coordonnées reçues et servos mis à jour !");
123 }
124 
125 void createServoMovement(float xCoord, float yCoord) {
126   // Mapper xCoord de [0, 500] à [0, 180] pour le servo gauche
127   int angleG = map(xCoord, 0, 500, 0, 180);
128   servoG.write(angleG);
129 
130   // Mapper yCoord de [0, 500] à [0, 180] pour le servo droit
131   int angleD = map(yCoord, 0, 500, 0, 180);
132   servoD.write(angleD);
133 
134   Serial.print("Servo gauche : ");
135   Serial.print(angleG);
136   Serial.print(" degrés, Servo droit : ");
137   Serial.print(angleD);
138   Serial.println(" degrés");
139 }

ne pas modifier sous cette ligne