ehrlich gesagt, nein.
Ich wollte dir nur logische Erlärungsansätze liefern.
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...
ehrlich gesagt, nein.
Ich wollte dir nur logische Erlärungsansätze liefern.
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.
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.
hängt das hier auch mit dem "map" zusammen?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); } }
gruß inka
Nö, da wird map() richtig benutzt.hängt das hier auch mit dem "map" zusammen?
ich stell die ursprüngliche frage mal anders herum:
mit diesem sketch:
werden diese bewegungen erzeugt:Code:/* 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); }
https://youtu.be/lR8RHupNr-s
was haltet ihr davon, ist es für den aufbau ok und sollte ich meine erwartungen runterschrauben?
gruß inka
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.
Grüssle, Sly
..dem Inschenör ist nix zu schwör..
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...
gruß inka
...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.
Grüssle, Sly
..dem Inschenör ist nix zu schwör..
Lesezeichen