PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Neubau eines Hexapoden



juergen009
29.03.2018, 10:56
Hallo liebe Experten,

Denke auch über den Bau eines Hexapoden nach. Habe auch schon mal ein einzelnes Bein gebaut, um die Ansteuerung mit PWM zu verstehen.

Mein Equipment:
Arduino Due
Servoboard SD21
2 Labornetzgeräte
Multimeter
Servos Graupner C5077 (nur zum ausprobieren, später will ich gute Servos nehmen)
div. ...

Zunächst habe ich die 3 Servos mit PWM angesteuert, um erstmal einen Einstieg zu haben.
Jetzt soll das Ganze mit I2C passieren und da tun sich bei mir Verständnisprobleme auf..

Die Adresse des SD21 habe ich ausgelesen = 0x61

Wie werden nun die einzelnen Servo - Adressen gefunden?
Die Adresse für Servo 1 habe ich (Roland war so freundlich und hat mir ein Stückchen Code gegeben)

#define SERVO 0x3F // Address of first servo

Das funktioniert auch, der Servo bewegt sich, allerdings funktioniert die Einstellung der Drehgeschwindigkeit nicht.
Egal was ich einstelle, der Servo bewegt sich immer mit gleicher Geschwindigkeit.

Der komplette Code

#include <Wire.h>
#define ADDRESS 0x61 // The address of the SD21
#define SERVO 0x3F // Address of first servo

void setup(){
Wire.begin();
}

void loop(){
Wire.beginTransmission(ADDRESS);
Wire.write(SERVO);
Wire.write(100); // Send a value of xxx to 255 to servo 1
Wire.endTransmission();
delay(1000);
Wire.beginTransmission(ADDRESS);
Wire.write(SERVO);
Wire.write(2000);
Wire.endTransmission();
delay(1000);
Wire.beginTransmission(ADDRESS);
Wire.write(SERVO);
Wire.write((byte)0); // Values of 0 being sent using writ have to be masked as a byte to stop them being misinterperted as NULL this is a bug with arduino 1
Wire.endTransmission();
delay(1000);
Wire.beginTransmission(ADDRESS);
Wire.write(SERVO);
Wire.write(128); // send a value of 128 to servo 1
Wire.endTransmission();
delay(1000);
}

Habe ich es richtig verstanden, zwischen jeder

Wire.beginTransmission
und
Wire.endTransmission();

vergehen 20 ms ?

Danke für Eure Hilfe

Jürgen

021aet04
30.03.2018, 10:55
Du verstehst es falsch. Das SD21 steuert unabhängig vom uC die Servos an. Mit dem uC gibst du nur die Anweisung welcher Servo mit welcher Geschwindigkeit wohin fahren soll. Die Impulserzeugung für die Servos (1-2ms Puls, 20ms Periode) übernimmt das SD21.

Du musst dir das Datenblatt/Anleitung zum SD21 besorgen und dann genau lesen welches Register was macht. Ich habe auch ein SD21, jedoch finde ich das Register 0x3f nicht (eventuell Versionsabhängig, meines habe ich schon ewig). Meine Register gehen von 0 bis 65 (dez. nicht hex).

MfG Hannes

rolber
30.03.2018, 19:17
Habe Dir mal eine Uebersicht aller Register rausgesucht:

http://www.roboter-teile.de/datasheets/sd21.pdf

Damit duerftest Du deine Probleme loesen koennen.

Und, zwischen:

Wire.beginTransmission
und
Wire.endTransmission();

stehen die Befehle, die der SD 21 ausfuehren soll.
Um das Timing kuemmert sich der SD 21 selbststaendig.
Du sagst: Fahre Servo X nach Pos. 255 mit Speed X , dann macht den Rest der SD21.
Es sei denn, Du gibst ihm bevor er alles erledigt hat, eine neue Anweisung zum gleichen Servo.
Durch den Befehl delay(1000) gibst Du ihm genuegend Zeit, um alles zu erledigen


MfG
Roland

juergen009
03.04.2018, 11:44
Hallo Roland,

erstmal lieben Dank für Deine Mühe, natürlich auch an Hannes. Leider habe ich immer noch nicht verstanden, wie die Servos
im Programmcode angesprochen werden. OK lt Datenblatt SD21 hat jedes Servo 3 Register (0 = Speed Servo 1, 1 = Low Byte, 2 High Byte) usw. In meinem obigen Programmcode steht #define SERVO 0x3F // Address of first servo. Ist nun das 0x3F die Servoadresse?

Habe schon tagelang gegoogelt, komme aber nicht weiter. Mir würde ein Stückchen Programmcode sehr helfen, damit ich nachvollziehen kann, was überhaupt passiert. Ein provisorisches Bein mit 3 Servos habe ich ja schon gebaut. Wie weit ist denn mittlerweile Dein runder Hexa?

viele Grüße

Jürgen

021aet04
03.04.2018, 16:13
Es gibt (nach der PDF von Roland) 62 Grundregister zum Schreiben und 2 zum Lesen. Zusätzlich gibt es noch weitere die man nur schreiben kann (fängt bei 63 = 0x3f für Servo 1). Wenn du die Register 0-62 nimmst, benötigst du einmal Geschwindigkei und einmal die Sollposition, aufgeteilt auf 2 Byte. Wenn du die Register ab 63 nimmst gibt es eine Formel, damit benötigst aber nur 1Byte anstatt 2Bytes.

Also für Servo 1 gibt es die Register 1 und 2 (0x01, 0x02) und Register 63.

MfG Hannes

rolber
04.04.2018, 22:06
Hallo juergen

021aet04 hat es vortrefflich erklaert:

0x3f ist die Servoadresse fuer Servo 1
0x40 waere dann Servo 2
0x41 Servo3
Damit koenntest Du deine 3 Servos deines Hexapod Beins schon mal verfahren.
Wenn Du aber alle 3 Servos mit verschiedenen Geschwindigkeiten fahren willst, musst Du die Register DEZIMAL 0-62 verwenden.
Das solltest Du aber schon selbst hin bekommen.
Falls das zu schwierig ist, wuerde ich Dir empfehlen etwas weniger komplexes als einen HEXA zu bauen.
Weil das nur ein minimaler Bruchteil der Programmierarbeit ist, die da noch auf Dich zu kommt.
Ein Hexapod ist kein Wochenend - Projekt.

Mein Runder HEXA ist mechanisch fertig, bewegt sich auch schon, koennte auch laufen , aber das ist mir noch nicht perfekt genug.
Im Moment habe ich auch andere Sachen on Top.
Eines Tages , bei Lust und Laune, hol ich den wieder von seinem Podest und mache daran weiter.

MfG
Roland