2013-05-20-11-45-25_0Da 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:

 

#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:

#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:

untitled-sketch_steckplatine

Kategorien: Atmel / Arduino

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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.