Doch das ö.
Gruß Tommy
Doch das ö.
Gruß Tommy
Tommy56:
Doch das ö.Gruß Tommy
hieß vor google translate bestimmt noch "delay" statt Verzögerung
Danke das war Fehler nr.1, habe jetzt delay drin
Dann ist also noch zusätzlich der Fehler bei Leere setup () & Leere Schleife () habe es jetzt geändert in viod setup & void loop...wir kommen weiter
Jetzt sieht es so aus:
#include <Servo.h> // Servo-Library einbinden
Servo horizontal; // Horizontale Servo
int servoh = 90; // Horizontale Servo stehen
Servo vertikal; // Vertikale Servo
int servov = 90; // Vertikale Servo stehen
// LDR Stiftverbindungen
// Name = analogpin;
int ldrlt = 0; // LDR oben links
int ldrrt = 1; // LDR oben rechts
int ldrld = 2; // LDR unten links
int ldrrd = 3; // LDR unten rechts
void setup ()
{
Serial.begin (9600);
// Servoanschlüsse
// Name.attacht (Pin);
horizontal.attach (9);
vertical.attach (10);
}
void loop ()
{
int lt = analogRead (ldrlt); // oben links
int rt = analogRead (ldrrt); // oben rechts
int ld = analogRead (ldrld); // unten links
int rd = analogRead (ldrrd); // unten rechts
int dtime = analogRead (4) / 20; // Lesen Potentiometer
int tol = analogRead (5) / 4;
int avt = (LT + RT) / 2; // Mittelwert top
int avd = (ld + rd) / 2; // Mittelwert nach unten
int avl = (lt + ld) / 2; // Mittelwert links
int avr = (RT + rd) / 2; // Mittelwert rechts
int dvert = avt - avd; // Überprüfen der diffirence zwischen oben und unten
int dhoriz = avl - avr; // Überprüfen der diffirence zwischen links und rechts
if (-1 * tol > dvert || dvert > tol) // Überprüfen, ob die diffirence im Toleranz, wenn nicht vertikalen Winkel verändern
{
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) // Überprüfen, ob die diffirence im Toleranz, wenn nicht horizontalen Winkel verändern
{
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)
{
// gar nichts
}
horizontal.write (servoh);
}
delay (DTIME);
}
// Die 4 Helligkeitswerte zu Testzwecken an den PC übertragen
Serial.println(String(ldrlt)); // LDR oben links
Serial.println(String(" - "));
Serial.println(String(ldrrt)); // LDR oben rechts
Serial.println(String)(" - ");
Serial.println(String)(ldrld); // LDR unten links
Serial.println(String)(" - ");
Serial.println(String)(ldrrd); // LDR unten rechts
Jetzt sind noch Fehler in der Bennenung
Neue Fehlerausgabe:
Arduino: 1.8.10 (Windows 10), Board: "Arduino/Genuino Uno"
E:\Arduino Projekt Solar\Sonnen_Verfolgung\Sonnen_Verfolgung.ino: In function 'void setup()':
Sonnen_Verfolgung:22:3: error: 'vertical' was not declared in this scope
vertical.attach (10);
^~~~~~~~
E:\Arduino Projekt Solar\Sonnen_Verfolgung\Sonnen_Verfolgung.ino:22:3: note: suggested alternative: 'vertikal'
vertical.attach (10);
^~~~~~~~
vertikal
E:\Arduino Projekt Solar\Sonnen_Verfolgung\Sonnen_Verfolgung.ino: In function 'void loop()':
Sonnen_Verfolgung:35:14: error: 'LT' was not declared in this scope
int avt = (LT + RT) / 2; // Mittelwert top
^~
Sonnen_Verfolgung:35:19: error: 'RT' was not declared in this scope
int avt = (LT + RT) / 2; // Mittelwert top
^~
Sonnen_Verfolgung:61:5: error: 'vertical' was not declared in this scope
vertical.write (servov);
^~~~~~~~
E:\Arduino Projekt Solar\Sonnen_Verfolgung\Sonnen_Verfolgung.ino:61:5: note: suggested alternative: 'vertikal'
vertical.write (servov);
^~~~~~~~
vertikal
Sonnen_Verfolgung:88:10: error: 'DTIME' was not declared in this scope
delay (DTIME);
^~~~~
E:\Arduino Projekt Solar\Sonnen_Verfolgung\Sonnen_Verfolgung.ino: At global scope:
Sonnen_Verfolgung:92:1: error: 'Serial' does not name a type
Serial.println(String(ldrlt)); // LDR oben links
^~~~~~
Sonnen_Verfolgung:93:1: error: 'Serial' does not name a type
Serial.println(String(" - "));
^~~~~~
Sonnen_Verfolgung:94:1: error: 'Serial' does not name a type
Serial.println(String(ldrrt)); // LDR oben rechts
^~~~~~
Sonnen_Verfolgung:95:1: error: 'Serial' does not name a type
Serial.println(String)(" - ");
^~~~~~
Sonnen_Verfolgung:96:1: error: 'Serial' does not name a type
Serial.println(String)(ldrld); // LDR unten links
^~~~~~
Sonnen_Verfolgung:97:1: error: 'Serial' does not name a type
Serial.println(String)(" - ");
^~~~~~
Sonnen_Verfolgung:98:1: error: 'Serial' does not name a type
Serial.println(String)(ldrrd); // LDR unten rechts
^~~~~~
Mehrere Bibliotheken wurden für "Servo.h" gefunden
Benutzt: C:\Users\...\Documents\Arduino\libraries\Servo
Nicht benutzt: C:\Users\...\Documents\Arduino\libraries\Servo-1.1.6
Nicht benutzt: C:\Program
exit status 1
'vertical' was not declared in this scope
Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.
was soll Verzögerung sein?
wenn, dann delay (auch wenn es nicht schön ist)
und
void setup()
void loop()
newpv:
Wenn ich das ö andere in oe geht es auch noch nicht...Dann ist also noch zusätlich der Fehler bei Leere setup () & Leere Schleife ()
Das ö musst Du aber ändern. Das "Leere setup()" habe ich für einen Witz gehalten. Ich wäre nie auf den Gedanken gekommen, dass jemand sowas wirklich macht.
Gruß Tommy
Bin leider im Programmieren nicht so fit...habe es als Vorlage genommen und möchte es zum laufen bringen!
Denke das bekomme ich mit eurer Hilfe hin! Danke schonmal!
Wenn das unveränderte Nachbauen des Beispiels nicht funktioniert, liegt das daran, dass die Anleitung nicht narrensicher genug ist, oder dass sie Fehler enthält. Oder etwas ähnliches, was man zumindest als "nicht narrensicher genug" interpretieren kann.
Dein Link zu Arduino Solar Tracker bietet allerdings beides.
Schönen Gruß an geobruce für sein Musterbeispiel dafür, dass das Internet sehr interessant aber auch großer Mist ist. (xprobe.net gibt es übrigens nicht mehr.)
Grundregel:
Du kannst nur sinnvoll übernehmen, was du soweit verstehst,
dass du es selbst besser machen könntest
michael_x:
dass die Anleitung nicht narrensicher genug ist
Narrensicher geht generell nicht: Die Narren sind zu erfinderisch.
Gruß Tommy
Habe jetzt die Fehler soweit raus!
#include <Servo.h> // Servo-Library einbinden
Servo Horizontal; // Horizontale Servo
int Servohorizontal = 90; // Servohorizontal start Position
Servo Vertikal; // Vertikale Servo
int Servovertikal = 90; // Servovertikal start Position
// LDR Stiftverbindungen
// Name = analogpin;
int LDRol = 0; // LDR oben links
int LDRor = 1; // LDR oben rechts
int LDRul = 2; // LDR unten links
int LDRur = 3; // LDR unten rechts
void setup ()
{
Serial.begin (9600);
// Servoanschlüsse
// Name.attacht (Pin);
Horizontal.attach (9);
Vertikal.attach (10);
}
void loop ()
{
int OL = analogRead (LDRol); // oben links
int OR = analogRead (LDRor); // oben rechts
int UL = analogRead (LDRul); // unten links
int UR = analogRead (LDRur); // unten rechts
int dtime = analogRead (4) / 20; // Lesen Potentiometer
int tol = analogRead (5) / 4;
int avt = (LDRol + LDRor) / 2; // Mittelwert oben
int avd = (LDRul + LDRur) / 2; // Mittelwert unten
int avl = (LDRol + LDRul) / 2; // Mittelwert links
int avr = (LDRor + LDRur) / 2; // Mittelwert rechts
int dvert = avt - avd; // Überprüfen der diffirence zwischen oben und unten
int dhoriz = avl - avr; // Überprüfen der diffirence zwischen links und rechts
if (-1 * tol > dvert || dvert > tol) // Überprüfen, ob die diffirence im Toleranz, wenn nicht vertikalen Winkel verändern
{
if (avt > avd)
{
Servovertikal = ++ Servovertikal;
if (Servovertikal > 180)
{
Servovertikal = 180;
}
}
else if (avt < avd)
{
Servovertikal = --Servovertikal;
if (Servovertikal < 0)
{
Servovertikal = 0;
}
}
Vertikal.write (Servovertikal);
}
if (-1 * tol > dhoriz || dhoriz > tol) // Überprüfen, ob die diffirence im Toleranz, wenn nicht horizontalen Winkel verändern
{
if (avl > avr)
{
Servohorizontal = --Servohorizontal;
if (Servohorizontal < 0)
{
Servohorizontal = 0;
}
}
else if (avl < avr)
{
Servohorizontal = ++ Servohorizontal;
if (Servohorizontal > 180)
{
Servohorizontal = 180;
}
}
else if (avl == avr)
{
// gar nichts
}
Horizontal.write (Servohorizontal);
}
// Die 4 Helligkeitswerte zu Testzwecken an den PC übertragen
Serial.println(LDRor); // LDR oben links
Serial.print(" - ");
Serial.println(LDRor); // LDR oben rechts
Serial.print(" - ");
Serial.println(LDRul); // LDR unten links
Serial.print(" - ");
Serial.println(LDRur); // LDR unten rechts
delay (dtime);
}
Bekomme jetzt beim Hochladen diesen Fehler:
Arduino: 1.8.13 (Windows 10), Board: "Arduino Uno"
Der Sketch verwendet 3862 Bytes (11%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 240 Bytes (11%) des dynamischen Speichers, 1808 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x0a
avrdude: stk500_recv(): programmer is not responding
Problem beim Hochladen auf das Board. Hilfestellung dazu unter http://www.arduino.cc/en/Guide/Troubleshooting#upload.
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x0a
Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.
Was ist das Falsch? Muss das Programm über USB am Arduino oder über einen USBasp Adapter hochgeladen werden?
Muss das Programm über USB am Arduino oder über einen USBasp Adapter hochgeladen werden?
Wie du willst.
Normalerweise geschieht "Hochladen" direkt über USB. Musst du das passende Board (ein Nano mit altem Bootloader ist kein Uno) und COM-Schnittstelle gewählt haben, und da darf kein anderes Programm (SerialMonitor) gleichzeitig aktiv sein.
Wenn du einen USBasp o.ä. verwenden willst, benutzt du "Hochladen mit Programmer" und überschreibst den Bootloader auf deinem Arduino.
Da ich diesen Arduino mal geflasht habe mit einem andern Programm, also auch den Bootloader muss ich es mit dem USBasp machen!
Der USBasp wird wie im Bild richtig erkannt, nur kommt beim Arduino Programm der Fehler:
Arduino: 1.8.13 (Windows 10), Board: "Arduino Uno"
Der Sketch verwendet 3862 Bytes (11%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 240 Bytes (11%) des dynamischen Speichers, 1808 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
avrdude: Warning: cannot query manufacturer for device: No such file or directory
avrdude: Warning: cannot query product for device: No such file or directory
avrdude: Warning: cannot open USB device: Function not implemented
avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'
avrdude: error: could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp'
Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.
Sind die Treiber falsch?
PS.: HAt sich erledfigt, Treiber musste per "Zadig" für den Programmer installiert werden, danach geht es jetzt
Programm übertragen geht jetzt!
Ich habe am Programm noch etwas weiter gemacht...
Ist die Ausgabe für den aktuellen Servowinkel so richtig?
Serial.print(Servovertikal); // Servovertikal
Serial.print(Servohorizontal); //Servohorizontal
Würde auch gerne noch im Programm drin haben, wenn LDRol+LDRor+LDRul+LDRur zusammen unter z.B. 200 sind, soll er automatisch in die Startposition fahren und wenn der Wert z.B. 300 ist soll er anfangen die Winkel usw anzupassen. Wie müssten die Zeilen lauten?
Habe jetzt schonmal die Rechnung drin:
int LDRcheck = (LDRol + LDRor + LDRul + LDRur); // Gesamtwert der 4 LDR
if (LDRcheck < 200) ???servo in Startposition???
if (LDRcheck > 300) ???Programm ablauf soll gestartet werden???
Ist die Ausgabe für den aktuellen Servowinkel so richtig?
Serial.print(Servovertikal); // Servovertikal
Serial.print(Servohorizontal); //Servohorizontal
Das Problem ist, dass du die beiden Zahlen schwer auseinanderhalten kannst, weil sie in eine Zeile direkt hintereinander geschrieben werden.
Ein bisschen Fleiß und die Ausgabe ist besser lesbar:
Serial.print (" Servo V:"); Serial.print(Servovertikal);
Serial.print (" H:");Serial.println(Servohorizontal);
Die Frage, wie oft diese Ausgabe gemacht werden soll, willst du vermutlich mit dem Poti, über
delay(dtime);
einstellen?
Da wäre mir dein
int dtime = analogRead (4) / 20;
etwas hektisch
if (LDRcheck > 300) ???Programm ablauf soll gestartet werden???
Ja, warum nicht? Die geschweiften Klammern umfassen da einen relativ großen Bereich, aber mit richtigem Einrücken, oder dem Auslagern in separate Funktionen, erzeugt man Übersichtlichkeit.
Danke für den Hinweis für die Ausgabe, habe es geändert!
Die delay(DTIME) habe ich bereits raus genommen, soll durch einen festen Wert angepasst werden!
Habe mal den einen Part reingeschrieben, das die Servos bei einem Wert unter 200 auf Startposition fahren und das Programm ab einen Wert von 300 startet.
Ist das so richtig?
#include <Servo.h> // Servo-Library einbinden
Servo Horizontal; // Horizontale Servo
int Servohorizontal = 15; // Servohorizontal start Position
Servo Vertikal; // Vertikale Servo
int Servovertikal = 15; // Servovertikal start Position
// LDR Stiftverbindungen
// Name = analogpin;
int LDRol = 0; // LDR oben links
int LDRor = 1; // LDR oben rechts
int LDRul = 2; // LDR unten links
int LDRur = 3; // LDR unten rechts
void setup ()
{
Serial.begin (9600);
// Servoanschlüsse
// Name.attacht (Pin);
Horizontal.attach (5);
Vertikal.attach (6);
}
void loop ()
{
int OL = analogRead (LDRol) * 1.0; // oben links, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int OR = analogRead (LDRor) * 1.0; // oben rechts, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int UL = analogRead (LDRul) * 1.0; // unten links, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int UR = analogRead (LDRur) * 1.0; // unten rechts, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int TOL = 200; // Wert, ab wann die Position geändert werden soll (Toleranz)
int MWT = (LDRol + LDRor) / 2; // Mittelwert oben
int MWU = (LDRul + LDRur) / 2; // Mittelwert unten
int MWL = (LDRol + LDRul) / 2; // Mittelwert links
int MWR = (LDRor + LDRur) / 2; // Mittelwert rechts
int dvert = MWT - MWU; // Überprüfen der diffirence zwischen oben und unten
int dhoriz = MWL - MWR; // Überprüfen der diffirence zwischen links und rechts
int LDRcheck = (LDRol + LDRor + LDRul + LDRur); // Gesamtwert der 4 LDR
if (LDRcheck < 200)
{
Horizontal.write (15);
Vertikal.write (15);
}
if (LDRcheck > 300)
{
if (-1 * TOL > dvert || dvert > TOL) // Überprüfen, ob die diffirenz in der Toleranz liegt, wenn nicht vertikalen Winkel verändern
{
if (MWT > MWU)
{
Servovertikal = ++ Servovertikal;
if (Servovertikal > 90)
{
Servovertikal = 90;
}
}
else if (MWT < MWU)
{
Servovertikal = --Servovertikal;
if (Servovertikal < 0)
{
Servovertikal = 0;
}
}
Vertikal.write (Servovertikal);
}
delay (200); //Warten bis der Servovertikal in Position ist
if (-1 * TOL > dhoriz || dhoriz > TOL) // Überprüfen, ob die diffirenz in der Toleranz liegt, wenn nicht horizontalen Winkel verändern
{
if (MWL > MWR)
{
Servohorizontal = --Servohorizontal;
if (Servohorizontal < 0)
{
Servohorizontal = 0;
}
}
else if (MWL < MWR)
{
Servohorizontal = ++ Servohorizontal;
if (Servohorizontal > 180)
{
Servohorizontal = 180;
}
}
else if (MWL == MWR)
{
// gar nichts
}
Horizontal.write (Servohorizontal);
}
}
// Die 4 Helligkeitswerte und die Grad Zahl Servomotoren zu Testzwecken an den PC übertragen
Serial.print (" LDRol:"); Serial.println(LDRol); // LDR oben links
Serial.print(" - ");
Serial.print (" LDRor:"); Serial.println(LDRor); // LDR oben rechts
Serial.print(" - ");
Serial.print (" LDRul:"); Serial.println(LDRul); // LDR unten links
Serial.print(" - ");
Serial.print (" LDRur:"); Serial.println(LDRur); // LDR unten rechts
Serial.print(" - ");
Serial.print (" Servo V:"); Serial.print(Servovertikal); // Servo Winkel Vertikal
Serial.print(" - ");
Serial.print (" Servo H:"); Serial.println(Servohorizontal); //Servo Winkel Horizontal
delay (200);
}
Nicht entscheidend, aber möglich:
if (LDRcheck < 200)
{
Horizontal.write (15);
Vertikal.write (15);
}
else if (LDRcheck > 300)
{
Meinst du mit "Nicht entscheidend, aber möglich", das man es nicht umbeding programmieren muss? Oder meinst du die Änderung von "if (LDRcheck > 300)" zu "else if (LDRcheck > 300)"?
Wäre es auch möglich bei den Winkel auf die Startwinkel am Anfang der Programmes zurück zugreifen?
Meine diese Zeilen:
Servo Horizontal; // Horizontale Servo
int Servohorizontal = 15; // Servohorizontal start Position
Servo Vertikal; // Vertikale Servo
int Servovertikal = 15; // Servovertikal start Position
Wenn ja, wie muss es dann statt "Horizontal.write (15)" & "Vertikal.write (15)" lauten?
Diese Zeile scheint falsch:
int LDRcheck = (LDRol + LDRor + LDRul + LDRur); // Gesamtwert der 4 LDR
Du addierst die Pinnummern.
Ungetesteter Versuch:
#include <Servo.h> // Servo-Library einbinden
Servo Horizontal; // Horizontale Servo
const byte servoPinH = 5;
int Servohorizontal = 15; // Servohorizontal start Position
Servo Vertikal; // Vertikale Servo
const byte servoPinV = 6;
int Servovertikal = 15; // Servovertikal start Position
// LDR Stiftverbindungen
// Name = analogpin;
const byte LDRol = A0; // LDR oben links
const byte LDRor = A1; // LDR oben rechts
const byte LDRul = A2; // LDR unten links
const byte LDRur = A3; // LDR unten rechts
void setup ()
{
Serial.begin (9600);
// Servoanschlüsse
// Name.attacht (Pin);
Horizontal.attach (servoPinH);
Vertikal.attach (servoPinV);
}
void loop ()
{
int OL = analogRead (LDRol) * 1.0; // oben links, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int OR = analogRead (LDRor) * 1.0; // oben rechts, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int UL = analogRead (LDRul) * 1.0; // unten links, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int UR = analogRead (LDRur) * 1.0; // unten rechts, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int TOL = 200; // Wert, ab wann die Position geändert werden soll (Toleranz)
int MWT = (OL + OR) / 2; // Mittelwert oben
int MWU = (UL + UR) / 2; // Mittelwert unten
int MWL = (OL + UL) / 2; // Mittelwert links
int MWR = (OR + UR) / 2; // Mittelwert rechts
int dvert = MWT - MWU; // Überprüfen der diffirence zwischen oben und unten
int dhoriz = MWL - MWR; // Überprüfen der diffirence zwischen links und rechts
int LDRcheck = (OL + OR + UL + UR); // Gesamtwert der 4 LDR
if (LDRcheck < 200)
{
Servohorizontal = 15;
Horizontal.write (Servohorizontal);
Servovertikal = 15;
Vertikal.write (Servovertikal);
}
else if (LDRcheck > 300)
{
if (-1 * TOL > dvert || dvert > TOL) // Überprüfen, ob die diffirenz in der Toleranz liegt, wenn nicht vertikalen Winkel verändern
{
if (MWT > MWU)
{
Servovertikal++;
if (Servovertikal > 90)
{
Servovertikal = 90;
}
}
else if (MWT < MWU)
{
Servovertikal--;
if (Servovertikal < 0)
{
Servovertikal = 0;
}
}
Vertikal.write (Servovertikal);
}
delay (200); //Warten bis der Servovertikal in Position ist
if (-1 * TOL > dhoriz || dhoriz > TOL) // Überprüfen, ob die diffirenz in der Toleranz liegt, wenn nicht horizontalen Winkel verändern
{
if (MWL > MWR)
{
Servohorizontal--;
if (Servohorizontal < 0)
{
Servohorizontal = 0;
}
}
else if (MWL < MWR)
{
Servohorizontal++;
if (Servohorizontal > 180)
{
Servohorizontal = 180;
}
}
else if (MWL == MWR)
{
// gar nichts
}
Horizontal.write (Servohorizontal);
}
}
// Die 4 Helligkeitswerte und die Grad Zahl Servomotoren zu Testzwecken an den PC übertragen
Serial.print (" LDRol:"); Serial.println(LDRol); // LDR oben links
Serial.print(" - ");
Serial.print (" LDRor:"); Serial.println(LDRor); // LDR oben rechts
Serial.print(" - ");
Serial.print (" LDRul:"); Serial.println(LDRul); // LDR unten links
Serial.print(" - ");
Serial.print (" LDRur:"); Serial.println(LDRur); // LDR unten rechts
Serial.print(" - ");
Serial.print (" Servo V:"); Serial.print(Servovertikal); // Servo Winkel Vertikal
Serial.print(" - ");
Serial.print (" Servo H:"); Serial.println(Servohorizontal); //Servo Winkel Horizontal
delay (200);
}
EDIT: Entsprechend #27 zurück zu int geändert, sonst gibt es Warnungen. Danke!
unt16_t -> uint16_t
agmue:
Diese Zeile scheint falsch:int LDRcheck = (LDRol + LDRor + LDRul + LDRur); // Gesamtwert der 4 LDR
Haste recht habe es geändert, auch mit der Ausgabe funktioniert es!
michael_x:
unt16_t -> uint16_t
Was meinst du damit?
Hier mein geändertes aktuelles Programm:
#include <Servo.h> // Servo-Library einbinden
Servo Horizontal; // Horizontale Servo
const byte servoPinH = 5;
int Servohorizontal = 15; // Servohorizontal start Position
Servo Vertikal; // Vertikale Servo
const byte servoPinV = 6;
int Servovertikal = 15; // Servovertikal start Position
// LDR Stiftverbindungen, Name = analogpin;
const byte LDRol = 0; // LDR oben links
const byte LDRor = 1; // LDR oben rechts
const byte LDRul = 2; // LDR unten links
const byte LDRur = 3; // LDR unten rechts
void setup ()
{
Serial.begin (9600);
// Servoanschlüsse
// Name.attacht (Pin);
Horizontal.attach (5);
Vertikal.attach (6);
}
void loop ()
{
int OL = analogRead (0) * 1.0; // oben links, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int OR = analogRead (1) * 1.0; // oben rechts, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int UL = analogRead (2) * 1.0; // unten links, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int UR = analogRead (3) * 1.0; // unten rechts, Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind
int TOL = 100; // Wert, ab wann die Position geändert werden soll (Toleranz)
int MWT = (OL + OR) / 2; // Mittelwert oben
int MWU = (UL + UR) / 2; // Mittelwert unten
int MWL = (OL + UL) / 2; // Mittelwert links
int MWR = (OR + UR) / 2; // Mittelwert rechts
int dvert = MWT - MWU; // Überprüfen der diffirence zwischen oben und unten
int dhoriz = MWL - MWR; // Überprüfen der diffirence zwischen links und rechts
int LDRcheck = (OL + OR + UL + UR); // Gesamtwert der 4 LDR
if (LDRcheck < 200) // Wenn der Wert unter 200 ist, fahren die Servomotoren in die Startposition
{
Horizontal.write (15);
Vertikal.write (15);
}
else if (LDRcheck > 300) // Wenn der Wert über 300 ist, startet die Ausrichtung
{
if (-1 * TOL > dvert || dvert > TOL) // Überprüfen, ob die diffirenz in der Toleranz liegt, wenn nicht vertikalen Winkel verändern
{
if (MWT > MWU)
{
Servovertikal = ++ Servovertikal;
if (Servovertikal > 90)
{
Servovertikal = 90; // Maximaler Winkelwert
}
}
else if (MWT < MWU)
{
Servovertikal = --Servovertikal;
if (Servovertikal < 0)
{
Servovertikal = 0; // Minimaler Winkelwert
}
}
Vertikal.write (Servovertikal);
}
delay (200); //Warten bis der Servovertikal in Position ist
if (-1 * TOL > dhoriz || dhoriz > TOL) // Überprüfen, ob die diffirenz in der Toleranz liegt, wenn nicht horizontalen Winkel verändern
{
if (MWL > MWR)
{
Servohorizontal = --Servohorizontal;
if (Servohorizontal < 0)
{
Servohorizontal = 0; // Minimaler Winkelwert
}
}
else if (MWL < MWR)
{
Servohorizontal = ++ Servohorizontal;
if (Servohorizontal > 180)
{
Servohorizontal = 180; // Maximaler Winkelwert
}
}
else if (MWL == MWR)
{
// gar nichts
}
Horizontal.write (Servohorizontal);
}
}
// Die 4 Helligkeitswerte und die Grad Zahl Servomotoren zu Testzwecken an den PC übertragen
Serial.print ("LDRol:"); Serial.print(OL); // LDR oben links
Serial.print (" LDRor:"); Serial.println(OR); // LDR oben rechts
Serial.print ("LDRul:"); Serial.print(UL); // LDR unten links
Serial.print (" LDRur:"); Serial.println(UR); // LDR unten rechts
Serial.print ("Servo V:"); Serial.print(Servovertikal); // Servo Winkel Vertikal
Serial.print (" Servo H:"); Serial.println(Servohorizontal); //Servo Winkel Horizontal
delay (1000);
}
Was jetzt noch schön wäre, wenn man hier auf den Startwinkel oben verweißen könnte:
if (LDRcheck < 200) // Wenn der Wert unter 200 ist, fahren die Servomotoren in die Startposition
{
Horizontal.write (15);
Vertikal.write (15);
}
Sind die Bezeichungen die ich soweit dahinter geschrieben habe soweit richtig?
newpv:
Was jetzt noch schön wäre, wenn man hier auf den Startwinkel oben verweißen könnte:
Guckst Du bitte #26.