Hallo zusammen :) Ich bin für die Berufsschule an einem Projekt. Es geht um einen Solartracker, welcher ich jetzt programmiert habe. Dies funktioniert. Doch ich habe leider noch keine 360° Servos. Nur 180°. Und wenn die Servos an einen bestimmten Punkt angelangt sind, möchten sie eigentlich noch weiterdrehen, doch dies geht nicht, weils ja nur 180° Servos sind. Wie kann ich jetzt im Script festlegen, dass sich diese nur maximal 180° drehen? Danke für eure Hilfe! lg Gabriel Hier ist noch der Code. #include <Servo.h> // include Servo library Servo horizontal; // horizontal servo int servoh = 90; // stand horizontal servo Servo vertical; // vertical servo int servov = 90; // stand vertical servo // LDR pin connections // name = analogpin; int ldrlt = 0; //LDR top left int ldrrt = 1; //LDR top rigt int ldrld = 2; //LDR down left int ldrrd = 3; //ldr down rigt void setup() { Serial.begin(9600); // servo connections // name.attacht(pin); horizontal.attach(9); vertical.attach(10); } void loop() { int lt = analogRead(ldrlt); // top left int rt = analogRead(ldrrt); // top right int ld = analogRead(ldrld); // down left int rd = analogRead(ldrrd); // down rigt int dtime = analogRead(4)/20; // read potentiometers int tol = analogRead(5)/4; int avt = (lt + rt) / 2; // average value top int avd = (ld + rd) / 2; // average value down int avl = (lt + ld) / 2; // average value left int avr = (rt + rd) / 2; // average value right int dvert = avt - avd; // check the diffirence of up and down int dhoriz = avl - avr;// check the diffirence og left and rigt if (-1*tol > dvert || dvert > tol) // check if the diffirence is in the tolerance else change vertical angle { if (avt > avd) { servov = ++servov; if (servov > 180) { servov = 180; } } else if (avt < avd) { servov= --servov; if (servov < 0) { servov = 0; } } vertical.write(servov); } if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle { if (avl > avr) { servoh = --servoh; if (servoh < 0) { servoh = 0; } } else if (avl < avr) { servoh = ++servoh; if (servoh > 180) { servoh = 180; } } else if (avl == avr) { // nothing } horizontal.write(servoh); } delay(dtime); }
Ich nehme mal an, das Ganze ist in einem Arduino implementiert worden? Da kenn ich mich nicht so gut aus, aber: du übermittelst an dein Servo keinen Winkel, sondern einen Puls einer bestimmten Länge. Heißt also, du müsstest am Oszi nachschauen, ob dein Puls länger als 2ms und/oder kürzer als 1ms ist und per UART o.Ä. die Variablen servoh/servov ausgeben. So wie es aussieht, sind diese in deinem Code schon begrenzt. Und schau mal in der Library Servo.c, ob es da Defines gibt, an denen man etwas schrauben könnte. Verschiedene Servos haben leicht unterschiedliche Standards, was das Verhältnis Pulseweite zu Winkel angeht. MfG, Viktor
Gabriel T. schrieb: > Doch ich habe leider noch keine 360° Servos. Nur 180°. Kannst Du keine mechanische Übersetzung machen?
Ja ich arbeite mit Arduino. Danke dir für deine Antwort! Das werde ich mir mal anschauen: lg Gabriel
Harald W. schrieb: > Gabriel T. schrieb: > >> Doch ich habe leider noch keine 360° Servos. Nur 180°. > > Kannst Du keine mechanische Übersetzung machen? Doch, das kommt noch, doch zuerst gehts mal um einen Vor-Prototyp, bei dem nur der Code funktionieren muss^^
Gemäß der Anleitung https://www.arduino.cc/en/Reference/Servo gibst du bei der write() Funktion vom Servo den Winkel im Bereich 0 bis 180 an. Wie du da hin kommst, ist reine Mathematik. Bedenke, dass Modellbau Servos analog arbeiten. Da verhält sich jeder ein bisschen anders. Vielleicht kannst du nur den Bereich von 5 bis 175 ausnutzen. Auf den ersten Blick sehe diese Fragemente schonmal nicht schlecht aus:
1 | if (servoh < 0) |
2 | {
|
3 | servoh = 0; |
4 | }
|
5 | |
6 | if (servoh > 180) |
7 | {
|
8 | servoh = 180; |
9 | }
|
Hast du das kopiert oder selbst geschrieben? Vielleicht stehen die Befehle an der falschen Stelle oder du musst den Winkel noch weiter einschränken. Aber so schlecht, wie dein Programm da oben formatiert ist, mag ich gar nicht genauer rein schauen. Bevor du demnächst Quelltext postest, lies die Anleitung vom Forum. Sie erscheint direkt über dem Eingabefeld. Anleitungen lesen hilft darauf muss man seltsamerweise immer öfter hinweisen. Warum nur?
Stefan U. schrieb: > Anleitungen lesen hilft darauf muss man seltsamerweise immer öfter > hinweisen. Warum nur? Warum? Da hilft nur das Lesen der Anleitung: "Wie verstehe ich Anleitungen richtig?" SCNR Paul
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.