Au cours de l’année, nous avons travaillé sur un projet de mécanisme klann. Pour cela, nous avons utilisé ce matériel :
Pour relier tout ce système nous avons soudé tous les câbles nécessaires au bon fonctionnement du système.
Ce robot octopode se base sur le mécanisme de Klann. Il s'agit mécanisme plan conçu pour simuler l'allure d’un animal à pattes et remplacer la roue. Le mécanisme se compose d’une "jambe" qui entre en contact avec le sol, d’une manivelle, de deux culbuteurs, et deux bielles, le tout relié par des liaisons pivotantes.
Voici le rendu final
Cette photo a été récupérée sur le site: Website
Certaines pièces ont été récupérées sur le site suivant : Website
Voici une photo du cablage pour tester les moteurs :
Câblage pour tester les moteurs en ayant rajouté un récepteur infrarouge :
Branchement de la puce L293D :
Branchement des récepteurs infrarouges :
Cablage final :
Vidéo test de la telecommande infrarouge :
Vidéo test de la télécommande Télé :
Programme qui sert à tester la télécommande infrarouge:
#include <IRremote.h> IRrecv irrecv(4); decode_results results; void setup() { Serial.begin(9600); // Démarrer la communication série irrecv.enableIRIn(); // Démarrer le récepteur IR Serial.println("Pret a demarrer"); // Afficher un message sur le moniteur série } void loop() { if (irrecv.decode(&results)) { //Serial.print("code IR = "); //Serial.println(results.value, HEX); //Serial.println(results.value); irrecv.resume(); if (results.value==16726215) Serial.println("5"); if (results.value==16718055) Serial.println("2"); if (results.value==16730805) Serial.println("8"); if (results.value==16716015) Serial.println("4"); if (results.value==16734885) Serial.println("6"); } }
Programme final:
#include <IRremote.h> // Définition des broches pour les moteurs const int moteur1Pin1 = 10; const int moteur1Pin2 = 11; const int moteur2Pin1 = 6; const int moteur2Pin2 = 5; IRrecv irrecv(4); decode_results results; void setup() { Serial.begin(9600); // Démarrer la communication série irrecv.enableIRIn(); // Démarrer le récepteur IR pinMode(moteur1Pin1, OUTPUT); pinMode(moteur1Pin2, OUTPUT); pinMode(moteur2Pin1, OUTPUT); pinMode(moteur2Pin2, OUTPUT); Serial.println("Prêt à démarrer"); // Afficher un message sur le moniteur série } void loop() { if (irrecv.decode(&results)) { irrecv.resume(); // Contrôle des moteurs en fonction des valeurs de la télécommande switch (results.value) { case 16718055: // Avancer Serial.println("Avancer"); avancer(); break; case 16730805: // Reculer Serial.println("Reculer"); reculer(); break; case 16734885: // Tourner à gauche Serial.println("Tourner à gauche"); tournerGauche(); break; case 16716015: // Tourner à droite Serial.println("Tourner à droite"); tournerDroite(); break; case 16726215: // Arrêter Serial.println("Arrêt"); arreter(); break; default: break; } } } // Fonction pour faire avancer le robot void avancer() { digitalWrite(moteur1Pin1, HIGH); digitalWrite(moteur1Pin2, LOW); digitalWrite(moteur2Pin1, HIGH); digitalWrite(moteur2Pin2, LOW); } // Fonction pour faire reculer le robot void reculer() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, HIGH); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, HIGH); } // Fonction pour faire tourner le robot à gauche void tournerGauche() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, HIGH); digitalWrite(moteur2Pin1, HIGH); digitalWrite(moteur2Pin2, LOW); } // Fonction pour faire tourner le robot à droite void tournerDroite() { digitalWrite(moteur1Pin1, HIGH); digitalWrite(moteur1Pin2, LOW); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, HIGH); } // Fonction pour arrêter le robot void arreter() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, LOW); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, LOW); }
Programme test de la télécommande télé:
#include <IRremote.h> IRrecv irrecv(4); decode_results results; void setup() { Serial.begin(9600); // Démarrer la communication série irrecv.enableIRIn(); // Démarrer le récepteur IR Serial.println("Pret a demarrer"); // Afficher un message sur le moniteur série } void loop() { if (irrecv.decode(&results)) { Serial.print("code IR = "); Serial.println(results.value, HEX); Serial.println(results.value); irrecv.resume(); if (results.value == 16798291) Serial.println("H"); if (results.value == 16831187) Serial.println("D"); if (results.value == 16814739) Serial.println("Ok"); if (results.value == 16806515) Serial.println("L"); if (results.value == 16839411) Serial.println("R"); if (results.value == 16778245) Serial.println("A"); if (results.value == 16811141) Serial.println("S"); } }
programme final pour télécommander l'araignée avec la télécommande télé.
#include <IRremote.h> // Définition des broches pour les moteurs const int moteur1Pin1 = 5; const int moteur1Pin2 = 6; const int moteur2Pin1 = 3; const int moteur2Pin2 = 2; const int enablePin1 = 9; // Broche enable pour le moteur 1 (PWM) const int enablePin2 = 10; // Broche enable pour le moteur 2 (PWM) // Variables pour la gestion de la vitesse int vitesseMoteur1 = 255; // Vitesse initiale à 255 (maximum) int vitesseMoteur2 = 255; // Vitesse initiale à 255 (maximum) IRrecv irrecv(4); decode_results results; void setup() { Serial.begin(9600); // Démarrer la communication série irrecv.enableIRIn(); // Démarrer le récepteur IR pinMode(moteur1Pin1, OUTPUT); pinMode(moteur1Pin2, OUTPUT); pinMode(moteur2Pin1, OUTPUT); pinMode(moteur2Pin2, OUTPUT); pinMode(enablePin1, OUTPUT); pinMode(enablePin2, OUTPUT); Serial.println("Prêt à démarrer"); // Afficher un message sur le moniteur série } void loop() { if (irrecv.decode(&results)) { Serial.print("valeur="); Serial.println(results.value, HEX); irrecv.resume(); // Contrôle des moteurs en fonction des valeurs de la télécommande switch (results.value) { case 16718055: // Avancer Serial.println("Avancer"); avancer(); break; case 16730805: // Reculer Serial.println("Reculer"); reculer(); break; case 16734885: // Tourner à gauche Serial.println("Tourner à gauche"); tournerGauche(); break; case 16716015: // Tourner à droite Serial.println("Tourner à droite"); tournerDroite(); break; case 16726215: // Arrêter Serial.println("Arrêt"); arreter(); break; case 16778245: // Accélérer (remplacez 0xA par la valeur correcte) Serial.println("Accélérer"); accelerer(); break; case 16811141: // Ralentir (remplacez 0xR par la valeur correcte) Serial.println("Ralentir"); ralentir(); break; default: break; } } } // Fonction pour faire avancer le robot void avancer() { digitalWrite(moteur1Pin1, HIGH); digitalWrite(moteur1Pin2, LOW); digitalWrite(moteur2Pin1, HIGH); digitalWrite(moteur2Pin2, LOW); analogWrite(enablePin1, vitesseMoteur1); analogWrite(enablePin2, vitesseMoteur2); } // Fonction pour faire reculer le robot void reculer() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, HIGH); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, HIGH); analogWrite(enablePin1, vitesseMoteur1); analogWrite(enablePin2, vitesseMoteur2); } // Fonction pour faire tourner le robot à gauche void tournerGauche() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, HIGH); digitalWrite(moteur2Pin1, HIGH); digitalWrite(moteur2Pin2, LOW); analogWrite(enablePin1, vitesseMoteur1); analogWrite(enablePin2, vitesseMoteur2); } // Fonction pour faire tourner le robot à droite void tournerDroite() { digitalWrite(moteur1Pin1, HIGH); digitalWrite(moteur1Pin2, LOW); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, HIGH); analogWrite(enablePin1, vitesseMoteur1); analogWrite(enablePin2, vitesseMoteur2); } // Fonction pour arrêter le robot void arreter() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, LOW); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, LOW); analogWrite(enablePin1, 0); analogWrite(enablePin2, 0); } // Fonction pour accélérer le robot void accelerer() { vitesseMoteur1 = min(vitesseMoteur1 + 50, 255); vitesseMoteur2 = min(vitesseMoteur2 + 50, 255); Serial.print("Nouvelle vitesse: "); Serial.println(vitesseMoteur1); } // Fonction pour ralentir le robot void ralentir() { vitesseMoteur1 = max(vitesseMoteur1 - 50, 0); vitesseMoteur2 = max(vitesseMoteur2 - 50, 0); Serial.print("Nouvelle vitesse: "); Serial.println(vitesseMoteur1); }
Code pour télécommander l'araignée avec 2 télécommandes en même temps.
#include <IRremote.h> // Définition des broches pour les moteurs const int moteur1Pin1 = 10; const int moteur1Pin2 = 11; const int moteur2Pin1 = 6; const int moteur2Pin2 = 5; IRrecv irrecv(4); decode_results results; void setup() { Serial.begin(9600); // Démarrer la communication série irrecv.enableIRIn(); // Démarrer le récepteur IR pinMode(moteur1Pin1, OUTPUT); pinMode(moteur1Pin2, OUTPUT); pinMode(moteur2Pin1, OUTPUT); pinMode(moteur2Pin2, OUTPUT); Serial.println("Prêt à démarrer"); // Afficher un message sur le moniteur série } void loop() { if (irrecv.decode(&results)) { irrecv.resume(); // Contrôle des moteurs en fonction des commandes de la télécommande switch (results.value) { case 16798291: // Touche "haut" pour avancer avec télécomande 1 case 3772778233: // Touche "haut" pour avancer avec télécomande 2 Serial.println("Avancer"); avancer(); break; case 16831187: // Touche "bas" pour reculer avec télécomande 1 case 3772810873: // Touche "bas" pour reculer avec télécomande 2 Serial.println("Reculer"); reculer(); break; case 16806515: // Touche "droite" pour tourner à droite avec télécomande 1 case 3772819033: // Touche "droite" pour tourner à droite avec télécomande 2 Serial.println("Tourner à droite"); tournerDroite(); break; case 16839411: // Touche "gauche" pour tourner à gauche avec télécomande 1 case 3772794553: // Touche "gauche" pour tourner à gauche avec télécomande 2 Serial.println("Tourner à gauche"); tournerGauche(); break; case 16814739: // Touche "OK" pour arrêter avec télécomande 1 case 3772782313: // Touche "OK" pour arrêter avec télécomande 2 Serial.println("Arrêt"); arreter(); break; default: break; } } } // Fonction pour faire avancer le robot void avancer() { digitalWrite(moteur1Pin1, HIGH); digitalWrite(moteur1Pin2, LOW); digitalWrite(moteur2Pin1, HIGH); digitalWrite(moteur2Pin2, LOW); } // Fonction pour faire reculer le robot void reculer() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, HIGH); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, HIGH); } // Fonction pour faire tourner le robot à gauche void tournerGauche() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, HIGH); digitalWrite(moteur2Pin1, HIGH); digitalWrite(moteur2Pin2, LOW); } // Fonction pour faire tourner le robot à droite void tournerDroite() { digitalWrite(moteur1Pin1, HIGH); digitalWrite(moteur1Pin2, LOW); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, HIGH); } // Fonction pour arrêter le robot void arreter() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, LOW); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, LOW); }
Code pour que l'araignée accélere et décélere avec les deux télécommandes.
#include <IRremote.h> // Définition des broches pour les moteurs const int moteur1Pin1 = 10; const int moteur1Pin2 = 11; const int moteur2Pin1 = 6; const int moteur2Pin2 = 5; int vitesse=125; int etat=0; // 0 : arrêt, 1 : avance, 2 : recule IRrecv irrecv(4); decode_results results; void setup() { Serial.begin(9600); // Démarrer la communication série irrecv.enableIRIn(); // Démarrer le récepteur IR pinMode(moteur1Pin1, OUTPUT); pinMode(moteur1Pin2, OUTPUT); pinMode(moteur2Pin1, OUTPUT); pinMode(moteur2Pin2, OUTPUT); Serial.println("Prêt à démarrer"); // Afficher un message sur le moniteur série } void loop() { if (irrecv.decode(&results)) { irrecv.resume(); // Contrôle des moteurs en fonction des commandes de la télécommande switch (results.value) { case 3772829743: // touche diminuer case 16811141: vitesse=vitesse-15; if (vitesse<200) vitesse=200; if (etat==1) avancer(); if (etat==2) reculer(); break; case 3772833823: case 16778245: vitesse=vitesse+15; if (vitesse>255) vitesse=255; if (etat==1) avancer(); if (etat==2) reculer(); break; case 16798291: // Touche "Haut" pour avancer avec telecommande 1 case 3772778233: // Touche "Haut" pour avancer avec telecommande 2 Serial.println("Avancer"); avancer(); break; case 16831187: // Touche "bas" pour reculer avec telecommande 1 case 3772810873: // Touche "bas" pour reculer avec telecommande 2 Serial.println("Reculer"); reculer(); break; case 16806515: // Touche "droite" pour tourner à droite avec telecommande 1 case 3772819033: // Touche "droite" pour tourner à droite avec telecommande 2 Serial.println("Tourner à droite"); tournerDroite(); break; case 16839411: // Touche "gauche" pour tourner à gauche avec telecommande 1 case 3772794553: // Touche "gauche" pour tourner à gauche avec telecommande 2 Serial.println("Tourner à gauche"); tournerGauche(); break; case 16814739: // Touche "ok" pour arrêter avec telecommande 1 case 3772782313: // Touche "ok" pour arrêter avec telecommande 2 Serial.println("Arrêt"); arreter(); break; default: break; } } } // Fonction pour faire avancer le robot void avancer() { analogWrite(moteur1Pin1, vitesse); digitalWrite(moteur1Pin2, LOW); analogWrite(moteur2Pin1, vitesse); digitalWrite(moteur2Pin2, LOW); etat=1; } // Fonction pour faire reculer le robot void reculer() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, HIGH); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, HIGH); } // Fonction pour faire tourner le robot à gauche void tournerGauche() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, HIGH); digitalWrite(moteur2Pin1, HIGH); digitalWrite(moteur2Pin2, LOW); } // Fonction pour faire tourner le robot à droite void tournerDroite() { digitalWrite(moteur1Pin1, HIGH); digitalWrite(moteur1Pin2, LOW); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, HIGH); } void reculer_lent() { analogWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, vitesse); analogWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, vitesse); } // Fonction pour arrêter le robot void arreter() { digitalWrite(moteur1Pin1, LOW); digitalWrite(moteur1Pin2, LOW); digitalWrite(moteur2Pin1, LOW); digitalWrite(moteur2Pin2, LOW); etat=0; }
Vidéo de l'araignée quand elle avance.
Voici une vidéo de l'araignée quand elle tourne.
Pour conclure, ce robot a été fabriqué sur une année scolaire. Le robot et maintenant pilotable sur tout type de surfaces, à une distance de 4 mètres.
Résultat final avec une télécommande TV.
résultat final avec 2 télécommandes.