Mein Roboter

Liebe TalentCAMPus-Teilnehmer!
Hier findet ihr Informationen für euren Roboter-Bausatz, die wir leider aufgrund der Zeitknappheit nicht besprechen konnten.

Die Hauptplatine ist ein so genannter Arduino Uno. Mit dieser Platine könnt ihr (relativ) schnell und einfach Hardware-Programmierung lernen. Die Offizielle Seite ist www.arduino.cc
Auf YouTube findet ihr natürlich viele tolle Tutorials zu spannenden Projekten.
Tatsächlich wird Arduino nicht nur für Programmieranfänger sonder auch schon in der Industrie benutzt.

Den Quellcode für deinen Roboter findest du unten.

Hier kannst du nochmal den Schaltplan anschauen.

Falls du fragen hast, kannst du mich mit diesem Kontaktformular erreichen.


Ab Hier beginnt der Quellcode:


#include <Servo.h>

// Geschwindigkeit (0-255)
#define geschwindigkeit 250
// Korrektur falls die Motoren nicht gleich schnell laufen (-50,50)
const static int speedCorL = 0;

const static int speedL = constrain(geschwindigkeit + speedCorL,0,255);
const static int speedR = constrain(geschwindigkeit - speedCorL,0,255);
// Distanz ab wann der Roboter bremst in Millimeter (1-50)
#define stop_distanz 20

//Ultraschallsensor auf Servo? (true,false)
#define servo_modus true

// Umschauwinkel des Servos (0-180)
#define winkel 90

// Roboter dreht sich um sich selbst um sich umzuschauen
// Dauer wie lange er sich drehen soll in Millisekunden (0-5000)
#define rotier_dauer 700

// Testmodus für die Laufrichtung der Räder (true,false)
#define testmodus false

//=================================================

// Motor Pins
#define ML_vor 3
#define ML_rueck 11
#define MR_vor 5
#define MR_rueck 6

#define ServoPin 7

// Pins für den Ultraschallsensor
#define Trigger_pin 12
#define Echo_pin 13

// Ereignisprotokoll aktivieren
#define logging true

Servo servo;
int linker_sector,rechter_sector;

void setup() {
//TIMER 0-> Delay!! D5 und D6 auf 62500.00 HZ
//TCCR0B = TCCR0B & B11111000 | B00000001;
//TIMER 1 D9 und D10 auf 31372.55 Hz
//TCCR1B = TCCR1B & B11111000 | B00000001;
//TIMER 2 D3 und D11 auf 31372.55 Hz
//TCCR2B = (TCCR2B & 0b11111000) | B00000001;
Serial.begin(115200);
Serial.println(speedL);
Serial.println(speedR);
linker_sector = int(90 + winkel / 2);
rechter_sector = int(90 - winkel / 2);
pinMode(ML_vor, OUTPUT);
pinMode(ML_rueck, OUTPUT);
pinMode(MR_vor, OUTPUT);
pinMode(MR_rueck, OUTPUT);

pinMode(Trigger_pin, OUTPUT);
pinMode(Echo_pin, INPUT);

servo.attach(ServoPin);
servo.write(90);

}

void loop() {
if (testmodus) {
test();
} else {
autonom();
}
}

void autonom() {
if (messeDistanz() >= stop_distanz) {
fahre_geradeaus(2);
} else {
stop(200);
fahre_zurueck(500);
stop(500);
if (schaueLinks() > schaueRechts()) {
drehe_nach_links(500);
} else {
drehe_nach_rechts(500);
}
}
delay(100);
}

long schaueLinks() {
log("schaue nach links und messe Distanz...");
if (servo_modus) {
servo.write(linker_sector);
}
else {
drehe_nach_links(rotier_dauer);
}
delay(500);

int dist = messeDistanz();

if (servo_modus) {
servo.write(90);
}
else {
drehe_nach_rechts(rotier_dauer);
}
delay(300);

return dist;
}

long schaueRechts() {
log("schaue nach rechts und messe Distanz...");

if (servo_modus) {
servo.write(rechter_sector);
}
else {
drehe_nach_rechts(rotier_dauer);
}
delay(500);

int dist = messeDistanz();

if (servo_modus) {
servo.write(90);
}
else {
drehe_nach_links(rotier_dauer);
}
delay(300);

return dist;
}

void fahre_geradeaus(int dur) {
reset();
log("__VOR__");
analogWrite(ML_vor, speedL);
analogWrite(MR_vor, speedR);
Serial.println(speedL);
Serial.println(speedR);
delay(dur);
}

void fahre_zurueck(int dur) {
reset();
log("__RUECK__");
Serial.println(speedL);
Serial.println(speedR);
analogWrite(ML_rueck, speedL);
analogWrite(MR_rueck, speedR);
delay(dur);
}

void reset() {
log("reset");
analogWrite(ML_vor, 0);
analogWrite(MR_vor, 0);
analogWrite(ML_rueck, 0);
analogWrite(MR_rueck, 0);
}
void stop(int dur) {
log("__STOP__");
reset();
delay(dur);
}

void stop() {
stop(2);
}

void drehe_nach_links(int dur) {
reset();
log("__LEFT__");
analogWrite(ML_rueck, speedL);
analogWrite(MR_vor, speedR);
delay(dur);
stop();
}

void drehe_nach_links() {
drehe_nach_links(2);
}

void drehe_nach_rechts() {
drehe_nach_rechts(2);
}

void drehe_nach_rechts(int dur) {
reset();
log("__RIGHT__");
analogWrite(MR_rueck, speedR);
analogWrite(ML_vor, speedL);
delay(dur);
stop();
}

void log(String msg) {
if (logging)Serial.println(msg);
}

long messeDistanz() {
long duration, distance;
digitalWrite(Trigger_pin, LOW);
delayMicroseconds(2);
digitalWrite(Trigger_pin, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger_pin, LOW);
duration = pulseIn(Echo_pin, HIGH);
distance = (duration / 2) / 29.1;
//Serial.println(distance);
Serial.print("distance: ");
Serial.println(distance);
return distance;
}
void testSonic() {
int dist = messeDistanz();
String balken = "";
for (int i = 0; i < dist; i += 2)balken += "=";
log(balken + dist);
delay(50);

}

void test() {
testSonic();
delay(100);
servo.write(45);
delay(300);
servo.write(90);
fahre_geradeaus(500);
stop(100);
drehe_nach_rechts(500);
stop(2000);
}