Hallo zusammen, ich bastel grad an meiner Projektarbeit. Dafür müssen 4 Servos via Arduino MEGA gesteuert werden. Zu diesem Zweck habe ich mir noch ein Servo Shield von AZ Delivery geholt, welches mit der Adafruit Library (github) gesteuert werden soll. Allerdings fehlt mir hierfür die Zeit mich vernünftig in die Materie einzuarbeiten.
Das Tutorial von Robojax auf YouTube ( Complete guide to PCA9685 16 channel Servo controller for Arduino with code Version of 5 ( V1) - YouTube ) hat mir zwar schon weiter geholfen, allerdings bekomme ich die eigentlich gewünschte Steuerung nicht umprogrammiert.
Die Servos sollen sich um 90 Grad drehen mit einer von mir vorgegebenen Geschwindigkeit. Beim Start des Programms stellen sich die Servos quasi mit Vmax in die Ausgangsposition, was ja OK ist. Die anschliessende Drehnung (hier noch keine 90 Grad) erfolgt langsam über den "for" Befehl.
#include
Aber wie um alles in der Welt sage ich diesen kleinen blauen Drecksding jetzt das er verdammt nochmal auch in die andere Richtung langsam machen soll. Nichtmal anbrüllen lässt er sich;
{schwarzer Humor EnDE}
Habe schonmal versucht den FOR Befehl unter das "delay (1000)" zu setzen, was aber leider nicht von Erfolg gekrönt war. Schliesse hier aber einen Fehler meinerseits nicht aus, zumal ich noch lange keine Leuchte beim programmieren bin, ich lerne beim ausprobieren.
An dieser Stelle schonmal ein dankeschön das ihr bis hier hin weiter gelesen habt !!!!!!!!!!!!!!
Hier noch der Sketch wie ich ihn bei Robojax ( Robjax.com source code for YouTube Videos ) übernommen und den Teil mit den "pwm.setPWM Befehlen" umgestrickt habe.
#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 120 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX 680 // this is the 'maximum' pulse length count (out of 4096)
// 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();
}
// the code inside loop() has been updated by Robojax
void loop() {
for( int angle =0; angle<181; angle +=5){
delay(10);
pwm.setPWM(0, 0, angleToPulse(angle) );
pwm.setPWM(1, 0, angleToPulse(angle) );
pwm.setPWM(14, 0, angleToPulse(angle) );
pwm.setPWM(15, 0, angleToPulse(angle) );
}
delay(1000);
}
/*
* angleToPulse(int ang)
* gets angle in degree and returns the pulse width
* also prints the value on seial monitor
* written by Ahmad Nejrabi for Robojax, Robojax.com
*/
int angleToPulse(int ang){
int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX);// map angle of 0 to 180 to Servo min and Servo max
Serial.print("Angle: ");Serial.print(ang);
Serial.print(" pulse: ");Serial.println(pulse);
return pulse;
}