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);
}
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.
die Messwerte des Lichteinfall als Funktion des Winkels ist eindeutig und stetig und betragsrichtig für jede Achse.
Du hast die Anordung mal händisch bewegt in alle 4 Richtungen und die Messwerte kontroliert
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.
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.
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).
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.
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
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 ...
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.
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.
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.