RFID Türöffnersystem mit I2C Seviceeinheit

Status
Für weitere Antworten geschlossen.

Cassio

Aktives Mitglied
29. Okt. 2008
4.027
17
38
Region Hannover
Sprachen
  1. BascomAVR
.
Es gibt inzwischen eine komplett überarbeitete Version aller Zugangskontroll-Systeme (A1, A2 & I):
Der Beitrag ist HIER zu finden !


Hallo zusammen!

Heute habe ich endlich mal die Zeit, eine meiner letzten Projekte hier einzustellen. :)

Vor einiger Zeit kam mir die Idee, unsere Schließanlage durch RFID-Schlüssel zu erweitern.
Der Vorteil ist, dass bei Verlust eines "Schlüssels" die Schließanlage nicht betroffen ist. Es wird lediglich der RFID-Code in der Öffnereinheit gelöscht und ein neuer eingelesen.
Alle die auch Kinder haben, werden wissen was ich meine. ;)

So ein System hatte ich früher immer schon von der Firma Siedle im Einsatz.
Nun wollte ich aber etwas eigenes erschaffen und meine persönlichen Ideen mit integrieren.
Aus diesen Überlegungen heraus ist die erste Version meines RFID-Öffner entstanden.


Zum Auslesen der RFID-Tags kommt eine Leseeinheit ID20 von ID-Innovations zum Einsatz.
Die Vorteile liegen klar auf der Hand.....
Kompakte Einheit mit integrierter Antenne und hoher Reichweite.

Durch die recht hohe Reichweite des ID20, habe ich mich auch erst einmal für eine "Indoor-Variante" entschieden.
Die Vorteile hierbei sind, dass alle Komponenten sich im Innenbereich befinden und die Temperaturen keine extremen Werte annehmen können.
Außerdem kann die Lese- und Auswerteinheit in einem Gehäuse verbaut werden.
Das Beste ist aber, dass man von Außen nichts erkennen kann und es keine Hinweise auf eine elektronische Türöffnung gibt. ;)


Nun aber mal zur Einheit....
Abgesehen von den baulichen Maßnahmen, sollte der RFID-Öffner folgende Funktionen aufweisen:
-eigenständig arbeitende Einheit
-Rückmeldung der Tür (geschlossen und verschlossen)
-nachträgliches speichern und löschen von RFID-Tags ohne Programmupdate
-Kurzzeittaster für Daueröffnung


Damit ich nun nachträglich jederzeit die RFID-Tags bearbeiten kann, wäre eine Matrixtastatur und ein LCD sehr hilfreich.
Allerdings wäre es übertrieben, später jede Einheit mit diesen Eigenschaften zu bestücken.
Aus diesem Grunde habe ich mir eine Art "Service-Einheit" überlegt, die ich bei Bedarf dann anstecken kann.
Für das I2C-Bussystem gibt es von Kent Andersson zwei LIB`s, die mir genau dies ermöglichen.

Einmal wird mit einem PCF8574(A) eine Matrixtastatur über I2C ausgelesen und ein anderes Mal wird ebenfalls mit einem PCF8574(A) ein Standard-LCD angesteuert.

Für die Matrixtastatur ist die LIB bereits in BASCOM vorhanden (key_i2c.lib), für das LCD musste ich die passende Datei (Lcd_i2c.lib) aber selbst hinzufügen.

Das Ganze sieht dann folgendermaßen aus:
Matrixtastatur => I2C-Matrix-Plan.gif I2C-Matrix.gif

LCD=> I2C-LCD-Plan.gif I2C-LCD.gif



Damit wären die Serviceeinheiten schon mal fertig: a_DSCF0896.jpg


Wie es dann weiter ging, folgt gleich in den nächsten Beiträgen. :)

Grüße,
Cassio
 
Hallo!

Da die "Service-Einheit" nun fertig war und bei ersten Tests auch problemlos funktionierte, konnte es mit der eigentlichen Arbeit weiter gehen. ;)

Als erstes habe ich mir den Programmablauf notiert:
RFID-Oeffner-Block.gif


Dann folgte der Anschlussplan:
RFID-Oeffner-Plan.gif


und zum Schluss noch das Platinenlayout:
RFID-Oeffner-Platine_1.gif


Damit waren alle Elemente fertig geplant und es ging daran die Hardware und Software zu erstellen.


Grüße,
Cassio
 
Hallo !

Als Software möchte ich hier "nur" meine Version 1.0 einstellen.
Diese ist funktionstüchtig und relativ einfach zu verstehen.
Sie diente mir zu Beginn dazu alle einzelnen Komponenten zu verstehen, zum Laufen zu bringen und den Programmablauf "transparent" zu halten.
Es ging also noch nicht darum den Programmcode möglichst klein und effizient zu halten.

Inzwischen bin ich bei Version 3.0, mit einigen Verbesserungen und Erweiterungen, gerade was die Ansteuerung, Key-Speicher und Variablenverwaltung betrifft.


Nun aber der Reihe nach.....

Zu Beginn möchte ich einen Blick auf die I2C-Serviceeinheit werfen.
Das hierfür zwei LIB`s von Kent Andersson verwendet werden, habe ich ja oben schon erwähnt.
Die Verwendung sieht bei mir so aus:


CodeBox bascom


' ==============================================================================
' I2C-Config
Config Scl = Portc.5 'I2C SCL
Config Sda = Portc.4 'I2C SDA

Config I2cdelay = 1

I2cinit


' I2C Matrixtastatur (Kent Andersson)------------------------
$lib "key_i2c.lib" 'LIB für I2C-Matrixtastatur
$external _key_code 'Externe Routine

'*****WICHTIG !*************************************************
'* Die Funktion "_key_scan", in der LIB "key_i2c.lib", MUSS ab BASCOM Ver. 2.0.3.0 auf _key_code geändert werden!
'* Ab BASCOM 2.0.3.0 dürfen Funktionen und Variablen NICHT mehr den selben Namen besitzen!
'* Bitte folgendes in der LIB ändern=
'* [_Key_code]
'* _Key_code:
'* Das war es dann auch schon !
'*****WICHTIG !*************************************************

Const Pcf8574_kbd = &H72 'I2C-Adresse des PCF8574A
!rcall _Key_Init 'Initialisierung aufrufen

Dim _key_scan As Byte 'Variable für Tastenausgabe


' I2C LCD (Kent Andersson)-----------------------------------
$lib "Lcd_i2c.lib" 'LIB für I2C-LCD

Const Pcf8574_lcd = &H74 'I2C-Adresse des PCF8574A

' _lcd_e Variable für LCD-Zeilen
Dim _lcd_e As Byte
_lcd_e = 128 ' 16x2 Displey
' 128 für Zeile 1+2
' 64 für Zeile 3+4
' 192 für Zeilen 1-4 z.B. bei CLS
' ==============================================================================



Wie ich im Programm schon als Kommentar vermerkt habe, muss man ab BASCOM Ver. 2.0.3.0 die externe Routine "_key_scan" in der LIB "key_i2c.lib" umbenennen, weil BASCOM ab dieser Version keine doppelten Namen mehr zulässt. :rolleyes:
Zu Beginn hatte ich noch mit der Version 2.0.2.0 gearbeitet und da gab es dieses "Problem" nocht nicht!


Nun ist es möglich, eine "externe" Matrixtastatur und ein "externes" LCD am System zu betreiben.
Hinweis:
Wenn man das LCD am laufen System mit dem I2C-Bus verbindet, zeigt es natürlich nichts an, weil das INIT fehlt.
Damit man aber nicht alles neu starten muss, kann man mit "!Rcall _init_LCD" das LCD auf "Knopfdruck" initialisieren und schon funktioniert es. :)

Im Programm habe ich dafür folgendes vorgesehen:
Code:
If _key_scan = 16 Then                                      'LCD neustarten
!Rcall _init_LCD
Waitms 100
Else
End If

Verbinde ich nun meine "Serviceeinheit" nachträglich mit dem System, muss ich nur eine betimmte Taste drücken (die den Key_scan 16 liefert) und schon arbeitet das LCD.

Im Betrieb sieht das dann so aus:
a_DSCF0900.jpg

Nun kann ich jederzeit die einzelnen RFID-Tags ansehen, speichern, löschen, oder auch meinen Kurzzeittimer überwachen. ;)

a_DSCF0901.jpg a_DSCF0902.jpg a_DSCF0903.jpg

a_DSCF0904.jpg


Leider habe ich es noch nicht geschafft, meine Serviceeinheit in ein Gehäuse zu bauen. :rolleyes:
Dies wird aber in Kürze geschehen. ;)


Wie auf den Bildern bereits zu sehen ist, sitzt mein RFID-Öffner schon an Ort und Stelle....... und verrichtet zuverlässig seinen Dienst. :)
Damit geht es dann im nächsten Beitrag auch weiter.

Grüße,
Cassio
 
Hallo !

So, nun noch der letzte Akt. ;)

Wie eingangs bereist berichtet, handelt es sich bei meiner ersten Einheit um eine "Indoor-Variante".
Besondere Vorkehrungen in Punkto Manipulationssicherheit waren dadurch nicht zu beachten.
Aus diesem Grunde befindet sich vom RFID-Scanner bis zur Auswertung alles in einem Gehäuse und auch die Ansteuerung des Türöffners erfolgt hier.

In den nächsten Varianten wird jedoch der RFID_Scanner mit einer Duo-LED von der restlichen Controllereinheit getrennt, da sich der Scanner im "ungeschützten" Bereich befindet.
Durch diese Maßnahme können später an der Außeneinheit keine Leitungen gebrückt werden, um den Türöffner zu betätigen.


Meine erste Variante sieht aber fertig installiert nun so aus:
a_DSCF0898.jpg

Der niedrige Montageort wurde extra so gewählt, damit man mit vollen Händen den RFID-Schlüssel in der Hosentasche belassen und trotzdem die Tür öffnen kann. ;)


Hier mal ein Blick auf das geöffnete Gehäuse:
(Achtung, Einheit wurde auf dem Kopf montiert)
a_DSCF0899.jpg



Zum Schluss stelle ich hier nun meinen Programmcode mit ein der, wie ein Beitrag zuvor schon geschrieben, zwar von mir so nicht mehr verwendet wird, aber alle Funktionen recht gut beschreibt und nachvollziehbar macht.

Hier der erste Teil des Programmcodes:
(Musste leider geteilt werden, weil sonst der Beitrag zu viele Zeichen enthielt. :rolleyes: )


CodeBox bascom

'
' Cassio von AVR-Praxis.de
' =========================
' RFID-Leseeinheit mit I2C-Schnittstelle
'
' Als RFID-Leser wird das Modul ID12 / ID20 von ID-Innovations.com verwendet!
' I2C-Matrix-Tastatur mit INT0-Überwachung zur Bedienung (nach Kent Andersson)
' I2C-16x2-LCD zur Anzeige von RFID-Tags und Menü (nach Kent Andersson)
' Kurzzeittaster (8min.) für permante Tür-Auf-Funktion über INT1
' Tür geschlossen Überwachung (Rückmeldungen der Tür erforderlich)
' Tür Verschlussüberwachung (Öffner-Rückmeldung vom Schloss erforderlich)
' Akustischer Signalgeber für richtige und falsche Werte
' Serviceprogramm zum nachträglichen speichern und löschen von RFID-Tags
' Auflistung und Ausgabe aller gespeicherten RFID-Tags via RS232
' Gespeicherte RFID-Tags werden dauerhaft im EEPROM gesichert
'
'
' ##########################################
' ACHTUNG !
' Fusebit High G = 0
' EEPROM wird beim Flashen NICHT gelöscht!!!
' ##########################################
'
'
' Erstellt mit 2.0.3.0
'
'
$regfile = "m8def.dat"
'$crystal = 14745600 '14,7456MHz für gerade Baudwerte
$crystal = 12000000 'extern Frequenz (Baud-Fehler 0,16%)


$hwstack = 128
$swstack = 128
$framesize = 128

$baud = 9600 'RxD für RFID-Tag und TxD zum PC
$timeout = 1500000 'Timeout wegen Waitkey()-Befehl


' ================================================
' Bestimme die Ein- und Ausgänge

' PD.0 = RxD (RFID)
' PD.1 = TxD (zum PC)
' PD.2 = INT0 (Matrixtastatur)
' PD.3 = INT1 (Kurzzeittimer)
' PD.4 = _Output
' PD.5 = _Input
' PD.6 = Kontakt Verschlussüberwachung
' PD.7 = Kontakt für Tür_zu
Ddrd = &B0001_0010 '1 ist Ausgang 0 ist Eingang
Portd = &B1110_1101 'auf Hi oder Low setzen

'PC.0 = _Input
'PC.1 = _Input
'PC.2 = _Output
'PC.3 = _Input
'PC.4 = SDA
'PC.5 = SCL
Ddrc = &B11_0100 '1 ist Ausgang 0 ist Eingang
Portc = &B00_1011 'auf Hi oder Low setzen

'PB.0 = Beeper
'PB.1 = Türöffner Ausgang
'PB.2 = _Input
'PB.3 = _MOSI
'PB.4 = _MISO
'PB.5 = _SCK
'PB.6 = _XTAL1 (14,7456MHz)
'PB.7 = _XTAL2 (14,7456MHz)
Ddrb = &B011 '1 ist Ausgang 0 ist Eingang
Portb = &B100 'auf Hi oder Low setzen0


' ================================================
' Globale Interrupts einschalten
Enable Interrupts


' ================================================
' Config für INT0 (I2C-Matrix)
Enable Int0 ' Überwache INT0
On Int0 Matrix_scan
'Enable Int0

' ================================================
' Config für INT1 (Kurzzeit-Taster)
Enable Int1
'Config Int1 = Falling ' Überwache INT1
On Int1 Kurzzeit
'Enable Int1


' ==============================================================================
' I2C-Config
Config Scl = Portc.5 'I2C SCL
Config Sda = Portc.4 'I2C SDA

Config I2cdelay = 1

I2cinit


' I2C Matrixtastatur (Kent Andersson)------------------------
$lib "key_i2c.lib" 'LIB für I2C-Matrixtastatur
$external _key_code 'Externe Routine

'*****WICHTIG !*************************************************
'* Die Funktion "_key_scan", in der LIB "key_i2c.lib", MUSS ab BASCOM Ver. 2.0.3.0 auf _key_code geändert werden!
'* Ab BASCOM 2.0.3.0 dürfen Funktionen und Variablen NICHT mehr den selben Namen besitzen!
'* Bitte folgendes in der LIB ändern=
'* [_Key_code]
'* _Key_code:
'* Das war es dann auch schon !
'*****WICHTIG !*************************************************

Const Pcf8574_kbd = &H72 'I2C-Adresse des PCF8574A
!rcall _Key_Init 'Initialisierung aufrufen

Dim _key_scan As Byte 'Variable für Tastenausgabe


' I2C LCD (Kent Andersson)-----------------------------------
$lib "Lcd_i2c.lib" 'LIB für I2C-LCD

Const Pcf8574_lcd = &H74 'I2C-Adresse des PCF8574A

' _lcd_e Variable für LCD-Zeilen
Dim _lcd_e As Byte
_lcd_e = 128 ' 16x2 Displey
' 128 für Zeile 1+2
' 64 für Zeile 3+4
' 192 für Zeilen 1-4 z.B. bei CLS
' ==============================================================================


' ================================================
' Bestimme die Variablen
Dim Kb As String * 1 'Keyboard-Wert als String
Dim Kbn As String * 1 'KB Zwischenspeicher

Dim Rfid_0(18) As Byte 'scan des aktuellen RFID-Tags
Dim Rfid_s As String * 11 'aktueller RFID-Tag als String
Dim Rfid_ss As String * 1 'einzelnes Zeichen des Strings

Dim I As Byte 'Indexzähler
Dim Z1 As Byte 'Zähler 1
Dim Pz1 As Byte 'Pausen-Zähler 1 (Sekunden)
Dim Pz2 As Byte 'Pausen-Zähler 2 (Minuten)

Dim Kurzzeit_flag As Bit 'Flag für Kurzzeittaster

Dim Toeff_zeit As Byte 'Öffnungszeit Türöffner


Dim Rfid_s1 As String * 11 'String für gespeicherten RFID-Tag
Dim Rfid_s2 As String * 11 'String für gespeicherten RFID-Tag
Dim Rfid_s3 As String * 11 'String für gespeicherten RFID-Tag
Dim Rfid_s4 As String * 11 'String für gespeicherten RFID-Tag
Dim Rfid_s5 As String * 11 'String für gespeicherten RFID-Tag
Dim Rfid_s6 As String * 11 'String für gespeicherten RFID-Tag
Dim Rfid_s7 As String * 11 'String für gespeicherten RFID-Tag
Dim Rfid_s8 As String * 11 'String für gespeicherten RFID-Tag

' ================================================
'Bestimme die EEProm-Variablen
Dim E_rfid_s1 As Eram String * 11 'RFID-Tag im EEPROM
Dim E_rfid_s2 As Eram String * 11 'RFID-Tag im EEPROM
Dim E_rfid_s3 As Eram String * 11 'RFID-Tag im EEPROM
Dim E_rfid_s4 As Eram String * 11 'RFID-Tag im EEPROM
Dim E_rfid_s5 As Eram String * 11 'RFID-Tag im EEPROM
Dim E_rfid_s6 As Eram String * 11 'RFID-Tag im EEPROM
Dim E_rfid_s7 As Eram String * 11 'RFID-Tag im EEPROM
Dim E_rfid_s8 As Eram String * 11 'RFID-Tag im EEPROM


' ================================================
' Aliasnamen:
Toeff Alias Portb.1 'Port für Türöffner
T_zu Alias Pind.7 'Tür zu Überwachung
T_schloss Alias Pind.6 'Tür Verschlussüberwachung

Beeper Alias Portb.0 'Signalgeber

Ein Alias 1
Aus Alias 0



' #############################################################################
' Anfangswerte:
Gosub E_rfids 'RFID-Tags aus dem EEPROM holen

Toeff = Aus

Toeff_zeit = 1 'Öffnungszeit

Kurzzeit_flag = 0
Rfid_s = " "
Rfid_ss = " "
Kb = " "
Pz1 = 0
Pz2 = 0

Cls
Locate 1 , 1
Lcd "RFID-Leser (I2C)"
Locate 2 , 1
Lcd " by Cassio "

Wait 1


' ################################################
' # #
' #---------------Arbeitsschleife----------------#
' # #
' ################################################
Do 'Hauptschleife-Beginn

If _key_scan = 13 Then Gosub Service


If _key_scan = 16 Then 'LCD neustarten
!Rcall _init_LCD
Waitms 100
Else
End If



If T_schloss = 1 Then
Locate 1 , 1
Lcd "Fehler! Tuer ist"
Locate 2 , 1
Lcd "verschlossen ! "
Else
If Kurzzeit_flag = 1 Then
Gosub Pause
Else
Gosub Rfid_scan
End If
End If

Loop 'Hauptschleife-Ende



' ################################################
' # #
' #----------------Subroutinen-------------------#
' # #
' ################################################
'------------------------------------------------------------------RFID_Key scan
Rfid_scan:

Locate 1 , 1
Lcd "RFID-Tag scan..."
Locate 2 , 1
Lcd " "

I = Waitkey() 'Warten auf Key bis Timeout

If I = 2 Then 'Startcharakter ist immer 02

If T_zu = 0 Then 'Prüfen, ob die Tür auch zu ist
For Z1 = 2 To 16
Rfid_0(z1) = Waitkey() 'Einlesen des RFID-Tags
Next Z1
Gosub Rfid_key 'Array in String formatieren
Gosub Zutritt 'Zutritt prüfen und ausführen
Else
Locate 1 , 1
Lcd " Tuer OFFEN ! "
Gosub Beep_fail
Wait 1
End If

Else
End If

Return

' ----------------------------------------------------------------------RFID_Key
Rfid_key:

For Z1 = 1 To 11 'Array in String schreiben
Rfid_ss = Chr(rfid_0(z1))
Rfid_s = Rfid_s + Rfid_ss
Next Z1


Locate 1 , 1
Lcd "RFID-Tag gelesen"
Locate 2 , 1
Lcd Rfid_s 'aktuellen Tag anzeigen

Return

'------------------------------------------------------------------------Zutritt
Zutritt:

Select Case Rfid_s 'Zutrittskontrolle
Case Rfid_s1
Toeff = Ein
Gosub Beep_ok
Case Rfid_s2
Toeff = Ein
Gosub Beep_ok
Case Rfid_s3
Toeff = Ein
Gosub Beep_ok
Case Rfid_s4
Toeff = Ein
Gosub Beep_ok
Case Rfid_s5
Toeff = Ein
Gosub Beep_ok
Case Rfid_s6
Toeff = Ein
Gosub Beep_ok
Case Rfid_s7
Toeff = Ein
Gosub Beep_ok
Case Rfid_s8
Toeff = Ein
Gosub Beep_ok
Case Else
Gosub Beep_fail
End Select


Wait Toeff_zeit 'Türöffnerzeit

Toeff = Aus

Rfid_s = " " 'temporären String leeren

Return


'------------------------------------------------------------------------Service
Service:

Print "Service"

Cls
Locate 1 , 1
Lcd " Service- "
Locate 2 , 1
Lcd " Menue ! "

Wait 1
While _key_scan > 0 'Keine Teste mehr gedrückt? Sonst warten!
NOP
Wend


Locate 1 , 1
Lcd "1= Key speichern"
Locate 2 , 1
Lcd "2= Key loeschen "

While _key_scan = 0 'Warten bis eine Taste gedrückt wurde
NOP
Wend
'--------------------------------------


Select Case _key_scan 'aktuelle Eingabe auswerten
Case 9 : Gosub Key_add
Case 10 : Gosub Key_del
Case 15 : Gosub Anzeige
End Select

Return



....zweiter Teil folgt sofort....
 
....und weiter gehts....



CodeBox bascom


'------------------------------------------------------------------------Key_add
Key_add:

Cls
Locate 1 , 1
Lcd "1= Key speichern"
Locate 2 , 1
Lcd " "

While _key_scan > 0 'Keine Teste mehr gedrückt? Sonst warten!
NOP
Wend
'--------------------------------------
Locate 2 , 1
Lcd "Nr.(1-8)= ? "


While _key_scan = 0 'Warten bis eine Taste gedrückt wurde
NOP
Wend


Locate 2 , 1
Lcd "Speicher " ; Kb ; " warte"


Do 'auf den RFID-Key warten
I = Waitkey() 'RFID-Tag scannen und in String schreiben

If I = 2 Then
For Z1 = 2 To 16
Rfid_0(z1) = Waitkey()
Next Z1
For Z1 = 1 To 11
Rfid_ss = Chr(rfid_0(z1))
Rfid_s = Rfid_s + Rfid_ss
Next Z1
Exit Do
Else
Gosub Beep_fail
End If
Loop

Gosub Beep_ok


Select Case Kb 'RFID-Tag speichern
Case "1"
Rfid_s1 = Rfid_s
Case "2"
Rfid_s2 = Rfid_s
Case "3"
Rfid_s3 = Rfid_s
Case "4"
Rfid_s4 = Rfid_s
Case "5"
Rfid_s5 = Rfid_s
Case "6"
Rfid_s6 = Rfid_s
Case "7"
Rfid_s7 = Rfid_s
Case "8"
Rfid_s8 = Rfid_s
End Select

Gosub Ee_rfids 'alle Tags im EEPRom sichern

Cls
Locate 1 , 1
Lcd "Key gespeichert!"
Locate 2 , 1
Lcd "Speicher Nr.:" ; Kb ; " "


Gosub E_rfids 'Lesen aller EEPRom-Werte

Wait 1

Rfid_s = " " 'aktuellen String leeren
Return

'------------------------------------------------------------------------Key_del
Key_del:
Cls
Locate 1 , 1
Lcd "Speicherplatz "
Locate 2 , 1
Lcd "angeben (1-8)= "

Waitms 250

While _key_scan > 0 'Keine Teste mehr gedrückt? Sonst warten!
NOP
Wend
'--------------------------------------

Waitms 10
While _key_scan = 0 'Warten bis eine Taste gedrückt wurde
NOP
Wend

Kbn = Kb 'Keyboardwert sichern

Locate 2 , 1
Lcd "angeben (1-8)= " ; Kbn

Waitms 500

Select Case Kbn
Case "1" : Rfid_s = Rfid_s1
Case "2" : Rfid_s = Rfid_s2
Case "3" : Rfid_s = Rfid_s3
Case "4" : Rfid_s = Rfid_s4
Case "5" : Rfid_s = Rfid_s5
Case "6" : Rfid_s = Rfid_s6
Case "7" : Rfid_s = Rfid_s7
Case "8" : Rfid_s = Rfid_s8
End Select


Locate 1 , 1
Lcd "RFID-Key Nr. " ; Kbn ; " :"
Locate 2 , 1
Lcd Rfid_s ; " "

Wait 3

Locate 1 , 1
Lcd "Key " ; Kbn ; " loeschen?"
Locate 2 , 1
Lcd "9= JA 0= NEIN"

While _key_scan = 0 'Warten bis eine Taste gedrückt wurde
NOP
Wend

Waitms 50

If Kb = "9" Then
Locate 2 , 1
Lcd "9= JA "

Select Case Kbn 'Speicherplatz auswählen und leeren
Case "1" : Rfid_s1 = " "
Case "2" : Rfid_s2 = " "
Case "3" : Rfid_s3 = " "
Case "4" : Rfid_s4 = " "
Case "5" : Rfid_s5 = " "
Case "6" : Rfid_s6 = " "
Case "7" : Rfid_s7 = " "
Case "8" : Rfid_s8 = " "
End Select

Gosub Ee_rfids 'RFID-Tags im EEPRom aktualisieren

Gosub Beep_ok

Gosub E_rfids 'RFID-Tags neu auslesen

Locate 1 , 1
Lcd "Speicherplatz " ; Kbn ; " "
Locate 2 , 1
Lcd "wieder frei ! "

Else

Gosub Beep_fail

Locate 1 , 1
Lcd "Vorgang wurde "
Locate 2 , 1
Lcd "abgebrochen ! "
End If

Wait 1

Rfid_s = " " 'aktuellen String leeren
Return


'------------------------------------------------------------------------Anzeige
Anzeige:
'Ausgabe der gespeicherten Keys via Print
Print "RFID 1 = " ; Rfid_s1
Print "RFID 2 = " ; Rfid_s2
Print "RFID 3 = " ; Rfid_s3
Print "RFID 4 = " ; Rfid_s4
Print "RFID 5 = " ; Rfid_s5
Print "RFID 6 = " ; Rfid_s6
Print "RFID 7 = " ; Rfid_s7
Print "RFID 8 = " ; Rfid_s8

Return


'--------------------------------------------------------------------------Pause
Pause:

If Pz1 < 59 Then '8 Minuten Daueröffnung
Toeff = Ein
Incr Pz1
Else
If Pz2 < 7 Then
Incr Pz2
Pz1 = 0
Else
Toeff = Aus
Pz1 = 0
Pz2 = 0
Kurzzeit_flag = 0
End If
End If


If Pz2 = 7 Then 'Warnungen vor Ablauf der Zeit
If Pz1 = 1 Then
Gosub Beep_fail
Elseif Pz1 = 30 Then
Gosub Beep_fail
Elseif Pz1 = 50 Then
Gosub Beep_ok
Else
End If
Else
End If

Locate 2 , 1
Lcd "Sek.:" ; Pz1 ; " Min.:" ; Pz2 ; " " 'Ausgabe des Timers

Wait 1
Return


'-----------------------------------------------------------------------INT1-Sub
Kurzzeit:

Toggle Kurzzeit_flag 'Kurzzeit umschalten

If Kurzzeit_flag = 1 Then 'Daueröffnung beginnt
Toeff = Ein
Locate 1 , 1
Lcd "Kurzzeitfunktion"
Gosub Beep_fail
Else 'Tür wieder verschließen
Toeff = Aus
Pz1 = 0
Pz2 = 0
Gosub Beep_ok
End If

Waitms 500

Return


'--------------------------------------------------------------------Matrix_Scan
Matrix_scan:

!rcall _key_code 'externe Routine aufrufen
If _key_scan > 0 Then
Kb = Lookupstr(_key_scan , Matrix_wert) 'Wert vom Key_scan der Tastatur anpassen
Else
End If

Return


'----------------------------------------------------------------------Beeper-OK
Beep_ok:

Sound Beeper , 50000 , 15 'langer Signalton

Return

'--------------------------------------------------------------------Beeper-Fail
Beep_fail:

Sound Beeper , 10000 , 5 'kurzer Signalton
Waitms 100
Sound Beeper , 10000 , 5
Waitms 100
Sound Beeper , 10000 , 5

Return

'------------------------------------------------------------------------E_RFIDs
'RFID-Keys aus dem EEProm lesen
E_rfids:
Rfid_s1 = E_rfid_s1 'Werte aus dem EEPRom lesen
Rfid_s2 = E_rfid_s2
Rfid_s3 = E_rfid_s3
Rfid_s4 = E_rfid_s4
Rfid_s5 = E_rfid_s5
Rfid_s6 = E_rfid_s6
Rfid_s7 = E_rfid_s7
Rfid_s8 = E_rfid_s8
Return

'-----------------------------------------------------------------------EE_RFIDs
'RFID-Keys ins EEProm speichern
Ee_rfids:
E_rfid_s1 = Rfid_s1 'Werte ins EEPRom schreiben
E_rfid_s2 = Rfid_s2
E_rfid_s3 = Rfid_s3
E_rfid_s4 = Rfid_s4
E_rfid_s5 = Rfid_s5
E_rfid_s6 = Rfid_s6
E_rfid_s7 = Rfid_s7
E_rfid_s8 = Rfid_s8
Return


End

' ------------------------------------------------------------------Data-Tabelle
Matrix_wert:
Data "Z" , "7" , "8" , "9" , "A" , "4" , "5" , "6" , "B" , "1" , "2" , "3" , "C" , "F" , "0" , "E" , "D"
Return



Das war es dann erst einmal, zu meiner letzten fertigen "Arbeit". ;)


Schöne Grüße,
Cassio
 
Hallo !

Ich bin in der Zwischenzeit natürlich nicht untätig gewesen und habe an meinen RFID-Öffnern weiter gearbeitet. :)

Die erste Variante (Indoor-Variante, oder auch System-I genannt ;) ) habe ich ja oben schon beschrieben.

Was mir nun noch fehlte waren die Outdoor-Varianten.....
Dafür habe ich zwei verschiedene Einheiten entworfen:
System-A1 = Controller- und Steuereinheit mit externem RFID-Scanner für Gleichstromöffner.
System-A2 = Controller- und Steuereinheit mit externem RFID-Scanner zur Integration in Sprechanlagen.


Auch wenn es nicht der Reihenfolge entspricht, habe ich nun schon mal das System A2 fertig gestellt. ;)
Wie eben schon geschrieben, handelt es sich beim System-A2 um eine Variante die zur Erweiterung von Sprechanlagen gedacht ist.

Was ist das "Besondere" am System-A2 ? :hmmmm:
-Schaltregler anstatt Spannungsregler
-Relaisausgang anstatt Transistor
-Anschlüsse für zweiten RFID-Scanner (um neue Key`s vor Ort einlesen zu können)
-keine Kurzzeitfunktion
-kein Signalgeber
-keine Tür-Geschlossen Überwachung
-keine Verschlussüberwachung
-manipulationssicher (separate Steuereinheit, kein Potential kann zum Türöffner gebrückt werden)

Da sich hier im Haus eine Siedle-Sprechanlage befindet, liefert diese auch die Spannungsversorgung für den RFID-Öffner.
Da der Trafo aber fast 16V AC liefert.... was eine Gleichspannung von gut 22,5V bedeutet :eek: ..... habe ich diesmal einen LM2574N5 Schaltregler verwendet.
Der Vorteil dieses Schaltreglers gegenüber einem normalen 7805 Spannugsregler ist, dass dieser die Differenz nicht "verbrennt".... also in Wärme umsetzt.

Bei einer Eingangsspannug von 22,5V und einer Ausgangsspannung von 5V würde der 7805 bei 100mA Betriebsstrom satte 1,75W Leistung regelrecht verbrennen (in Wärme wandeln). :eek:
Das der Regler dabei ziemlich heiß werden würde und einen großen Kühlkörper benötigt, kann sich wohl jeder denken.

Der LM2574N5 ist zwar um einiges teurer und benötigt dazu noch eine Shottky-Diode und eine Spule, arbeitet aber völlig anders.
Er "schneidet" die Eingangsspannung so zurecht, dass nur 5V am Ausgang übrig bleiben...... ähnlich wie ein gewöhnlicher Dimmer mit Phasenabschnitt.

Der Vorteil liegt nun klar auf der Hand..... es wird fast keine Leistung verbrannt und der Schaltregler wird auch bei größeren Lasten nicht wirklich warm. :)


Da der vorhandene Türöffner in der Haustür mit Wechselstrom betrieben wird....
(Besucher müssen scheinbar immer das Rattern des Öffners hören, sonst verstehen die das nicht ;) ), habe ich zur Ansteuerung einfach ein kleines Relais verwendet.


Der Kurzzeittimer, der die Tür einige Minuten offen hält bzw. den Türöffner einige Minuten mit Strom versorgt entfällt bei diesem System, weil dies bei einem Wechselstromöffner nur noch nerven würde. ;)


Im Gegensatz zum System-I verfügt diese Einheit auch nicht über einen Piezo-Signalgeber, weil jeder durch das Rattern des Wechselstromöffners den Hinweis zur Türöffnung automatisch erhält. ;)

Das waren auch schon die Unterschiede zwischen System-A2 und System-I!


Der Programmcode musste von mir auch nur geringfügig modifiziert werden....
So wurden die Subroutinen für die Kurzzeitfunktion und die verschiedenen Signaltöne entfernt.
Das Service-Menü wurde ebenfalls etwas überarbeitet.....
Weil der Signalgeber nun nicht mehr vorhanden war, werden nun alle OK- und Fehler-Meldungen am Display ausgegeben.

Das war es dann auch schon.....
Aus dem Grunde werde ich den Code nun nicht noch einmal hier einstellen.
Außerdem habe ich mit dem oben gezeigten Programmcode ja schon nicht mehr gearbeitet. :rolleyes:


Dafür habe ich aber noch ein paar Bilder vom System-A2 zu bieten. :)


Hier mal ein Bild von der frisch geäzten Platine....
a_DSCF0940.jpg


...fertig gebohrt und mit Bestückungsaufdruck.....
a_DSCF0945.jpg


....fertig bestückte Steuereinheit (ohne AVR) und separater RFID-Scanner ID-12.....
a_DSCF0947.jpg


...die Platine wurde natürlich so erstellt, dass sie in ein entsprechendes Gehäuse passt.....
a_DSCF0949.jpg


.....später kommt dann der Deckel drauf und die Steuereinheit wird sicher im Verteilerkasten auf der Hut-Schiene montiert.
a_DSCF0950.jpg



Wie die Einheit im Testbetrieb aussieht folgt dann gleich noch...... ;)


Grüße,
Cassio
 
Hallo !

So, nun folgen noch die restlichen Bilder.....


Hier mal das System A2 in Betrieb mit meiner I2C-Serviceeinheit.... die leider immer noch kein Gehäuse hat. :rolleyes:
a_DSCF0952.jpg


Dies ist wieder der normale "Betriebszustand".....
a_DSCF0955.jpg


und hier folgt der Hinweis auf das leicht geänderte Menüsystem des A2.....
a_DSCF0956.jpg



Den neuen Schaltplan und das Programmblockbild muss ich noch fertig stellen....
wird aber die Tage nachgereicht. :)


Soweit erst mal zu meinem RFID-Öffner System A2.

Grüße,
Cassio
 
Hallo !

Wie versprochen, folgen nun noch die Pläne zum System A2. :)


Einmal das Blockbild zum Programmablauf:
RFID-Block-A2.gif


Nun noch der Anschlussplan:
RFID-Plan-A2.gif


und zu guter Letzt noch die geplante Platine:
RFID-Oeffner-A2-Platine.gif


Damit hätten wir nun wohl wieder alles vollständig. :)


Schöne Grüße,
Cassio
 
Hi Cassio,

mal nen Korrekturvorschlag ...
oben beim Relais steht PB1 dran und unten beim Mega8 steht der
Türöffner am PD4 ... kleiner Fehler im Plan ?

Gruß
Dino
 
Hi Dino!

Wieso, wo denn? :hmmmm: .............. :D


Danke, für den Hinweis!
Habe es gleich mal geändert. PinD.4 war der Richtige. ;)

Das kommt davon, wenn man fertige Pläne nur noch etwas umzeichnen muss. :rolleyes:


Danke und Gruß,
Cassio
 
  • Like
Reaktionen: LotadaC
Hallo,

schönes Projekt. Ich mach grad so etwas ähnliches für unsere Garagentorsteuerung. Da diese einen 28V Trafo hat muss ich einen Schaltregler verwenden. Was hast du für eine Spule und Diode für deinen Schaltregler verwendet? Ich wollte die "09P 330µ" von Reichelt bestellen, habe aber im Datenblatt etwas von einer speziellen Spule gelesen. Die Diode scheint nicht näher im Datenblatt erwähnt zu werden. Ist egal welche man dort verwendet?

Danke im Vorraus.

Mfg,
Flo
 
Hallo,

Ich wollte die "09P 330µ" von Reichelt bestellen, habe aber im Datenblatt etwas von einer speziellen Spule gelesen. Die Diode scheint nicht näher im Datenblatt erwähnt zu werden. Ist egal welche man dort verwendet?
bei Schaltreglern sollte man immer Schottky-Dioden einsetzen. Die Spulen sollten möglichst niederohmig sein. Such dir also eine Spule deren Sättigungsstrom größer wie dein Laststrom ist. Man kann für einen Schaltwandler nicht einfach irgendeine Spule verwenden. Aber ich muß mich da selber auch noch etwas reinarbeiten. Wenn man die falschen Bauteile benutzt bekommt man auf jeden Fall keine Leistung raus sondern es bricht einem eher die Ausgangsspannung zusammen. Also das Datenblatt des ICs lesen was sich der Hersteller so alles gedacht hat.

Gruß
Dino
 
.....Ich wollte die "09P 330µ" von Reichelt bestellen....


Hallo Flo!

Jepp, die "09P 330µ"-Spule habe ich bis jetzt auch immer verwendet und es gab in Betrieb keine Probleme. :wink:

Die Diode ist eine Shottky-Diode.... entweder eine 1N5819 oder eine BAT85 !


Schöne Grüße und weiterhin gutes Gelingen,
Cassio

EDIT:
Hier mal Bilder vom Scope mit einem 3,3V Schaltregler.....

Vor der Spule: LM2574N33_2.gif

Hinter der Spule: LM2574N33_4.gif
 
Mir fällt grad ein Stein vom Herzen, da ich sonst das halbe Layout hätte neumachen müssen. Danke für die Bilder, die Spule scheint ja ihren Dienst ganz vorzüglich zu run :) . Wenn der Schaltregler funktioniert dann bin ich echt froh. Ich habe schon versucht alles was er stören könnte aus dem Layout zu verbannen. Wenn das ganze fertig ist stelle ich das Projekt dann noch mit schönen Bildern in einem Extrathrerad vor.

Mfg,
Flo
 
Hallo Cassio,
kannst Du vielleicht die eagle Datei zur Platine einstelle?
Oder hast Du e.V. noch ein fertiges Muster?

Liebe Grüße
Siggi
 
Hallo Adelinde!

Welche Platine meinst du eigentlich? :hmmmm:
Die vom System-I, oder die vom System-A2?

Allerdings sind beide Platinenlayouts ja schon in den Beiträgen mit drin. ;)

Ach so....
Eagle-Dateien kann ich dir keine geben, weil ich mit dem Programm einfach nicht arbeite!
Du kannst aber gerne welche zeichnen und hier dann mit einstellen. :D

Grüße,
Cassio
 
Hallo Adelinde!

Welche Platine meinst du eigentlich? :hmmmm:
Die vom System-I, oder die vom System-A2?

Dile von A2 würdem ich interresieren, falls Du rein zufällig 2 davon gemacht hast. :)

Ach so....
Eagle-Dateien kann ich dir keine geben, weil ich mit dem Programm einfach nicht arbeite!
Du kannst aber gerne welche zeichnen und hier dann mit einstellen. :D


Mit was zeichnest Du die Platinenl, die sehen echt gut aus?
gruß Siggi
 
Hallo Siggi!

Nein, ich habe nur eine Platine erstellt, weil ich diese auch nur einmal benötige.
Mir geht das "Rasseln" des Wechselstrom-Türöffners so schon auf den Nerv.....
Da lobe ich mir doch die anderen Türen mit Gleichstrom-Codeöffner. ;)


Ich zeichne meine Platinen mit SprintLayout von Abacom
Schau auch mal bei Reichelt.... da bekommst du die Software günstiger, als bei Abacom direkt.
Habe mich darüber auch schon mächtig geärgert!
Da nützt es auch nichts, wenn die Gutscheine wegen einer neuen Version per Email versenden! Bei Reichelt ist es dann immer noch günstiger!
Irgendwie kommt man sich da als langer "Kunde" und Anwender ein wenig verkaspert vor!


EAGLE ist mir einfach zu "groß" und zu unübersichtlich!
Außerdem kann/darf man mit der freien Version nur solche Miniplatinen von 80x100 erstellen. :(

Grüße,
Cassio
 
...Außerdem kann/darf man mit der freien Version nur solche Miniplatinen von 80x100 erstellen. :(
...
nicht ganz, Du darfst lediglich außerhalb dieser Grenzen (sind natürlich in Wirklichkeit irgendwelche krummen Werte altertümlicher Maßeinheiten;)) keine Bauteile platzieren. Leiterbahnen verlegen, Vias und so platzieren geht...
(zumindest bis Version 5.x)
 
Du darfst lediglich außerhalb dieser Grenzen....
....keine Bauteile platzieren. Leiterbahnen verlegen


Hallo!

Wenn ich mir die Lizenz durchlese kommt das Gleiche bei raus.
Größer als 80x100 darf ich als Bastler nicht erstellen....
Außerdem darf ich keine Platine die damit Layoutet wurde verkaufen und und und....

Was soll ich mich mit Spitzfindigkeiten bei den Lizenzen rumärgern.
Wenn mir dir Auflagen nicht gefallen, nehme ich etwas anders! :cool:

Mit SprintLayout arbeite ICH nun schon einige Jahre und bin damit eigentlich sehr zufrieden!

So, nun aber genug :offtopic: sonst greift der Moderator ein! ;)

Grüße,
Cassio
 
Status
Für weitere Antworten geschlossen.

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)