drflach.org




Schrobot

Ziel des Projekts:
Bau eines Fahrzeugs, das sich autonom im Raum bewegen kann. Bei Berührung eines Gegenstandes soll es zurücksetzen, eine Drehung vollziehen und dann wieder vorwärts weiterfahren.
Das Projekt umfasst die folgenden Teilprojekte:

Mechanik

Schrobot-Mechanik Schrobot-Mechanik
Träger: Regalschienen
Motoren: aus CD-Laufwerken
Räder und Zahnräder aus dem Modellbau-Handel
Sensor vorn: zwei Metallschienen und ein Reset-Taster aus einem alten PC
Seitenanfang

Elektronik

Schrobot-Mechanik
Optokoppler-Board: vierkanaliger Optokoppler, galvanische Trennung zwischen Arduino-Versorgung und Motor-Versorgung
Relaiy-Board: zwei einkanalige Relais, um die Versorgung der beiden Motoren getrennt ein- und auszuschalten, zwei zweikanalige Relais, um die Laufrichtung der Motoren umzupolen.
Ansteuerung über ein Arduino-kompatibles Board.
Seitenanfang

Software

Der Schrobot wird durch ein Arduino Nano kompatibles Microcontroller-Board gesteuert. Der Arduino-Sketch folgt hier:


// Schrobot-Steuerung 2016-05
// Author: Dr. Bjoern Flach - drflach.org
//---------------------------------------

// Pin Definiton
const unsigned char ch1 = 2;
const unsigned char ch2 = 3;
const unsigned char ch3 = 4;
const unsigned char ch4 = 5;
const unsigned char sensor = 6;     // red
const unsigned char us_trigger = 7; // blue
const unsigned char us_echo = 8;    // white
const unsigned char LED = 13;
// Pausen
const unsigned int Pause = 2000;
const unsigned int SensorPause = 10;
const unsigned int Blitz = 30;
// Richtungen
const unsigned int dir_vor = 3;
const unsigned int dir_rueck = 15;
const unsigned int dir_rechts = 7;
const unsigned int dir_links = 11;

const unsigned int minAbstand = 20;

bool wegfrei = true;

long usToCm(long microseconds) { 
// Umrechnung microsekunden nach cm
return microseconds / 29 / 2; 
}

void setup() {
  pinMode(ch1, OUTPUT);
  pinMode(ch2, OUTPUT);
  pinMode(ch3, OUTPUT);
  pinMode(ch4, OUTPUT);
  pinMode(LED, OUTPUT);
  pinMode(sensor, INPUT_PULLUP);
  pinMode(us_trigger, OUTPUT);
  pinMode(us_echo, INPUT); 
  delay(Pause);
}

void schrobotmove(unsigned int Val, unsigned int Del){
  digitalWrite(ch1, Val&1); 
  digitalWrite(ch2, Val&2); 
  digitalWrite(ch3, Val&4); 
  digitalWrite(ch4, Val&8);
  delay(Del);
}

void ausweichen(){
  // Rueck, Drehung und Pause
  schrobotmove(dir_rueck,1000);
  schrobotmove(0,100);
  schrobotmove(dir_rechts,500);
  schrobotmove(0,Pause);// stop
  wegfrei = true;
}

void loop() { 
  long duration;
  long distance;
  
  // Schrobot vorwaerts, kurzes Delay
  schrobotmove(dir_vor,10);

  // Warten auf Hindernis-Detektion
  while (wegfrei){
    // Abfrage Auffahrsensor
    if (digitalRead(sensor) == LOW) {
      wegfrei = false;
      schrobotmove(0,100);
      digitalWrite(LED, HIGH);
      delay(Blitz);
      digitalWrite(LED, LOW);
      delay(Blitz);
      digitalWrite(LED, HIGH);
      delay(Blitz);
      digitalWrite(LED, LOW);
      delay(Blitz);
    }
    // Abfrage Ultraschall    
    // Trigger Puls, 2 us LOW, 10 us HIGH, dann LOW
    digitalWrite(us_trigger, LOW); 
    delayMicroseconds(2); 
    digitalWrite(us_trigger, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(us_trigger, LOW);
    // Dauer bis Echo messen und Umrechnung in cm
    duration = pulseIn(us_echo, HIGH); 
    distance = usToCm(duration);
    if (distance < minAbstand) {
      wegfrei = false;
      schrobotmove(0,100);
      digitalWrite(LED, HIGH);
      delay(Blitz);
      digitalWrite(LED, LOW);
      delay(Blitz);
   }
    delay(SensorPause);
  }
  ausweichen();
}

      

Seitenanfang