Hallo,
ich bin neu beim Programmieren und möchte gerne ein Programm erstellen mit 2 Beweglichen Achsen für die Sonne verfolgung. Habe nach Vorlage gearbeitet! Das Problem ist jetzt ich muss ja 2x die Differenz ausrechnen. 1x zwischen dem LDR links-rechts und 1x zwischen dem LDR oben-unten. bekomme aktuell eine Fehlermeldung, da ich nich weiß wie ich diese unterschiedlich diffieren/bennen kann.
Hier das Programm:
// Servo-Library einbinden
#include <Servo.h>
// Servo-Objekt horizontal erzeugen, Motor rechts-links
Servo horizontal;
// Startwinkel für den Servo horizontal (Bereich 0-179 Grad)
int servoh = 90;
// Servo-Objekt vertikal erzeugen, Motor oben-unten
Servo vertikal;
// Startwinkel für den Servo vertikal (Bereich 0-90 Grad)
int servov = 45;
void setup() {
// Serielle Schnittstelle initialisieren
Serial.begin(9600);
// Pin 5 PWM als Ausgabe-Pin
pinMode(5, OUTPUT);
// Pin 5 PWM ist Steuerpin für den Servo horizontal, Motor rechts-links
horizontal.attach(5);
horizontal.write(servoh);
delay(20);
// Pin 6 PWM als Ausgabe-Pin
pinMode(6, OUTPUT);
// Pin 6 PWM ist Steuerpin für den Servo vertikal, Motor oben-unten, Startwinkel setzen und warte Zeit
vertikal.attach(6);
vertikal.write(servov);
delay(20);
}
void loop() {
// Helligkeit der 2 lichtempfindlichen Widerstände für horizontal auslesen (Rechts)
int rightEye = analogRead(0);
// Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind (Links)
int leftEye = analogRead(1) * 1.0;
// Differenz horizontal ausrechnen
int diff = (rightEye - leftEye);
// Wenn rechts deutlich heller als links -> 2 Grad nach rechts drehen
if (diff > 20) {
servoh = servoh + 2;
}
// Wenn links deutlich heller als rechts -> 2 Grad nach links drehen
if (diff < -20) {
servoh = servoh - 2;
}
// Servo horizontal max. bis 179 Grad drehen
if (servoh > 179) {
servoh = 179;
}
// Servo horizontal min. bis 0 Grad drehen
if (servoh < 0) {
servoh = 0;
}
// Grad an den Servo horizontal schicken
horizontal.write(servoh);
// Warte Zeit bis der Servo horizontal gefahren ist
delay(100);
// Helligkeit der 2 lichtempfindlichen Widerstände für vertikal auslesen (Oben)
int aboveEye = analogRead(2);
// Faktor 1.0 anpassen, wenn die Widerstände sehr unterschiedlich sind (Unten)
int belowEye = analogRead(3) * 1.0;
// Differenz vertikal ausrechnen
int diff = (aboveEye - belowEye);
// Wenn oben deutlich heller als unten -> 2 Grad nach oben drehen
if (diff > 20) {
servov = servov + 2;
}
// Wenn unten deutlich heller als oben -> 2 Grad nach unten drehen
if (diff < -20) {
servov = servov - 2;
}
// Servo vertikal max. bis 90 Grad drehen
if (servov > 90) {
servov = 90;
}
// Servo vertikal min. bis 0 Grad drehen
if (servov < 0) {
servov = 0;
}
// Grad an den Servo horizontal schicken
vertikal.write(servov);
// Die beiden Helligkeitswerte zu Testzwecken an den PC übertragen
Serial.println(String(rightEye) + "-" + String(leftEye));
Serial.println(String(aboveEye) + "-" + String(belowEye));
// Kurze Wartezeit, dann nächste Messung.
// Sollte es beim Testen der Einstellungen zu chaotisch werden,
// diesen Wert einfach auf 50 oder 100 erhöhen und damit den Vorgang verlangsamen
delay(20);
}
PS.: Die Zeiten werden natürlich noch angepasst, ist erstmal zum testen!
Die Servo-Bibliothek kann auf jeden Pin den Servo ansteuern. Es müssen keine PWM Pins sein.
Außerdem müssen diese Pins auch nicht mit pinMode initialisiert werden. Das macht die Bibliothek.
Also lösche pinMode();
Die Fehlermeldung möchte ich auch gerne sehen. Ich kann sie nämlich nicht erraten.
Da hast Du Dir bei C&P ein böses Zeichen eingefangen.
Öffne den Text mal in einem Editor, bei dem Du zwischen UTF8 und ASCII/ANSI umschalten kannst (z.B. Notepad++). Dann müsstest Du beim Umschalten ein komisches Zeichen sehen, dass Du löschen solltest.
#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
Leere setup ()
{
Serial.begin (9600);
// Servoanschlüsse
// Name.attacht (Pin);
horizontal.attach (9);
vertical.attach (10);
}
Leere Schleife ()
{
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);
}
Verzögerung (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
Hier die Komplette Fehlermeldung:
Arduino: 1.8.10 (Windows 10), Board: "Arduino/Genuino Uno"
Sonnen_Verfolgung:88:7: error: stray '\303' in program
Verzögerung (DTIME);
^
Sonnen_Verfolgung:88:8: error: stray '\266' in program
Verzögerung (DTIME);
^
Sonnen_Verfolgung:16:1: error: 'Leere' does not name a type
Leere setup ()
^~~~~
Sonnen_Verfolgung:25:1: error: 'Leere' does not name a type
Leere Schleife ()
^~~~~
Sonnen_Verfolgung:16:1: error: 'Leere' does not name a type
Leere setup ()
^~~~~
Sonnen_Verfolgung:25:1: error: 'Leere' does not name a type
Leere Schleife ()
^~~~~
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
stray '\303' in program
Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.
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.
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.
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
#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.