Hausaufgaben7 Tipp 1: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(Die Seite wurde neu angelegt: „ ---- → zurück zum Hauptartikel: Termin 7: Ultraschall Notbremse“) |
Keine Bearbeitungszusammenfassung |
||
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
Zuerst wird eine Funktion <code>sucheZiel()</code> programmiert, die den Arbeitsbereich 0°..180° absucht und das räumlich nächste Ziel zurück gibt. | |||
Der hier dargestellte Quelltext Funktion <code>TestSucheZiel()</code> überprüft die Funktion <code>sucheZiel()</code>. | |||
== Quelltext == | |||
<div style="width:1200px; height:300px; overflow:auto; border: 2px solid #088"> | |||
<pre> | |||
/* Bibliotheken hinzufügen */ | |||
#include "AlphaBot.h" // Header hinzufügen | |||
#include <Servo.h> | |||
/* Instanzen erzeugen */ | |||
AlphaBot Alf = AlphaBot(); // Instanz des AlphaBot mit dem Handle WallE erzeugen | |||
Servo AlfServo; // Servo Instanz | |||
/* KONSTANTEN deklarieren */ | |||
const int TRIG = 11; // US Trigger an D11 | |||
const int ECHO = 12; // US Echo an D12 | |||
static const byte SERVO_PORT_u8 = 9; // Port des Servo Motors | |||
static const int COM_GESCHW_s16 = 9600; // Baude | |||
static const float NaN = 1029; // NaN beim US, keine Objekt in Reichweite | |||
void setup() // Einmalige Systeminitialisierung | |||
{ | |||
int PotiWinkel_s16 = 0; // Winkel des Potis | |||
int DrehWinkel_s16 = 0; // Drehwinkel des Roboters | |||
float USAbstand_f32 = NaN; | |||
Serial.begin(COM_GESCHW_s16); // Serieller Monitor mit 9600 Baud | |||
initUltraschall(); // US initialisieren | |||
AlfServo.attach(SERVO_PORT_u8); // Servo verbinden | |||
PotiWinkel_s16 = sucheZiel(&USAbstand_f32); // Nächstes Ziel wird gesucht | |||
Serial.print("Nächste Ziel: "); | |||
Serial.print(USAbstand_f32); | |||
Serial.print(" m"); | |||
} // END setup() | |||
void loop() // Main Schleife | |||
{ // Hier passiert nichts. | |||
} | |||
void initUltraschall() | |||
{ | |||
pinMode(ECHO, INPUT); // Define the ultrasonic echo input pin | |||
pinMode(TRIG, OUTPUT); // Define the ultrasonic trigger input pin | |||
Serial.println("** initUltraschall"); | |||
} | |||
int sucheZiel(float *USAbstand_f32) | |||
{ | |||
/* Lokale Variablen deklarieren */ | |||
boolean ZielGefunden_bit = false; | |||
int ServoPosition_s16 = 0; | |||
int ServoInkrement_s16 = 5; | |||
float MinUSAbstand_f32 = NaN; // kleinster gemessener Abstand in cm, 1029 = NaN | |||
int MinServoPosition_s16 = NaN; // kleinster gemessener Abstand in cm, 1029 = NaN | |||
AlfServo.write(ServoPosition_s16); // Initiale Servoposition anfahren | |||
while (ZielGefunden_bit == false) | |||
{ | |||
if (ServoPosition_s16 >= 0 && ServoPosition_s16 <= 180) | |||
{ | |||
AlfServo.write(ServoPosition_s16); // Der Servo soll sich an die Position drehen | |||
} | |||
delay(200); | |||
*USAbstand_f32 = messeUSAbstand(); // US Abstand messen | |||
//delay(250);/* Wir warten 15ms, bis der Servo seine Position erreich hat */ | |||
Serial.print("Winkel: "); | |||
Serial.print(ServoPosition_s16); | |||
Serial.print(" - "); | |||
Serial.print(*USAbstand_f32); | |||
if (*USAbstand_f32 > 2 && *USAbstand_f32 < 400) // nur valide Messungen betrachten | |||
{ | |||
if (*USAbstand_f32 < MinUSAbstand_f32) | |||
{ | |||
MinUSAbstand_f32 = *USAbstand_f32; | |||
MinServoPosition_s16 = ServoPosition_s16; | |||
Serial.print(" * "); // räuml. nächstes Ziel markieren | |||
} | |||
} | |||
Serial.println(" cm"); | |||
ServoPosition_s16 += ServoInkrement_s16; | |||
if (ServoPosition_s16 < 0) | |||
{ | |||
ServoPosition_s16 = 0; | |||
ServoInkrement_s16 *= (-1); // Am Ende des Sweeps in die andere Richtung drehen | |||
if (MinUSAbstand_f32 < NaN) // Wurde ein Ziel gefunden? | |||
{ | |||
ZielGefunden_bit = true; | |||
} | |||
Serial.println(ServoInkrement_s16); | |||
} | |||
else if (ServoPosition_s16 > 180) | |||
{ | |||
ServoPosition_s16 = 180; | |||
ServoInkrement_s16 *= (-1); // Am Ende des Sweeps in die andere Richtung drehen | |||
if (MinUSAbstand_f32 < NaN) // Wurde ein Ziel gefunden? | |||
{ | |||
ZielGefunden_bit = true; | |||
} | |||
Serial.println(ServoInkrement_s16); | |||
} | |||
} | |||
/* Rückgabewerte */ | |||
*USAbstand_f32 = MinUSAbstand_f32; // Mindestanstand | |||
return MinServoPosition_s16; // ServoPosition | |||
} // END sucheZiel | |||
float messeUSAbstand() // Abstand in cm | |||
{ | |||
float USAbstand = 0; // Rückgabewert initialisieren | |||
float fSignalLaufzeit = 0; // Messwert der Signallaufzeit | |||
digitalWrite(TRIG, LOW); // setze Trigger auf LOW für 2μs | |||
delayMicroseconds(2); | |||
digitalWrite(TRIG, HIGH); // setze Trigger auf HIGH für mind. 10 us | |||
delayMicroseconds(10); | |||
digitalWrite(TRIG, LOW); // setze Trigger auf LOW | |||
fSignalLaufzeit = pulseIn(ECHO, HIGH); // Messung der Singnallaufzeit des Impulses | |||
USAbstand = fSignalLaufzeit / 58; // Umrechnung Laufzeit in s in Abstand in cm | |||
//Y m =(X s * 344)/ 2; | |||
//X s =( 2 * Y m)/ 344; | |||
//X s = 0.0058 * Y m; | |||
//cm = us /58 | |||
return USAbstand; // Rückgabewert | |||
} // END messeUSAbstand() | |||
</pre> | |||
</div> | |||
Aktuelle Version vom 8. Mai 2022, 14:38 Uhr
Zuerst wird eine Funktion sucheZiel()
programmiert, die den Arbeitsbereich 0°..180° absucht und das räumlich nächste Ziel zurück gibt.
Der hier dargestellte Quelltext Funktion TestSucheZiel()
überprüft die Funktion sucheZiel()
.
Quelltext
/* Bibliotheken hinzufügen */ #include "AlphaBot.h" // Header hinzufügen #include <Servo.h> /* Instanzen erzeugen */ AlphaBot Alf = AlphaBot(); // Instanz des AlphaBot mit dem Handle WallE erzeugen Servo AlfServo; // Servo Instanz /* KONSTANTEN deklarieren */ const int TRIG = 11; // US Trigger an D11 const int ECHO = 12; // US Echo an D12 static const byte SERVO_PORT_u8 = 9; // Port des Servo Motors static const int COM_GESCHW_s16 = 9600; // Baude static const float NaN = 1029; // NaN beim US, keine Objekt in Reichweite void setup() // Einmalige Systeminitialisierung { int PotiWinkel_s16 = 0; // Winkel des Potis int DrehWinkel_s16 = 0; // Drehwinkel des Roboters float USAbstand_f32 = NaN; Serial.begin(COM_GESCHW_s16); // Serieller Monitor mit 9600 Baud initUltraschall(); // US initialisieren AlfServo.attach(SERVO_PORT_u8); // Servo verbinden PotiWinkel_s16 = sucheZiel(&USAbstand_f32); // Nächstes Ziel wird gesucht Serial.print("Nächste Ziel: "); Serial.print(USAbstand_f32); Serial.print(" m"); } // END setup() void loop() // Main Schleife { // Hier passiert nichts. } void initUltraschall() { pinMode(ECHO, INPUT); // Define the ultrasonic echo input pin pinMode(TRIG, OUTPUT); // Define the ultrasonic trigger input pin Serial.println("** initUltraschall"); } int sucheZiel(float *USAbstand_f32) { /* Lokale Variablen deklarieren */ boolean ZielGefunden_bit = false; int ServoPosition_s16 = 0; int ServoInkrement_s16 = 5; float MinUSAbstand_f32 = NaN; // kleinster gemessener Abstand in cm, 1029 = NaN int MinServoPosition_s16 = NaN; // kleinster gemessener Abstand in cm, 1029 = NaN AlfServo.write(ServoPosition_s16); // Initiale Servoposition anfahren while (ZielGefunden_bit == false) { if (ServoPosition_s16 >= 0 && ServoPosition_s16 <= 180) { AlfServo.write(ServoPosition_s16); // Der Servo soll sich an die Position drehen } delay(200); *USAbstand_f32 = messeUSAbstand(); // US Abstand messen //delay(250);/* Wir warten 15ms, bis der Servo seine Position erreich hat */ Serial.print("Winkel: "); Serial.print(ServoPosition_s16); Serial.print(" - "); Serial.print(*USAbstand_f32); if (*USAbstand_f32 > 2 && *USAbstand_f32 < 400) // nur valide Messungen betrachten { if (*USAbstand_f32 < MinUSAbstand_f32) { MinUSAbstand_f32 = *USAbstand_f32; MinServoPosition_s16 = ServoPosition_s16; Serial.print(" * "); // räuml. nächstes Ziel markieren } } Serial.println(" cm"); ServoPosition_s16 += ServoInkrement_s16; if (ServoPosition_s16 < 0) { ServoPosition_s16 = 0; ServoInkrement_s16 *= (-1); // Am Ende des Sweeps in die andere Richtung drehen if (MinUSAbstand_f32 < NaN) // Wurde ein Ziel gefunden? { ZielGefunden_bit = true; } Serial.println(ServoInkrement_s16); } else if (ServoPosition_s16 > 180) { ServoPosition_s16 = 180; ServoInkrement_s16 *= (-1); // Am Ende des Sweeps in die andere Richtung drehen if (MinUSAbstand_f32 < NaN) // Wurde ein Ziel gefunden? { ZielGefunden_bit = true; } Serial.println(ServoInkrement_s16); } } /* Rückgabewerte */ *USAbstand_f32 = MinUSAbstand_f32; // Mindestanstand return MinServoPosition_s16; // ServoPosition } // END sucheZiel float messeUSAbstand() // Abstand in cm { float USAbstand = 0; // Rückgabewert initialisieren float fSignalLaufzeit = 0; // Messwert der Signallaufzeit digitalWrite(TRIG, LOW); // setze Trigger auf LOW für 2μs delayMicroseconds(2); digitalWrite(TRIG, HIGH); // setze Trigger auf HIGH für mind. 10 us delayMicroseconds(10); digitalWrite(TRIG, LOW); // setze Trigger auf LOW fSignalLaufzeit = pulseIn(ECHO, HIGH); // Messung der Singnallaufzeit des Impulses USAbstand = fSignalLaufzeit / 58; // Umrechnung Laufzeit in s in Abstand in cm //Y m =(X s * 344)/ 2; //X s =( 2 * Y m)/ 344; //X s = 0.0058 * Y m; //cm = us /58 return USAbstand; // Rückgabewert } // END messeUSAbstand()
→ zurück zum Hauptartikel: Termin 7: Ultraschall Notbremse