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

Construisez un Bras Robotique Intelligent Contrôlé par Arduino : Tutoriel DIY Facile

Composants et Fournitures

Composant Description Quantité
Arduino UNO Carte microcontrôleur 1
Micro Servomoteurs Servos standards 5
Potentiomètres Pour le bras maître (contrôle manuel) 5
Plaque d'essai (Breadboard) Genérique 1

À Propos de ce Projet

Dans ce tutoriel, je vais réaliser un bras robotique simple contrôlé par un bras maître. Le bras mémorisera les mouvements et les rejouera en séquence. Le concept n'est pas nouveau – je m'en suis inspiré du "mini robotic arm" de Stoerpeak. Je voulais le faire depuis longtemps, mais j'étais alors débutant sans connaissances en programmation. Maintenant, je le construis enfin, en le gardant simple, peu coûteux, et en le partageant avec vous tous.

Alors, commençons…

Étape 1 : Matériel Nécessaire

Étape 2 : Fabriquer le Bras

Construisez un Bras Robotique Intelligent Contrôlé par Arduino : Tutoriel DIY Facile
Construisez un Bras Robotique Intelligent Contrôlé par Arduino : Tutoriel DIY Facile

J'ai utilisé des bâtonnets de glace (popsicle sticks) pour construire le bras. Vous pouvez utiliser n'importe quel matériau disponible. Essayez différents designs mécaniques pour un bras encore meilleur – le mien n'est pas très stable.

J'ai simplement utilisé du ruban adhésif double face pour coller les servos aux bâtonnets et les ai fixés avec des vis.

Pour le bras maître, j'ai collé les potentiomètres sur des bâtonnets et fabriqué le bras.

Regardez les photos pour mieux comprendre. J'ai tout monté sur une toile A4 utilisée comme base.

Étape 3 : Réaliser les Connexions

Construisez un Bras Robotique Intelligent Contrôlé par Arduino : Tutoriel DIY Facile
Construisez un Bras Robotique Intelligent Contrôlé par Arduino : Tutoriel DIY Facile
Construisez un Bras Robotique Intelligent Contrôlé par Arduino : Tutoriel DIY Facile

Dans cette étape, nous faisons toutes les connexions nécessaires. Référez-vous aux photos ci-dessus.

Broches utilisées :

Note importante : Même si les servos ne sont pas alimentés par l'Arduino, assurez-vous de connecter la masse (GND) des servos à l'Arduino, sinon le bras ne fonctionnera pas.

Étape 4 : Programmation

Construisez un Bras Robotique Intelligent Contrôlé par Arduino : Tutoriel DIY Facile

La logique du code est assez simple : les valeurs des potentiomètres sont stockées dans un tableau, puis parcourues avec une boucle for pour que les servos reproduisent les positions mémorisées. Vous pouvez consulter ce tutoriel de référence : "Arduino Potentiometer Servo Control & Memory".

Variables Globales

#include <Servo.h>
// Objets Servo
Servo Servo_0;
Servo Servo_1;
Servo Servo_2;
Servo Servo_3;
Servo Servo_4;

// Objets Potentiomètre
int Pot_0;
int Pot_1;
int Pot_2; 
int Pot_3;
int Pot_4;

// Variables pour stocker positions servos
int Servo_0_Pos;
int Servo_1_Pos;
int Servo_2_Pos;
int Servo_3_Pos;
int Servo_4_Pos;

// Variables pour stocker positions précédentes
int Prev_0_Pos; 
int Prev_1_Pos; 
int Prev_2_Pos;
int Prev_3_Pos; 
int Prev_4_Pos;

// Variables pour stocker positions actuelles
int Current_0_Pos; 
int Current_1_Pos; 
int Current_2_Pos; 
int Current_3_Pos;
int Current_4_Pos;

int Servo_Position; // Stocke l'angle 
int Servo_Number; // Stocke numéro du servo
int Storage[600]; // Tableau pour stocker les données (augmenter la taille consomme plus de mémoire)
int Index = 0; // Index du tableau commence à 0
char data = 0; // Variable pour stocker données depuis entrée série

Fonction setup()

void setup() {
  Serial.begin(9600); // Communication série entre Arduino et IDE
  // Attacher les objets Servo aux broches PWM
  Servo_0.attach(3);
  Servo_1.attach(5);
  Servo_2.attach(6);
  Servo_3.attach(9);
  Servo_4.attach(10);
  // Servos initialisés à la position 100
  Servo_0.write(100);
  Servo_1.write(100);
  Servo_2.write(100);
  Servo_3.write(100);
  Servo_4.write(100);
  Serial.println("Press 'R' to Record and 'P' to play");
}

Fonction Map_Pot() – Lecture et Mapping des Potentiomètres

void Map_Pot()
{
  /* Les servos tournent sur 180 degrés
     mais les utiliser aux limites n'est pas
     une bonne idée car cela fait bourdonner les servos en continu
     ce qui est agaçant. On limite le mouvement entre 1 et 179 */
  Pot_0 = analogRead(A0); // Lecture entrée pot, stockage dans Pot_0
  Servo_0_Pos = map(Pot_0, 0, 1023, 1, 179); // Mapping 0-1023 → 1-179
  Servo_0.write(Servo_0_Pos); // Déplace servo à cette position
  
  Pot_1 = analogRead(A1);
  Servo_1_Pos = map(Pot_1, 0, 1023, 1, 179);
  Servo_1.write(Servo_1_Pos); 
  
  Pot_2 = analogRead(A2); 
  Servo_2_Pos = map(Pot_2, 0, 1023, 1, 179);
  Servo_2.write(Servo_2_Pos);
  
  Pot_3 = analogRead(A3); 
  Servo_3_Pos = map(Pot_3, 0, 1023, 1, 179);
  Servo_3.write(Servo_3_Pos);
  
  Pot_4 = analogRead(A4);
  Servo_4_Pos = map(Pot_4, 0, 1023 , 1, 179);
  Servo_4.write(Servo_4_Pos);
}

Fonction loop()

void loop() 
{
  Map_Pot(); // Appel fonction lecture pots
  
  while (Serial.available() > 0) 
  {
    data = Serial.read();
    if (data == 'R')
      Serial.println("Recording Moves...");
    if (data == 'P')
      Serial.println("Playing Recorded Moves...");
  }
  
  if (data == 'R') // Si 'R' saisi, commencer enregistrement
  {
    // Stocker les valeurs dans variables
    Prev_0_Pos = Servo_0_Pos;
    Prev_1_Pos = Servo_1_Pos;
    Prev_2_Pos = Servo_2_Pos;
    Prev_3_Pos = Servo_3_Pos;
    Prev_4_Pos = Servo_4_Pos;
    
    Map_Pot(); // Rappel fonction Map pour comparaison
    
    if (abs(Prev_0_Pos == Servo_0_Pos)) // Valeur absolue par comparaison
    {
      Servo_0.write(Servo_0_Pos); // Si valeurs identiques, servo repositionné
      if (Current_0_Pos != Servo_0_Pos) // Si valeurs différentes
      {
        Storage[Index] = Servo_0_Pos + 0; // Valeur ajoutée au tableau
        Index++; // Index incrémenté
      }
      Current_0_Pos = Servo_0_Pos; 
    }
    /* De même pour tous les servos, +100 ajouté à chaque entrée comme valeur différentielle */
    if (abs(Prev_1_Pos == Servo_1_Pos))
    {
      Servo_1.write(Servo_1_Pos);
      if (Current_1_Pos != Servo_1_Pos)
      {
        Storage[Index] = Servo_1_Pos + 100; 
        Index++;
      }
      Current_1_Pos = Servo_1_Pos;
    }
    
    if (abs(Prev_2_Pos == Servo_2_Pos))
    {
      Servo_2.write(Servo_2_Pos);
      if (Current_2_Pos != Servo_2_Pos)
      {
        Storage[Index] = Servo_2_Pos + 200; 
        Index++;
      }
      Current_2_Pos = Servo_2_Pos;
    }
    
    if (abs(Prev_3_Pos == Servo_3_Pos))
    {
      Servo_3.write(Servo_3_Pos); 
      if (Current_3_Pos != Servo_3_Pos)
      {
        Storage[Index] = Servo_3_Pos + 300; 
        Index++;
      }
      Current_3_Pos = Servo_3_Pos; 
    } 
    if (abs(Prev_4_Pos == Servo_4_Pos))
    {
      Servo_4.write(Servo_4_Pos);
      if (Current_4_Pos != Servo_4_Pos)
      {
        Storage[Index] = Servo_4_Pos + 400; 
        Index++;
      }
      Current_4_Pos = Servo_4_Pos;
    }
    /* Affichage valeurs sur moniteur série, '\t' pour format tabulaire */
    Serial.print(Servo_0_Pos); 
    Serial.print(" \t "); 
    Serial.print(Servo_1_Pos); 
    Serial.print(" \t "); 
    Serial.print(Servo_2_Pos); 
    Serial.print(" \t "); 
    Serial.print(Servo_3_Pos); 
    Serial.print(" \t "); 
    Serial.println(Servo_4_Pos);
    Serial.print ("Index = "); 
    Serial.println(Index); 
    delay(50); 
  }
  
  if (data == 'P') // SI 'P' saisi, lecture mouvements enregistrés
  {
    for (int i = 0; i < Index; i++) // Parcours tableau avec boucle for
    {
      Servo_Number = Storage[i] / 100; // Trouve numéro servo
      Servo_Position = Storage[i] % 100; // Trouve position servo
      switch(Servo_Number) 
      { 
        case 0:
          Servo_0.write(Servo_Position);
          break;
        case 1:
          Servo_1.write(Servo_Position);
          break;
        case 2:
          Servo_2.write(Servo_Position);
          break; 
        case 3:
          Servo_3.write(Servo_Position);
          break;
        case 4:
          Servo_4.write(Servo_Position);
          break;
      }
      delay(50);
    }
  }
}

Une fois le code prêt, téléversez-le sur la carte Arduino.

Le bras intelligent est prêt à fonctionner. Le mouvement n'est pas encore aussi fluide que celui de Stoerpeak.

Si vous pouvez améliorer le code ou avez des suggestions, faites-le moi savoir dans les commentaires.

Étape 5 : Test

Après avoir téléversé le code avec succès, ouvrez le 'Moniteur Série' (dans Outils). Au démarrage du moniteur, l'Arduino redémarre. Vous pouvez maintenant contrôler le bras robotique avec le bras maître, mais rien n'est enregistré.

Pour commencer l'enregistrement, tapez 'R' dans le moniteur, puis effectuez les mouvements souhaités.

Une fois les mouvements terminés, tapez 'P' pour lire les mouvements enregistrés. Les servos continueront à exécuter la séquence tant que la carte n'est pas réinitialisée.

J'espère que le projet vous plaira. Merci !

Code (Fichiers Séparés)

Le code est également fourni en plusieurs extraits pour une meilleure lisibilité :

Schémas

Construisez un Bras Robotique Intelligent Contrôlé par Arduino : Tutoriel DIY Facile

Processus de fabrication

  1. Système de pointage RFID fiable avec Arduino et Python (base de données phpMyAdmin)
  2. Construire une télécommande Android universelle avec Arduino, 1Sheeld et contrôle IR
  3. Construire un Voltmètre Intelligent avec Arduino et Smartphone – Projet DIY Facile
  4. Contrôle IoT à Distance d'un Bras Robotique Personnalisé avec Arduino MKR1000
  5. Bocal Intelligent IoT avec ESP8266, Arduino et Capteur Ultrasonique – Surveillance Temps Réel
  6. Mesure Précise de Fréquence et Rapport Cyclique avec Arduino UNO
  7. Construire un bras robotique 3D fonctionnel piloté par Arduino – Guide pas à pas
  8. Chaussures auto-laçantes intelligentes avec récupération d'énergie piézoélectrique
  9. Serrure connectée WiFi avec Arduino et ESP8266 – Déverrouillage par smartphone