Auteurs : M. Robin et B. Nicolas Classes : 1ère STI2D

Mécanisme klann

Lycée Haroun Tazieff, Saint-Paul-lès-Daxseptembre2023/Juin 2024

Cahier des charges

Introduction

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.

Modélisation 3d

Voici le rendu final


Cette photo a été récupérée sur le site: Website

Photos du modèle réalisé

Partie pièces

Certaines pièces ont été récupérées sur le site suivant : Website

Photo des pièces :

Partie câblage

Photo du câblage pour test :

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 :

PARTIE INFRAROUGE

Vidéo test de la telecommande infrarouge :

Vidéo test de la télécommande Télé :

Partie programme

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.

Conclusion

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.