Hallo Morbius,
bin seit längerer Zeit mal wieder hier und gleich über dieses Posting gestolpert.
Wie schon vor einiger Zeit per Mail geschrieben, kann ich zu den I2C-Interfaceroutinen nichts sagen/schreiben.
Ein Oszi wäre hier sicher hilfreich um zu sehen, was sich an den Ausgängen überhaupt tut.
Ich habe mir nochmal das Mainprogramm angesehen, hier sind allerdings ein paar Sachen nicht ganz korrekt.
Code:
servo = s;
System.out.println("Servo " +s);
position = 1500;
speed = 2;
[...]
packet[1] = servo;
packet[2] = position;
packet[3] = speed;
In Packet[1] gehört die Registernummer rein. Die ist jedoch nicht mehr identisch mit der Servonummer (wie beim SD20), sondern folgendermaßen aufgebaut:
Register Servo Belegung
0 1 Speed
1 1 Low byte Position
2 1 High byte Position
3 2 Speed
1 2 Low byte Position
2 2 High byte Position
4 3 Speed
......
60 21 Speed
61 21 Low byte Position
62 21 High byte Position
Obiges Programm kann also nicht funktionieren, zumindest müssten die Servos ziemlich wahllos positioniert werden.
Zum Ausprobieren würde ich dir die erweiterten (und zum SD20 kompatiblen) Register ab Register 63 empfehlen.
In Register 63 wird dann die Byteposition (1-linker Anschlag, 127-Mitte, 255 anderer Anschlag) für Servo 1 geschrieben, in Register 64 dann für Servo 2 usw.
Code:
servo = s + 62; // Servo1 = Register 63
position = 1; // linker Anschlag,
[...]
packet[0] = (int)SD21_ADDRESS;
packet[1] = servo;
packet[2] = position;
[...]
outputStream.write((int)packet[0]); // ob das so geht, keine Ahnung!!!
outputStream.write((int)packet[1]); // wichtig, I2C arbeitet immer byteweise
outputStream.write((int)packet[2]);
[...]
Ansonsten tippe ich auch eher, wie PicNick schon geschrieben hat, auf einen Fehler in den Interfacegeschichten.
HTH und Viele Grüße
Jörg
Lesezeichen