Eine Hardware-Lösung würde ich gerne vermeiden. Ich habs jetzt erstma anderweitig gelöst, jetzt fährt er dauerhaft zwischen zwei Positionen hin und her, z.b. 30° und 150°. Das dürfte für meine Zwecke reichen.
Allerdings komm ich damit im Moment nicht weiter wenn ich in die Loop noch eine andere Funktion packe.
1+2 = fail
1
Code:
#include <Servo.h>
int pos = 0;
Servo myservo;
long previousMillis1 = 0;
long previousMillis2 = 300;
void setup(){
myservo.attach(10);
}
void loop(){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis1 >= 600) { //yes 200
myservo.write(30);
previousMillis1 = currentMillis;
}
if(currentMillis - previousMillis2 >= 600) { //yes 200
myservo.write(150);
previousMillis2 = currentMillis;
}
}
2
Code:
#define echoPin 46 // Echo Pin
#define trigPin 47 // Trigger Pin
int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long interval = 50; // Scanrate
long previousMillis = 0;
long duration, distance;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
scan();
}
int scan(){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
Serial.println(distance);
distance = duration/58.2; //Calculate the distance (in cm) based on the speed of sound.
previousMillis = currentMillis;
}
}
fail
Code:
#include <Servo.h>
#define echoPin 46 // Echo Pin
#define trigPin 47 // Trigger Pin
int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
int pos = 0;
long interval = 50; // Scanrate
long previousMillis = 0;
long previousMillis1 = 0;
long previousMillis2 = 300;
long duration, distance;
Servo myservo;
void setup() {
Serial.begin (9600);
myservo.attach(10);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop(){
scan();
unsigned long currentMillis = millis();
if(currentMillis - previousMillis1 >= 600) { //yes 200
myservo.write(30);
previousMillis1 = currentMillis;
}
if(currentMillis - previousMillis2 >= 600) { //yes 200
myservo.write(150);
previousMillis2 = currentMillis;
}
}
int scan(){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
Serial.println(distance);
distance = duration/58.2; //Calculate the distance (in cm) based on the speed of sound.
previousMillis = currentMillis;
}
}
Scannen, also die Entfernung messen, macht er perfekt, allerdings fährt der Servo nur auf Position 150° und schläft ein.
Einzelnd betrachtet funktionieren die Sketche. Kommt er mit den ganzen 'currentMillis = millis();' nicht klar und verzählt sich oder kommt aus dem takt?
Lesezeichen