History:
11-03-2011 - SMD-Transponder
10.03.2011 - Manchestercode
06.03.2011 - Assemblersource
23.02.2011 - erste Gesamtfasssung
RFID mit einem mobilen
Reader und einer potenziellen Anzeige auf LCD stehen im Mittelpunkt dieses
Projekts.
Die Arbeitsfrequenz ist 125 kHz und der verwendete RFID-Chip ist der
U2270B.
Ein Alternativchip ist der EM4095.
Und weil man an Assembler für einen kompakten Code trotzdem nicht vorbei
kommt,
ist der experimentelle Teil in Assembler programmiert. Pate dafür stand
ein Artikel in ELEKTOR (Heft 6-2010-Seite 24ff).
Dieser Artikel in ELEKTOR zeigt ferner, wie man eigene Transponder bauen und
programmieren kann.
Radio - Frequency - IDentification lautet die Antwort. Dabei wird nicht die Frequenz identifiziert, denn dafür wäre ein Frequenzscanner besser geeignet, sondern die Information, die meist indirekt von einem sogenannten Transponder passiv auf das Lesegerät übertragen wird. Natürlich gibt es auch aktive RFID-Systeme wie z. B. Schlüsselfinder. Von denen ist hier aber nicht die Rede.
Zur Darstellung der Funktion mögen die beiden folgenden Abbildungen zusammen mit dem erklärenden Text dienen.
Abb. 1: Grundsätzliche Situation beim Auslesen der Information eines
RFID-Transponders (transponder = Übertrager)
Beginnen wir bei der mittleren Einheit der Abbildung 1, dem RFID-Reader. Im wirklichen Leben ist das ein IC, welches im Wesentlichen aus einem Oszillator und einem Demodulator besteht. Der Oszillator (=Schwingungserzeuger) produziert eine Wechselspannung von 125 kHz und gibt diese an eine angeschlossene (Luft-)spule ab. Luftspule heißt, dass diese Spule keinen Eisen- oder Ferritkern besitzt. Zur Herstellung wird Kupferlackdraht von 0,2mm bis 0,4mm um einen Zylinder zu einer Spule mit ca. 160 Windungen gewickelt. Die Anordnung stellt bislang einen Langwellensender dar, der eine Leistung von ein paar Milliwatt abstrahlt.
Rechts in der Abb. 1 ist der Transponder dargestellt. Das kann eine Karte, ein Schlüsselanhänger, eine Parkhausmarke oder ein ähnliches Teil sein, welches neben einer Spule (aus sehr dünnem Draht) einen Mikrocontrollerchip enthält. Die Spule hat drei Aufgaben:
a) Sie nimmt die abgestrahlte Energie der Senderspule am Lesegerät (Reader) auf und versorgt nach Gleichrichtung der Spannung den Chip im Transponder mit Energie.
b) Damit der Transponderchip arbeiten kann, benötigt er eine Taktfrequenz wie jeder Prozessor. Diese Taktfrequenz ist gleich der Sendefrequenz des RFID-Reader-Chips, welche über die elektromagnetische Welle übertragen wird.
c) Die Spule im Transponder dient als Modulator zur Übertragung der im Transponder gespeicherten Information auf indirektem Weg. Das bedeutet, dass der Transponder im Normalfall kein Sender sondern wirklich nur Empfänger ist. Trotzdem kann auf diesem Weg Information an das sendende Gerät übertragen werden. Der Weg dazu ist folgender.
Abb. 2: Der Schalter im Transponder ist geschlossen
Im Transponder ist ein 5-stelliger Hexadezimalwert fest eingespeichert. Bei passiven RFID-Transpondern wird dieser Wert bei der Herstellung eingestellt und ist weltweit einzigartig. Bei Aktivierung durch empfangene elektromagnetische Wellen wird dieser Code durch Öffnen und Schließen des "Schalters" übertragen. Das Prinzip dazu verdeutlichen die beiden folgenden Abbildungen Abb. 3 und Abb. 4.
Abb. 3: Trafo ohne sekundäre Belastung | Abb. 4: Belasteter Transformator |
Beim Transformator wird Energie über das magnetische Feld im Eisenkern übertragen. Wird die Sekundärseite (rechte Hälfte in Abb. 3) nicht belastet, dann ist auch die Stromstärke auf der Primärseite (linke Hälfte in Abb. 3) gering. Schließt man aber auf der von der Primärseite elektrisch isolierten Sekundärseite einen "Verbraucher" an, dann steigt dort aber auch auf der Primärseite die Stromstärke (Abb. 4). Das ist völlig normal, denn die Glühlampe kann nur dann leuchten, wenn mehr Energie zur Verfügung steht. Das bedeutet aber, dass bei gleicher Spannung die Stromstärke im Primärkreis steigen muss oder dass, bei begrenzter Sendeleistung, bei Belastung die Spannung im Primärkreis geringer wird. Der an der Sendespule des RFID-Readers angeschlossene Demodulator registriert genau diesen Zustand - fließt in der Sendespule mehr Strom, weil der Empfänger kurz geschlossen ist, sinkt die Spannung an der Sendespule. Bei RFID fehlt nur zwar der Eisenkern, dennoch wird die Energie über Spulen übrtragen und via Belastung Information vom passiven Empfänger auf das Sendersystem rückgekoppelt.
Am Ausgang des Demodulators des RFID-Reader-Chips liegt nur leider noch nicht das fertige, vom PC auswertbare Signal von 40 Bit = 5 Byte an. Zum Einen ist das Übrtragungsprotokoll des RFID-Chips daran schuld zum Anderen die Codierung der übertragenen Bits. Tatsächlich werden nicht nur 40 Bits übertragen sondern 64, des Weiteren werden die übertragenen Bits im sog. Manchestercode an den Mikrocontroller gesendet, welcher an den RFID-Chip angeschlossen ist (siehe Abb. 3/4). Dem Mikrcontroller obliegt daher die Aufgabe, diesen Code, welcher gleichzeitig Daten- und Taktsignal quasi auf einer Leitung übertragen kann, zu entschlüsseln und über ein Standardinterface (USB, RS232) an einen PC weiterzuleiten. (Die gleiche Codierungsart wird bei IR-Fernsteuerungen verwendet!)
Zum Aufbau des RFID-Bords habe ich mich für den Chip U2270B entschieden, den man z.B. von der Firma Pollin beziehen kann. Mit dem Link landest du direkt bei dem Chip auf der Pollin-Site. Die Entscheidung lag in der Luft, da die Besorgung des Alternativchips EM4095 Probleme bereitete. Außerdem hatte ich über den RFID-Bausatz von Pollin (BstNr: 810059) bereits erste Erfahrungen gesammelt. Der Bausätze (ich habe drei davon in Verwendung) hatten auf Anhieb funktioniert, nachdem ich erkannt hatte, dass ein Verdrillen der Spulenanschlüsse von der Spule bis zum Anschluss an der Platine die Funktion der Schaltung sehr sicher machten. Zuvor (ohne Verdrillung) erschienen merkwürdige Zufallszeichen in der Anzeige des angeschlossenen LCD, sobald man der Lesespule einen Transponder näherte. Daran änderte auch ein Neucompilieren des Quellcodes nichts, den man von der Pollin-Site herunterladen kann. In der Folgezeit stellte sich durch das Studium diverser Foreninhalte heraus, dass der U2270B wohl dieselben Signale ausgibt wie der EM4095. Beide Chips sollten also von der Funktion, nicht aber von der Pinbelegung her identisch sein. Diese Aussage soll noch näher untersucht werden. Ergebnisse irgendwann an dieser Stelle.
Am Pollinbausatz gefiehl mir allerdings die Größe nicht, das Ding war nach Einbau in ein Gehäuse einfach zu groß. Ferner wollte ich mir die Möglichkeit zum Experimentieren offen halten und daher musste der RFID-Teil der Schaltung austauschbar gehalten werden. Daraus entstand die hier dargestellte kleine Platine, die SMD-bestückt ist. Die Teiledichte ist jedoch so gering gehalten, dass ein einigermaßen geübter Bastler beim Löten keine Probleme haben sollte. Die Schaltung ist an der Applikation 1 des Datenblatts zum U2270B orientiert.
Abb. 5: Layout | Abb. 6: Bestückung |
Das Layout ist so eingerichtet, dass es nach dem Ausdruck mit der Druckschicht direkt auf die Platine mittels Bügeln oder Fototransfer übertragenwerden kann. Für den Ausdruck als Vorlage zur Platinenherstellung gibt es eine PDF-Datei zum Download. Die Bestückung wird, weil SMD-Technik, von der Kupferseite her dargestellt und erscheint daher gegen das Layout gespiegelt. Pin 1 des U2270B ist links oben, an der Kerbe halt. Den 220µF Kondensator gleich neben der Kerbe des ICs habe ich dank Überfluss an 100nF-Kondensatoren in Parallelschaltung ausgeführt, deshalb die drei nebeneinander liegenden Lötpads. Ähnlich verhält es sich mit dem 1n2 Kondensator, der aus einem 1n0 und einem 220p zusammengesetzt ist. Wenn man direkt passende Werte hat, muss man natürlich nicht zusammensetzen und kann die restlichen Pads frei lassen. Der 68 Ohm Widerstand rechts unten im Bestückungsplan kann man in der Regel weglassen. Der Spulenanschluss ist dann über eine Leiterbahnbrücke mit dem 1n0 Kondensator verbunden. Allerdings kann der Wert des Widerstands Einfluss auf die Reichweite des Geräts haben. Auch das soll in weiteren Versuchen noch näher untersucht werden. Bei der von mir verwendeten Spule liegt ohne den Widerstand eine Spannung von ca. 80 Vss an. Dieser Wert wird zumindest von meinem Oscilloskop angezeigt. Die Reichweite der zuletzt hergestellten Geräte liegt dann bei ca. 3- 5 cm. Das sollte für Anwendungen in der Schule genügen.
Damit sind wir auch schon bei der Spule angelangt. ich stellte die Spulen, welche eine Induktivität von 1,62mH haben sollen mit Kupferlackdraht von 0,3mm Durchmesser her, indem ich den Draht um einen speziell gefertigten KS-Zylinder von 4,2 cm Durchmesser gewickelt habe - 155 Windungen auf eine Breite von 4,0 mm. Danach wurde die Wicklung an ein paar Stellen abgebunden, um den Draht besammen zu halten, die Breite der Spule beeinflusst auch die Induktivität. Durch wechselweises Messen und partielles Abwickeln wurde schließlich die geforderte Induktivität von 1,62 mH eingestellt. Danach wurde die Wicklung in Abständen von ca. 5mm mit einem gewachsten Faden abgebunden. Wichtig ist das lockere Verdrillen der ca. 10cm langen Spulenanschlüsse. Das verhindert die Abstrahlung auf dem Weg von der Platine zur Spule. Ohne diese Verdrillung spielten meine fertigen Reader stets verrückt indem auf dem Display alle möglichen unsinnigen Hieroglyphen dargestellt wurden. Zur Berechnung der Spulendaten kann man auf der Site http://www.dl5swb.de/html/mini_ringkern-rechner.htm das Freeware-Programm "Miniringkernrechner" herunterladen. Die damit berechneten Luftspulen gehen allerdings von nur einer Drahtlage aus. Daher wird der Drahtdurchmesser sher, sehr dünn ausgewiesen und die berechnete Windungszahl weicht auch von der realen mehrlagigen Spule ab, weil auch der Durchmesser der Spule einen Einfluß auf die Induktivität hat. Um ein nachträgliches Abgleichen durch Messen kommt man also kaum herum.
Die genauen Daten zum U2270B kann man dem umfangreichen Datenblatt von TEMIC entnehmen. Dort findet sich auch die Außenbeschaltung des Chips.
Abb. 7: Pinbelegung des U2270B (Quelle: Datenblatt)
Abb. 8: Schaltung der Platine (Quelle: Datenblatt)
Über die Leitung CFE kann der Mikrocontroller den Treiber der Antannenspule des U2270B ein- und ausschalten. Die Spulenausgänge arbeiten dann laut Datenblatt im Gegentakt, weil MS Highpegen führt. Das manchestercodierte Signal steht an Out des U2270B zur Verfügung. Der etwas unübliche Widerstand von 110kOhm an RF stellt über eine interne Konstantstromquelle die Frequenz von 125 kHz ein. Wegen daraus folgender Frequenzabweichungen ist weder ein 100kOhm noch ein 120kOhm Widerstand brauchbar.
Weitergehende Information zur Funktion der einzelnen Pins entnehme man dem Datenblatt.
3. Ein RFID-Board mit dem EM4095 - Manchestercode und ein SMD-Transponder
Das hier vorgestellte Miniplatinchen ist vor kurzem noch als Alternative zum U2270B aus der Schaltung entstanden, die auf dem Datenblatt zum EM4095 zu finden ist.
Abb. 9: Schaltung der Readereinheit mit EM4095
Mit dem, für diese Schaltung aus dem C-Quelltext von Martin Oßmann aus ELEKTOR Heft 6/2010 umgeschriebenen Assemblerprogramm (Quelltext oder Hexfile), erreicht man von vornherein einen maximalen Leseabstand von ca. 7,5 cm. Mit diesem Quelltext steht ein Assemblercode zum Auslesen von 125 kHz-Transpondern zur Verfügung, den man leicht auch an andere Anwendungen anpassen kann.
Beeindruckend ist der Ruhestrom des EM4095-Chips. Wenn SHD auf 1 liegt (Standby), fließt weniger als 1µA Strom. Mein DVM konnte im 200mA-Bereich keinen Ruhestrom nachweisen! Dachte schon, der Chip ist hinüber, aber nein - legt man SHD auf 0, dann sausen kräftige 45 mA! Die Assemblerfassung hat gegenüber der Original C-Fassung den Vorteil, dass nur 37% statt 67% des Flashspeichers des ATTiny 2313 benutzt werden. Auch beim SRAM sinkt die Nutzung von 72% auf 61%. Das schafft Platz für eigene Erweiterungen, z. B. für ein LCD. Das ist auch von Seiten der nötigen Anschlüsse machbar, denn wenn die ganze Kiste erst mal fehlerfrei läuft, kann man die Test- und Prüfleitungen frei machen und umwidmen. Dann kann man auch noch einen Taster spendieren, der, z. B. beim Start die Umschaltung der Frequenz am Pin 9 erlaubt und somit das Programmieren eines ATTiny 13 als Transponder an der in genanntem ELEKTOR-Heft vorgestellten Schaltung erleichert. Inzwischen ist eine neue Miniplatine entstanden, welche den Schaltkreis für den Transponder in SMD-Bauweise enthält. Dieses Platinchen beinhaltet ein ganz normales SPI und eine externe Spannungsversorgung, sodass der darauf gelötete ATTiny13 SO auch ohne Sockelwechsel direkt programmiert werden kann.
Bei mir existieren zwei Layoutvarianten für den RFID-Reader mit dem EM4095 von denen beide mit der AVR-Platine aus Kapitel 4. Platinen bestücken, löten und testen in der Funktion geprüft wurden. Schaltung und Programm aus dem ELEKTOR-Artikel wurden dazu etwas abgewandelt und den Bedürfnissen angepasst sowie von unnötigem Ballast befreit. Das Layout des 16 mm x 23 mm großen Readerplatinchens kann man auch als PDF-Datei herunterladen. Die zweite Variante des Readerplatinchens ist schaltungstechnisch identisch mit Abb. 9 aber noch etwas kleiner (16 mm x 20 mm) und zum Anschluss an die unten beschriebene Hauptplatine mit dem ATTiny2313 vorgesehen. Tests wurden auch mit diesen Konstellationen durchgeführt. Dabei zeigte sich, dass sowohl die U2270B-Platine wie auch die beiden EM4095-Platinen prächtig mit dem Tiny 2313 in Verbindung mit dem Assemblerprogramm zusammenarbeiteten. Die für den U2270B entwickelte und mit Bascom programmierte Hauptplatine versagte jedoch den Dienst im Zusammenhang mit dem EM4095.
Abb. 10: EM4095-Platine - druckfertiges Layout (gespiegelt) | Abb. 11: EM4095-Platine - Bestückung (Sicht auf Cu-Seite) |
Das Layout ist auch als PDF-Datei zum Download erhältlich und wie die anderen Layouts nach dem direkten Ausdruck fertig für den Transfer. Diese Version kann direkt an die Hauptplatine aus dem ELEKTOR-Artikel angesteckt werden. Die 6-polige Steckerleiste der zweiten Variante hat die gleiche Pinbelegung wie die U2270B-Platine. Beim Programmieren muss man lediglich beachten, dass der Eingang SHD lowaktiv ist. Der gleiche Pin (CFE) der U2270B-Platine ist highaktiv.
Die Spule mit 725 µH hat wie die U2270B-Spule 42 mm Durchmesser. Sie wurde mit 95 Windungen Cu-Lackdraht von 0,3mm Durchmesser gewickelt und danach mit ca. 1cm Abstand abgebunden.
Aktuelle Bezugsquelle (März 2011) für den EM4095: http://www.rfid-dealer.de/Produkte.html
Die folgenden Oszillogramme aus dem Versuchsaufbau zeigen das Zusammenspiel der verschiedenen Testsignale und auch ein Stück Manchestercode von einer Transponderkarte mit Decodierung. Das Oszilloskop ist ein UT2202CE.
Abb. 12: IRQ-Signal von TCNT0-OVL |
In Abb. 12 stellt Kanal 1 das 500 kHz-Signal dar, wie
es am Pin 9(PD.5=OC0B) zur Verfügung steht. Kanal 2 ist an Pin 8 (PD.4)
angeschlossen. Die Rechtecke von ca. 3 µs Dauer werden durch das Ein-
und Ausschalten des Pins am Beginn und Ende der Interrupt-Service-Routine
(ISR) des Timer/Counter 0 Überlaufs ausgelöst. Der IRQ funktioniert
also und ist nur wenig belastet, wie die lange Pause zwischen den Signalen
zeigt. |
Abb. 13: Synchronisationsphase |
Hier sieht man die Synchronisationsphase. Das obere Signal
stammt vom Pin 13 (PB.1), welches lowaktiv ist und bei Eintritt und Verlassen
der Routine "empfangen" erzeugt wird. Das ist der Teil des Programms,
welcher nach einer gültigen Präambel (9 Einsen in Folge) sucht
und dann das Abholen der Daten veranlasst.. Kanal 2 gibt das Signal wieder,
welches auf ähnliche Weise in der Unterprocedur "holedaten"
erzeugt wird. Nach einer kurzen Eingewöhnungsphase laufen die beiden
Signale synchron. |
Abb 14: Manchestercode |
Dieses Oszillogramm bietet ein Stück Manchestercode. Wir wollen annehmen, dass es am linken Bildrand beginnt. Allerdings gilt es zu beachten, dass die Gitterlinien NICHT! die Bitlängen darstellen und daher etwas verwirren. Deshalb wurde diese Folge nachgezeichnet (Abb. 15). Zum Decodieren werden zuerst die Bitgrenzen gezeichnet. Dabei ist zu beachten, dass in jedem Bit ein Pegelwechsel stattfinden MUSS! Also muss in der Mitte der breiten Impulse oder Pausen stets eine Bitgrenze liegen, denn in jedem Bit müssen die Halbbits unterschiedlichen Pegel haben. Sollte das an irgend einer Stelle nicht funktionieren, liegt ein Übertragungsfehler vor. Das Programm filtert solche Fälle in der Routine "holebit" aus, indem es den Fehlercode 2 zurückgibt. Meist ist das am Beginn einer Übertragung der Fall (siehe Abb. 13). Ein Bit dauert etwas länger als 500µs. Die Baudrate beträgt genau 125000 kHz : 64 = 1,953 kBaud, weil ein Bit 64 Perioden des Taktsignals und somit 512 µs lang ist. Der Rest ist simpel, einem Wechsel von 0 nach 1 in der Mitte eines Bitintervalls
wird die "0" zugeordnet, dem umgekehrten Wechsel eine "1".
Durch strikte Anwendung ergibt sich die Bitfolge der Abb. 15. |
Abb. 15: Manchestercode decodieren ganz einfach |
Zur Qualitätssicherung der Übertragung werden nun nicht alle Bit in einem Stück übertragen sondern in 4-er-Gruppen eingeteilt und sowohl jeder Gruppe einzeln ein Paritätsbit sowie allen Bits aller 4-er-Gruppen ein Paritätsbyte zugewiesen. Dieses Protokoll stellt sicher, dass die übertragenen 5 Bytes fehlerfrei sind, falls zum Schluss die Paritätsprüfung im Empfänger eine 0 liefert,
Der folgende Schnappschuss hat eine Sequenz festgehalten, die ein eigens dafür programmierter ATTiny2313 quasi als Transponder "gesendet" hat. Dazu wurde wieder eines der Progrämmchen von Martin Oßmann aus dem zitierten ELEKTOR-Artikel angepasst. Das Oszillogramm bestätigt zum einen die oben berechneten Werte durch Messung (1953,30 Hz) und zeigt auch sehr schön das Zusammenspiel zwischen Systemtakt (Kanal2, gelb, unten) und dem erzeugten Manchestercode.
Abb. 16: Startsequenz einer Bytefolge
Eine Streckung auf den halben Zeitfaktor und stückweises Festhalten der Teilbilder, die danach in Artweaver wieder zu einem Streifen zusammengesetzt wurden offenbart die Arbeitsweise des "Senderprogrämmchens".
Der Timer TCNT0 erzeugt über seinen Overflow-IRQ am Pin PB0 das gelbe Signal, indem beim Eintritt in die IRQ-Service-Routine PB0 auf 1 gesetzt wird und ein paar Sytemtakte später kurz vor dem Verlassen der ISR wieder auf 0. Weil die ISR zwischen dem Schalten der Ausgangsleitung höchstens 7 Sytemtakte in Anspruch nimmt, ergeben sich die schmalen Nadeln. Der Systemtakt wird durch die Fuse CKDIV8 von 8 MHZ auf 1 MHZ heruntergeteilt. Für den Timer TCNT0 erfolgt noch einmal eine Teilung durch 8. Damit wird TCNT0 genau so schnell oder besser langsam getaktet wie beim Empfang der 125 kHz-Schwingung vom RFID-Reader.
Nach 64 -1 = 63 Timertakten hat der Counter die eingestellte Obergrenze erreicht, es passiert ein Überlauf und damit wird die zugehörige ISR aufgerufen, um die Unterbrechungsanforderung (IRQ) zu bedienen. Der Counter wird automatisch auf 0 zurückgestellt und die Befehle in der ISR werden abgearbeitet. Auf deren Inhalt komme ich gleich zurück.
Der Timer bedient als zweiten Job so ganz nebenbei auch noch den PWM-Ausgang über die Output-Compare-Funktion. Immer dann, wenn TCNT0 einen Zählerstand von 32 erreicht hat, stimmt dieser Wert mit dem voreingestellten Vergleichswert im OCR0B-Register überein. Dieser Zustand löst ein Gleichstandsereignis aus, auf welches das Timermodul mit verschiedenen programmierten Zuständen antworten kann. Dem Vergleichsregister OCR0B ist ferner ein Anschluss (PD5=OCB0) am ATTiny2313 zugeordnet. Dessen Logikpegel wird durch eine entsprechende Voreinstellung des Timermoduls nun wie folgt beeinflusst:
Soll eine "0" als Manchestercodebit gesendet werden, dann wird mit eintretendem Vergleichsereignis der Anschluss OCB0 auf 1 gelegt und beim Erreichen des Höchstwerts 63 wieder auf 0.
Muss eine "1" gesendet werden, dann wird mit eintretendem Vergleichsereignis OCB0 auf 0 gelegt und beim Erreichen des Höchstwerts 63 wieder auf 1.
Die Mitte des Zeitraums zwischen der Auslösung zweier folgender IRQs fällt immer auf den Beginn eines Bitintervalls oder anders herum, IRQs liegen stets in der Mitte einer Bitdauer.
Welcher Schaltvorgang durchzuführen ist, weiß der Anschluss OCB0 erst dann, wenn die ISR des Timerüberlaufs, der ja auch bei 63 zeitgleich passiert, dem Timermodul das mitgeteilt hat. Bis zu dem ersten potenziellen Umschalten des OCB0-Pins in der zeitlichen Mitte zwischen zwei IRQs behält das Pin den vorherigen Schaltzustand bei. Sollte sich jetzt herausstellen, dass wegen eines Wechsels von 0 auf 1 oder von 1 auf 0 der geforderte Pegel bereits anliegt, dann erfolgt die nächste Umschaltung erst mit dem Erreichen des Zählerhöchststands, also mit dem nächsten ausgelösten IRQ. Auf diese Weise entstehen die breiten Pulse des Manchestercodes, Folgen von gleichen logischen Zuständen haben stets schmale Impulse zum Ergebnis.
Zustände, in denen drei Halbbits nacheinander den gleichen Logikpegel haben können nach obigem Vorgehen bei ordnungsgemäßer Übertragung nicht auftreten (Fehlerzustand 2). Die Übertragung der laufenden Sequenz von 64 Bit wird beim Erkennen eines solchen Fehlers abgebrochen, der Reader wartet bis zum Eintreffen der nächsten Präambel und beginnt dort erneut mit der Codeumwandlung.
Wegen der Einteilung der "Nutzlast" in 4-er-Gruppen und dem Nachfolgen eines Paritätsbits, welches den Wert 0 hat, wenn in der Vierergruppe eine gerade Anzahl von Einsen ist (ungerade Anzahl von Einsen -> Paritätsbit = 1), kann eine Folge von 9 Einsen wie bei der Präambel nicht in den Nutzbytes vorkommen. Nach spätestens nach 4 Einsen kommt eine 0 als Partätsbit.
Mit dieser Information kann man eigene Transponder programmieren. Martin Oßmann zeigt das in dem genannten ELEKTOR-Artikel wie das geht und stellt auch einige Beispielprogramme zum Download bereit (Kostenlose Registrierung erforderlich). Der ATTiny13 arbeitet mit wenigen externen Bauteilen und kann die Information von angeschlossenen Sensoren verarbeiten.
Abb. 17: So sieht mein Eigenbau Modell-Transponder aus (sendet den Code:
ABCDEF0123)
Der Rahmen des Geräts in Abb. 17 ist 189mm x 117mm und dient als Demoonstrations-Transponder. Ein wesentlich kleineres Gerät mit 100mm x 62mm entstand mit einer SMD-Ausführung der Originalversion. Layout und Bestückung sowie ein Foto zeigt Abb. 18.
Abb. 18: SMD-Ausführung des Transponders (PDF-Download durch Anklicken eines der Bildchen) |
Da der SMD-Tiny13 nicht in dem Test- und Programmierteil des Elektorprojekts programmiert werden kann habe ich eine andere Lösung entwickelt. Auch die im Originalverwendeten Winkelstecker waren viel zu riesig. Beim Durchstöbern meiner Werkstatt kamen mit winzige Nieten, die man zum Durchkontaktieren von doppelseitigen Platinen verwendet (Reichelt: NIETEN 0,6MM) in die Finger. Sie passen in eine Bohrung von 0,8 mm und haben einen Innedurchmesser von 0,6 mm. Von der Rückseite der Platine her durchgesteckt ragen sie auf der Kupferseite weniger wie die Höhe des Prozessorchips hervor. Im Abstand von 2,54mm montiert, dienen sie als Buchsen für meinen Programmierstecker, der, wie anderswo beschrieben, mit einer umgekehrt aufgelöteten Reihe gedrehter Fassungen aufgebaut ist. Im Foto der Abb. 18 rechts neben dem Chip zu sehen. Die Buchsenreihe am unteren Rand des Fotos ist der Sensoranschluss, bei dem ich aber, weils unkomplizierter zu machen war die Reihenfolge der Portanschlüsse etwas verändert habe. Von links nach rechts: GND - PB4 - PB2 - PB0 - Vcc, gegenüber dem Original sind also PB2 und PB0 vertauscht. Das spielt jedoch keine große Rolle, weil sowieso ein anderer Stecker verwendet werden muss.
Bleibt das Problem der Programmierung selbst. Wenn die Transponderplatine schon einen eigenen Programmieranschluss gesponsort bekommen hat, braucht sie auch noch einen eigenen Takteingang sowie eine Spannungsversorgung. Letztere wird über den Programmierstecker eingeschleift indem Vcc und GND mit einer 5V-Versorgung verbunden werden. Als Taktgenerator verwende ich einen 4MHz-Quarzoszillator, der über drei Leitungen mit dem Sensoranschluss (Vcc und GND) sowie dem Takteingang (in der Mitte zwischen Dioden und Chip im Foto) verbunden wird. Dadurch wird auch ein Problem gelöst, das ich mit der Verwendung des ELEKTOR-Programmierinterfaces und der Readerprogrammierung hatte. Der Tiny13 ließ sich nämlich in dem Moment nicht mehr programmieren, als ich die Taktquelle vom internen 9,6 MHz-Takt auf die 125 kHz vom ATTiny2313 umgestellt hatte. Das AVR-Studio 4 müsste dann mit einem 31 kHz-Takt beim Transfer arbeiten (1/4 des Prozessortaktes) was es offenbar nicht akzeptiert sondern die Rate des Übertragungstaktes auf 0 stellt. Somit ist kein Transfer mehr möglich. Erst ein Hochsetzen der exportierten Taktfrequenz von 125kHz auf 500kHz brachte eine Lösung des Problems, dieist aber auf Dauer nicht praktikabel.
Wird jetzt an der SMD-Platine der Quarzoszillator angeschlossen, kann der Transfertakt beim Programmieren bis 1 MHz betragen. Zum Test der Transponderschaltung kann man auf gleiche Weise den 125 kHz-Takt des ELEKTOR-Readers anschließen und im Transponderbetrieb versorgt die Antennenspule über den 4,7kOhm-Widerstand mit dem 125 kHz-Takt des Readers.
Die Schaltung der Hauptplatine ist in Abb. 9 dargestellt - dazu gibt es nicht viel Neues zu sagen, ist alles bereits durch frühere Projekte erschlagen. LCD in Kapitel 14. Eine LCD-Anzeige - Programmbibliotheken und die RS232 in Kapitel 16. Chat mit dem PC - die RS232-Schnittstelle. Gegenüber der Pollinschaltung hat meine Ausführung nur einen Taster und dafür eine praktischere Belegung der Ports für das LCD. Hier muss man zum Programmieren keine Jumper ziehen und hernach für den Betr ieb wieder stecken. Wie oben bereits erwähnt, wurde auch das RFID-Board unabhängig vom Controllerboard aufgebaut. Zum Anschluss trägt das Mainboard eine 6-polige Buchsenleiste und das U2270B-Board eine entsprechende Steckerleiste - Rastermaß 2,54 mm. Die SPI-Steckerleiste hat allerdings ein Rastermaß von 1,27 mm bekommen - aus Platzgründen. Um auf die normale SPI-Buchsenleiste weiterhin zurückgreifen zu können wurde ein Adapter von RM2,54 auf RM1,27 zum Projekt hinzugefügt. Das Layout dazu sowie zur Hauptplatine und zur Stromversorgung gibt's weiter unten.
Abb.19: Schaltung der Controllerplatine
Die Platinenlayouts sind wie üblich so abgebildet, dass man nach dem Ausdruck sofort bügeln oder Druck auf Schicht belichten kann. Neben den Abbildungen hier gibt es auch ein PDF zum Download. Die Bauteile der Controllerplatine kommen mit Ausnahme der SUBD9-Buchse, den Elkos, dem SPI, der Buchse zum U2270B und dem Quarz alle auf die Lötseite (SMD!). Auch das LCD (Pollin 120545 2 Zeilen a 16 Zeichen) wird auf der Lötseite angesteckt (Flexiprintbuchse Pollin 450969) und bekommt seinen Platz im Gehäuse über der 9V-Blockbatterie. Die Platine wird mit 5mm Abstandshaltern von unten an die Frontplatte des Gehäuses geschraubt. Eine detaillierte Skizze zum Zusägen und Bohren des Gehäuses aus Acrylglas kann auch heruntergeladen werden. Zum Sägen der Ausschnitte und zum Bohren schneide ich die Teile des Ausdrucks genau aus und klebe sie mit einem wasserlöslichen Klebestift auf die exakt ausgesägten KS-Teile. Nach der Bearbeitung werden die aufgeklebten Pläne abgezogen, das Gehäuse zusammengeklebt, zugeschraubt und beschliffen. Dieses Vorgehen garantiert passgenauen Sitz.
Abb. 20: Layout Controller, Stromversorgung und SPI-Adapter im Maßstab
2:1
Die Stromversorgung enthält neben den in der Schaltskizze dargestellten Teile noch eine Rohrbuchse (Pollin 450598), so dass man auch ein externes Netzteil mit einem Rohrstecker (5,5mm Außen- und 2,1mm Innendurchmesser) verwenden kann. Die Rohrbuchse schaltet automatisch zwischen externem Netzteil und Batterie um, sobald ein Netzteil angesteckt wird, wird die Batteriezuführung unterbrochen. Außerdem ist an der kleinen Platine noch ein Schalteranschluss vorgesehen. Vor der eigentlichen Elektronik liegt eine Verpolungsschutzdiode. Netzteile mit einem positiven Kernanschluss und negativer Schirmung ab ca. 7,5 V= sind verwendbar. Bei der Stromversorgungsplatine kommen die großen Bauteile ganz normal auf die Bestückungsseite der Platine, 100n Blockkondensatoren und Verpolungsschutzdiode sind SMD-Teile. Die Befestigung erfolgt ganz einfach durch das Festschrauben der Rohrbuchse im Gehäuse.
Abb. 21: Schaltung der Stromversorgung
Hier kommen noch die Bestückungspläne.
Abb. 22: Bestückungsplan Controllerplatine von der Bestückungsseite
her!!! SMD-Teile und ICs werden von der Lötseite her bestückt!!! Die
drei Draht-Brücken nicht vergesen, die langen an der Flexiprintbuchse von
der Bestückungsseite, die kleine (unten) von der Lötseite.
Abb.23: Stromversorgung, 100n Blockkondensatoren und Verpolungsschutzdiode
sind SMD-Teile!
Damit man eine Vorstellung davon bekommt wie das Gerät aussieht, Hier die Ansicht von unten und von oben. Boden und Deckel sind aus klarem Acrylglas, damit man auch ohne schrauben sieht was drin ist.
Abb. 24: Gerät von unten
Abb. 25: Gerät von oben - schaut nur noch der Taster raus, die LEDs
sind hier auch SMD-Typen
Zusammenfassung einiger Daten
Chip | U2270B | EM4095 |
Ruhestrom gesamt | 40 mA (CFE = 0) | 17 mA (SHD = 1) |
Strom aktiv | 40 mA (CFE = 1) | 170 mA (SHD =0) |
Reichweite | R = 0 Ohm: ca. 2cm - 4 cm | R = 68 Ohm: ca 10 cm |
R = 220 Ohm: 7cm - 8 cm |
Von einer Programmierung in Assembler wurde zunächst einmal abgesehen, ist aber inzwischen umgesetzt. Die Bequemlichkeit hatte zwar ursprünglich gesiegt, weil der BASCOM-Compiler von MCS-Electronics nämlich eine Bibliothek mitbringt, die beide Chips, den U2270B und den EM4095, behandeln könne soll. Eigentlich geht es gar nicht um den Chip selbst sondern um das Decodieren des Manchestercodes, der aus beiden RFID-Chips herauskommt. Das schien mit BASCOM viel einfacher zu gehen (2 Bibliotheks-Routinen) als in Assembler. Das Listing des Programms als Textfile kann man sich herunterladen, ebenso das fertige Hexfile. Es wird ausdrücklich darauf hingewiesen, dass sich meine Version von der Pollinvariante unterscheidet, ferner steht fest, dass das BASCOM-Programm nur mit dem U2270B arbeitet.
Meine Assemblervariante des Programms hat einen entscheidenden Vorteil. Während das Pollin BASCOM-Programm lediglich den U2270B unterstützt, funktioniert meine Assemblervariante mit beiden Chips, dem U2270B und dem EM4095. Sehr interessant ist die Tatsache, dass Bascom-Programme mit egal welchen Konfigurationen mit dem eigentlich dafür vorgesehenen Chip EM4095 ÜBERHAUPT NICHT funktionieren. Die diesbezüglichen höchst aufgeblasenen Forumsbeiträge im mikrocontroller.net sind für mich daher nicht nachvollziehbar. Die BASCOM-RFID-Bibliothek von Herrn Günzel bedarf offensichtich einiger Nachbesserungen. Laut Oscar sendet mein EM4095-Chip wie ein Weltmeister Manchestercode, der Mikro kann denselben selbst mit der angepassten Pollin-Programmierung aber leider nicht decodieren obwohl im Oszillogramm eindeutig Präambel und nachfolgender Code erkennbar sind. Gleiches gilt für den Bascom-Code aus ELEKTOR Heft 09-2009. Selbst nach Anpassung der LCD-Ausgabe an eine normale 4-Bit-Arbeitsweise mit RS- und E-Signal konnte keine funktionierende Transponder-Auslesung realisiert werden.
Wie bereits mehrmals in diesem Kurs kann ich nur wiederholt vermerken:
Die
Programmierung in C oder gar in BASCOM ist holperig und extrem codeintensiv
und daher nicht zu empfehlen!
6. COM2KBD oder wie kommt der Transpondercode in die Anwendung
Bei herkömmlichen USB-RFID-Readern wird vom Chip eine USB-Tastatur emuliert. Über den windowseigenen HID-Treiber ist das bei entsprechender Kennung des Readers möglich. Das hier vorgestellte Gerät hat "nur" eine serielle Schnittstelle und kann daher keine Tastatur imitieren. Weil mich das gestört hat, habe ich mir kurzerhand einen eigenen Tastaturemulator in VB geschrieben, der letztlich genau das Gleiche bietet. Der Input von der RS232-Schnittstelle wird durch dieses Tool auf die Tastatureingabe jedes gerade aktiven Programms umgeleitet. Somit kann man die Codenummer aus dem RFID-Transponder beliebig in Excel, Access oder Scratch einlesen. Un wenn ein Rechner keine RS232-Schnittstelle mehr hat, dann kann man problemlos einen USB-RS232-Adapter (Pollin 721034) verwenden. Wenn man die Preise für Geräteteile und USB-Adapter addiert bleibt man noch locker unter 25 Euro (Stand Feb. 2011) und hat die gleiche Performance wie bei dem teuren USB-Stick.
Abb. 26: COM2KBD nach dem Start | Abb. 27: Die Schnittstellt ist geöffnet |
Nach dem Start des Tools (Abb.16), welcher vor dem Start der Zielanwendung oder auch während deren Betrieb erfolgen kann, werden zuerst die Schnittstellenparameter eingestellt. Die Schnittstellennummer bestimmen Hardware und Windows, die anderen Parameter legt das BASCOM-Programm im AVR fest. Wenn man diese Einstellungen ändern möchte (was hier null Sinn macht), dann muss man das im Quelltext der Firmware tun, neu compilieren und das entstandene Hexfile neu flashen.
Nun wird über "OpenCOMM" die Schnittstelle geöffnet (abb. 17). Die Parameter sind jetzt nicht mehr änderbar. Eingaben von der seriellen Schnittstelle erscheinen jetzt in dem Fensterchen mit dem roten Punkt.
Abb. 28: Auf die Tastatur durchgeschaltet
Über den Schalter "Data to keyboard" werden die Eingaben von RS232 an die Tastatur weitergereicht. Mehrfacheingaben werden durch die einstellbare Totzeit unterbunden. "Good bye" beendet den Transfer und schließt den Zugriff auf die Schnittstelle, gibt sie also für andere Anwendungen frei.
Bekannte Probleme (von Microsoft hausgemacht!)
Bei der Nutzung der seriellen Schnittstelle gibt es windowseigene also hausgemachte Fallen in Form von sogenannten Killbits. Das sind letztlich Eintragungen in Registry-Schlüsseln, die das Benutzen von Hardware durch Ausschalten von Treibern verbieten. Das gibt es auch für das COMM-Steuerelement von VB. Durch das Installieren von Windowsupdates handelt man sich ganz flink auch das Killbit für besagtes Steuerelement ein und dann geht erst mal gar nix mehr.
Abhilfe schafft ein zurückgestellter Eintrag in der Registry, den man aber nicht von Hand in RegEdit durchführen muss. Für solche Fälle gibt es ein nettes Tool auf der Site http://nirsoft.mirrorz.com das den Namen ActX-Compatibilitymanager trägt. Runterladen, entpacken, starten und Killbit killen.
Hier die ACM-Umgebung:
Abb. 29: Killbit killen mit ACM
Man sucht über "Edit - Find" oder einfach von Hand nach dem markierten Eintrag, macht einen Rechtsklick auf die Zeile und klickt "enable selected Item" - das war's. Der Treiber ist wieder Aktiv und die Anwendung funktioniert wieder. Den ACM kann man natürlich auch für andere von MS ausgeschaltete Eigenschaften verwenden! ;-) Wer lässt sich denn schon gern von Onkel Bill vorschreiben, was er zu verwenden hat und was nicht!?!
Hier noch einmal alle Files, die man herunterladen kann im Überblick:
PDF-Datei mit dem Layout der AVR-Platine
PDF-Datei mit dem Layout der RFID-Platine für den U2270B
PDF-Datei mit dem Layout einer RFID-Platine für den EM4095
TXT-Datei mit dem Programmtext für den BASCOM-Compiler (für U2270B)
HEX-Datei der Firmware für das U2270B-Board
ASM-Datei (Quellcode) für das EM4095-Board (Minimalausstattung)
HEX-Datei für das EM4095-Board (Minimalausstattung)
Bauplan (Zuschnitt- und Bohrvorlagen) für das Gehäuse
Händler:
EM4095: http://www.rfid-dealer.de/Produkte.html
(Hier kann man auch alle möglichen Transponder bekommen)
U2270B: http://www.pollin.de/shop/dt/OTk5ODk4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/IC/U2270B.html
und Bausatz: http://www.pollin.de/shop/dt/MDQ5OTgxOTk-/Bausaetze_Module/Bausaetze/Bausatz_RFID_125kHz_Empfaenger.html
Artikel in ELEKTOR:
2010: Hefte März
und Juni
2009: Hefte Mai und September
Artikel und Foren zum Thema in http://www.mikrocontroller.net Stichwort: RFID