Moin,
in meinem Projekt möchte ich ein RC Auto mit einer Hinderniserkennung ausstatten. Über den Ultraschallsensor HC-SR04 soll ab einer vorgegebenen Entfernung zu einem Hindernis das Auto stoppen. Die Vorwärtsbewegung soll blockiert werden und das Auto nur noch rückwärts fahren können, bis ein ausreichender Abstand zum Hindernis vorliegt bzw kein Hindernis mehr erkannt wird.
Mein bisheriges Programm sieht wie folgt aus:
//-------------------------------------------------------------------------------------------------------------------
//Stufenlose Geschwindigkeits- und Lenkregelung
#include <Servo.h>
Servo Lenkservo;
#define ENA 6
#define IN1 5
#define IN2 7
int g = 0;
char cmd[100];
int cmdIndex;
//-------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------
//Bluetooth-Verbindung
#define bluetooth Serial
//-------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------
//Display
#include <Wire.h> // Wire Bibliothek einbinden
#include <LiquidCrystal_I2C.h> // Vorher hinzugefügte LiquidCrystal_I2C Bibliothek einbinden
LiquidCrystal_I2C lcd(0x27, 16, 2); //VCC=5V , SDA = A4 , SCL = A5
//-------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------
//RFID-Erkennung
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN); //SDA=10, SCK=13, MOSI=11, MISO=12, RST=5 (nicht benötigt)
long ids[] = {1857660, 1857660};
boolean e = false;
//-------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------
//Temperaturmessung
#define TMP A0
int sensorwert;
int temperatur = 0;
unsigned long temperatur_trigger = 4000;
//-------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------
//Hinderniserkennung
#include <NewPing.h>
#define PING_PIN A3
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
NewPing sonar(PING_PIN, PING_PIN, MAX_DISTANCE); // NewPing setup of pin and maximum distance.
long entfernung = 0;
//-------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------
unsigned long zeit = 0;
unsigned long startMillis;
const unsigned long period = 1000;
//-------------------------------------------------------------------------------------------------------------------
//__________________________________________________________________________________________________________________________
//RFID-Erkennung
void rfid() {
long code = 0;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
code = ((code + mfrc522.uid.uidByte[i]) * 10);
}
Serial.print("Die Kartennummer lautet:");
Serial.println(code);
int counter = 0;
for (counter = 0; counter < sizeof(ids) - 1; counter++) {
if (code == ids[counter]) {
e = !e;
break;
}
else if (code != ids[counter]) {
break;
}
}
delay (100);
}
//Hinderniserkennung: Stoppen, wenn Hindernis (Abstand = 5cm) erkant wurde, und blockieren der //Vorwärtstbewegung. Nur Rückwärtsbewegung erlauben.
void hindernis () {
// sendewechsel = zeit;
unsigned int uS = sonar.ping();
entfernung = (uS / US_ROUNDTRIP_CM);
if (entfernung > 1 && entfernung < 5) {
}
}
//Stufenlose Geschwindigkeits- und Lenkregelung --> done
void exeCmd() {
if (cmd[0] == 's' && cmd[1] == ' ') {
int g = atoi(cmd + 2);
Serial.print("geschwindigkeit=");
Serial.println(g);
if (g >= 0) {
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, g);
} else {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, -g);
}
}
if (cmd[0] == 'y' && cmd[1] == ' ') {
//float val = atof(cmd + 2);
//val = val / 9.8; //nur mit Beschleunigungssensor notwendig
//val = val * 500;
int servoMicroseconds = atof(cmd + 2); //1500 ist die Mittelposition des Servos
Lenkservo.writeMicroseconds(servoMicroseconds);
Serial.print("Servo=");
Serial.println(servoMicroseconds);
}
}
//Temperaturmessung
void tempmessung () {
sensorwert = analogRead(TMP);
temperatur = map(sensorwert, 0, 410, -50, 150);
Serial.println(temperatur);
}
void setup() {
//delay(500);
Serial.begin(9600);
pinMode(ENA , OUTPUT);
pinMode(IN1 , OUTPUT);
pinMode(IN2 , OUTPUT);
Lenkservo.attach(9);
Lenkservo.writeMicroseconds(1500);
SPI.begin();
mfrc522.PCD_Init();
lcd.init();
cmdIndex = 0;
startMillis = millis();
}
void loop() {
zeit = millis();
if (zeit - startMillis >= period) {
startMillis = zeit; //Alle 4 Sekunden wird die Temperatur gemessen
tempmessung ();
}
if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
rfid();
}
while (bluetooth.available() && e == true) {
char c = (char)bluetooth.read();
if (c == '\n') {
cmd[cmdIndex] = 0;
exeCmd(); // Befehl ausführen
cmdIndex = 0; // reset the cmdIndex
} else {
cmd[cmdIndex] = c;
if (cmdIndex < 99) cmdIndex++;
}
}
}
Leider habe ich keine Idee, wie ich ab einer bestimmten Entfernung die Vorwärtsbewegung blockieren und nur die Rückwärtsbewegung aus der Funktion void exeCmd freigeben kann. Diese Funktion erlaubt das stufenlose Regeln der Geschwindigkeit mittels Schieberegler, der von -255 bis 255 geht und somit über ein PWM Signal den Motortreiber ansteuert.
Zunächst muss ich sicherstellen, dass durchgehend die Entfernung gemessen wird ==> dies muss daher im Loop passieren. Richtig? Allerdings ist hier das Problem, dass das Programm so lange in der While-Schleife loopt, wie ich das Auto übers Handy steuere. ==> Bedeutet, die Entfernungsmessung müsste sich in dieser While-Schleife befinden. Richtig?
Wenn jetzt eine Entfernung kleiner als eine vorgegebene Entfernung gemessen wird, könnte evtl eine Funktion ähnlich der Funktion void exeCmd ausgeführt werden, die nur eine Rückwärtsbewegung erlaubt.
Hört sich das soweit richtig an oder bin ich auf dem Holzweg? Vielleicht habt ihr eine Idee. Ich würde mich riesig freuen.
Grüße.