6-Achsen Roboterarm mit ATMega328 und Servomotoren

Dieser Beitrag wurde uns von unserem Gastautoren Miguel Torres Gordo zugesandt. Viel Spaß beim Lesen und Nachbauen:

Es hat mich schon immer fasziniert, die Bewegungen von Roboterarmen zu sehen, wenn sie alle möglichen Arbeiten ausführen. Ihre Bewegungen sind präzise und kontinuierlich, als wäre ich in einem Tanzkurs. Diese Industrieroboter verfügen über leistungsstarke Motoren und spezielle elektronische Schaltungen, um die Bewegungen nach programmierten Koordinaten zu steuern. Wäre es möglich, einen kleinen Roboterarm mit einfachen elektronischen Modulen und Komponenten zu bauen?

Das Hauptproblem ist das Gewicht der Struktur des Roboterarms und der Aktuatoren, die ihn bewegen sollen. Idealerweise sollte die Struktur aus Metall sein und die Aktuatoren müssten Schrittmotoren sein, aber dieses Set ist schwer und teuer. Die Frage ist: Könnte man es mit Servomotoren machen?

Wir müssen nach einem Material suchen, das nicht sehr schwer und kostengünstig ist. Für Intarsien (Einlegearbeiten) wird Balsaholz verwendet, das nicht schwer und trotzdem widerstandsfähig ist. So ist es möglich, dass die Servomotoren das Set bewegen, wobei dort bereits die Elektronik zur Steuerung integriert ist. Wir werden einen Roboterarm entwickeln, der Teile mit einem Greifer aufnimmt und sie an einem anderen Ort ablegt.

Die für dieses Projekt benötigten Materialien sind:

Die erforderliche Software ist:

Der erste Schritt besteht darin, die Struktur unseres Roboterarms aus 3 mm dickem Balsaholz zu entwerfen. Damit die verschiedenen Teile unseres Roboters das Gewicht des nächsten Teils aushalten können, müssen wir die Dicke dieser Teile erhöhen, indem wir mehrere gleiche Stücke verleimen (das Gewicht steigt nicht sehr stark an, wie Sie bemerken werden). Um die Bewegungen der Servomotoren zu unterstützen, müssen wir die Gewichte der Arme ein wenig ausgleichen, wobei wir das Gewicht des Arms am anderen Ende berücksichtigen.

Zeichnungen als ZIP-Download (im neuen Fenster rechts oben auf "Herunterladen" klicken)

Für den Betrieb unseres Roboterarms ist es sehr wichtig, die Pulsbreitendaten der Servomotoren zu kennen, um den minimalen und maximalen Winkel mit den Einstellsketches zu positionieren und den Roboterarm in die gewünschte Position zu bringen. Laut Datenblatt dreht sich der MG995-Servomotor um 120 Grad, während die MG90S- und SG90-Servomotoren um 180 Grad drehen. Um die erforderlichen Impulsbreitendaten zu ermitteln, verwenden wir die Sketches Servo_check_120_degrees_slow_motion.ino und Servo_check_180_degrees.ino und einen Winkelmesser, wie in der Zeichnung gezeigt.

Die beiden Sketches sind sich sehr ähnlich, deshalb werden wir die wichtigsten Zeilen einer der beiden Skizzen erläutern. Die folgenden Zeilen gehören zur Skizze der MG995-Servomotoren. Die ersten beiden Zeilen, die wir analysieren, sind die Mindest- und Höchstwerte der Impulsbreite für jeden Servomotor, die den Positionen 0 Grad und 180 Grad entsprechen.

 #define SERVOMIN  100         // This is the 'minimum' pulse length count (out of 4096)
 #define SERVOMAX 500         // This is the 'maximum' pulse length count (out of 4096)

In den folgenden Zeilen erstellen wir zwei Schleifen, in denen wir die rot markierten Daten ändern müssen, um den Servomotor zwischen 30 Grad und 150 Grad zu positionieren. In diesem Fall erhalten wir die 120 Grad, mit denen der MG995 arbeitet. Die Bewegung erfolgt langsam mit 10 "Schritten" alle 50 Millisekunden von 30 Grad bis 150 Grad. Wir müssen diese Prozeduren mit allen Servomotoren, die wir verwenden werden, durchführen und die entsprechenden Werte für jeden einzelnen aufschreiben, da dies die Werte sind, zwischen denen er arbeitet, um sich zu positionieren.

for (int pos=165; pos<430; pos +=10) {       // Loop with movement slow from 30
  degrees to 150 degrees
  pwm.setPWM(0, 0, pos );
  Serial.println("165 pulse length count --> 30 degrees");
  delay(50);
}
delay (5000);

for (int pos_m=430; pos_m>165; pos_m -=10) {   // Loop with movement slow from 150
  degrees to 30 degrees
  pwm.setPWM(0, 0, pos_m );
  Serial.println("430 pulse length count --> 150 degrees");
  delay(50);
}
delay (5000);

Montage

Sobald wir die minimalen und maximalen Impulswerte für den minimalen und maximalen Arbeitswinkel jedes Servomotors haben, ist es an der Zeit, alles zusammenzubauen. Um den Zusammenbau ordnungsgemäß durchzuführen, können Sie wie folgt vorgehen:

    1. Wir beginnen die Montage an dem Greifer, wobei dieser geschlossen und der Servomotor um 90 Grad gedreht ist.

    2. Der nächste Servomotor ist Nummer 1, mit der Position bei 0 Grad und dem Greifer in der Position, die auf dem Foto zu sehen ist, da die Drehung um 180 Grad im Uhrzeigersinn erfolgt.

    3. Der dritte Servomotor ist Nummer 2, der sich, wie der vorherige, in der 0-Grad-Position befindet und den Greifer senkrecht nach oben bewegt, da er sich ebenfalls im Uhrzeigersinn dreht, um sich in Richtung 180 Grad zu bewegen.

    4. Jetzt ist der Servomotor Nummer 3 an der Reihe, die Position des Servomotors belassen wir in diesem Fall bei 90 Grad und den Arm montieren wir in einer Linie mit dem nächsten, da wir so 60 Grad Bewegung in jede Richtung haben.

    5. Für den Servomotor Nummer 4 belassen wir die Position bei 90 Grad und den Arm montieren wir horizontal (parallel zum Boden), wodurch wir wie beim vorherigen Servomotor einen großen Aktionsradius mit 60 Grad in jede Richtung haben.

    6. Den letzten Servomotor, Nummer 5, lassen wir wie den vorherigen auf 90 Grad stehen und montieren die Drehplattform so, dass sich der Rest des Arms in der Mitte der Seitenkante der Basis befindet.

    Schaltung und Beschreibung der Funktionsweise

    Wie Sie im Schaltplan sehen können, ist die Schaltung sehr einfach. Wir haben den Mikrocontroller, das PCA9685 Modul und die 6 Servomotoren.

    Die elektrischen Anschlüsse der Servomotoren an die PCA9685-Baugruppe werden entsprechend der Nummerierung des Servomotors mit der Nummer des entsprechenden PWM-Ausgangsports auf der Baugruppe verbunden, d.h. Servomotor Nummer 0 mit Ausgangsport 0.

    Die 5V-Gleichstromversorgung wird an den grünen Schraubverbinder des Treiberboards angeschlossen, wobei auf die Polarität zu achten ist, da die Servomotoren über diesen Anschluss versorgt werden.

    Die Verbindungen zwischen dem Atmega328P-Mikrocontroller und dem PCA9685-Modul sind die I2C-Kommunikation über seinen Port und die 5V für die Spannungsversorgung der Modulelektronik.

    Die sechs Servomotoren werden vom Atmega328P-Mikrocontroller über das PCA9685-Modul gesteuert, das zwei wichtige Funktionen hat. Die erste besteht darin, die Servomotoren mit 5V von einer externen Stromversorgung mit genügend Leistung zu versorgen, um die 6 Servomotoren gleichzeitig zu bewegen. Die zweite besteht darin, das PWM-Signal zum jeweiligen Servomotor zu schicken, das über das I2C-Signal vom Mikrocontroller übermittelt wurde. Wie im Diagramm oben zu sehen ist, benötigen wir nur 2 Pins für die Kommunikation zwischen dem Mikrocontroller und dem PCA9685-Modul, wobei die anderen Pins für andere Verwendungen übrigbleiben.

    Der wirklich mühsame Teil dieses Projekts ist die Einstellung der Werte für jede Position des Arms und der Geschwindigkeiten der Bewegungen. Letzteres muss langsamer werden, wenn der Arm einen Gegenstand aufheben soll.

    Für die Einstellung und Bewegung des Roboterarms in jeder Stufe wurde je ein Sketch pro Stufe erstellt. Damit lassen sich die Einstellungen einzeln vornehmen. Wenn wir alle Einstellungen richtig vorgenommen haben, werden wir sie alle in einem einzigen Sketch zusammenfassen. Dabei werden wir Methoden/Funktionen verwenden, so dass der Code sauberer und einfacher zu verfolgen ist. Analysieren Sie den Code für eine Stufe und Sie werden sehen, dass er sehr einfach ist. Für die übrigen Stufen ist die Anpassungsmethode ähnlich.

    Der Code, den wir analysieren werden, sind die Einstellungen für den Roboterarm, um das erste Teil aufzunehmen. Der Sketch heißt pick_up_first_object.ino.

    Die ersten beiden Zeilen des Codes sind die Bibliotheken, die wir benötigen, damit der Sketch korrekt läuft. Wire.h ist für die I2C-Kommunikation und Adafruit_PWMServoDriver ist für die Verwendung des PCA9685-Moduls zuständig.

    #include <Wire.h>

    #include <Adafruit_PWMServoDriver.h>

     

    Die nächsten 4 Zeilen sind der Reihe nach die Implementierung eines Adafruit_PWMServoDriver-Objekts zur Steuerung der Servomotorpositionen, SERVOMIN und SERVOMAX sind die Werte der steigenden Flanke und der fallenden Flanke für die 0-Grad- bzw. 180-Grad-Position der Servomotoren. Die Geschwindigkeitsvariable wird für die Wartezeit bis zur Bewegung des nächsten Servomotors verwendet.

    Adafruit_PWMServoDriver pca9685 = Adafruit_PWMServoDriver();

     

    #define SERVOMIN  100             

    #define SERVOMAX  500            

     

    int velocidad = 450;

     

    Die nächsten 4 Zeilen sind der Reihe nach die Implementierung eines Adafruit_PWMServoDriver-Objekts zur Steuerung der Servomotorpositionen, SERVOMIN und SERVOMAX sind die Werte der steigenden Flanke und der fallenden Flanke für die 0-Grad- bzw. 180-Grad-Position der Servomotoren. Die Geschwindigkeitsvariable wird für die Wartezeit bis zur Bewegung des nächsten Servomotors verwendet.In der setup() -Methode initialisieren wir den seriellen Monitor und geben eine Nachricht aus. In den nächsten beiden Zeilen initialisieren wir das PCA9685-Modul mit Hilfe seines zuvor implementierten Objekts und geben die Frequenz an, mit der die Servomotoren arbeiten, nämlich 50 Hz.

    In der setup()-Methode initialisieren wir den seriellen Monitor und geben eine Nachricht aus. In den nächsten beiden Zeilen initialisieren wir das PCA9685-Modul mit Hilfe seines zuvor implementierten Objekts und geben die Frequenz an, mit der die Servomotoren arbeiten, nämlich 50 Hz.

    void setup() {

       Serial.println("Ajusting to Pick up first object");

     

       pca9685.begin();

       pca9685.setPWMFreq(50);

     

    }


    Jetzt implementieren wir die loop()-Methode Hier beginnen wir mit den Einstellungen für jeden der Servomotoren, die für die Ausführung der Bewegung agieren müssen. Wir beginnen mit dem ersten Servomotor, den wir bewegen wollen. Servomotor 5 ist derjenige, der den Roboterarm dreht. Mit der Funktion pca9685.setPWM(5, 0, 350) geben wir dem PCA9685-Modul an, dass es den Motor 5 in die Position bewegen soll, die sich aus der Subtraktion des Wertes der steigenden Flanke (0) von der fallenden Flanke (350) ergibt, und mit der Funktion delay(velocidad ) warten wir 450 Millisekunden, um die nächste Funktion des folgenden Servomotors auszuführen.

    void loop() {

     

           // Servomotor 5

           pca9685.setPWM(5, 0, 350);

           delay(velocidad);

     

    Die nächsten beiden Funktionsaufrufe führen die Bewegungen der Servomotoren 4 und 2 aus. Die Ausführung ist ähnlich wie bei der vorhergehenden Funktion, zuerst den Servomotor 4 bewegen, 450 Millisekunden warten und nach dieser Zeit den Servomotor 2 an die Position der Differenz zwischen der steigenden und der fallenden Flanke bewegen.

           // Servomotor 4

           pca9685.setPWM(4, 0, 210);

           delay(velocidad);

     

           // Servomotor 2

           ca9685.setPWM(2, 0, 405);

           delay(velocidad);

    Die folgenden zwei Funktionen führen die Bewegungen der Servomotoren 3 und 2 aus. Erklären wir, warum wir dafür Schleifen implementiert haben. Die Bewegung der vorherigen Servomotoren erfolgt mit der normalen Geschwindigkeit, die sehr abrupt ist. Um das Gefühl einer langsamen Geschwindigkeit zu vermitteln, haben wir eine Schleife implementiert, in der sich der Servomotor alle 10 Millisekunden um einen "Schritt" von der Startposition (150) der Variablen pos bis zu ihrer Endposition (180) des Servomotors 3 bewegt. Die tatsächliche Bewegung ist eine intermittierende Bewegung, aber da die Wartezeit zwischen den einzelnen Bewegungen nur 10 Millisekunden beträgt, vermittelt die Bewegung ein Gefühl der Kontinuität bei geringer Geschwindigkeit. Da die Bewegung dadurch glatt ist, hilft sie uns, eine gute Präzision zu erreichen.

           // Servomotor 3

           for (int pos=150; pos<180; pos +=1) {

               pca9685.setPWM(3, 0, pos);

               delay(10);

           }

     

           // Servomotor 2

           for (int pos=405; pos>350; pos -=1) {

                 pca9685.setPWM(2, 0, pos);

                 delay(10);

           }

     

    Die Entwicklung der letzten beiden Funktionen, die die Servomotoren 1 und 0 (Greifer) bewegen, ist ähnlich wie oben beschrieben. Der Servomotor 1 bewegt sich mit normaler Geschwindigkeit und der Servomotor 0, der den Greifer darstellt, schließt ihn mit langsamer Geschwindigkeit, da er sich in einer Schleife befindet.

           // Servomotor 1

           pca9685.setPWM(1, 0, 300);

           delay(velocidad);

     

           // Servomotor 0

           for (int pos=200; pos>166; pos -=1) {

               pca9685.setPWM(0, 0, pos);

               delay(10);

           }

     

    Die letzte Wartezeit in einigen der einzelnen Sketches beträgt 60 Sekunden, da es sich um Bewegungen innerhalb von Schleifen handelt, die kontinuierlich ausgeführt werden. Auf diese Weise können wir überprüfen, welche Koordinaten in welchen Positionen korrekt sind, und wir können die Werte der Variablen pos jedes Servomotors so anpassen, dass der Roboterarm an den gewünschten Koordinaten positioniert ist.

           delay(60000);

    }


    Um die Einstellung an jeder Stufe vorzunehmen, müssen wir den entsprechenden Sketch ausführen und die Werte der pos-Variablen der einzelnen Servomotoren variieren, bis der Roboterarm die gewünschte Position erreicht hat.

    Der vorbereitete Sketch robot_arm.ino führt eine Bahn aus, die von einer Sicherheitsposition ausgeht, zwei Teile bewegt und zur Sicherheitsposition zurückkehrt. Ich habe versucht, die Programmierung dieser Skizze so weit wie möglich zu vereinfachen. Deshalb habe ich den Code für jeweiligen Stufen als separate Sketches hinterlegt und sie in der loop()-Methode des robot_arm.ino-Sketches mit den gleichen Namen als Funktionen programmiert. So wissen wir jederzeit, in welcher Position sich unser Roboterarm befindet.

    Wenn die Servomotoren an das Modul PCA9685 angeschlossen sind und dieses mit Spannung versorgt wird, behalten die Servos die Position bei, in der sie sich befinden. Das habe ich ausgenutzt, um die Anzahl der Funktionen in einigen Stufen zu reduzieren. Wenn wir in der vorherigen Stufe einen Servomotor in einer Position haben und die nächste die gleiche ist, brauchen wir nicht zu wechseln, so dass wir die letztere eliminieren, da sie die Position beibehält, die sie vorher hatte.

    Ich wünsche Ihnen viel Spaß mit diesem Projekt.

    Miguel Torres Gordo

    Per arduino.Progetti per principianti

    19 Kommentare

    Sönke Friedrichs

    Sönke Friedrichs

    Die Zeichnungen am PC für die Roboterbauteile nehmen Form an ….
    Wenn diese fertig sind werde ich sie mit einem 3D- Drucker ausdrucken und die Ergebnisse über Herrn Wolter an Herrn Gordo weiterleiten.
    Dann sehen wir weiter, wie wir das mit den Dateien oder den Drucken machen ….

    WETTERENE

    WETTERENE

    https://www.thingiverse.com/thing:5198230

    WETTERENE

    WETTERENE

    merci pour le schéma, j’attend les moteurs et je mets les stl sur thingeverse

    Andreas Wolter

    Andreas Wolter

    Der Autor des Beitrags hat freundlicherweise in einer der PDFs die Maße des Greifers ergänzt. Die PDF-Datei wurde in der verlinkten ZIP-Datei ausgetauscht.

    Grüße,
    Andreas Wolter
    AZ-Delivery Blog

    Günter Keilhammer

    Günter Keilhammer

    @Sönke Friedrichs: hatte eine ähnliche Idee; falls möglich wäre super, wenn man die STL Files bekommen könnte?

    WETTERENE

    WETTERENE

    bonjour, serait-il possible d’avoir les mesures pour dessiner la pince
    svp
    je suis en train de dessiner les pièce avec Fusion 360
    ce projet est super

    Andreas Wolter

    Andreas Wolter

    um die Zeichnungen herunterzuladen, klicken Sie auf “Zeichnungen als Download”. Es sollte sich dann Google Drive öffnen und die Dateien in der ZIP aufgelistet werden. Sie können dann rechts oben auf den “Herunterladen”-Button klicken. Sier erhalten darüber alle PDFs als eine ZIP-Datei, die Sie auf Ihrem Rechner entpacken können.

    Die Videos werden zusätzlich bei Youtube hochladen. Dann sollte das Problem behoben sein. Es wird an dem Videocodec liegen, denke ich. Wenn dieser nicht installiert ist, kann man die Videos nicht abspielen.

    Was die ausverkauften Artikel angeht, können wir das leider nicht verhindern. Die Kollegen sind darum bemüht, den Bestand aufzufüllen. In einigen Fällen sind die Komponenten noch bei Amazon im AZ-Shop vorrätig. In diesem Fall jedoch nicht. Das tut uns leider.

    Wolfgang Menzel

    Wolfgang Menzel

    Hm, interessantes Projekt, wollte es eigenlich mit meinem Enkel realisieren. Leider sind die Motoren ausverkauft.
    Gruß

    Sönke Friedrichs

    Sönke Friedrichs

    @ Andreas Wolter, vielen Dank, habe die Zeichnungen gefunden !
    Ich zeichne die Bauteile gerade am PC.
    Zum Nachdrucken mit einem 3D- Drucker ….
    Vieleicht hat ja jemand Interesse daran ……
    Gerne würde ich hierzu auch mit Herrn Gordo in Kontakt treten :-)
    Ist das möglich ?? ( bin noch neu hier …… ;-) )

    Michael

    Michael

    Ich bekomme leider die Zeichnungsdateien nicht runter, kann sie auch nicht einsehen.

    mike

    mike

    videos gehen bei mir weder im firefox noch chromium unter LMDE 4/Linux

    Donboy

    Donboy

    Es gibt von mir sowas sehr ähnliches bereits zum 3D drucken unter : https://www.thingiverse.com/thing:597267 (siehe letztes Bild = Video) Der Trick ist es alle Servos gleichzeitig anzusteuern um somit anstatt jedem einzeln einen Winkel vorzugeben und abzuwarten, alle gleichzeitig zum Zielpunkt anlaufen zu lassen. Hier der relevante Code:

    #include
    #include
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

    #define SERVOMIN 240 // this is the ‘minimum’ pulse length count (out of 4096)
    #define SERVOMAX 470 // this is the ‘maximum’ pulse length count (out of 4096)

    uint8_t servonum = 7;
    int MOnPin = 7;
    int SOnPin = 8;
    int LOnPin = 1;
    boolean MOn = LOW;
    boolean SOn = LOW;
    float oS0;
    float oS1;
    float oS2;
    float oS3;
    float oS4;
    float oSC;

    void setup()
    {
    Serial.begin(9600);

    pinMode(SOnPin, OUTPUT); pinMode(MOnPin, OUTPUT); pinMode(LOnPin, OUTPUT); pwm.reset(); pwm.begin(); pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates digitalWrite(SOnPin, SOn); digitalWrite(MOnPin, MOn); InitArmPos(370, 500, 220, 200, 550, 700) ; ArmOn();

    }
    void loop() {
    // ( S0, S1, S2, S3, S4, SC, Stp, SetpDelay,Paus )
    MoveArm( 370, 500, 220, 200, 550, 700, 100, 2, 1000);
    MoveArm( 0 , 250, 470, 360, 0, 450, 100, 2, 1000);
    MoveArm( 200 , 0, 0, 200, 0, 450, 100, 2, 500);
    digitalWrite(LOnPin, HIGH);
    delay(500);
    MoveArm( 530, 0, 0, 0, 550, 0, 100, 2, 500);
    digitalWrite(LOnPin, LOW);
    MoveArm( 370, 0, 0, 0, 0, 0, 50, 1, 200);
    MoveArm( 0,500, 280, 220, 0, 650, 100, 2, 0);
    MoveTrack(80,80,500);
    MoveArm( 0, 430, 0, 360, 0, 550, 100, 2, 0);
    MoveTrack(-100,100,1000);
    MoveArm( 0, 0, 220, 440, 0, 450, 100, 2, 2000);
    MoveArm( 200, 0, 460, 200, 300, 0, 200, 5, 1000);
    MoveTrack(100,-100,1000);
    MoveArm( 530, 0, 0, 0, 0, 0, 50, 2, 1000);
    MoveArm( 200, 0, 0, 0, 0, 0, 50, 2, 500);
    MoveTrack(-80,-80,500);
    //delay(5000);
    }

    void TrackStop()
    {
    MoveTrack(0,0);
    }

    void ArmOn()
    {
    SOn= HIGH;
    digitalWrite(SOnPin, SOn);
    }

    void ArmOff()
    {
    SOn= LOW;
    digitalWrite(SOnPin, SOn);
    }

    void MoveTrack (int SL, int SR)
    {
    if ( SL !=0 || SR !=0)
    {
    MOn = HIGH;
    }
    else
    {
    MOn = LOW;
    }
    digitalWrite(MOnPin, MOn);
    pwm.setPWM(2, 0, 370 + SL);
    pwm.setPWM(1, 0, 370 – SR);
    }

    void MoveTrack (int SL, int SR, int pause)
    {
    MoveTrack (SL, SR);
    delay(pause);
    MoveTrack (0, 0);
    }

    void MoveArm(int nS0, int nS1, int nS2, int nS3, int nS4, int nSC, float duration, int delays, int pause)
    {
    float dS0 = (nS0 – oS0)/duration;
    float dS1 = (nS1 – oS1)/duration;
    float dS2 = (nS2 – oS2)/duration;

    float dS3 = (nS3 -oS3)/duration; float dS4 = (nS4 -oS4)/duration; float dSC = (nSC -oSC)/duration; for( int i=0 ; i<duration; i++) { if(nS0 > 0) { oS0 += dS0; pwm.setPWM(0, 0, oS0); } if (nS1 > 0) { oS1 += dS1; pwm.setPWM(4, 0, oS1); } if (nS2 > 0) { oS2 += dS2; pwm.setPWM(7, 0, oS2); } if (nS3 > 0) { oS3 += dS3; pwm.setPWM(3, 0, oS3); } if (nS4 > 0) { oS4 += dS4; pwm.setPWM(5, 0, oS4); } if (nSC > 0) { oSC += dSC; pwm.setPWM(6, 0, oSC); } Serial.print(oS0); Serial.print(“\t”); Serial.print(oS1); Serial.print(“\t”); Serial.print(oS2); Serial.print(“\t”); Serial.print(oS3); Serial.print(“\t”); Serial.print(oS4); Serial.print(“\t”); Serial.println(oSC); delay(delays); } delay(pause);

    }

    void InitArmPos(int nS0, int nS1, int nS2, int nS3, int nS4, int nSC)
    {
    digitalWrite(SOnPin, HIGH);
    delay(500);
    oS0 = nS0;
    oS1 = nS1;
    oS2 = nS2;
    oS3 = nS3;
    oS4 = nS4;
    oSC = nSC;
    pwm.setPWM(0, 0, oS0);
    pwm.setPWM(4, 0, oS1);
    pwm.setPWM(7, 0, oS2);
    pwm.setPWM(3, 0, oS3);
    pwm.setPWM(5, 0, oS4);
    pwm.setPWM(6, 0, oSC);
    delay(1000);
    digitalWrite(SOnPin, SOn);
    }
    Wer sich die Mühe macht, kann abhängig der Armlängen das ganze mathemathisch trigonometrisch in Relation stellen (Formeln) und dann als Zielkoordinaten (X,Y,Z) eingeben und der Arm positioniert sich ganu dort hin.

    Andreas Wolter

    Andreas Wolter

    @Sönke Friedrichs: die Zeichnungen sind als PDF Downloads verlinkt. Direkt unter der letzten Abbildung der Zeichnungen.

    Grüße,
    Andreas Wolter
    AZ-Delivery Blog

    Eugen Wirsing

    Eugen Wirsing

    Die Videos lassen sich herunterladen und mit z.B. VLC-Player abspielen.

    Sönke Friedrichs

    Sönke Friedrichs

    Ich bin 3D- Drucker …..
    Wenn mir jemand die Zeichnungen zukommen läßt …..
    Vieleicht sogar gleich als .stl …..
    Dann würde ich die Sperrholzteile drucken …..

    Andreas Wolter

    Andreas Wolter

    @Markus Pohle: ich habe es in Firefox unter Windows und Linux, sowie auf dem Smartphone getestet. Dort funktioniert es. Ich vermute, dass ein Videocodec fehlt, oder das Abspielen der Videos blockiert wird. Können Sie es auf anderen Geräten unter anderen Bedingungen nachvollziehen?

    Grüße,
    Andreas Wolter
    AZ-Delivery Blog

    Wolle

    Wolle

    Ein interessantes Projekt. Ich habe noch einen alten Plastik-Roboterarm. Vielleicht kann ich den nehmen und umrüsten.

    Markus Pohle

    Markus Pohle

    Schade, die Videos gehen nicht… ist das nur bei mir der Fall, da ich den Artikel über den Chrome Browser auf dem Handy schaue?

    Schill Gottfried

    Schill Gottfried

    einfach super
    danke für den Beitrag

    Einen Kommentar hinterlassen

    Alle Kommentare werden vor der Veröffentlichung moderiert

    Post di blog consigliati

    1. Installa ESP32 ora dal gestore del consiglio di amministrazione
    2. Lüftersteuerung Raspberry Pi
    3. Arduino IDE - Programmieren für Einsteiger - Teil 1
    4. ESP32 - das Multitalent
    5. OTA - Over the Air - Programmazione ESP tramite WLAN