PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : me-arm, 12bit servotreiber und ein joystick



inka
19.02.2019, 18:14
hallo allerseits,

ich habe mir den billig-robot-arm (https://www.banggood.com/Mearm-DIY-Mini-Colorful-Industrial-Robot-Arm-Rotating-Mechanical-Acrylic-Pocket-Robotic-Arm-p-1308700.html?utm_source=google&utm_medium=cpc_ods&utm_campaign=auto2-sdsrm-ea4&utm_content=arvin&ad_id=325127034188&gclid=CjwKCAiA767jBRBqEiwAGdAOry3uWgVgFV0jZlwTx91V QQs6FF1_m4_sI9fwMp9qIea99iZMeBC2MxoC1uYQAvD_BwE&ID=226&cur_warehouse=CN) angeschafft, die servos sollen über die 12bit-servo-treiber-platine (https://de.banggood.com/PCA9685-16-Channel-12-bit-PWM-Servo-Motor-Driver-I2C-Module-For-Arduino-Robot-p-1170343.html?gmcCountry=DE&currency=EUR&createTmp=1&utm_source=googleshopping&utm_medium=cpc_bgcs&utm_content=zouzou&utm_campaign=pla-deg-rm-all-purchase-pc&cur_warehouse=CN) betrieben werden, alles funktioniert in ansätzen:
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:


/* 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...

HaWe
19.02.2019, 18:17
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...



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);


//...



:?:

inka
19.02.2019, 18:25
und das hier?



* A0 HOR
* A1 VER
* A2 HOR
* A3 VER
* A4 SDA
* A5 SCL

ist das wirklich das gleiche?



int xdirPin = 0;
int ydirPin = 1;
int zdirPin = 3;
int gdirPin = 2;

HaWe
19.02.2019, 18:30
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:

* A4 SDA
* A5 SCL

das gilt für den Uno, nicht aber für den mega2560.

inka
19.02.2019, 18:31
und das die anzahl nicht übereinstimmt...

HaWe
19.02.2019, 18:38
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

inka
19.02.2019, 18:39
die zahlen hier


* 0 Base
* 1 Shoulder (right)
* 2 Elbow (left)
* 3 Gripper

sind aber die pinn-nummern des 12bit-servotreibers und nicht des arduino, nehme ich mal an...

HaWe
19.02.2019, 18:43
und die sollen per analogRead gelesen werden?
Servo-Pins sind digitale pwm- Outputs, keine analogen Inputs.
Ich vermute, die tragen nur zu Querreferenz-Zwecken die gleichen Nummern

inka
19.02.2019, 18:45
weiss ich ja nicht, sonst hätte ich doch nicht gefragt...

aber hast du dich schon mit dem me-arm, 12bit treiber und so beschäftigt?

HaWe
19.02.2019, 18:46
nein, aber analogRead kann nur analoge Input-Pins lesen, und die hat nur der Arduino an A0, A1,... , oder nicht?
Daran müssten ja auch die Joystick-Pins angeschlossen sein.

inka
19.02.2019, 18:54
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...

HaWe
19.02.2019, 18:58
ehrlich gesagt, nein.
Ich wollte dir nur logische Erlärungsansätze liefern.

Sisor
19.02.2019, 19:01
...der arm ruckelt aber ziemlich...


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 (https://www.arduino.cc/en/pmwiki.php?n=Reference/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:

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;
}

inka
20.02.2019, 12:27
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.



#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?

Sisor
20.02.2019, 12:35
hängt das hier auch mit dem "map" zusammen? Nö, da wird map() richtig benutzt.

inka
20.02.2019, 15:44
ich stell die ursprüngliche frage mal anders herum:

mit diesem sketch:


/* meArm_Adafruit IK test - York Hackspace May 2014
* Test applying Nick Moriarty's Inverse Kinematics solver
* to Phenoptix' meArm robot arm, to walk a specified path.
*
* Pins:
* Arduino PWMServo
* GND GND
* 5V VCC & V+
* 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>


meArm arm;


void setup() {
Serial.begin(115200);
arm.begin();
}


void loop()
{
//Go to start position
arm.gotoPoint(0,100,50);

//Clap - so it's obvious we're at this part of the routine
arm.openGripper();
arm.closeGripper();
arm.openGripper();
arm.closeGripper();
arm.openGripper();
delay(500);

//Go up and left to grab something
arm.gotoPoint(-80,100,140);
arm.closeGripper();
//Go down, forward and right to drop it
arm.gotoPoint(70,200,60);
arm.openGripper();
//Back to start position
arm.gotoPoint(0,100,50);
delay(2000);

}

werden diese bewegungen erzeugt:

https://youtu.be/lR8RHupNr-s

was haltet ihr davon, ist es für den aufbau ok und sollte ich meine erwartungen runterschrauben?

Rabenauge
21.02.2019, 10:07
Was hast du denn für Servos verbaut?
Für den Fall, dass es diese billigen SG-90 für 2€ sind (oder vergleichbarer Ramsch) finde ich, der bewegt sich doch ganz gut.
Bei _diesen_ Hebellängen würde ich, wenn der Arm irgendwas anheben soll, wenigstens MG-90 verwenden.
Die sind kräftiger und schneller.
Das Problem bei Billigservos (auch den MG-90, nur sind die halt schon etwas besser) ist, dass sie gegen Ende des Weges kaum mehr Kraft haben, weil die Regelung sie dann "runterfährt" (wahrscheinlich um ein überfahren der Soll-Position zu verhindern), dadurch erreichen sie PosSoll aber nur schwer, vor allem, unter Last.
Wenn du wissen willst, ob die Servos überhaupt ausreichend stark sind: lass den Greifer mal das schwerste halten, was der Arm bewältigen soll, und dann fahr den Arm möglichst weit aus- so dass du maximale Last am unteren Servo hast.
Wenn es an dieser Position brummt, sind die Servos zu schwach.

Ansonsten: bei vielen billigen Servos ist es so, dass die sich-selbst ohne Last-teilweise nicht wirklich geschmeidig bewegen. Das liegt einfach daran, dass in denen das billigste Gerümpel verbaut ist, was der Wühltisch hergab. Bessere Servos haben z.B. Doppelschleifer-Potis. Sowas fährt dann auch beim tausendsten Mal die gleiche Position immernoch _genau_ an.
Billige schätzen ihre Position öfter einfach nur....
Ebenfalls gern genommen, bei billigen Servos mit Kunstoff-Welle: wenn man die Schraube, die das Servohorn sichert, zu fest zieht, spreizt sich die Welle etwas auf- und das ganze Servo läuft schwer oder überhaupt nicht mehr.

inka
21.02.2019, 10:35
die servos, die bei dem arm dabei waren sind auch verbaut, es steht SG-90 drauf und beim preis des bausatzes von 12€ können sie nicht mal 2€ pro stück gekostet haben :-)...
mir ging es bei diesem experiment - ich hatte vorher so gut wie nichts mit servos am hut (ausser mal den ultraschallsensor ein bischen hin und her zu schwenken) - hauptsächlich um die bewegung, die inverse kinematik (verstanden habe ich das thema noch lange nicht) weniger um das heben/halten von lasten. Aber den versuch mit den MG-servos mache ich noch...
Aber du scheinst da einiges zu wissen? Beim drehen des arms wackelt ja das ganze ziemlich, wird das mit den MG-servos besser? Die geschwindigkeit ist nicht so das, was ich anstrebe, eine saubere bewegung schon...

Rabenauge
26.02.2019, 10:09
...ein bisschen besser wird es.
Die SG sind so mies, dass sich sogar die Abtriebswelle etwas verdrehen kann, hehe. Beim MG (MG=metal gear) ist die aus Metall.
Auch gibts zu den MG-90 bessere Servoarme- die von den SG verbiegen sich ja schon, wenn du sie scharf anschaust.
Insgesamt sind die MG etwas stärker, ich vermute, dass daher auch die höhere Geschwindigkeit kommt, die SG haben ja schon im Leerlauf mit sich selber zu tun....

An deiner Stelle würde ich, zumindest an den längeren Hebeln (an der Greiflkaue kommts ja eher nicht so drauf an) MG-90 einbauen. Die gibts auch im 3er oder 5er-Pack bezahlbar in Ebay.