Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Construire un Robot Wall-E LEGO avec Arduino Nano : Guide Pas à Pas

Composants et fournitures

LEGO Wall-E (acheté d'occasion, plus fabriqué) × 1
Arduino Nano R3 × 1
Moteur DC (générique) × 2
Contrôleur Double Moteur L298N × 1
LED Bicolore (3 broches) × 1
Capteur Infrarouge × 1
Buzzer (capable de jouer différentes tonalités) × 1
Batterie 9V × 1
Résistance 330 ohm × 3
Fils de connexion (génériques) × 20

Outils nécessaires

Applications et services en ligne

À propos de ce projet

Tout le monde connaît le film Wall-E (et si ce n'est pas le cas, allez le regarder maintenant !) et le petit héros jaune qui essaie de nettoyer la Terre. Dans ce projet, j'ai utilisé une version Lego de notre petit ami et je lui ai appris à éviter les obstacles. C'était mon premier projet et une excellente expérience d'apprentissage pour comprendre les bases de l'électronique.

Étape 1 - Le Code

En tant que développeur logiciel de métier, j'ai réfléchi à ce que je voulais qu'il fasse et j'ai commencé par le code.

// Ce programme contrôle le robot Lego Wall-E.
// Wall-E se déplace. Quand il voit un obstacle, il s'arrête, regarde autour et choisit un autre chemin.
// Arduino Nano a 21 broches utilisables pour digitalRead/Write
// Broches PWM 3, 5, 6, 9, 10, 11 pour analogWrite
// Broches 0 et 1 pour TTL
// Broches 2 et 3 pour interruptions externes
// Broches 10, 11, 12, 13 supportent la communication SPI
// Broche 13 = LED interne
// Broches 14 à 21 = broches analogiques A0 à A7 pour analogRead

#define INFRA_RED 9
#define GREEN_LED 7 // nécessite résistance ~220 Ohm
#define RED_LED 8   // nécessite résistance ~220 Ohm
#define BUZZER 10   // doit être broche PWM pour fréquence, résistance ~1k Ohm

// MR = moteur droit, ML = moteur gauche
#define MR_1 A1
#define MR_2 A2
#define MR_ENABLE 5 // PWM pour contrôle vitesse
#define ML_1 A3
#define ML_2 A4
#define ML_ENABLE 6 // PWM pour contrôle vitesse

const int NORMAL_SPEED = 255;

void setup() {
  delay(2000); // Attente pour éviter pics de tension au débranchement moteur
  pinMode(GREEN_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  // pinMode(BUZZER, OUTPUT); // pas nécessaire
  digitalWrite(RED_LED, LOW);
  digitalWrite(GREEN_LED, HIGH);
  
  pinMode(MR_ENABLE, OUTPUT);
  pinMode(MR_1, OUTPUT);
  pinMode(MR_2, OUTPUT);
  pinMode(ML_ENABLE, OUTPUT);
  pinMode(ML_1, OUTPUT);
  pinMode(ML_2, OUTPUT);
  
  pinMode(INFRA_RED, INPUT);
  randomSeed(analogRead(0));
  playHello();
}

void loop() {
  driveForwards(NORMAL_SPEED);
  digitalWrite(RED_LED, LOW);
  digitalWrite(GREEN_LED, HIGH);
  
  if (digitalRead(INFRA_RED) == LOW) { // LOW = obstacle détecté
    digitalWrite(GREEN_LED, LOW);
    digitalWrite(RED_LED, HIGH);
    stopDriving();
    playUhOh();
    
    // Vérifier gauche
    turnLeft(500);
    boolean obstacleLeft = false;
    if (digitalRead(INFRA_RED) == LOW) obstacleLeft = true;
    
    // Retour centre
    delay(100);
    turnRight(500);
    delay(500);
    
    // Vérifier droite
    turnRight(500);
    boolean obstacleRight = false;
    if (digitalRead(INFRA_RED) == LOW) obstacleRight = true;
    
    // Retour centre
    delay(100);
    turnLeft(500);
    
    // Décider comment sortir
    if (obstacleLeft && obstacleRight) {
      driveBackwards(NORMAL_SPEED / 3);
      for (int i = 0; i < 5; i++) {
        tone(BUZZER, 1000, 500);
        delay(1000);
      }
      randomTurn(800, 1600);
    } else if (obstacleLeft) {
      turnRight(1000);
    } else if (obstacleRight) {
      turnLeft(1000);
    } else {
      randomTurn(1000, 1800);
    }
  }
  
  // Actions aléatoires pour plus d'interaction
  int number = random(100); // 0 à 99
  if (number == 0) {
    randomTurn(200, 2000);
  }
}

// Fonctions de contrôle moteur...

Quand on débranche un moteur en marche, des pics de tension peuvent se produire et endommager l'électronique. C'est pourquoi je fais attendre Wall-E deux secondes avant d'agir. Ainsi, je peux appuyer sur Reset et débrancher rapidement la batterie sans rien abîmer.

Il joue une petite mélodie au démarrage, puis se met à rouler. Quand il détecte un obstacle, il s'arrête, joue un son « Uh-oh », et regarde autour pour déterminer la meilleure voie. Le capteur infrarouge utilisé a une petite vis à l'arrière pour régler la distance de détection. C'est pourquoi il n'y a pas de calcul de distance dans le code. (Je voulais utiliser un capteur ultrasonique au début, mais il ne rentrait pas dans ses yeux.)

Wall-E vérifie d'abord si la gauche est libre, puis la droite. Si les deux sont bloquées, il recule en bipant comme un engin de chantier, puis tourne dans une direction aléatoire et continue. Si un seul côté est bloqué, il va de l'autre côté. Si les deux sont libres, il choisit aléatoirement.

J'ai essayé de lui faire faire des virages aléatoires, mais cette partie n'est pas encore finie. J'essaie d'utiliser le timer intégré de l'Arduino. Dites-moi en commentaire si vous avez une idée pour l'optimiser !

Étape 2 - Câblage

La première chose était d'intégrer le capteur infrarouge dans l'œil pour que ce ne soit pas trop visible. Je l'ai démonté, collé une goupille Lego sur le capteur (pour que son œil puisse bouger haut/bas) et utilisé de la patafix pour remettre les pièces Lego autour :

Construire un Robot Wall-E LEGO avec Arduino Nano : Guide Pas à Pas

Le plus important pour les moteurs était qu'ils aient assez de couple, car la configuration des roues de Wall-E demande pas mal de force. J'ai dû souder des fils aux moteurs et les fixer solidement aux Lego. J'ai démonté ses roues, commandé un sac plein de goupilles Technic, enveloppé du ruban plâtre (ruban doux pour la peau) autour des arbres moteurs, et les ai insérés dans deux goupilles devenues l'axe principal de chaque roue. Ça a marché quelques minutes, mais le frottement était trop fort pour la colle du ruban. Heureusement, les goupilles Technic ont de petites rainures sur le côté, donc le ruban a fini par tenir après avoir été trempé dans de la super glue.

Construire un Robot Wall-E LEGO avec Arduino Nano : Guide Pas à Pas

J'ai aussi retiré un peu de sa poitrine pour passer la LED. Puis j'ai connecté tous les composants et l'Arduino.

Construire un Robot Wall-E LEGO avec Arduino Nano : Guide Pas à Pas

Le shield moteur rentre juste dans son ventre :

Construire un Robot Wall-E LEGO avec Arduino Nano : Guide Pas à Pas

Le schéma n'est pas très clair non plus, mais j'ai essayé de colorier les fils pour une meilleure vue :

Construire un Robot Wall-E LEGO avec Arduino Nano : Guide Pas à Pas

Par convention, tous les fils rouges sont positifs (« délivrent » l'électricité) et tous les fils noirs sont négatifs (« reçoivent » l'électricité). Le fil jaune en haut à droite porte le signal du capteur infrarouge ; les fils orange et vert sont pour la LED bicolore à 3 broches, les fils violets commandent le sens de rotation des moteurs, et les fils bleus commandent la vitesse.

Le shield moteur avait un très bon tutoriel qui a facilité la connexion et l'utilisation. Malheureusement, la pièce Fritzing n'avait pas les deux broches pour régler la vitesse, donc les fils bleus semblent flotter sur le shield dans le schéma.

Un autre problème : manque de broches Voltage et Ground. Je voulais alimenter les moteurs directement via le shield pour qu'ils aient un maximum de puissance, mais je devais aussi alimenter l'Arduino et le capteur IR en 5V. J'ai fait ce que presque tout le monde sur le web dit de ne pas faire : j'ai connecté la sortie 5V du shield moteur à la broche 5V de l'Arduino en entrée. Avec ce shield, je suis sûr qu'il sort un 5V régulé sans pics qui pourrait endommager l'Arduino. Si vous branchez une source non régulée sur cette broche, vous grillez probablement quelque chose. J'ai voulu utiliser la broche Vin au début, mais elle a un régulateur intégré qui abaisse tout, donc mes 5V seraient devenus 3.8V, insuffisant pour l'Arduino. À la place, j'ai utilisé le Vin libre pour alimenter le capteur IR en 5V, car je n'avais pas de splitter de câble, et je savais qu'il y aurait aussi 5V qui en sortiraient. Oui, ça ressemblait un peu à Frankenstein à ce stade. Mais ça a marché !

Étape 3 - Wall-E en Action

Voici quelques vidéos le montrant en action :

Et ici, je testais ce qu'il ferait s'il était coincé dans un coin :

Voilà pour mon premier petit projet. Je prévois maintenant d'optimiser les connexions de câbles et peut-être d'ajouter un servo pour qu'il puisse tourner la tête. J'achèterais peut-être des splitters et un shield moteur plus petit pour tout faire tenir dans son ventre.

Et ainsi Wall-E vécut heureux pour toujours. Fin.

Code

Wall_e_control

// Code complet identique à celui de l'étape 1 (voir ci-dessus)

Schémas

Signification des couleurs des câbles :
rouge = tension (positif)
noir = masse (négatif)
jaune = signal capteur infrarouge
orange et vert = connexions entrées LED rouge et verte
violet = contrôle direction moteurs
bleu = contrôle vitesse moteurs (malheureusement, la pièce Fritzing n'avait pas les deux broches de mon pont en H pour ces connexions, ça ressemble à des fils libres pour l'instant)

Processus de fabrication

  1. Capteur CO2 K30 : Surveillance en temps réel de la qualité de l'air intérieur
  2. Faciliter la communication sourd-aveugle avec 1Sheeld et Arduino
  3. Construire une Tirelire Intelligente : Contrôler un Accepteur de Pièces avec Arduino Nano
  4. Construire un tireur LEGO Star Wars automatisé avec Arduino Uno
  5. Robot Évitement d'Obstacles Piloté par Servomoteur : Construction avec Arduino et HC-SR04
  6. Contrôler une LED par Bluetooth avec Arduino et MIT App Inventor
  7. Intégrer un capteur d'empreintes capacitif DFRobot (ID809) avec Arduino ou ESP8266
  8. Créez un robot suiveur de ligne autonome avec Arduino UNO
  9. Station météo interactive Nextion HMI avec Arduino Mega et capteurs