Motorrad Alarmanlage

Guten Tag,

bevor ich meinen eigentlichen Post beginne ein kurzes Hallo in die Runde und kurz etwas zu mir:
Ich bin Bj 86, komme aus Unterfranken/Raum Würzburg und auf der Suche nach einem neuen Projekt :slight_smile:

Nun zum Wichtigsten, dem Projekt:
Geplant ist eine Alarmanlage für ein Motorrad, möglichst Batterieschonend mit einigen Sonderfunktionen, die es leider (warum auch immer) selbst in teureren Alarmanlagen (Beispiel Legos) nicht gibt.

wie das ganze ablaufen soll, hier jedoch noch einmal die Fakten:

1.Es soll eine Alarmanlage für ein Motorrad sein :slight_smile:

2.Nach Ausschalten des Motorrades und einer Verzögerung von 30 Sekunden ertönt ein kurzer “Beep” (Piezowandler) zur Signalisierung, dass die Alarmanlage scharf ist.

3.Bei Auslösen des Alarmgebers (Gravitationssensor und/oder Erschütterungssensor) soll eine kurze Warnung ein “Beep” (siehe oben - sollte man vergessen haben die Alarmanlage zu deaktivieren wird man jetzt noch einmal daran erinnert und hat noch kurz Zeit diese zu deaktivieren, bevor sie loshupt) ausgegeben werden, nach einer Verzögerung von 4 Sekunden schaltet ein Relai 4x (hupen/Blinken)

3.1 Nach der ersten Auslösung des Alarmgebers (3.) ist die Alarmanlage in Bereitschaft und hört für 90 Sekunden weiter auf die Eingänge/den Eingang für das Alarmsignal. Nach Ablauf der 90 Sekunden und erneuter Auslösung wieder ab 3. (Bis Counter bei 10, dann Alarmanlage deaktiviert bis das Motorrad wieder an war - wenn das Motorrad an ist, kriegt die Alarmanlage keinen Strom - Es könnte durchaus sein, dass die Alarmanlage 10x kurz anspringt, um zu verhindern, dass sie das ununterbrochen macht bis die Batterie leer ist, ist die Absicherung mit maximal 10 Zyklen gedacht)

3.2 Wenn ein Alarmsignal innerhalb der unter 3.1 genannten 90 Sekunden erneut eingeht, schaltet (an-aus-an-aus … ) ein Relais 28 Sekunden lang um eine Hupe/Blinker zu betätigen

Ideal wäre es für mich, wenn ich die Intervalle (90 Sekunden und 4 Sekunden) und auch die Geschwindigkeit, in der das Alarmsignal ausgegeben wird (Hup/Blinkintervall) seperat über einen Poti/Kippschalter regeln könnte. Aber das wäre nur Fleissarbeit und ist auch im Struktogramm nicht weiter aufgeführt. - Non plus Ultra wäre die deaktivierung der Alarmanlage über RFID -

MFG und Danke im Vorraus :slight_smile:

Hi coolrunning,
interessantes Projekt… ohne mir konkret gedacnken genacht zu haben schon mal 2 Einwürfe:

  • Wichtig ist der Energieverbrauch; Ergo solltest du auf einen Arduino mit SMD-Technik setzten, z.B der Nano bzw dem Mini (oder einen billigeren Clon), da hier der Energieverbrauch (etwas) niedriger ist. außerdem müssen wir großzügig Gebrauch von Interupts machen
  • Statt Relais um die Blinker zu steuern würde ich auf eine Transistorschaltung wechseln

Die umsetzung des Codes kriegen wir (mit ein wenig Mitarbeit von dir) relativ problemlos hin.

Interrupts? Für Anfänger vielleicht etwas hochgegriffen... Würde das nicht besser in der möglichen Optimierung aufgehoben sein? Nun noch der obligatorische Hinweis: Basteleien an Fahrzeugen bzw. Der Fahrzeugelektronik müssen in der Regel abgenommen werden. Ohne Abnahme zahlt im Falle eines Personen- oder Sachschadens keine Versicherung.

Der Eingriff ist hier allerdings minimal - nicht wie bei unserem BMW-Fahrer gestern - es geht rein um die Ansteuerung der Blinker - wobei das hier sogar noch als "Bonus" betrachtet wird.

Wenn du stromsparend arbeiten willst, solltest du über Transistoren schalten, da ein Relais wesentlich mehr Strom benötigt und du zusätzliche Hardware (Wie etwa Freilaufdioden) einbauen musst oder solltest - bei ohmschen Verbrauchern wie einer Glühbirne zwar nicht soooo wichtig, aber wenn schon, denn schono

Interupts sind nur kompliziert, solange man sich nicht mit ihnen befasst - wenn jemand den Willen hat, etwas zu lernen, nimmt er die Sache mit den Interupts mit und weiß es beim nächsten mal.

Der Nano/Mini/NG verbraucht im Vergleich zum normalen Arduino Uno/Diecemilla etwa 40% weniger Strom. Das ist also mehr als nur ein bisschen...

btw: hab was ganz witziges gefunden, passt zum Thema - allerdings nicht zum Projekt: http://de.engadget.com/2012/05/07/the-hornster-das-lauteste-fahrrad-der-welt-hupt-178-dezibel/

Ich verstehe nicht wieso die Arduino Nano/Mini/NG weniger Strom verbrauchen sollen als der Arduino UNO. Abgesehen davon daß der Arduino NG nicht mehr aufzutreiben ist verstehe, ich daß der Mini weniger Strom verbraucht, weil er keinen USB/Serial Adapter auf der Platine hat. Der Nano hat das Interface genau wie der Arduino 2009.

Die Stromsparstategie ist: - niedrige Versorgungspannung (3V aus Lithiumbatterie) - Den Controller die meiste Zeit in den Sleep Modus versetzen und nur kurz aufwachen zu lassen um zu kontrollieren ob ein Alarmzustand gegeben ist. - Nur im Alarmfall Strom aus dem Motorrad-Akku für Hupe und Licht nehmen.

Grüße Uwe

Sorry, meinte natürlich den Arduino SMD - dachte das sei der NG... Alles andere stimme ich dir vollkommen zu - wie bereits oben geschrieben.

Die SMD-Varianten Verbrauchen in der Tat weniger Strom - wieso das so ist, keine Ahnung - Aber es ist deutlich messbar, häng beide an eine Batteriestromquelle mit neuen Batterien, lade die selbe Anwendung drauf und warte - die SMD-Varianten (Mini, Nano - den Arduino SMD hab ich nicht) halten etwa 30 - 40% länger durch.

http://arduino.cc/forum/index.php/topic,104497.0.html

Als Energiequelle kannst du durchaus den Motoradakku hernehmen - bis dir den der Arduino leerlutscht ist dein Bike über alle Berge... Generell würde ich es unterlassen am Fahrzeugsystem generell etwas zu verändern, dh. statt die eingebauten Blinker würde ich Zusatzbeleuchtung wählen. Oder, falls wirklich wichtig, wenigsten eine galvanische Trennung über Optokoppler vornehmen. Kein Mensch weiß, was alles passieren kann, wenn dir der Arduino eine Fehlfunktion beschert. Ich hatte mal einen Audi 80, da ging auf einmal der Heckscheibenwischer nicht mehr - was allerdings nicht am Scheibenwischer lag, sondern an einem eingeklemnmten Kabel im Türkontakt der Beifahrerseite - Habs nur durch Zufall beim Saugen entdeckt und behoben - hab ich mich gewundert, als dann der Heckwischer wieder ging, hab vorher so ziemlich alles probiert und mich dann mit dem Defekt abgefunden...

Ich würde für sowas überhaupt keinen Arduino nehmen. Der größte Teil des Stromverbrauchs kommt vom Spannungsregler. Besser wäre es einen “nackten” Chip zu nehmen. Quarz kann man auch weglassen weil das Timing eher unkritisch ist. Die Taktfrequenz mit CKDIV auf 1 MHz runternehmen, dann läuft das Teil auch noch bei geringerer Batteriespannung. Da kriegt man den Stromverbrauch locker unter 1mA hin. Mit etwas Müher auch <10uA.

Viel kritischer sehe ich den mechanischen Aufbau an. Das Teil muß mit Vibrationen, ggf. Wasser fertig werden. Und im Alarmfall darf ein Dieb das nicht einfach zerstören können.

Vermutlich sollen auch Fehlalarme erkannt / unterdrückt werden. Das könnte schon einen Tick schwerer werden als man auf den ersten Blick vermuten würde.

Die eigentlich Programmierung halte ich dabei für ein eher geringes Problem.

Noch ein Nachtrag:

  • Non plus Ultra wäre die deaktivierung der Alarmanlage über RFID -

Das verträgt sich leider eher weniger mit sehr niedrigem Stromverbrauch. So ein Modul zieht locker mal 10-50mA.

Erst mal schön, dass du auch bereit bist, erste eigene Codezeilen zu entwickeln. Besser ist es, den eigenen Code forentypisch kennzuzeichnen. Dazu gibt es die [#]-Schaltfläche beim Schreiben des Postings.

Wenn du programmierst hast du immer zwei grundlegende Funktionen zu berücksichtigen: setup() (die hast du drin) und loop(). Anweisungen in der letztgenannte Funktion werden, wie der Name schon sagt, wiederholend abgewickelt. Es besteht auch die Möglichkeit, eigene Funktionen zu entwerfen, um den Quelltext sauberer zu gliedern. Deine while-Anweisungen sind sicher gut gemeint, ich könnte mir jedoch vorstellen, dass eine for-Schleife in den meisten Fällen sinnvoller.

Einfach am Ball bleiben, das wird schon...

@ udo Klein deswegen hatte ich mir ja überlegt die Abfrage/Funktion des RFID Elemnts nur auf Knopfdruck zu aktivieren/abzufragen. Aber ich belasse es erstmal mit RFID und setze das in einem anderen Projekt an geeigneter Stelle um. :)

@ sth77 Quellcode in Box gepackt check

bezüglich der loop() Funktion. Diese ist also zwangsläufig nötig? Mein Programm ist nach der Schleife (//while Schleife - Alarmsignal) aber zu Ende, bzw soll der Controller dann nichts mehr unternehmen. Wie mache ich das dann?

"Deine while-Anweisungen sind sicher gut gemeint, ich könnte mir jedoch vorstellen, dass eine for-Schleife in den meisten Fällen sinnvoller." Komme leider nicht mit dem FOR Befehl zurecht. Deshalb auch die WHILE schleife. Diese habe ich (hoffentlich) soweit hingekriegt ^^

Ich lasse mich gerne korrigieren, aber für dieses Projekt sollte es egal sein, ob ich den For oder While nutze, oder?

Passt der restliche Quelltext soweit?

ps: Der Reset Taster war zum "Neustart" und bezweckt das gleiche wie das Entfernen und neue Anschließen der Stromversorgung, oder?

Wenn du keine sich wiederholenden Anweisungen hast, kannst du einfach alles in die setup()-Routine schreiben. Die loop() ist dann leer:

loop(){}

Ob man sie ganz weglassen kann, weiß ich nicht, eventuell schimpft dann der Compiler... ;)

//Variablen Pins zuweisen
int pin = 7;                          // Alarmgeber liegt an Pin 7.

passt mit

//Pins als Eingang-Ausgang setzen
  pinMode(Alarmgeber, INPUT);    // Setzt den pin (Pin 7) als Eingang

noch nicht zusammen.

[edit] Du kannst deinen Code auch in der IDE testen, grobe Fehler erkennt die ja auch schnell.

Die loop ist zwingend nötig - aber du brauchst ja in der loop nichtsmehr machen, wenn nix zu tun ist.

Ob du deinen Programmablauf, der ja nureinmal laufen soll, in die loop oder die Setup packst, ist eigentlich egal... Allerdings muss das ding ja auch scharfgeschaltet werden und dann kontinuierlich werte von den sensoren erfassen - nachdem es keine richtigen Sensorevents gibt, löst es der arduino indem er einfach in einer endlosschleife immer wieder die Sensoren abfragt. Die loop- und setup-Routinen der IDE sind eh nur show and shine - intern wird der Code dann umgewandelt und aus der loop-methode wird eine for( ; ; )-Endlosschleife

Wie man Strom spart wurde im Forum schon häufiger diskutiert.

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1282757748/all

Ansonsten mit Google nach Arduino + sleep oder Arduino + narcoleptic suchen.

Interrupts sind hier beschrieben (mit Beispiel): http://arduino.cc/it/Reference/AttachInterrupt.

Ich hoffe ich sag nix falsches:

int pin = 13;

Heißt nur das die Variable pin ein Integer ist und 13 enthält.

attachInterrupt(0, blink, CHANGE);

Heißt das wenn sich der Status an Interrupt 0 also pin 2 ÄNDERT wird blink aufgerufen.

digitalWrite(pin, state);

Hier wird pin (also 13) auf den Wert state gesetzt.

state = !state;

Hier wird state gleich nicht state gesetzt. Also wenns low war wirds high und umgekehrt.

Dein angehängter code macht nichts anderes wie den state immer auf den pin (also 13) zu schreiben. Kommt nun ein change an 0 (pin2) wird blink aufgerufen und hier wird state geändert. Dadurch wird im nächsten loop der neue state geschrieben.

So glaube ich.

Völlig korrekte Beschreibung.

Wobei es besser wäre den digitalWrite auch noch in die Interruptroutine zu packen. In Loop wird sonst fast immer nur der gleiche Wert geschrieben. Im Interrupt weiss man ja, dass sich der Wert geändert hat und schreibt ihn dann einmal und gut.

Außerdem könnte man dann state auch in der Interruptroutine als static deklarieren und wäre damit die globale volatile Variable los.

Also so:

int pin = 13;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}

void loop()
{
}

void blink()
{
  static int state = LOW;

  state = !state;
  digitalWrite(pin, state);
}

kann ich hier kein delay setzen?

Nein, wakeUpNow() ist ein InterruptHandler und sollte nur kurz laufen.

Wo die Funktion in deiner Datei steht, ist übrigens egal

sleepNow() wird in deinem Beispiel noch gar nicht aufgerufen. Wenn aber doch ( z.B. wenn du in loop() merkst, dass es “Zeit zum Schlafengehen” ist ) läuft sleepNow() als Funktion von loop() und mit sleep_mode(); ist erstmal Pause!

Der Interrupt Pin2 = LOW startet die Routine wakeUpNow mit hoher Priorität ( InterruptRoutine ). Wenn diese ( möglichst bald ) fertig ist, geht die normale Programmausführung weiter, und zwar direkt nach [b]sleep_mode(); [/b] mit

   // THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
    sleep_disable();        
    detachInterrupt(0);      
}

von da zurück zu Aufrufer ( loop() ? ) und alles ist wieder normal…

Wozu ist das #include <avr/sleep.h> ? läd er hier einen Queelcode (sleep.h) zusätzlich in mein Board?

.h Dateien enthalten (fast) keinen Programmcode, aber Funktionsdeklarationen, damit der Compiler z.B. weiss dass es eine Funktion namens sleep_disable() gibt, und welche Aufruf- und Rückgabewert-Typen diese erwartet. Die Funktionen, die aktuell gebraucht werden, werden dann auch mit in dein Board geladen. Deren Code ist in der Regel in eigenen .cpp Dateien. Beide können in Libraries… angeschaut werden.