Servo Motor dreht dauerhaft

Hallo Zusammen,

ich brauche eure Hilfe.

Es ist mein erstes Arduino Projekt und ich versuche zwei servor Motoren anzusteuern. Das Signal soll über 4 Lichtsensoren kommen.

Schließe ich mein arduino so an den Laptop an, dreht der servo an pin 9 dauerhaft durch. Der zweite bewegt sich nur am start minimal und bleibt dann star.

Kann mir dieses Verhalten jemand erklären?

Wäre für jede Hilfe sehr Dankbar!

#include <AFMotor.h>

#include <Servo.h>

// 180 horizontal MAX Servo horizontal; // Horizontal/Azimuth servo
Servo horizontal;
int servoh = 90; // Make servo stationary
int servohLimitHigh = 100; int servohLimitLow = 5;

Servo vertical; // Vertical/Zenith servo
int servov = 45; // Make servo horizontal
int servovLimitHigh = 110; int servovLimitLow = 20;

// LDR pin connections //position = Analog pin
int ldrbl = 0; //Bottom Left
int ldrbr = 1; //Bottom Right
int ldrtl = 2; //Top Left
int ldrtr = 3; //Top Right

void setup() { Serial.begin(9600);
// servo connections
// name.attacht(digital pin);
horizontal.attach(9);
vertical.attach(10);
delay(1000);
}

void loop() { int bl = analogRead(ldrbl); // Bottom left
int br = analogRead(ldrbr); // Bottom Right
int tl = analogRead(ldrtl); // Top Left
int tr = analogRead(ldrtr); // Top Right
int percentb, percentt, percentl, percentr;
//int dtime = analogRead(4)/20; // read potentiometers
//int tol = analogRead(5)/4;
int dtime = 500; int tol = 10;
int avb = (bl + br) / 2; // average value bottom
int avt = (tl + tr) / 2; // average value top
int avl = (bl + tl) / 2; // average value left
int avr = (br + tr) / 2; // average value right
percentb = map(avb,0,1023,0,100); percentt = map(avt,0,1023,0,100); percentl = map(avl,0,1023,0,100); percentr = map(avr,0,1023,0,100);
int dvert = avt - avb; // check the diffirence of top and bottom
int dhoriz = avl - avr;// check the diffirence of left and rigt
Serial.print(percentt);
Serial.println(" percent t ");
Serial.print(percentb);
Serial.println(" percent b ");
Serial.print(percentl);
Serial.println(" percent l ");
Serial.print(percentr);
Serial.println(" percent r ");
Serial.print(dtime);
Serial.println(" delay time");
Serial.print(tol);
Serial.println(" tolerance ");
Serial.print(dhoriz);
Serial.println(" Difference Horizontal ");
Serial.print(dvert);
Serial.println(" Difference Vertical ");
if (-1*tol > dvert || dvert > tol) // check if there is a difference,within the tolerance, or else change vertical angle
{
if (avt > avb)
{
servov = ++servov;
if (servov > servovLimitHigh)
{
servov = servovLimitHigh;
}
}
else if (avt < avb)
{
servov= --servov;
if (servov < servovLimitLow)
{
servov = servovLimitLow;
}
}
vertical.write(servov);
}
if (-1*tol > dhoriz || dhoriz > tol) // check if there is a difference,within the tolerance, or else change horizontal angle
{
if (avl > avr)
{
servoh = ++servoh;
if (servoh < servohLimitLow)
{
servoh = servohLimitLow;
}
}
else if (avl < avr)
{
servoh = --servoh;
if (servoh > servohLimitHigh)
{
servoh = servohLimitHigh;
}
}
else if (avl = avr)
{
// nothing
}
horizontal.write(servoh);
}
delay(dtime);
}

Ich habe zwar keine Lösung für Dein Problem, bekomme beim Anblick Deines Codes aber Lust, noch einmal auf

hinzuweisen :slight_smile:

Gruß

Gregor

Hi

Die AFMotor.h befindet sich nicht in den Tiefen der IDE - woher hast Du Die?

MfG

PS: Mit STRG-T in der IDE sieht 'die Sache' gleich ganz anders aus :wink:

Hallo,

warum fängst Du bei Deinem ersten Projekt nicht mit einem Beispiel aus der Lib an.

Damit kannst du testen ob deine Hardware ok ist und die Funktion verstehen.

Was soll Dein Sketch denn machen , der ist etwas unübersichtlich.

ich kann nur vermuten das 2 Achsen x,y verstellt werden sollen, so das der Lichteinfall der 4 Sensoren maximiert wird .

Heinz

Danke für die schnellen Rückmeldungen.

Das Projekt ist für die UNI, da konnte ich vorher nicht groß den Umgang mit einem Arduino üben.

AFMotor.h habe ich wie hier beschrieben installiert:

bin weiterhin für jede Hilfe Dankbar!

Ziel ist es ein Nachführsystem zu bauen, welches der Sonne folgt.

4 Lichtsensoren geben Rückmeldung zu em Sonnenstand.

Ein Servo sorgt für die vertikale Drehung und der andere für die Horizontale.

Der 360° Servo dreht beim einschalten dauerhaft der 180° Servo zuckt nur kurz und dann bewegt sich nix mehr.

Hallo,

Na ja , ein Beispiel mit einem Motor ausprobieren dauert 10 minuten , Verstehen dann noch mal 30 Minuten, vorausgesetzt ein paar Grundkentnisse sind vorhanden.

Hast Du den Sketch selbst geschrieben, selbst kopiert, selbst nicht verstanden?

Wenn Du auf der Uni bist dann kann ich ja jetzt mal versuchen bei der systematische Analyse des zu Probems helfen. wie Du dir sicher vorstellen kannst ist die Anordnung und Geometrie der 4 LDR zueinander und in Bezug auf die Lichtquelle wichtig.

  1. die Messwerte des Lichteinfall als Funktion des Winkels ist eindeutig und stetig und betragsrichtig für jede Achse.

  2. Du hast die Anordung mal händisch bewegt in alle 4 Richtungen und die Messwerte kontroliert

  3. Du hast die Servos mal einzeln fahren lassen langsam von einer zur andere Seite und die Messwerte auf Richtung und Betrag kontrolliert so dass es zu keiner Mittkopplung kommen kann.

  4. Du hast den Regelkreis, denn das will es ja letztlich werden , Achse fur Achse einzeln getestet.

man kann sicher auch kaotisch vorgehen (Glück gehabt geht) , aber das hätte mit der Arbeitsweise auf einer UNI ja nich viel zu tun, wollen wir also nicht.

Heinz

Das Thema gab es schon mal. Nutze mal die Suche.

Zusammenfassung des Ergebnisses: Die 4 LDR müssen sich gleich verhalten, also auch quasi die gleiche Kennlinie aufweisen. Das bedeutet unter Umständen langwierieges Ausmessen aus einer großen Anzahl (und gleich ein paar als Reserve mit).

Gruß Tommy

Ja, der code hat Teile von anderen Projekten. Habe ihn mit Hilfe eines Informatikers angepasst.

Wenn ich die Dioden alle im dunkeln halte bewegt sich kein Motor. Wenn ich sie einzeln mit einer Taschenlampe anleuchte bewegt sich immer nur der Motor für die Vertikale Achse.

Hallo

die 4 LDR werden einzeln eingelesen, damit könntest Du für jeden die Kennlinie einzeln anpassen. Anders sieht das sicher aus wenn man mit zwei LDR einen Teiler aufbauen würde, dann müssen sie gleich sein.

letzlich muss es ja nur um den optimalen Winkel herum, genau sein, also vermute ich mal einen Offsetwert als Anpassung wird reichen Bei grösseren Positionsabweichungen links rechts gehts ja eigendlich nur darum das der Servo in die richtige Richtung fährt. Aber das ergibt sich aus punkt 1-4 in #6

Gruß heinz

Guck Dir das hier mal an..

Gruß SG

Hi

Du schriebst was von einem 360°-Servo - DAS sind, meines Wissen nach, Servos, Die eben NICHT auf eine Gradzahl fahren, sondern nur unterschiedlich schnell in eine der Richtungen, je nachdem, ob der Impuls größer oder kleiner der Mittel-Position ist bzw. Deren Entfernung dazu.

Wenn Du statt einer Gegenkopplung eine Mitkopplung gebaut hast, dann MUSS sich Das laufend drehen.

Bitte erläutere noch Mal Deine Aufgabe, Deine Hardware, Deine Vorkenntnisse.
Auch so Kleinigkeiten wie '360°-Servo' wären so zu erklären, daß ich verstehe, was Du darunter verstehst - aber bitte langsam, bin nicht studiert ... :wink:

MfG

Habe schon einige Beispiele wie den Link durch.

Habe ein Podest und eine kleine Alukonstruktion die sich der Sonne hinterher bewegen soll. Dafür befinden sich an jeder der 4 Ecken des systems eine LED.

jetzt habe ich einen Servo Motor der zu 180Grad drehungen fähig ist für die drehung um die x-Achse.

Der zweite Servo kann sich um 360Grad drehen und soll um die y-Asche die Drehbewegung steuern.

Aktuell ist der Stand:

Beim einschalten im abgedunkelten Zustand, stehen beide still, kommt licht dazu beginnen beide zu drehen. Der y-Achsen Motor dreht dann allerdings ununterbrochen auch bei erneutem abdunkeln. Der X-Achsen Servo hört schon früher auf.

Beginne ich den Versuch im Hellen, laufen beide. Jedoch hört der x-achsen Servo auch nach einigen Sekunden auf.

Aktuell ist die Elektronik noch von der Hardware getrennt sodass cih manuell bestimme, wie die Lichtverhältnisse sind.

Hi

Da wird auch Dein Problem sein - wenn der Sensor erkennt, daß wir GAAAANZ WEIT NACH LINKS müssen, steuert Er das Servo 'volle Kanne auf nach Rechts' - nun kommst Du nicht in die Puschen, um die Plattform richtig 'nachzuführen' - der Arduino sieht immer noch, daß wir viel zu weit weg sind und sagt Das auch dem Servo, Der immer noch 'wie blöd' dreht.

Du brauchst die Rückkopplung der Plattform zu den Sensoren.
Wenn zwei Achsen akut zu Viel des Guten sind - mach erst eine Achse.

Dabei kannst Du Dir auch vorerst damit behelfen, daß Du Dir ausgeben lässt, was der Arduino wohl mit den jetzigen Sensorwerten vor hätte - also: bei Fehlern den Sketch mit Serial.print voll stopfen, damit man sieht, was wirklich ab geht.
Wenn was falsch läuft -> korrigieren, bis's passt.

MfG

Hallo,

warum gehst Du meine 4 Punkte nicht durch und ziehst die Schlüsse daraus. Wenn Du eine Lampe verwendest kannst du auch die Lampe um die Einrichtung bewegen. Die Regelsinne stimmen nicht vermute ich immer noch. Du hast doch genug Serial.print drin umd die Messwerte zu testen. Geh systematisch für jede Achse einzeln vor und trenn den Regelkreis auf , das verwirrt Dich nur.

Heinz