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
Mehrere Servos gleichzeitig steuern (Hexapod)
17.01.2017, 10:05
Beitrag #1
Mehrere Servos gleichzeitig steuern (Hexapod)
Hallo. Ich bin derzeit dabei ein Projekt umzusetzen. Es handelt sich dabei um einen Hexapod mit 2DOF, sprich zwei Gelenken pro Bein. Als Steuerung möchte ich einen PCA9685 und einen Arduino Nano v3 verwenden. Nun müssen ja immer viele Servos gleichzeitig bewegt werden, ich glaube aber dass das Sketchbeispiel für den Servocontroller hierfür nicht anwendbar ist. Könnt ihr mir helfen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2017, 22:55 (Dieser Beitrag wurde zuletzt bearbeitet: 17.01.2017 22:57 von scritch.)
Beitrag #2
RE: Mehrere Servos gleichzeitig steuern (Hexapod)
Ok, doofe Frage meinerseits. Habe sie mir selber beantworten können. Nun habe ich aber das Problem, dass sich die Servos zu schnell bewegen. Wie kan ich das anpassen?
Code:
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
#define SERVOMIN  300 // this is the 'minimum' pulse length count (out of 4096) #150
#define SERVOMAX  500 // this is the 'maximum' pulse length count (out of 4096) #600

int anzahl_servos = 12;
// our servo # counter
uint8_t servonum = 0;

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

  pwm.begin();
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

  //yield();

  //servos auf mittelstellung = 375
  for(int i=0; i<anzahl_servos; i++){
    pwm.setPWM(i, 0, 375);
  }


}


void loop() {
  delay(1000);
  for(int i=0; i<anzahl_servos; i++){
    pwm.setPWM(i, 0, SERVOMIN);
  }
  
  delay(1000);
  for(int i=0; i<anzahl_servos; i++){
      pwm.setPWM(i, 0, SERVOMAX);
  }
}


// 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);
  pwm.setPWM(n, 0, pulse);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2017, 13:23
Beitrag #3
RE: Mehrere Servos gleichzeitig steuern (Hexapod)
Hi,
1.) ist sich klar, du jagst die Servo's ja auch direkt von Anschlag zu Anschlag.
2.) wenn du alle Servos zwischen dem wert 300 und 500 laufen läßt dann ziehen auch alle auf einmal den vollen Strom aus der Versorgung - hier wäre eine Staffelung der Startzeit 300 + 100*ServoNr. sinnvoll das die Anlaufströme Zeitversetzt aufkommen.
3.) Standartservos werden üblicherweise mit 50Hz ~20mS upgedatet, wenn du schnelle Digitalservos hast geht das auch bis 250...330 Hz womit dann auch das Ende der Fahnenstand erreicht ist.
Natürlich wird ein gutes Servo auch die 60Hz mitmachen...aber das sollte man im Einzelfall prüfen.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2017, 14:14
Beitrag #4
RE: Mehrere Servos gleichzeitig steuern (Hexapod)
Danke für deine Antwort. Allerdings verstehe ich das noch nicht ganz wie das hilft, die Servos langsamer laufen zu lassen. Das sind kleine 9g Billigservos und die werden mit 60Hz angesprochen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2017, 22:01
Beitrag #5
RE: Mehrere Servos gleichzeitig steuern (Hexapod)
(18.01.2017 14:14)scritch schrieb:  Danke für deine Antwort. Allerdings verstehe ich das noch nicht ganz wie das hilft, die Servos langsamer laufen zu lassen. Das sind kleine 9g Billigservos und die werden mit 60Hz angesprochen.

...steht das mit dem 60Hz auf den Servos drauf ? Würde mich bei Billigteilen wundern...habe das nämlich noch nie wo auf nem Servo gesehen. Und Servos habe ich schon seit lass mal nachrechnen...45 Jahre im gebrauch...

Also da du doch so schön programmieren kannst wundert mich deine Frage doch enorm...immerhin schaffst du es sie von Anschlag zu Anschlag mit der vollen Servogeschwindigkeit laufen zu lassen... dann überleg doch mal was du dabei für Vorgaben machst und wie du diese Vorgabe nach deinen Wünschen beeinflussen kannst.
Die Alternative wäre ein etwas teureres programmierbares Digitalservo wo man die Stellgeschwindigkeit begrenzen kann....
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.01.2017, 11:58 (Dieser Beitrag wurde zuletzt bearbeitet: 19.01.2017 11:59 von P.Martin.)
Beitrag #6
RE: Mehrere Servos gleichzeitig steuern (Hexapod)
Hallo,
..oder..
https://forums.adafruit.com/viewtopic.php?f=25&t=54791
mfg Martin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2017, 00:07
Beitrag #7
RE: Mehrere Servos gleichzeitig steuern (Hexapod)
Bevor ich den vorgeschlagenen Thread von Martin las, hätte ich genau das vorgeschlagen ein delay(); einzubauen. Allerdings wäre das für meinen Fall nur eine mittelmäßig zufriedenstellende Lösung. Bei dem Hexapod ist zwischen den Beinen z. B. nur wenig Spielraum um sich bewegen zu können. So ist der Servowert MAX bei einigen Beinen nur 375 und der MIN bei 330. Wenn ich das Bein langsam bewegen lassen wollen würde, müsste ich ja von 330 bis 375 in einer FOR-Schleife hoch oder entsprechend runter zählen um da dann ein delay(); einbauen zu können. Somit hätte das Bein dann 45 Schritte bei der Bewegung, was mir irgendwie zu wenig vorkommt.
Was meiner Auffassung nach sinnvoller wäre, ist eine Anpassung des PWM-Signals. Wenn die 0-Phase gleich bleibt aber die 1-Phase um meinetwegen 20% verringert wird, würde der Servo ja auch langsamer drehen. Aber das würde ja mit der Ansprechfrequenz einhergehen, die würde dadurch ja verändert werden. Ich habe jetzt ja 60Hz eingestellt, aber offenbar laufen die Servos ja normalerweise mit einer anderen Frequenz, obwohl sie hiermit funktionieren.

Oder habe ich da gerade etwas grundlegend falsch verstanden? Hier mein aktueller Code für zwei der Beine für den Vorwärtslauf.

Code:
/***************************************************
* This is an example for our Adafruit 16-channel PWM & Servo driver
* Servo test - this will drive 16 servos, one after the other
*
* Pick one up today in the adafruit shop!
* ------> http://www.adafruit.com/products/815
*
* These displays use I2C to communicate, 2 pins are required to  
* interface. For Arduino UNOs, thats SCL -> Analog 5, SDA -> Analog 4
*
* Adafruit invests time and resources providing this open source code,
* please support Adafruit and open-source hardware by purchasing
* products from Adafruit!
*
* Written by Limor Fried/Ladyada for Adafruit Industries.  
* BSD license, all text above must be included in any redistribution
****************************************************/

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

// 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) #150
#define SERVOMAX  500 // this is the 'maximum' pulse length count (out of 4096) #600

int anzahl_servos = 12;
// our servo # counter
uint8_t servonum = 0;

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

  pwm.begin();
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

  //yield();

  //servos auf mittelstellung = 375
  for(int i=0; i<anzahl_servos; i++){
    pwm.setPWM(i, 0, 375);
  }
}

void loop() {
  _vorwaerts();
}


// 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);
  pwm.setPWM(n, 0, pulse);
}



void _vorwaerts(){
  /*
KLEINER WERT UND DER SERVO DREHT NACH RECHTS!!!
   Beinwerte:
   Vorne:      Hinten:
   b1 = 375    330
   b2 = 420    330
   b3 = 420    375
   b4 = 330    375
   b5 = 330    420
   b6 = 375    420
  
   heben: 300
   unten: 375
  
   #1            #2          #3          #4          #5        #6
   b1 heben      vorne       unten       hinten      warten    warten
   b2 hinten     warten      warten      heben       vorne     unten
   b3      
   b4      
   b5
   b6
  
   Servoausgänge:
   heben/unten:
   b1 0
   b2 1
   b3 2    
   b4 3    
   b5 4
   b6 5
  
   vorne/hinten:
   b1 6
   b2 7
   b3 8    
   b4 9    
   b5 10
   b6 11
   */

  //#1
  pwm.setPWM(0, 0, 300); //b1 heben
  pwm.setPWM(7, 0, 330); //b2 hinten
  delay(100);
  //#2
  pwm.setPWM(6, 0, 420); //b1 vorne
  //b2 warten
  delay(100);
  //#3
  pwm.setPWM(0, 0, 400);//b1 unten
  //b2 warten
  delay(100);
  //#4
  pwm.setPWM(6, 0, 330); //b1 hinten
  pwm.setPWM(1, 0, 300); //b2 heben
  delay(100);
  //#5
  //b1 warten
  pwm.setPWM(7, 0, 420); //b2 vorne
  delay(100);
  //#6
  //b1 warten
  pwm.setPWM(1, 0, 400); //b2 unten
  delay(100);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2017, 08:18 (Dieser Beitrag wurde zuletzt bearbeitet: 25.01.2017 08:35 von scritch.)
Beitrag #8
RE: Mehrere Servos gleichzeitig steuern (Hexapod)
Scheint wohl so, als käme ich um die Verzögerung per delay(); nicht drum herum, wie? Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Probleme mit SD-Karten und Displayansteuerung gleichzeitig reichs 7 335 13.11.2019 18:55
Letzter Beitrag: reichs
  wie kann ich ausgangspins aus einem array steuern? uwe.z 4 302 04.11.2019 21:46
Letzter Beitrag: Holzauge
  Rotary Encoder - gedrückt und gleichzeitig drehen Gerdchen03 6 321 29.10.2019 10:49
Letzter Beitrag: Tommy56
  1 Knopf, mehrere Funktionen Muff4 2 299 23.10.2019 17:12
Letzter Beitrag: Muff4
Photo Technisat Receiver mit Arduino steuern Beans 0 365 29.09.2019 15:39
Letzter Beitrag: Beans
  LEDs mit Touchscreen steuern Mr_Martin 5 619 08.09.2019 22:55
Letzter Beitrag: georg01
  Motor mit Ultraschall steuern matzesims 11 898 28.08.2019 10:40
Letzter Beitrag: hotsystems
  Mehrere HX711 mit einem Arduino Uno be14b029 8 4.480 16.03.2019 18:22
Letzter Beitrag: charlie883
  kRPC mit Arduino steuern ? comfan 3 567 26.02.2019 22:19
Letzter Beitrag: Tommy56
  SPI Schnittstellen für mehrere Geräte nutzen Hoffmakl 11 1.699 31.01.2019 15:41
Letzter Beitrag: Hoffmakl

Gehe zu:


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