- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 19

Thema: me-arm, 12bit servotreiber und ein joystick

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180

    me-arm, 12bit servotreiber und ein joystick

    hallo allerseits,

    ich habe mir den billig-robot-arm angeschafft, die Servos sollen über die 12bit-servo-treiber-platine betrieben werden, alles funktioniert in ansätzen:
    Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_20190219_5940.jpg
Hits:	13
Größe:	104,5 KB
ID:	34013
    der arm ruckelt aber ziemlich...
    Da Suche ich nun nach lösungsansätzen, dabei habe ich mir auch verschiedene beispiele aus der adafruit lib angeschaut, z.b. dieses hier:

    Code:
    /* meArm_Adafruit IK joysticks - York Hackspace May 2014
     * Using inverse kinematics with joysticks
     * Uses two analogue joystcks (two pots each)
     * First stick moves gripper forwards, backwards, left and right
     * Second stick moves gripper up, down, and closes and opens.
     * 
     * I used Sparkfun thumbstick breakout boards, oriented 'upside down'.
     * 
     * Pins:
     * Arduino    Stick1    Stick2   PWMServo  
     *    GND       GND       GND        GND
     *     5V       VCC       VCC   VCC & V+
     *     A0       HOR
     *     A1       VER
     *     A2                 HOR
     *     A3                 VER
     *     A4                            SDA
     *     A5                            SCL
     * 
     * The Servos attach to the first block of four servo connections on
     * the Adafruit board, brown wire at the bottom, yellow wire at the top.
     * Adafruit    Servo
     *       0      Base
     *       1  Shoulder (right)
     *       2     Elbow (left)
     *       3   Gripper
     *
     * You can attach to a different block of four by changing the 'begin' call
     * to specify a block 0-3, e.g. to use the second block call arm.begin(1);
     * - to mirror movements to all 4 blocks, call arm.begin(-1);
     */
    #include "meArm_Adafruit.h"
    #include <Adafruit_PWMServoDriver.h>
    #include <Wire.h>
    
    
    int xdirPin = 0;
    int ydirPin = 1;
    int zdirPin = 3;
    int gdirPin = 2;
    
    
    meArm arm;
    
    
    void setup() {
      arm.begin();
    }
    
    
    void loop() {
      float dx = map(analogRead(xdirPin), 0, 1023, -5.0, 5.0);
      float dy = map(analogRead(ydirPin), 0, 1023, 5.0, -5.0);
      float dz = map(analogRead(zdirPin), 0, 1023, 5.0, -5.0);
      float dg = map(analogRead(gdirPin), 0, 1023, 5.0, -5.0);
      if (abs(dx) < 1.5) dx = 0;
      if (abs(dy) < 1.5) dy = 0;
      if (abs(dz) < 1.5) dz = 0;
      
      if (!(dx == 0 && dy == 0 && dz == 0))
        arm.goDirectlyTo(arm.getX() + dx, arm.getY() + dy, arm.getZ() + dz);
      
      if (dg < -3.0)
        arm.closeGripper();
      else if (dg > 3.0)
        arm.openGripper();  
      delay(50);
    }
    die/den joystick (selbstgebaut) muss ich an die pins A0 bis A5 des arduino anschliessen um den sketch ausprobieren zu können. Wie man im bild sehen kann, hat der roboter schon einiges "onboard" und daher sind einige der arduino mega 2560 schon belegt, z.b. ein paar der im fraglichen sketch verwendeten (a0 und A3). Die hier verwendeten libs ( meArm_Adafruit.h bzw. Adafruit_PWMServoDriver.h) wie auch die *.cpp dateien habe ich mir angeschaut, ich finde einfach die stelle nicht wo die pins A0 bis A5 (aus dem sketch) abgefragt werden? Hat sich schon jemand damit beschäftigt?

    wäre super...
    gruß inka

  2. #2
    HaWe
    Gast
    Zitat Zitat von inka Beitrag anzeigen
    Wie man im bild sehen kann, hat der roboter schon einiges "onboard" und daher sind einige der arduino mega 2560 schon belegt, z.b. ein paar der im fraglichen sketch verwendeten (a0 und A3). Die hier verwendeten libs ( meArm_Adafruit.h bzw. Adafruit_PWMServoDriver.h) wie auch die *.cpp dateien habe ich mir angeschaut, ich finde einfach die stelle nicht wo die pins A0 bis A5 (aus dem sketch) abgefragt werden? Hat sich schon jemand damit beschäftigt?

    wäre super...
    Code:
    int xdirPin = 0;
    int ydirPin = 1;
    int zdirPin = 3;
    int gdirPin = 2;
    
    //...
    
    void loop() {
      float dx = map(analogRead(xdirPin), 0, 1023, -5.0, 5.0);
      float dy = map(analogRead(ydirPin), 0, 1023, 5.0, -5.0);
      float dz = map(analogRead(zdirPin), 0, 1023, 5.0, -5.0);
      float dg = map(analogRead(gdirPin), 0, 1023, 5.0, -5.0);
    
    
      //...


  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    und das hier?

    Code:
     *     A0       HOR
     *     A1       VER
     *     A2                 HOR
     *     A3                 VER
     *     A4                            SDA
     *     A5                            SCL
    ist das wirklich das gleiche?

    Code:
    int xdirPin = 0;
    int ydirPin = 1;
    int zdirPin = 3;
    int gdirPin = 2;
    gruß inka

  4. #4
    HaWe
    Gast
    kA, aber was soll analogRead anderes lesen als analoge Pins?
    Zugegeben, schon seltsam, dass xdirPin, ydirPin,... usw, als 0,1,... definiert werden und nicht als A0, A1,...

    PS,
    ebenfalls seltsam:
    Code:
     *     A4                            SDA
     *     A5                            SCL
    das gilt für den Uno, nicht aber für den mega2560.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    und das die anzahl nicht übereinstimmt...
    gruß inka

  6. #6
    HaWe
    Gast
    wieso, die Anzahl stimmt doch: A0...A3
    A4+A5 (für den Mega: fälschlich) als I2C Pins

    - - - Aktualisiert - - -

    ich könnte mir vorstellen, dass
    int xdirPin = 0;
    int ydirPin = 1;
    int zdirPin = 3;
    int gdirPin = 2;

    intern von der Lib auf A0...A3 "umgemapped" werden

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Hawe, es verwirrt nur, wenn du deine Antworten editiert ohne dass es erkennbar ist. Worauf soll man denn Antworten? Und du möchtest doch auch eine Antwort, oder?
    ps. Schnelligkeit ist nicht alles...

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von inka Beitrag anzeigen
    ...der arm ruckelt aber ziemlich...
    Code:
    void loop() {
      float dx = map(analogRead(xdirPin), 0, 1023, -5.0, 5.0);
      float dy = map(analogRead(ydirPin), 0, 1023, 5.0, -5.0);
      float dz = map(analogRead(zdirPin), 0, 1023, 5.0, -5.0);
      float dg = map(analogRead(gdirPin), 0, 1023, 5.0, -5.0);
    map ist eine Integerfunktion. dx, dy etc. werden also nur ganzzahlige Werte zwischen -5 und 5, also 11 Schritte annehmen. Damit ruckelts.

    Lösung ist einfach: Einfach folgende Funktion vor die loop()-Definition setzen:
    Code:
    float map(long x, long in_min, long in_max, float out_min, float out_max)
    {
      return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
    }
    Geändert von Sisor (19.02.2019 um 19:26 Uhr) Grund: Lösungsvorschlag angehängt.

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    danke Sisor,
    leider kann ich es im moment nicht ausprobieren, ich muss jetzt erstmal überlegen wie ich HaWe's vorschläge für den anschluss der joystickplatine realisiere...
    Es ging bei der ursprünglichen frage um's ruckeln, ich wollte probieren, ob es bei einer "behutsamen" ansteuerung mit dem joystick auch so ruckartig fährt. Es ruckelt aber auch bei anderen sketches wie dem hier z.b.


    Code:
    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
    
    
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
    
    
    #define MIN_PULSE_WIDTH 650
    #define MAX_PULSE_WIDTH 2350
    #define DEFAULT_PULSE_WIDTH 1500
    #define FREQUENCY 50
    
    
    //uint8_t servonum = 0;
    uint8_t i;
    
    
    
    
    void setup()
    {
      Serial.begin(115200);
      Serial.println("16 channel Servo test!");
      pwm.begin();
      pwm.setPWMFreq(FREQUENCY);
    }
    int pulseWidth(int angle)
    {
      int pulse_wide, analog_value;
      pulse_wide = map(angle, 0, 180, MIN_PULSE_WIDTH, MAX_PULSE_WIDTH);
      analog_value = int(float(pulse_wide) / 1000000 * FREQUENCY * 4096);
      Serial.println(analog_value);
      return analog_value;
    
    
      //pwm.setPWM(0, 0, pulseWidth(0));
    }
    
    
    void loop()
    {
    
    // servo für horizontale drehung
    
      for (i = 70; i <= 135; i++)
      {
        //Serial.println(i);
        pwm.setPWM(0, 0, pulseWidth(i));
    
        delay(50);
      }
    
      delay(500);
    
      for (i = 135; i >= 70; i--)
      {
        //Serial.println(i);
        pwm.setPWM(0, 0, pulseWidth(i));
    
        delay(50);
      }
    }
    hängt das hier auch mit dem "map" zusammen?
    gruß inka

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    hängt das hier auch mit dem "map" zusammen?
    Nö, da wird map() richtig benutzt.

Ähnliche Themen

  1. Servotreiber RNS1
    Von Naturp im Forum Elektronik
    Antworten: 33
    Letzter Beitrag: 07.02.2010, 21:38
  2. ADC mit 12bit besser 16bit mit 1Wire oder I2C gesucht
    Von mat-sche im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 3
    Letzter Beitrag: 25.01.2010, 21:54
  3. wie verschicke ich 12bit per spi??
    Von drivepro82 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 21
    Letzter Beitrag: 16.09.2008, 19:36
  4. AVR 12Bit-PWM Lookuptable
    Von teslanikola im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 17.06.2008, 14:05
  5. einen 4bit und 8bit wertals 12bit Wert verarbeiten
    Von Olle_Filzlaus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 14.08.2007, 11:42

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress