Hallo Ich habe ein kleines Problem mit meinem Projekt und hoffe hier auf
bestmögliche Hilfe.
Ich habe ein kleines laufende Programm und möchte mit Hilfe eines
HC-SR04 Ultraschallsensor das laufende Programm stoppen, ein kleines
Unterprogramm ablaufen lassen und zum Hauptprogramm zurückkehren.
Ich habe an Interrupts gedacht doch irgendwie keine Ahnung wie ich das
Programm schreiben soll.
Kann mir einer helfen oder Tipps geben wie ich das Programm schreiben
kann?
Der HC-SR04 erzeugt einen Echoimpuls, dessen DAUER dem Abstand
entspricht (Abstand = (V_luft * Zeit) /2). Du musst dabei also die
Zeitdauer bestimmen, wie lange der Impuls auf 1 war.
Bei einem Abstand von 1m braucht das Echo ca. 6ms - nur mal so als
Größenordnung. Beliebig weit kann der Sensor auch nicht messen.
Spätestens nach 200ms geht das Echo-Signal wieder auf 0.
Wenn Du weisst, wie Du mit deinem Controller (welcher ist es denn?) eine
Zeitdauer in µs-Auflösung messen kannst, dann kannst Du mit dem HC-SR04
anfangen. Vorher macht das noch wenig Sinn.
Ich habe einen Arduino UNO und das Unterprogramm könnte doch eine
blinkende LED sein und durch die Annäherung an den Sensor soll
vielleicht die zweite LED blinken.
Einen Quellcode habe ich noch nicht geschrieben, für mein kleines
Beispielprogramm mit den LED´s. Ich habe keine Ahnung wie ich das mit
den Sensor verbinden muss.
Der Sensor muss mit ein Triggersignal dauerhaft gespeist werden und auf
das Echosignal über die Interrupts reagieren. Im Hauptprogramm blinkt
eine LED1 und wenn man sich dem Sensor nährt soll das Hauptprogramm
unterbrochen werden und ein Unterprogram, LED2 blinken, gestartet
werden. So lange bis ich den Sensor aktiviere.
Ich kann mir nicht vorstellen wie ich beginnen soll.
Ich habe es mal mit einen Schalter versucht aufzubauen, soweit ganz gut.
Nur möchte ich jetzt das statt der Schalter dies ein Ultraschallsensor
macht. Hauptprogramm unterbrechen, Unterprogramm durchführen und zum
Hauptprogramm zurückkommen.
Ich habe keine leise Idee wie ich das anstellen kann.
Ich habe mal den Code mit beigefügt und hoffe auf hilfe.
int pin = 13;
int pin1 = 8;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT);
pinMode(pin1, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop()
{
digitalWrite(pin, HIGH);
delay(1000);
digitalWrite(pin, LOW);
delay(1000);
}
void blink()
{
state = !state;
if (state == HIGH)
{
digitalWrite(pin1, HIGH);
}
else {
digitalWrite(pin1, LOW);
}
}
Schön, jetzt blinken vermutlich beide LEDs immer.
Der Sensor gibt dir in jedem Fall irgendwann ein Echo zurück (im
Fehlerfall bei zu großem Abstand nach max. 200ms).
Du bekommst also nur 2 blinkende LEDs, die etwas Zeitversetzt sind...
Versuche erst einmal, den Sensor überhaupt zu verstehen, bevor du mit
Interrupt und 2 parallelen Blinkprozessen ankommst.
Benenne in deinem Programm die Pins sinnvoll. z.B. Trigger und Echo
Dann einen kurzen Impuls an Trigger erzeugen, danach warten und
mitzählen
z.b.
while (Echo == 0)
{
Zaehler++;
warte_100us();
}
Jetzt hast du die Messung auf 0,1ms genau und kannst mit dem Zählerstand
den Abstand berechnen (Schallgeschwindigkeit ~ 340m/s, doppelte Laufzeit
für das Echo).
Jetzt kannst Du anhand des Abstandes irgend was auslösen.
A=Anfänger schrieb:> Hauptprogramm unterbrechen, Unterprogramm durchführen und zum> Hauptprogramm zurückkommen.
Wenn das Hauptprogramm unterbrochen werden soll, brauchst du einen
Interrupt.
A=Anfänger schrieb:> ... und möchte mit Hilfe eines HC-SR04 Ultraschallsensor das laufende> Programm stoppen,
Wie stellst du dir das vor. Wenn das bei Annäherung passieren soll, muss
der HC-SR04 dauernd die Entfernung messen und bei Unterschreitung eines
bestimmten Wertes eine Aktion veranlassen. Als erstes solltest du dann
deinen Arduino dazu bewegen, den Abstand per US-Modul unter Nutzung
eines Timers zu messen.
Du hast also einen UNO und einen Ultraschallsensor.
Ich gehe davon aus, du möchtest abhängig vom Abstand etwas
steuern/schalten..
Probier mal das...ist zwar ohne ISR, aber die würde dir hier eh nix
bringen.
[CODE]
int trigPin = 14;
int inPin = 15;
long duration, cm;
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT);
digitalWrite(trigPin, LOW);
pinMode(inPin, INPUT);
}
void loop()
{
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(inPin, HIGH);
cm = (int)(duration / 58);
if(cm > 100)
{
/*do this*/
}
else
{
/*do that*/
}
}
LG Johann