Projekt 23: Nachbau eines Roboters "LittleArm"

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

Autoren: Joseph Balmer und Fabian Linnemann

Betreuer: Prof. Dr. Mirek Göbel

(Abb.1) LittleArmBig [1]

Einleitung

Der folgende Artikel befasst sich mit dem Projekt 23: Nachbau eines Roboters "LittleArm" des GET-Fachpraktikums, welches im fünften Semester des Studiengangs Mechatronik an der Hochschule Hamm-Lippstadt bearbeitet wurde.


Aufgabenstellung

Das Projekt befasste sich mit der Entwicklung und dem Aufbau eines interaktiven 6-Achs-Roboter (Abb.1). Erwartungen der Projektlösung waren dabei:

  • Recherche bisheriger Lösungen
  • Entwurf der Schaltung, Konstruktion des Tischaufbaus und Beschaffung der Bauteile inkl. 3D-Druck
  • Realisierung der Schaltung durch Fertigung eines prototypischen Arduino-Uno-Shields
  • Programmierung und Visualisierung
  • Erstellen eines Videos
  • Test und wissenschaftliche Dokumentation

Projektplan

Folgender Abschnitt listet unsere zuvor geplante Durchführung des Projektes auf. Die Punkte sind dabei als einzelne Schritte zu sehen.

  1. Recherche
  2. Besorgen der Materialien
  3. CAD-Zeichnung des Roboters
  4. 3D-Druck der Einzelkomponenten
  5. Montage der Einzelteile
  6. Suchen/Erstellen eines Programmes
  7. Simulieren der Funktionen
  8. Testen des Roboters
  9. Anpassen des Programmes oder des Roboters
  10. Test des Roboters
  11. Mögliche optische Anpassungen
  12. Dokumentation

Einkaufsliste/Bill of Material(BOM)

Folgende Liste zeigt die für das Projekt verwendeten Materialen an.

Pos. Anzahl Bauteil Quelle Stückpreis in €
1 3 Tower Pro Micro Servo Motor MG90S littlearmrobot.com ~ 4,15 (4,99$)
2 3 Tower Pro Digi High Speed Servo Motor MG995 littlearmrobot.com ~ 8,20 (9,99$)
3 1 Arduino Uno Rev3 arduino.cc 20,00
4 1 LittleArm Big 3D CAD-Zeichnung littlearmrobot.com ~ 16,40 (20,00$)


Bauteile

Mechanische Komponenten

Bei den mechanischen Komponenten des LittleArm handelt es sich um eine Basis, ein Schultergelenk, einen Oberarm, eine Manschette, einen Ellenbogen und einen Greifer inklusive Gelenk. Im folgenden Absatz werden jeweilige Teile kurz dargestellt und beschrieben.


(Abb.2) Basis [2]

Basis

Bei der Basis (Abb.2) handelt es sich um die Grundfläche des LittleArm. Diese ist mit einem Tower Pro Digi High Speed MG995 Servo Motor ausgestattet welche den Arm bei Bedarf um 120° drehen kann, 60° in jede Richtung. Außerdem befinden sich in der Basis, Löcher in welche man Saugnäpfe befestigen kann damit der LittleArm stabil auf Oberflächen stehen kann.




(Abb.3) Schultergelenk [3]

Schultergelenk

Das Schultergelenk (Abb.3) ist die Verbindungskomponente zwischen der Basis und dem Oberarm. Das Schultergelenk ist mit der Basis via dem Tower Pro Digi High Speed MG995 Servo Motor verbunden und kann sich um 120° drehen. Außerdem verbindet ein weiterer Tower Pro Digi High Speed MG995 Servo Motor den Oberarm mit dem Schultergelenk. Der Motor hat dann auch die Möglichkeit den Oberarm um 120° vertikal zu bewegen.





(Abb.4) Oberarm [4]

Oberarm

Der Oberarm (Abb.4) ist ein mechanische Bauteil welches fast ausschließlich aus einem langen Quader besteht. Dieses fasst Motoren und Kabel. Der Oberarm ist für die vertikale Höhe des LittleArm zuständig. In dieser Komponente befinden sich zwei Tower Pro Digi High Speed MG995 Servo Motoren, einer verbindet, wie zuvor beschrieben den Oberarm mit dem Schultergelenk und der andere Motor steuert den Ellenbogen.






(Abb.5) Ellenbogen [5]

Ellenbogen

Der Ellenbogen (Abb.5) befindet sich zwischen dem Oberarm und der Manschette. Er ist in der Lage sich um 120° zu bewegen und steuert auch die vertikale Bewegung des LittleArm. Er ist durch eine Klebverbindung an der Manschette befestigt.





(Abb.6) Manschette [6]

Manschette

Die Manschette (Abb.6) ist ähnlich wie das Schultergelenk ein Verbindungsstück zwischen dem Greifmechanismus und dem Rest des LittleArm. Die Manschette ist via Klebeverbindung an dem Ellenbogen und durch den Tower Pro Micro Servo Motor MG90S mit dem Greifgelenk verbunden.






(Abb.7) Greifgelenk [7]

Greifgelenk

Das Greifgelenk (Abb.7) wird durch den Tower Pro Micro Servo Motor MG90S an der Manschette befestigt und hat dadurch die Möglichkeit sich um 180° zu drehen, 90° in jede Richtung. Am Greifgelenk wird unter anderem der Greifer montiert, welcher auch mit einem Tower Pro Micro Servo Motor MG90S gesteuert wird.






(Abb.8) Greifer [8]
(Abb.9) Finger [9]

Greifer

Der Greifer besteht aus drei Einzelteilen:

  • Hand
  • Finger
  • Finger mit Servo

Dabei ist die Hand mit dem Greifgelenk (Abb.8) verbunden und sorgt dafür, dass der LittleArm "um die Ecke" greifen kann. Durch den Tower Pro Micro Servo Motor MG90S ist die Winkeleinstellung von 180° möglich. Die Hand ist wiederum mit den zwei Fingern (Abb.9) verbunden, wobei einer durch einen weiteren Tower Pro Micro Servo Motor MG90S angesteuert wird. Da die Finger durch Zahnräder verbunden sind, können diese Objekte greifen und loslassen.










(Abb.10) Fritzing Skizze [10]

Elektrische Komponenten

Wie die Motoren mit dem Arduino verbunden sind kann man in der Anschlusstabelle nachschauen. Dabei wird kurz erläutert welcher Motor auf welchen Pin gesteckt wird.


(Abb.11) Tower Pro Digi High Speed Servo Motor MG995 [11]
(Abb.12) Tower Pro Micro Servo Motor MG90S [12]

Tower Pro Digi High Speed Servo Motor MG995

Bei dem Tower Pro Digi High Speed Servo Motor MG995 [13] (Abb.11) handelt es sich um einen Servo Motor der Marke Tower Pro. Der Servomotor ist auf einen Winkel von 60° je Richtung begrenzt und kann somit einen Winkel von 120° abdecken. Der Motor wird durch den Arduino auf 5V betrieben, da er eine Betriebsspannung von 4.8V bis 7.2V hat.

Tower Pro Micro Servo Motor MG90S

Bei dem Tower Pro Micro Servo Motor MG90S [14] (Abb.12) handelt es sich um einen Servo Motor der Marke Tower Pro. Der Servomotor ist auf einen Winkel von 90° je Richtung begrenzt und kann somit einen Winkel von 180° abdecken. Der Motor wird durch den Arduino auf 5V betrieben, da er eine Betriebsspannung von 4.8V bis 6V hat.

Anschlusstabelle der Motoren

Motor PIN/Anschluss GND 5V
M995 (Basis) ~3 x x
M995 (Schulter) ~5 x x
M995 (Ellenbogen) ~6 x x
M90S (Manschette) ~9 x x
M90S (Greifer) ~10 x x
M90S (Finger) ~11 x x


(Abb.13) Anschlüsse des M995 Servo Motors [15]

Bei den Anschlüssen, die mit "~" gekennzeichnet sind handelt es sich um PWM Anschlüsse. Bei PMW (engl. für Pulse Width Modulation) handelt es sich um eine Pulsweitenmodulation. Dies bedeutet, dass die Motoren durch schnelles An- und Ausschalten unterschiedlich schnell drehen können. Einen Ein-und Ausschalt-Durchlauf bezeichnet man als Periode.








(Abb.14) Grafische Oberfläche [16]

Programm

Um den LittleArm anzusteuern steht eine Software [Download] der Firma LittleBots zur Verfügung. Diese bietet eine Grafische Oberfläche (Abb.14) um den LittleArm zu steuern oder Bewegungen aufzunehmen und abzuspielen. Zusätzlich ist der Einblick in den Quellcode möglich, wobei man diesen bearbeiten kann um zum Beispiel die Anschlusspins der Motoren zu ändern. Programm und Quellcode sind Open-Source und stehen frei zur Verfügung.







Quellcode:

// LittleArm 2C arduino code
// Allows serial control of the LittleArm Big 3D printed robot arm so that it can commmunicate with the Android or Windows App
// Designed for Arduino Nano with Meped Board
// Created by Slant Concepts

#include <Servo.h>  //arduino library
#include <math.h>   //standard c library


Servo baseServo;  
Servo shoulderServo;  
Servo elbowServo; 
Servo wristRotServo;
Servo wristFlexServo;
Servo gripperServo;

struct jointAngle{
  int base;
  int shoulder;
  int elbow;
  int wRot;
  int wFlex;
};

struct jointAngle desiredAngle; //desired angles of the servos

int desiredGrip;
int gripperPos;
int command;
int desiredDelay;

int servoSpeed = 15;
int ready = 0;

//+++++++++++++++FUNCTION DECLARATIONS+++++++++++++++++++++++++++
int servoParallelControl (int thePos, Servo theServo );
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

void setup()
{ 
  Serial.begin(9600);
  baseServo.attach(3);        // attaches the servo on pin 3 to the servo object 
  shoulderServo.attach(5);
  elbowServo.attach(6);
  wristRotServo.attach(9);
  wristFlexServo.attach(10);

  gripperServo.attach(11);
  
  Serial.setTimeout(50);      //ensures the the arduino does not read serial for too long
  Serial.println("started");
  //baseServo.write(90);        //intial positions of servos
  //shoulderServo.write(100);
  //elbowServo.write(110);
  ready = 0;
} 

//primary arduino loop
void loop() 
{ 
  if (Serial.available()){
    ready = 1;
    desiredAngle.base = Serial.parseInt();
    desiredAngle.shoulder = Serial.parseInt();
    desiredAngle.elbow = Serial.parseInt();
    desiredAngle.wRot = Serial.parseInt();
    desiredAngle.wFlex = Serial.parseInt();
    desiredGrip = Serial.parseInt();
    desiredDelay = Serial.parseInt();

    if(Serial.read() == '\n'){              // if the last byte is 'd' then stop reading and execute command 'd' stands for 'done'
        Serial.flush();                     //clear all other commands piled in the buffer
        Serial.print('d');                  //send completion of the command
    }
  }
  
  int status1 = 0;
  int status2 = 0;
  int status3 = 0;
  int status4 = 0;
  int status5 = 0;
  int status6 = 0;
  int done = 0 ; 
  
  while(done == 0 && ready == 1){  
    //move the servo to the desired position
    status1 = servoParallelControl(desiredAngle.base, baseServo, desiredDelay);
    status2 = servoParallelControl(desiredAngle.shoulder,  shoulderServo, desiredDelay);
    status3 = servoParallelControl(desiredAngle.elbow, elbowServo, desiredDelay);
    status4 = servoParallelControl(desiredAngle.wRot, wristRotServo, desiredDelay); 
    status5 = servoParallelControl(desiredAngle.wFlex, wristFlexServo, desiredDelay);       
    status6 = servoParallelControl(desiredGrip, gripperServo, desiredDelay);  
    
    if (status1 == 1 & status2 == 1 & status3 == 1 & status4 == 1 & status5 ==1 & status6 == 1){
      done = 1;
    }      
  }// end of while
}

//++++++++++++++++++++++++++++++FUNCTION DEFINITIONS++++++++++++++++++++++++++++++++++++++++++

int servoParallelControl (int thePos, Servo theServo, int theSpeed ){
  
    int startPos = theServo.read();        //read the current pos
    int newPos = startPos;
    //int theSpeed = speed;
    
    //define where the pos is with respect to the command
    // if the current position is less that the actual move up
    if (startPos < (thePos-3)){
       newPos = newPos + 1;
       theServo.write(newPos);
       delay(theSpeed);
       return 0;
           
    }
  
   else if (newPos > (thePos + 3)){
  
      newPos = newPos - 1;
      theServo.write(newPos);
      delay(theSpeed);
      return 0;
          
    }  
    
    else {
        return 1;
    }  
   
} //end servo parallel control


Ergebnis

  • Beschaffung der Bauteile
  • CAD-Zeichnung
  • Komponenten des Armes im Druck
  • Realisierung einer Schaltung
  • Programmierung und Visualisierung

Fazit

Vorerst ist anzumerken, dass die komplette Vervollständigung des Projektes nicht durchführt werden konnte, dies ist mit Sicherheit einer fehlerhaften Zeitplanung zuzuschreiben. Die Hürde bei dem Projekt war dabei, dass keiner der Studenten, Erfahrungen mit Projektplänen hatte und der zeitliche Aufwand stark unterschätzt wurde. Des Weiteren waren die nötigen Materialien nicht auf Rechnung bestellbar, weswegen die Bauteile, bis auf den noch in Arbeit befindenden 3D-Druck, privat besorgt wurden. Erstellung und die Arbeit mit den Programmen fand nicht auf praktischer Basis statt, da ein Zusammenspiel der Hard-und Software nicht möglich war.

Zum vervollständigen des Projektes fehlt noch der fertige 3D-Druck, mit möglichen Änderungen, die Montage des fertigen LittleArm, der Test mit der zugehörigen Software und dem dementsprechenden Finetuning.


Weiters Vorgehen

Nachdem der 3D-Druck erfolgt ist wird der LittleArm montiert und die nötigen Programme getestet. Des weiteren könnten Sensoren angeschlossen werden um den Arm zu steuern [Video]. Eine weitere Möglichkeit, welche denkbar wäre ist die Verbindung zu einer Kinect-Kamera mit Gestenerkennung [Projekt15: Gestenerkennung der Kinect zur Ansteuerung von LED, Servos u.s.w. aus dem WS 17/18: Fachpraktikum Elektrotechnik (MTR)] und die darauf folgende Gestensteuerung.


Persönliche Reflektion

Was wir persönlich aus der Projekt mitgenommen haben ist, dass mehr Wert auf die Komponente der Zeit bei der Projektplanung zu legen ist. Dadurch dass wir die Dauer des 3D-Drucks unterschätzen war es wie zuvor erwähnt nicht möglich den Arm zu montieren und ihn in der Praxis zu testen. Dies werden wir in folgenden Projekten berücksichtigen und uns besser vorbereiten. Es gibt viele Möglichkeiten das Projekt auszubauen oder neue zu bearbeiten.


Weblinks

Website Little Bots

Website Arduino

Website Hochschule Hamm-Lippstadt

Website Tower Pro

YouTube Video

t.b.a. (wird bei Vollendung des LittleArm gedreht)

Korrektur/Rückmeldungen

Literaturverzeichnis