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:
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
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();
}