Da ich auch mal was mit einem Servo bauen wollte,
habe ich eine kleine „Selbstschussanlage“ in 2 Versionen gebaut .
Es wurden hierfür verwendet:
- Arduinio Uno
- Laser aus einem alten Laserstift
- Modellbau Servo
- HC-SR04 Ultraschallsensors
Viel Spaß damit ;o)
Version 1:
https://www.youtube.com/watch?v=Rm9CACL7nVs
#include <Servo.h> #include <NewPing.h> Servo myservo; //Servo Config static byte ScanServoPin = 9; //Sonar Config static byte TRIGGER_PIN = 12; static byte ECHO_PIN = 11; static byte MAX_DISTANCE = 30; static byte LaserPin = 3; static byte Standby = 7; long previousMillis = 0; int ledState = HIGH; void setup() { Serial.begin (115200); pinMode(LaserPin, OUTPUT); pinMode(Standby, INPUT); } void loop() { if(digitalRead(Standby) == LOW) { digitalWrite(LaserPin, LOW); ScanServo(ScanServoPin); } else { LaserSleep(); } } void Laser() { for (int i = 0; i < 5; i++) { digitalWrite(LaserPin, HIGH); delay(55); digitalWrite(LaserPin, LOW); delay(55); } } void LaserSleep() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > 1000) { previousMillis = currentMillis; if (ledState == LOW) { ledState = HIGH; SleepMessag(); } else { ledState = LOW; } digitalWrite(LaserPin, ledState); } } void FireMessag(int Target, int Range) { Serial.println(F("Alarm!")); Serial.print(F("Es wurde ein Ziel gesichtet auf ")); Serial.print(Target); Serial.print(F("Grad und ")); Serial.print(Range); Serial.println(F("cm Entfernung.")); Serial.println(F("Feuer!!!!!!")); Serial.println(F("")); Serial.println(F("")); } void NoTargetMessag() { Serial.println(F("Es wurden keine Ziel gesichtet.")); Serial.println(F("Starte naechsten Scann der Umgebung........")); Serial.println(F("")); Serial.println(F("")); } void SleepMessag() { Serial.println(F("System ist im Standby.....")); Serial.println(F("")); Serial.println(F("")); } void ScanServo (int Pin) { myservo.attach(Pin); int pos = 1; for(pos = 1; pos < 180; pos += 1) { unsigned long currentMillis = millis(); myservo.write(pos); if(currentMillis - previousMillis > 100) { previousMillis = currentMillis; if(Sonar() > 0) { FireMessag(pos, Sonar()); Laser(); } } delay(10); } NoTargetMessag(); previousMillis = 0; for(pos = 180; pos>=1; pos-=1) { unsigned long currentMillis = millis(); myservo.write(pos); if(currentMillis - previousMillis > 100) { previousMillis = currentMillis; if(Sonar() > 0) { FireMessag(pos, Sonar()); Laser(); } } delay(10); } // waits 15ms for the servo to reach the position NoTargetMessag(); previousMillis = 0; } int Sonar() { NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); unsigned int dist = sonar.ping()/ US_ROUNDTRIP_CM; return dist; }
Version 2:
https://www.youtube.com/watch?v=Z51RZTEvTdU
#include <Servo.h> #include <NewPing.h> Servo myservo; //Servo Config static byte ScanServoPin = 9; //Sonar Config static byte TRIGGER_PIN = 12; static byte ECHO_PIN = 11; static byte MAX_DISTANCE = 30; static byte LaserPin = 3; static byte Standby = 7; long previousMillis = 0; int ledState = HIGH; void setup() { Serial.begin (115200); pinMode(LaserPin, OUTPUT); pinMode(Standby, INPUT); } void loop() { if(digitalRead(Standby) == LOW) { digitalWrite(LaserPin, HIGH); ScanServo(ScanServoPin); } else { LaserSleep(); } } void Laser() { for (int i = 0; i < 21; i++) { digitalWrite(LaserPin, LOW); delay(55); digitalWrite(LaserPin, HIGH); delay(55); } } void LaserSleep() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > 1000) { previousMillis = currentMillis; if (ledState == LOW) { ledState = HIGH; SleepMessag(); } else { ledState = LOW; } digitalWrite(LaserPin, ledState); } } void FireMessag(int Target, int Range) { Serial.println(F("Alarm!")); Serial.print(F("Es wurde ein Ziel gesichtet auf ")); Serial.print(Target); Serial.print(F("Grad und ")); Serial.print(Range); Serial.println(F("cm Entfernung.")); Serial.println(F("Feuer!!!!!!")); Serial.println(F("")); Serial.println(F("")); } void NoTargetMessag() { Serial.println(F("Es wurden keine Ziel gesichtet.")); Serial.println(F("Starte naechsten Scann der Umgebung........")); Serial.println(F("")); Serial.println(F("")); } void SleepMessag() { Serial.println(F("System ist im Standby.....")); Serial.println(F("")); Serial.println(F("")); } void ScanServo (int Pin) { myservo.attach(Pin); int pos = 1; int Range = 999; int Target = 0; int SonarNew = 0; for(pos = 1; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees { unsigned long currentMillis = millis(); // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' if(currentMillis - previousMillis > 50) { previousMillis = currentMillis; SonarNew = Sonar(); if(SonarNew > 0) { if(Range > SonarNew) { Range = SonarNew; Target = pos; } } } delay(10); // waits 15ms for the servo to reach the position } if(Target > 0) { myservo.write(Target); delay(600); FireMessag(Target, Range); Laser(); } else { NoTargetMessag(); Range = 999; Target = 0; previousMillis = 0; } for(pos = 180; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees { unsigned long currentMillis = millis(); myservo.write(pos); // tell servo to go to position in variable 'pos' if(currentMillis - previousMillis > 80) { previousMillis = currentMillis; SonarNew = Sonar(); if(SonarNew > 0) { if(Range > SonarNew) { Range = SonarNew; Target = pos; } } } delay(10); // waits 15ms for the servo to reach the position } if(Target > 0) { myservo.write(Target); delay(600); FireMessag(Target, Range); Laser(); } else { NoTargetMessag(); Range = 999; Target = 0; previousMillis = 0; } } int Sonar() { NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); unsigned int dist = sonar.ping()/ US_ROUNDTRIP_CM; return dist; }
Der Aufbau:
6 Kommentare
Johnk749 · 7. Juni 2014 um 06:53
Hi, I desire to subscribe for this web site to obtain latest updates, therefore where can i do it please assist. edkgdeeeakdd
Bastian · 13. Juni 2013 um 12:26
Ich wunder mich ein bisschen, dass der Servo direkt am PWM-Ausgang funtioniert.
Normalerweise erwarten die Modellbauservos PWM@50Hz mit 1-2ms High-Pegel.
Meine Arduinos machen da an allen PWM-Pins unterschiedliche Frequenzen, das kleinste ich IMHO 200Hz.
Shojo · 14. Juni 2013 um 07:02
Ich habe mittlerweile diverse Servos so angeschlossen und noch nie Probleme gehabt.
Rodney Wilkinson · 10. Juni 2013 um 08:37
Hi, nice article. I really like it!
haim · 21. Mai 2013 um 14:02
very nice!
i wonder if you could publish the connection schematics…
tnx!
Shojo · 21. Mai 2013 um 19:27
Updated ;o)