Codeschloss

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

von Stefan1971

Einleitung

Im Folgenden geht es um ein Haustür-Codeschloss, das als kleines AVR-Projekt in Hard- und Software umgesetzt ist und seit 2009 seinen Dienst am Klingelschild einer Haustüre versieht. Durch Eingabe des richtigen Codes lässt sich damit die Haustüre ohne Schlüssel öffnen.

Merkmale

  • Codeschloss mit ATtiny2313 zum Schalten eines elektrischen Türöffners über Relais
  • Programmierbarer Tastencode zum Öffnen der Haustür kann aus bis zu 12 Tasten bestehen
  • Aktivierdauer des Türöffners ist einstellbar
  • Einzelne Taster oder alternativ eine 4x3-Matrixtastatur können angeschlossen werden
  • Rote LED, wenn Codeeingabe läuft (leuchtet, sobald erste richtige Codetaste gedrückt wurde; verlöscht bei Zeitablauf in der Codeeingabe bzw. zusammen mit Abschalten des Türöffners)
  • Gelbe LED leuchtet, wenn Codeschloss in Programmiermodus ist (=Lernen eines Codes) und blinkt, wenn Aktivierzeit für den Türöffner eingestellt wird
  • Grüne LED zur Anzeige, ob Türöffner gerade geschaltet ist
  • Wenn der Türöffner gerade aktiv ist, kann er durch Drücken einer beliebigen Codetaste vor Ablauf des Timers abgeschaltet werden
  • Anschlüsse sind vorgesehen für die 12 Volt-Stromversorgung (Wechselspannung), eine LED als Türschildbeleuchtung und den Türöffner. Für die Codetasten gibt es eine Anschlussbuchse.

Programmierung zur Nutzung

Programmieren des Codes

Durch Drücken des Programmiertasters auf der Schaltung wird in den Programmiermodus gewechselt. Das wird durch Leuchten der gelben LED angezeigt. Nun sind die Tasten in der gewünschten Reihenfolge zu betätigen. Der Code kann aus bis zu zwölf Tastendrücken bestehen. Die Programmierung wird durch erneutes Drücken des Programmiertasters abgeschlossen. Damit ist der Tastencode gespeichert. Werden bei der Programmierung die maximal möglichen Tasten gedrückt (derzeit 12), beendet sich der Programmiermodus ohne Betätigen des Programmiertasters; der Code wird auch dann gespeichert.

Programmieren der Aktivierdauer des Türöffners

Wird der Programmiertaster im Programmiermodus (d.h. die gelbe LED leuchtet) gedrückt, ohne dass eine Codetaste zum Lernen eines neuen Codes betätigt wurde, so wechselt das Codeschloss in die Programmierung für die Aktivierdauer des Türöffners. Die gelbe LED zeigt dies durch Blinken an. In diesem Modus erfolgt mit der Taste 1 eine Testauslösung des Türöffners, mit der Taste 2 kann die Dauer verlängert, mit Taste 3 die Dauer verkürzt werden.

Ist eine Matrixtastatur angeschlossen, werden andere Tasten verwendet: Hier erfolgt die Testauslösung mit der Taste (*). Die Taste (7) verlängert und die Taste (4) verkürzt die Dauer.

Die Dauer wird in Stufen von ca. 0,2 Sekunden eingestellt.

Erneutes Drücken des Programmiertasters speichert die Einstellung, die gelbe LED erlischt. Jede andere Taste als 1, 2, 3 bzw. (*), (7) oder (4) bricht die Programmierung ab und verwirft evtl. gemachte Änderungen an der Aktivierdauer.

Software

Das Steuerprogramm ist in Assembler geschrieben. Über bedingte Assemblierung im Quelltext kann auf die Zielplattformen ATmega8 oder ATtiny2313 assembliert werden. Hintergrund ist, dass zuerst auf einem myAVR Board mit ATmega8 entwickelt und später für den Selbstbau auf den ATtiny2313 umgeschwenkt wurde.
Mittlerweile (November 2011) gibt es auch eine funktional gleiche Version in C (siehe Abschnitt Download).

Folgende interne Zustände werden in der Firmware unterschieden:
Status Beschreibung
SCAN SCAN ist der Default-Modus im laufenden Betrieb. Warten auf Tasten in der richtigen Reihenfolge. Tastendruck gilt als erfolgt, wenn Taste losgelassen wurde. Mit Loslassen der ersten richtigen Taste wird (Software-) Timer gestartet. Rote LED leuchtet.
Nächste Taste war richtig: Zeiger wird auf nächste zu erwartende Taste weiter gestellt, Timer wird zurückgesetzt.
Taste war falsch: Zeiger auf Anfang, LED aus, Timer deaktivieren.
Timer abgelaufen: Zeiger auf Anfang, LED aus; wie bei falscher Taste
Anzeigen des SCAN-Modus durch Leuchten der roten LED, sobald die erste richtige Taste betätigt (d.h. losgelassen) wurde.
Wenn alle Tasten in der richtigen Reihenfolge richtig gedrückt wurden, erfolgt Wechsel in Status OPEN.
Wenn Programmierkontakt erkannt wurde, Wechsel in den PROG-Modus.
OPEN Timer für Türöffner mit programmiertem Wert (aus Status PROG_DOOR) starten, grüne LED leuchtet, rote LED ebenfalls, Türöffner aktiv
Timer abgelaufen: Türöffner aus, LEDs aus, zurück in SCAN-Modus
Beliebige Taste wird gedrückt (Schließen ist relevant, nicht Öffnen): Türöffner aus, grüne und rote LED aus; zurück in SCAN-Modus: wie Timer-Ablauf
Der Abbruch des OPEN-Modus durch Drücken einer beliebigen Taste ist realisiert, indem das Drücken einer falschen Taste simuliert wird.
PROG Programmiermodus: Tritt ein, wenn im SCAN-Modus der Programmierkontakt betätigt (=losgelassen) wurde. Ende des Programmiermodus, wenn Programmierkontakt erneut betätigt wird. Im Programmiermodus werden die betätigten Tasten (Loslassen der Taste, wie im SCAN-Modus) nacheinander im SRAM festgehalten. Hierzu wird Index auf SRAM-Tastenspeicher zunächst auf Null gesetzt. Bei Ende des Programmiermodus wird die im SRAM festgehaltene Tastenfolge ins EEPROM übernommen. Beenden des Programmiermodus, ohne dass eine Taste während des Programmiermodus betätigt wurde, erhält den bisher eingestellten Code; dann keine Übernahme ins EEPROM. Beenden des Programmiermodus führt dann in die Programmierung der Aktivierdauer des Türöffners; Wechsel in Modus PROG_DOOR.
Eine begonnene Programmierung, bei der irrtümlich falsche Tasten gedrückt wurden, kann nicht storniert werden, sondern muss erneut durchgeführt werden. Im Programmiermodus leuchtet die gelbe LED.
PROG_DOOR Dient zur Programmierung der Aktivierdauer des Türöffners.
Um in diesen Modus zu gelangen, muss der Programmierkontakt zweimal betätigt werden, d.h. der Code-Programmiermodus muss ohne Druck einer Codetaste beendet (übersprungen) werden. Im PROG_DOOR-Modus blinkt die gelbe LED.
Die Tasten des Codeschlosses erhalten im PROG_DOOR-Modus folgende Bedeutung:
Taste 1: löst den Türöffner für die eingestellte Zeit zum Test aus (per Timer)
Taste 2: verlängert mit jedem Tastendruck die eingestellte Zeit
Taste 3: verkürzt mit jedem Tastendruck die eingestellte Zeit
Jede andere Taste: Verwirft die Änderungen und verlässt den PROG_DOOR-Modus, Rückkehr in den SCAN-Modus.
Abschließendes Betätigen des Programmierkontakts führt zu Übernahme des neuen Timer-Ladewerts ins EEPROM und beendet den PROG_DOOR-Modus. Wechsel in den SCAN-Modus.

Ist eine 4x3-Matrixtastatur angeschlossen, ist die Tastenbelegung für die Programmierung der Türöffneraktivierdauer wie folgt:
Taste (*): Türöffner testhalber auslösen
Taste (7): Aktivierdauer verlängern
Taste (4): Aktivierdauer verkürzen

STARTUP Beim Start der Anwendung wird zunächst in diesen Modus gewechselt. Er hat den Zweck, die drei LEDs des Codeschlosses dreimal blinken zu lassen um anzuzeigen, dass der Controller arbeitet und auf Eingaben wartet. Wenn diese Phase abgelaufen ist, wird in den SCAN-Modus gewechselt.

Hardware

Belegung der Ports beim ATtiny2313:
PB0 ... PB7 IN 8 Tasten zur Codeeingabe
PD6 IN Programmierkontakt
PD0 OUT Türöffner
PD1 OUT Rote LED (laufende Codeeingabe)
PD2 OUT Gelbe LED (Programmiermodus)
PD3 OUT Grüne LED (Türöffner ist aktiv)

Einzelne Tasten werden mit jeweils einem Kontakt an Pin0 bis Pin7 angeschlossen, mit dem anderen Kontakt an Masse. Welche Tastatur (einzelne Tasten oder 4x3-Matrixtastatur) angeschlossen ist, wird über den bei der Matrixtastatur nicht benötigten Pin acht (PB7) gesteuert. Ist dieser beim Anwendungsstart auf Masse geschlossen, wird auf Abtastung einer Matrixtastatur umgestellt.

Anschlussschema für 4x3-Matrixtastatur:
IN / OUT Pin4 Pin5 Pin6
Pin0 1 2 3
Pin1 4 5 6
Pin2 7 8 9
Pin3 * 0 #

Pin7 und Pin8 (Masse) sind dann dauerhaft miteinander verbunden.

Bei Nutzung eines Reed-Relais als Schaltelement muss der Türöffner erfahrungsgemäß einen Widerstand von mindestens 20Ω haben.

Die Fuses des Controllers sind folgendermaßen gesetzt:
Fuse Einstellung
SPIEN: Enabled
BODLEVEL: Brown-out detection disabled
CKDIV8: Enabled
SUT_CKSEL: Int. RC Osc. 4 MHz; Startup-time: 14 CK + 65 ms
alle anderen: Disabled

Schaltplan und Platinenlayout wurden mit Target3001 erstellt.

Bilder

Codeschloss-Platine
Anschluss einer Matrixtastatur

Download

  • Codeschloss.zip
    enthält ASM-Source, XLS-Rechenhilfe für Interrupt-Timing, Schaltplan-/Layout-Ausdruck
  • Codeschloss_C.zip
    Version in C (WinAVR-20100110), mit .hex- und .epp-Datei