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
2Code:#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; } }
failCode:#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; } }
Scannen, also die Entfernung messen, macht er perfekt, allerdings fährt der Servo nur auf Position 150° und schläft ein.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; } }
Einzelnd betrachtet funktionieren die Sketche. Kommt er mit den ganzen 'currentMillis = millis();' nicht klar und verzählt sich oder kommt aus dem takt?







Zitieren

Lesezeichen