Servo Shield AZ Delivery

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;
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

incrediblelinus:
.....
Allerdings fehlt mir hierfür die Zeit mich vernünftig in die Materie einzuarbeiten.
....

Alles sehr interessant, allerdings frage ich mich und dich, wie du das Projekt ohne Einarbeitung fertig stellen willst.

Oder sind wir hier für dich das Entwicklungsbüro, was für dich kostenfrei dein Projekt fertigstellen sollen ?

Ja super, auch wenn du deinen Thread hier nochmals zitierst, wird unsere Hilfe nicht umfangreicher.

Mach erstmal worum du gebeten wurdest.

Da der TO neuerdings seine Beiträge hier löscht, anstatt diese zu überarbeiten, hat sich dieser Beitrag zum Teil erledigt.

HotSystems:
Alles sehr interessant, allerdings frage ich mich und dich, wie du das Projekt ohne Einarbeitung fertig stellen willst.

Oder sind wir hier für dich das Entwicklungsbüro, was für dich kostenfrei dein Projekt fertigstellen sollen ?

Ich erhoffe mir aus diesem Forum Hilfe um dieses Projekt fertig zu stellen. Dafür sind Foren schliesslich da.

Wenn ich gefragt werde wie man die Beläge an einer Trommelbremse an einem Golf 2 vor 1987 wechselt, sage ich demjenigen auch nicht, mach ne Lehre als Kfz.- Mechatroniker......

Hallo,

incrediblelinus:
Ich erhoffe mir aus diesem Forum Hilfe um dieses Projekt fertig zu stellen. Dafür sind Foren schliesslich da.

Wenn ich gefragt werde wie man die Beläge an einer Trommelbremse an einem Golf 2 vor 1987 wechselt, sage ich demjenigen auch nicht, mach ne Lehre als Kfz.- Mechatroniker......

selbstverständlich erklärst Du ihm auch ausführlich, was eine Trommelbremse ist. was Werkzeuge wie Maul- Ring-, Steckschlüssel sind, was die komischen Nummern auf den Schlüsseln bedeuten, oder setzt Du da etwa ein gewisses Grundwissen voraus und sagst sonst libeer "laß das lieber jemanden machen, der sich damit auskennt"?

Gruß aus Berlin
Michael

Ich gehe mal davon aus, dass die Projektarbeit ein Ausbildungsbestandteil ist, mit dem Deine Kenntnissse bewertet werden sollen und nicht die Kenntnisse des Forums.

Du siehst den Sinn von Foren falsch. Sie sind nicht der kostenlose Hausarbeitsdienst.
Dieses Forum dient der Hilfe zur Selbsthilfe und beim Lernen.

Um auf Deinen Autovergleich einzugehen: Wenn Du Die Beläge nicht selbst wechseln kannst, musst Du eine Werkstatt dafür bezahlen. In der Programmierung heißt das entsprechend einen Dienstleister bezahlen.

Gruß Tommy

incrediblelinus:
Ich erhoffe mir aus diesem Forum Hilfe um dieses Projekt fertig zu stellen. Dafür sind Foren schliesslich da.

Wenn ich gefragt werde wie man die Beläge an einer Trommelbremse an einem Golf 2 vor 1987 wechselt, sage ich demjenigen auch nicht, mach ne Lehre als Kfz.- Mechatroniker......

Klar bekommst du die entsprechende Hilfe.
Allerdings solltest du dann deinen Beitrag anders formulieren.
Und dein Einwand passt hier absolut nicht.

Hi

Da sage ich, als Fragesteller, aber auch nicht, daß ich mir die Finger lieber nicht schmutzig machen will und eh keine Zeit dafür habe, oder?
Dafür braucht's keinen Mechatroniker (Was, meiner Meinung nach, eh ein kastrierter Beruf ist).

MfG

Tommy56:
Ich gehe mal davon aus, dass die Projektarbeit ein Ausbildungsbestandteil ist, mit dem Deine Kenntnissse bewertet werden sollen und nicht die Kenntnisse des Forums.

Du siehst den Sinn von Foren falsch. Sie sind nicht der kostenlose Hausarbeitsdienst.
Dieses Forum dient der Hilfe zur Selbsthilfe und beim Lernen.

Um auf Deinen Autovergleich einzugehen: Wenn Du Die Beläge nicht selbst wechseln kannst, musst Du eine Werkstatt dafür bezahlen. In der Programmierung heißt das entsprechend einen Dienstleister bezahlen.

Gruß Tommy

Der Teil mit dem Arduino gehört nicht zu den Bewertungskriterien. Er soll ein Modell zur Anschauung steuern.

Ich habe den Sinn von Foren schon immer darin gesehen anderen zu helfen, so gut es mir möglich ist. Erst mal in textlicher Form und wenn möglich auch "physisch"....

Also wenn mich jemand zu Details wegen der Bremse fragt, helfe ich ihm KOSTENLOS (so bin ich nunnmal) Wenn er mich drum bittet diese für ihn zu wechseln, mache ich das auch. In der Regel packen die dann von sich aus das Portemonaie aus und drücken mir was in die Hand.

Ich bat erstmal grundsätzlich um Hilfe! Wenn mir hier jemand anbietet das für eine Summe X komplett zu machen, kann man da drüber ohne weiteres sprechen. Fragen kostet aber erstmal nichts...

Allerdings nicht in dem Ton den HotSystems hier anschlägt!

Böser HotSystems ... böööhöööser böööser HotSystems!!
(in diesem Post könnte Ironie enthalten sein ...)

incrediblelinus:
......
Allerdings nicht in dem Ton den HotSystems hier anschlägt!

Huch....was für ein Ton ?

Nur weil ich dich zitiert habe ?

Ich hatte doch geschrieben, wir helfen gern....allerdings wenn jemand zu faul ist oder keine Zeit dazu hat, wird es wohl eng.

Ohhh....sorry für meinen angeschlagenen Ton. :wink:

Da frage ich mich jetzt, wer braucht Hilfe ?

postmaster-ino:
Hi

Da sage ich, als Fragesteller, aber auch nicht, daß ich mir die Finger lieber nicht schmutzig machen will und eh keine Zeit dafür habe, oder?
Dafür braucht's keinen Mechatroniker (Was, meiner Meinung nach, eh ein kastrierter Beruf ist).

MfG

Ich möchte mir die Finger schmutzig machen (wundtippen). Die shabe ich auch bereits getan, allerdings bin ich mit meinem latein am Ende und habe derzeit nicht genug Zeit um mich eingehend damit zu beschäftigen. Das ist im Moment mein grösstes Problem. daher habe ich hier um Hilfe gebeten....

Gruss LInus

Hi

Wie wäre Es, wenn Du mit dem Heulen aufhörst und Dein Problem konkrekt angehst?
Wie hast Du Es geschafft, daß die Anfangsrichtung langsamer verfahren wird?
Ein Servo fährt SO SCHNELL WIE MÖGLICH an den übergebenen Zielwinkel.
Nach Deiner FOR-Schleife kommt als nächster Zielwinkel wieder das andere Ende - Was soll so ein kleines Servo sonst machen, als Seinen Job?
Nämlich mit ALLER KRAFT zu dieser Position rennen?
DU hast DAS SO vorgegeben.

Nun denn, schauen wir Mal, was hier noch kommt ...

MfG

postmaster-ino:
Hi

Wie wäre Es, wenn Du mit dem Heulen aufhörst und Dein Problem konkrekt angehst?
Wie hast Du Es geschafft, daß die Anfangsrichtung langsamer verfahren wird?

MfG

Genau das versuche ich seid drei Tagen heraus zu finden. Wie bereits oben beschrieben habe ich es mit dem um setzen des FOR Befehls versucht. Was nicht von Erfolg gekrönt war. Wie ebenfalls oben erwähnt habe ich nur die pwm.setPWM Befehle für meine Zwecke geändert.

....bin mal gespannt was jetzt noch kommt :wink:

Hi

Da ich Deine Versuche nicht wirklich sehe, kann ich auch nicht feststellen, was an Deiner 'umgesetzten FOR' falsch ist.

Anders ausgedrückt:
WAS passiert in Deiner FOR?

  • Setze neue Ziel-Position
  • WARTE

Und außerhalb? Dort wird nur loop() neu begonnen und die neue Ziel-Position ist 'am anderen Ende' - dorthin rast das Servo mit Maximum-Warp, hat ja nur diesen einen Job, Den Es auch priima umsetzt.

Also vorhin: Winkel 180° und ein WARTE
Jetzt: Zielwinkel 0° und ein WARTE.

Der Zielwinkel ändert Sich bei Dir 0..10..20.... und IMMER mit einem angehangenem WARTE.
Weshalb der neue Ziel-Winkel eben erst NACH dem WARTE gestetzt wird.
Das Servo 'springt' förmlich auf die neue Position, fällt Dir nur nicht auf, da Du nur kleine Änderungen vornimmst.
AUSSER, die FOR ist beendet, dort kommt als erster Zielwinkel die Null - und von 180 nach Null ist's der ganze Weg - und für das Servo: so schnell wie möglich.

Also: Was könnte man tun, damit Das nicht von 180 direkt auf Null wechselt?

MfG

Um ein Servo langsam drehen zu lassen mußt Du das Servo mit vielen Zwischenschritten ansteuern.
zB Hin von 0 bis 180 und zurück von 180 bis 0 in 1-er Schritten.

Das mußt Du zeitlich genau regeln darum schau mal nach:

millis() und Nachtwächtererklährung
Ablaufsteuerung (Diskrete State Machine)

Wieso brauchst Du ein Shield AZ Delivery? 4 Servo kann ein Arduino UNO auch selbst mit der servo.h Bibliothek ansteuern.

Grüße Uwe

Beim durchstöbern diverser Webseiten wurde immer wieder drauf hingewiesen das man bei der Benutzung von mehreren Servos solch einen zusätzlichen Baustein benutzen soll...und es sind weniger Kabel am Arduino anzuschliessen....

Den grössten Teil habe ich ja auf der Robojax Seite rauskopiert. Von daher habe ich den FOR Befehl auch nicht selber eingesetzt. Ich verstehe nur soviel davon das dieser dafür sorgt das das Servo in bestimmten Schritten gehen soll.

int angle =0 //gibt den Start Punkt vor. Würde ich hier 90 eigeben, würde es bei 90 Grad starten usw...

angle<181 // Winkel kleiner 181... Steht das dafür das der eingegebene Winkel von "int angle=" kleiner bleiben muss???

angle = +5 // soll +5 Grad bewegen

delay (500) // Pause, danach bewegt er wieder 5 Grad aus der Zeile drüber

das ganze macht er solange bis die 180 Grad erreicht sind.

Dann springt er mit Maximum Warp zurück zu 0.

pwm.setPWM (0,0, angelToPulse(angle)
// erste adressiert an Kanal Null Servo Shield, zweite Null: KEIN PLAN, angleToPulse(angle): KEIN PLAN

Die Zusammenhänge von FOR und INT usw, vertstehe ich acu nicht genau. Von daher steh ich auf dem Schlauch, was ich wo ändern muss.

incrediblelinus:
Beim durchstöbern diverser Webseiten wurde immer wieder drauf hingewiesen das man bei der Benutzung von mehreren Servos solch einen zusätzlichen Baustein benutzen soll...und es sind weniger Kabel am Arduino anzuschliessen....

Der Arduino UNO kann 12 Servo ansteuern. Für mehr braucht es solche Shields oder man nimmt einen Arduino MEGA 2560 (48 Servo).

Grüße Uwe