Hallo ich muss für mein Schulprojekt einen licht Verfolger mit dem Arduino bauen. Hierbei soll ich ein kostruckt bauen das sich mit Hilfe von 2 Servos (2 Achsen) einer Lichtquelle folgt, allerdings bekomme ich es nicht hin denn 2 Servo anzusteuern. Könnte mir jemand sagen wo das Problem liegt ?
Hier der Code:
// Servo-Library einbinden
#include <Servo.h>
// Servo-Objekt1 erzeugen
Servo myservo1;
// Servo-Objekt2 erzeugen
Servo myservo2;
// Startwinkel für den Servo (Bereich 0-179 Grad)
int angle = 180;
int anglex = 180;
void setup() {
// Serielle Schnittstelle initialisieren
Serial.begin(9600);
// Pin 3 als Ausgabe-Pin
pinMode(3, OUTPUT);
pinMode(0, OUTPUT);
// Pin 3 ist Steuerpin für den Servo
myservo1.attach(3);
myservo2.attach(0);
}
void loop() {
// Helligkeit der beiden lichtempfindlichen Widerstände
int rightEye = analogRead(1);
int leftEye = analogRead(2);
int upEye = analogRead(3);
int downEye = analogRead(4);
// Differenz ausrechnen
int diff = (1.2*rightEye - leftEye);
int diffup = (upEye - downEye);
// Wenn rechts deutlich heller als links -> 2 Grad nach rechts drehen
if (diff > 10) {
angle = angle+1;
}
if (diffup > 10){
anglex = anglex+1;
}
// Wenn links deutlich heller als rechts -> 2 Grad nach links drehen
if (diff < -10) {
angle = angle-1;
}
if (diffup < -10){
anglex = anglex-1;
}
// Servo max. bis 179 Grad drehen
if (angle > 179) {
angle = 179;
}
if (anglex > 179){
anglex = 179;
}
// Servo min. bis 0 Grad drehen
if (angle < 0) {
angle = 0;
}
if (anglex < 0) {
anglex = 0;
}
// Grad an den Servo schicken
myservo1.write(angle);
myservo2.write(anglex);
// Die beiden Helligkeitswerte zu Testzwecken an den PC übertragen
Serial.println(String(rightEye)+"-"+String(leftEye)+"-"+String(upEye)+"-"+String(downEye));
// 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);
}
Pin 0 und 1 sind schon vergeben für die Serielle Schnittstelle
korrigiere
pinMode(0, OUTPUT);
myservo2.attach(0);
int rightEye = analogRead(1);
Das ist schon lästig, dass du dir das im Code nun durchgängig zusammen suchen musst, oder?
daher besser:
definiere ALLE Deine Pins in Konstanten und verwende diese dann.
ungetestet:
// Servo-Library einbinden
#include <Servo.h>
// PIN Definitionen
// reserviert für Serial = 0
// reserviert für Serial = 1
const int servo1Pin = 3;
const int servo2Pin = 5; // noiasca: Achtung umschließen!
const int ldrRightPin = 6; // noiasca: Achtung umschließen!
const int ldrLeftPin = 2;
const int ldrUpPin = 3;
const int ldrDownPin = 4;
// genutzt von #define LED_BUILTIN 13
// Servo-Objekt1 erzeugen
Servo myservo1;
// Servo-Objekt2 erzeugen
Servo myservo2;
// Startwinkel für den Servo (Bereich 0-179 Grad)
int angle = 180;
int anglex = 180;
void setup() {
// Serielle Schnittstelle initialisieren
Serial.begin(9600);
// Pin 3 als Ausgabe-Pin
//pinMode(servo1_pin, OUTPUT); // noiasca: das ist für Servos nicht notwendig
//pinMode(servo2_pin, OUTPUT); // noiasca: ebenso
// Pin 3 ist Steuerpin für den Servo
myservo1.attach(servo1Pin);
myservo2.attach(servo2Pin);
}
void loop() {
// Helligkeit der beiden lichtempfindlichen Widerstände
int rightEye = analogRead(ldrRightPin);
int leftEye = analogRead(ldrLeftPin);
int upEye = analogRead(ldrUpPin);
int downEye = analogRead(ldrDownPin);
// Differenz ausrechnen
int diff = (1.2 * rightEye - leftEye);
int diffup = (upEye - downEye);
// Wenn rechts deutlich heller als links -> 2 Grad nach rechts drehen
if (diff > 10) {
angle = angle + 1;
}
if (diffup > 10) {
anglex = anglex + 1;
}
// Wenn links deutlich heller als rechts -> 2 Grad nach links drehen
if (diff < -10) {
angle = angle - 1;
}
if (diffup < -10) {
anglex = anglex - 1;
}
// Servo max. bis 179 Grad drehen
if (angle > 179) {
angle = 179;
}
if (anglex > 179) {
anglex = 179;
}
// Servo min. bis 0 Grad drehen
if (angle < 0) {
angle = 0;
}
if (anglex < 0) {
anglex = 0;
}
// Grad an den Servo schicken
myservo1.write(angle);
myservo2.write(anglex);
// Die beiden Helligkeitswerte zu Testzwecken an den PC übertragen
Serial.println(String(rightEye) + "-" + String(leftEye) + "-" + String(upEye) + "-" + String(downEye));
// 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);
}
P.S.: bitte lies im Forum How to wie man Code als Code formatiert