Moin Claus,
Für die Elektronik haben wir zwei Modellbauservos verwendet (Link).
Außerdem noch einen Ultraschall Sensor HC-SR04
Software dann mit Arduino Nano:
#include <Servo.h> //Die Servobibliothek wird aufgerufen. Sie wird benötigt, damit die Ansteuerung des
Servos vereinfacht wird.
#include "QuickStats.h"
//Sonic Echo: PIN 6
//Sonic Trigger: PIN 7
//Servo Right: PIN 10
//Servo Left: PIN 9
Servo servoRight; //Erstellt für das Programm ein Servo mit dem Namen „servoblau“
Servo servoLeft; //Erstellt für das Programm ein Servo mit dem Namen „servoblau“
int triggerSonic1=7; //Trigger-Pin des Ultraschallsensors an Pin7 des Arduino-Boards
int echoSonic1=6; // Echo-Pim des Ultraschallsensors an Pin6 des Arduino-Boards
QuickStats stats;
long randNumber;
void setup()
{
Serial.begin (9600); //DEBUG
servoRight.attach(10);
servoLeft.attach(9);
pinMode(triggerSonic1, OUTPUT); // Trigger-Pin ist ein Ausgang
pinMode(echoSonic1, INPUT); // Echo-Pin ist ein Eingang
randomSeed(analogRead(0));
}
void loop()
{
//goForward(3000);
//stopWalking(3000);
//goBackwards(3000);
//turnRight(3000);
randNumber = random(10);
long distanceSonic1 = getDistanceSonic1(); //get distance in cm
if ((distanceSonic1 <= 50) && (distanceSonic1 >= 30)) {
if (randNumber <= 5) {
turnRight(3000);
} else {
turnLeft(3000);
}
} else if (distanceSonic1 < 30) {
goBackwards(3000);
} else {
goForward(100);
}
}
void turnRight(int duration) {
servoRight.write(0); //Position 1 ansteuern mit dem Winkel 0°
servoLeft.write(0); //Position 3 ansteuern mit dem Winkel 180°
delay(duration);
}
void turnLeft(int duration) {
servoRight.write(180); //Position 1 ansteuern mit dem Winkel 0°
servoLeft.write(180); //Position 3 ansteuern mit dem Winkel 180°
delay(duration);
}
void goForward(int duration){
servoRight.write(0); //Position 1 ansteuern mit dem Winkel 0°
servoLeft.write(180); //Position 3 ansteuern mit dem Winkel 180°
delay(duration);
}
void goBackwards(int duration) {
servoRight.write(180); //Position 1 ansteuern mit dem Winkel 0°
servoLeft.write(0); //Position 3 ansteuern mit dem Winkel 180°
delay(duration);
}
void stopWalking(int duration) {
servoRight.write(90); //Position 1 ansteuern mit dem Winkel 0°
servoLeft.write(90); //Position 3 ansteuern mit dem Winkel 180°
delay(duration);
}
long getDistanceSonic1() {
float distanceMean[10];
for (int i=0; i <= 9; i++)
{
digitalWrite(triggerSonic1, LOW); //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
delay(5); //Dauer: 5 Millisekunden
digitalWrite(triggerSonic1, HIGH); //Jetzt sendet man eine Ultraschallwelle los.
delay(10); //Dieser „Ton“ erklingt für 10 Millisekunden.
digitalWrite(triggerSonic1, LOW);//Dann wird der „Ton“ abgeschaltet.
long duration = pulseIn(echoSonic1, HIGH); //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
long distance = (duration/2) * 0.03432; //Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
distanceMean[i] = distance;
}
for (int i=0; i <= 9; i++)
{
//Serial.print(distanceMean[i]); //DEBUG
// Serial.print(","); //DEBUG
}
Serial.println(stats.median(distanceMean,10)); //DEBUG
return stats.median(distanceMean,10);
}
Vielleicht ist für euch noch folgender geogebra link interessant: https://www.geogebra.org/m/xdnnbGZG