INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
SunFounder 16 Channel 12 Bit PCA9685 PWM Servo I2C Driver Shield
08.10.2017, 12:06 (Dieser Beitrag wurde zuletzt bearbeitet: 08.10.2017 17:02 von Bikandajyo.)
Beitrag #1
SunFounder 16 Channel 12 Bit PCA9685 PWM Servo I2C Driver Shield
Liebe Arduino Gemeinde,

kann mir evtl. jemand bei folgendem Problem helfen?
Ich habe dieses Shield gekauft:
SunFounder 16 Channel 12 Bit PCA9685 PWM Servo I2C Driver Shield
Link zu dem Sunfounder Shield

Ich wollte damit 2 Arme eines kleinen Roboters bewegen.

Leider bewegen sich die Servos nur ruckelnd hin und her. Sie sollen aber schön sanft laufen und auch nicht zu schnell. Die Einstellungen mit SERVOMIN nud SERVOMAX habe ich so weit, dass sich die Servos etwa in der Mittelstellung bewegen.
Ändere ich die pwmSetFrequency(60); auf 80 oder mehr, scheint die Bewegung sanfter zu werden doch dann stimmt der Mittelstellung nicht mehr .
Gibt es da einen Trick wie man da am besten seine Werte herausfindet bzw. errechnen kann?

Auch ist mir noch nicht klar wie ich eine genaue Position anfahren kann und der servo dies beibehält oder einstellen kann wie lange eine hin und her Bewegung geschehen soll.

Ich habe diesen Aufbau verwendet:

[Bild: _mg_7634-1.jpg]



Code:
/***************************************************
  This is an example for our Sunfounder 16-channel PWM & Servo driver
  PWM test - this will drive 16 servos

****************************************************/
#include <Wire.h>
#include <SunFounder_PCA9685_PWM.h>

// Depending on your servo make, the pulse width min and max may vary, you
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!
#define SERVOMIN  300 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  500 // this is the 'maximum' pulse length count (out of 4096)

void setup() {
  Serial.begin(9600);
  Serial.println("16 channel pwmServo test!");

  pwmBegin();
  
  pwmSetFrequency(60);  // Analog servos run at ~60 Hz updates

}

// you can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
  
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= 60;   // 60 Hz
  Serial.print(pulselength); Serial.println(" us per period");
  pulselength /= 4096;  // 12 bits of resolution
  Serial.print(pulselength); Serial.println(" us per bit");
  pulse *= 1000;
  pulse /= pulselength;
  Serial.println(pulse);
  pwmSetValue(n, pulse);
}

void loop() {
  // All channel increased pwm value
  for(int value=SERVOMIN; value<SERVOMAX; value++){
    for(int channel=0; channel<16; channel++){
       pwmSetValue(channel, value);
    }
    //delay(10);
    Serial.print("pwm value:");
    Serial.println(value);  
  }
  // All channel decreased pwm value
  for(int value=SERVOMAX; value>SERVOMIN; value--){
    for(int channel=0; channel<16; channel++){
       pwmSetValue(channel, value);
    }
    //delay(10);
    Serial.print("pwm value:");
    Serial.println(value);  
  }
}

Irgendwie kann man wohl auch Grad Zahlen einstellen, leider verstehe ich es nicht.
Ich bin nun auf der Suche nach einem einfachen Democode um 4 Servos unabhängig von einander bewegen zu können. Eigentlich wollte ich es in Fällen machen, alsoso zB.:

Fall1
2 Servos bewegen sich 30 Grad und gleichzeitig die Servos 3 und 4 um 10 Grad.
Fall 2
Alle Servos bewege sich gleichmässig hin und her (um die Mittelstellung 10 Grad) und stoppen nach 20 Sekunden
Fall3
die Servos bewegen sich nach einander je um 10 Grad und stoppen dann

Die einzelnen Fälle wollte ich dann gern mit einem seriellen Befehl anschuppsen.

Dann versuche ich noch herwuszufinden, wie die Mittelstellung des Servos beim Programmstart gestellt bwz. gehalten wird.

Vielen Dank schon mal im Voraus für Eure Hilfe.

Gruss Anna
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2017, 09:31
Beitrag #2
RE: SunFounder 16 Channel 12 Bit PCA9685 PWM Servo I2C Driver Shield
Wernn Du einfach mal Google anwerfen würdest, anstatt auf Lösungen zu warten, wärest Du schon weiter.

Suchbegriff: "arduino pca9685 servo"

Da findest Du viele Seiten mit Beispielen, die Du ausprobieren kannst.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2017, 11:38
Beitrag #3
RE: SunFounder 16 Channel 12 Bit PCA9685 PWM Servo I2C Driver Shield
... Ich habe hunderte Seiten angeschaut doch nichts war wirklich hilfreich:-(
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2017, 12:44
Beitrag #4
RE: SunFounder 16 Channel 12 Bit PCA9685 PWM Servo I2C Driver Shield
(17.10.2017 11:38)Bikandajyo schrieb:  ... Ich habe hunderte Seiten angeschaut doch nichts war wirklich hilfreich:-(
Hast Du die 100 Seiten auch ausprobiert?
Da sind einige Seiten dabei, mit denen man einen Servo zum Laufen bekommt. Man muss es nur tun.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2017, 13:00 (Dieser Beitrag wurde zuletzt bearbeitet: 17.10.2017 13:01 von Bikandajyo.)
Beitrag #5
RE: SunFounder 16 Channel 12 Bit PCA9685 PWM Servo I2C Driver Shield
....natrlich habe ich sehr viel Code ausprobiert. Die Servos bewegen sich ja auch nur nie so wie sie sollen bzw. Ich verstehe nicht wie man es so ändern kann dass sich die Servos wie in meiner ersten Frage bewegen. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2017, 13:07 (Dieser Beitrag wurde zuletzt bearbeitet: 17.10.2017 15:25 von Tommy56.)
Beitrag #6
RE: SunFounder 16 Channel 12 Bit PCA9685 PWM Servo I2C Driver Shield
(17.10.2017 13:00)Bikandajyo schrieb:  ....natrlich habe ich sehr viel Code ausprobiert. Die Servos bewegen sich ja auch nur nie so wie sie sollen bzw. Ich verstehe nicht wie man es so ändern kann dass sich die Servos wie in meiner ersten Frage bewegen. Sad

Auch das kann man den Beispielen entnehmen. Du musst die Pulslängen variieren und die jeweiligen Längen für Diene Zielstellung ermitteln.
Einfaches Beispiel bei Adafruit.

Daraus kannst Du Dir die passenden Pulslängen ermitteln, die Du brauchst.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2017, 20:26
Beitrag #7
RE: SunFounder 16 Channel 12 Bit PCA9685 PWM Servo I2C Driver Shield
Min und max sowie die Mittelstellung habe ich ja.
Seltsam ist aber z.B.mdass zu Anfang alle Servos wild rum zappeln und erst nach einer Weile alle halbwegs ruhig laufen.
Auch habe ich es noch nicht hinbekommen einzelne Servos anzusprechen also wie in,meiner ersten Frage. Bisher gehen ja immer einer nach dem andern.


Überqll liesst man es ist super einfach....." is an easy way to ..." "...it is very smple..." etc.
Nein es ist ebend nicht einfach!


Wie kann ich zum Beispiel solchen Code einbauen

pwm.setPWM(15,300, 460)
pwm.setPWM(1, 460, 300)

Und servo 3 soll nur zur Mittelstellung fahren
pwm.setPWM(3, 365)

Gruss und Dank
Anna
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2017, 21:38
Beitrag #8
RE: SunFounder 16 Channel 12 Bit PCA9685 PWM Servo I2C Driver Shield
Hallo Anna,
fangen wir von vorne an;

Zitat:Ich bin nun auf der Suche nach einem einfachen Demo Code um 4 Servos unabhängig von einander bewegen zu können.

Das Code (gehe von aus) aus der (SunFounder_PCA9685_PWM) Lib. – was Du gepostet hast; – das ist ein Demo Code einer simplen Steuerung. Also das ist ein einfaches Demo Code, der sogar für Deine Platine zugeschnitten ist. Gehe vom Namen aus.
Wie der Tommy schon angedeutet, es gib (der hat sich bemüht, um es nachzuschauen) mehrere Libs und Tutorials - Demo – Code für das pca9685 Servo.

Leider die Realität:
Zitat:... Ich habe hunderte Seiten angeschaut doch nichts war wirklich hilfreich:-(

Du wirst auch nach 10 000 Seiten, nicht den Passenden für Dein vorgehen Code finden.

Zitat:....natrlich habe ich sehr viel Code ausprobiert. Die Servos bewegen sich ja auch nur nie so wie sie sollen

Weil die Beispiele, müssen an Deine Bedürfnissen (so wie Du es haben möchtest) angepasst werden.

Zitat:… Ich verstehe nicht wie man es so ändern kann dass sich die Servos wie in meiner ersten Frage bewegen

Die Frage basiert auf Deinen Mangelhaften (wenn nicht überhaupt keinen) Programmierungskenntnissen. Was die Hardwarekenntnisse betrifft, werde ich mir auch nicht sicher.
Dass alles, was Du Dir vorgenommen hast ist viel zu komplex für Dich.

Zurück zu dem (von Dir gepostetem ) Code:
Code:
...
// All channel increased pwm value
  for(int value=SERVOMIN; value<SERVOMAX; value++){
    for(int channel=0; channel<16; channel++){
       pwmSetValue(channel, value);
    }
...

Die (doppelt-e) For-Schleife, steuert alle verfügbare Kanäle (16 Chanels);

for(int channel=0; channel<16; channel++)

mit Werten; (SERVOMIN, SERVOMAX)
for(int value=SERVOMIN; value<SERVOMAX; value++)

Du hast ABER NUR (laut Deinem Anschlussbild) EIN Servo angeschlossen.
ALSO es ist auch klar – warum es “stottert“.
1) Dein Servo wird “Angesprochen“ –> gesteuert,
2) DANN restliche 15 Kanäle (Bewegung1 … Bewegung2)
3) und ERST danach wird wieder Dein Servo “Angesprochen“ –> gesteuert

Tipp:
Du sollst nur die Kanäle (Chanels) Benutzen, welche Du auch brauchst (? also 4).
Damit kommt es zu keinen Verzögerungen und die Bewegungen werden (so wie Du es Konfigurierst) sanft ablaufen.
Tommy Beispiellink ist ein Paradebeispiel. Mehr kann man nicht erwarten / finden.
Das muss nur eingepasst bzw. erweitert werden.

Zitat:...
Auch habe ich es noch nicht hinbekommen einzelne Servos anzusprechen also wie in,meiner ersten Frage
...
Nein es ist ebend nicht einfach!

Weil das alles viel zu komplex für Dich ist.

Gruß Georg

Sorry für mein nicht korrektes Deutsch. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Spannung anlegen bei Servo herby 12 604 31.10.2018 23:51
Letzter Beitrag: Bitklopfer
  Shield Zeichnung in Eagle huber5093 7 663 27.09.2018 13:41
Letzter Beitrag: hotsystems
  Arduino shield zählt komisch hoch Flap 10 1.279 13.09.2018 18:59
Letzter Beitrag: ardu_arne
  I2C bus ( Nano + PCA9685 ) wie verbinden ? uweq 11 1.357 31.07.2018 21:27
Letzter Beitrag: uweq
  Seeedstudio Grove OLED Display (0.96") ansteuerung ohne Basis Shield möglich? Grooxy 5 848 22.05.2018 00:09
Letzter Beitrag: avoid
  Ethernet-Shield Ardusil 9 1.500 09.03.2018 18:09
Letzter Beitrag: hotsystems
  Arduino Mega mit TFT Shield Diskusguppy 6 1.400 16.02.2018 10:35
Letzter Beitrag: Tommy56
  Welches GSM Shield Kaufen ?? huber5093 7 1.087 19.12.2017 07:53
Letzter Beitrag: Chopp
  nano, micro oder? für LAN Shield sepp01 10 1.702 12.11.2017 11:30
Letzter Beitrag: sepp01
  Steckertyp von SD Card Shield V4.0? alpenpower 7 1.283 10.11.2017 10:04
Letzter Beitrag: SkobyMobil

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste