Willkommen auf unserem Seminar-Blog

Immer auf dem aktuellen Stand bleiben

Dieser Seminar-Blog befindet sich noch im Aufbau und wird in den kommenden Tagen entsprechend verfeinert.

Member Login

Lost your password?

Registration is closed

Sorry, you are not allowed to register by yourself on this site!

You must either be invited by one of our team member or request an invitation by email at viad.info {at} zhdk {dot} ch.

10 Crazy Machine “Mini-WALL-E”

16. November 2011

Unsere Aufgabe bestand darin, mittels Arduino mit Hilfe von einem Servo und einem Sensor einen kleinen Roboter oder ähnliches zu bauen. Wir entschieden und für den Bewegungssensor, welcher mit Infrarot den Input gibt. Den Output wäre dann der Servo, der sich jeweils um 180° drehen kann, und so einer Bewegung folgen kann. Auf dem Video sieht man den kleinen Prototypen, der sich schon zur Kamera hin ausrichtet und dieser mit seinen "Augen" folgt. Die Software des Trackers is so aufgebaut das die beiden Sensoren sich untereinander abwechseln und dann als Haupt bzw. Wächter Sensor fungieren. Haut der Hauptsensor ein Objekt erkannt, und verliert es wider dreht er sich in die Richtung des Sensors. der Wächtersensor der "hinterher" dreht fungiert jetzt als "BackUp" Sensor. Erkennt der Hauptsensor das Objekt wieder, hält der Roboter wieder an. Erkennt jedoch der Wächter Sensor das Objekt, tauschen Sie sich und der Wächter wird zum Hauptsensor.   YouTube Preview Image
// Libraries
#include <Servo.h>

// Pins
#define SERVO 9
#define LEFTSENS 0
#define RIGHTSENS 5
#define LED1 3
#define LED2 5
#define LED3 7

// Settings
#define TARGET_TRESHHOLD 150
#define LED_DURATION 200

// Objects
Servo servo;

// Data Stores
int leftSensNew = 0;
int leftSensOld = 0;
int rightSensNew = 0;
int rightSensOld = 0;
int servoPosition = 0;

// Stores
boolean hasTargetNew = false;
boolean hasTargetOld = false;

// Majorness
boolean leftIsMajor = true;
boolean rightIsMajor = false;

// LED
int ledActive = 1;
double ledLastChange = 0;

void setup()
{
  // Setup Serial
  Serial.begin(9600);
  Serial.println("START TRACKING");

  // Setup Servo
  servo.attach(SERVO);

  // Setep LED's
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(LED3,OUTPUT);

  // Test LEDS
  digitalWrite(LED1,HIGH);
  digitalWrite(LED2,HIGH);
  digitalWrite(LED3,HIGH);

  // Turn to Start
  servo.write(servoPosition);
  delay(1000);

  // Turn OFF LED's
  digitalWrite(LED1,LOW);
  digitalWrite(LED2,LOW);
  digitalWrite(LED3,LOW);
}

void loop()
{
  // Get Data
  leftSensNew = analogRead(LEFTSENS);
  rightSensNew = analogRead(RIGHTSENS);

  // Smoth Input
  leftSensNew = (0.98*leftSensOld)+(0.02*leftSensNew);
  rightSensNew = (0.98*rightSensOld)+(0.02*rightSensNew);

  // Debug
  Serial.print("L: ");
  Serial.print(leftSensNew);
  Serial.print(" - R: ");
  Serial.print(rightSensNew);

  // Set Old
  leftSensOld = leftSensNew;
  rightSensOld = rightSensNew;

  // Check for Target
  boolean leftHasTarget = (leftSensNew > TARGET_TRESHHOLD);
  boolean rightHasTarget = (rightSensNew > TARGET_TRESHHOLD);

YouTube Preview Image

  // Set Major Sensor
  if(leftHasTarget && !rightHasTarget) {
    leftIsMajor = true;
    rightIsMajor = false;
  } else if(!leftHasTarget && rightHasTarget) {
    leftIsMajor = false;
    rightIsMajor = true;
  }

  // Set Target
  hasTargetNew = (leftHasTarget || rightHasTarget);

  // Debug
  if(hasTargetNew && !hasTargetOld) {
    Serial.print(" - Object Found!");
  }

  if(!hasTargetNew && hasTargetOld) {
    Serial.print(" - Object Lost!");
  }

  // Search
  if(!hasTargetNew) {
    search();
  } else {
    animateLED();
  }

  // Save Data
  hasTargetOld = hasTargetNew;

  // End Debug
  Serial.println();

}

void search()
{
  // Check for Majorness
  if(leftIsMajor) {
    servoPosition += 2;
  } else if(rightIsMajor) {
    servoPosition -= 2;
  }

  // Check for End
  if(leftIsMajor && servoPosition >= 179) {
    rightIsMajor = true;
    leftIsMajor = false;
  }

  // Check for End
  if(rightIsMajor && servoPosition == 0) {
    rightIsMajor = false;
    leftIsMajor = true;
  }

  // Turn Servo
  servo.write(servoPosition);
}

void animateLED()
{
  // Check for Change
  if(millis() - ledLastChange > LED_DURATION) {

    // Increment
    ledActive++;

    // Check for last
    if(ledActive > 2) {
      ledActive = 0;
    }

    ledLastChange = millis();

    // All to LOW
    digitalWrite(LED1,LOW);
    digitalWrite(LED2,LOW);
    digitalWrite(LED3,LOW);

    // Set Current Active
    switch(ledActive)
    {
      case 0: digitalWrite(LED1,HIGH); break;
      case 1: digitalWrite(LED2,HIGH); break;
      case 2: digitalWrite(LED3,HIGH); break;
    }
  }

}