QR-Code auf ARM Mikrokontrollern
QR-Codes haben in den letzten Jahren enorm an Beliebtheit gewonnen und werden heutzutage fast überall verwendet. Sie ermöglichen die Darstellung einer Vielzahl von Informationen in einem sehr kompakten Formfaktor. Mithilfe von Mikrokontrollern lassen sich QR-Codes erzeugen und auf einem Display darstellen, beziehungsweise mittels einer Kamera auswerten. Mögliche Einsatzgebiete sind die Identifikation von IoT Geräten und die Bereitstellung von (interaktiven) Informationen.
Inhalt
Im Rahmen des Boostcamps 2022 haben wir unser Know-how zu verschiedenen Technologien ausgebaut, so auch im Bereich QR-Codes. Dazu wurde eine Beispiel-Implementation zum Anzeigen sowie Auswerten eines QR-Codes mithilfe eines STM32H7B3I-DK Discovery Kits von ST umgesetzt. Das Discovery Kit verfügt über ein Display, das für die Anzeige eines QR-Codes genutzt wurde.
Was ist ein QR-Code?
Ein QR-Code ist die zweidimensionale Version eines Barcodes. Er ermöglicht die Darstellung einer Vielzahl von Informationen in einem sehr kleinen Format, bestehend aus einer zweidimensionalen quadratischen Matrix aus schwarzen und weissen Quadraten.
QR-Codes sind gemäss dem Standard ISO 18004 standardisiert. Der Standard unterscheidet 40 verschiedenen Versionen. Die Version bestimmt die Anzahl Pixel des Codes und kann von 21x21 bis 177x177 Pixel reichen.
Neben den verschiedenen Versionen bestehen vier Fehlerkorrektur-Levels. Abhängig vom gewählten Level können 7 bis 30 % der Daten des QR-Codes wiederhergestellt werden. Der Wiederaufbau erfolgt durch die Reed-Solomon Codierung.
Folgende Fehlerkorrektur Level sind definiert:
Der Aufbau eines QR-Codes
Spezifische Merkmale:
- Versionsfelder zur Bestimmung der QR-Code Version (1)
- Formatfelder mit Infos zur Fehlertoleranz und Datenmaske (2)
- Datenfeld und Fehlerkorrektur-Daten (3)
- Positionsmarkierungen in den Ecken (4.1)
- Ausrichtungsmarkierungen (kleiner als Positionsmarkierungen und helfen bei der Verarbeitung) (4.2)
- Synchronisationslinien zur Bestimmung der Grösse der Datenmatrix (4.3)
- Bit zur Repräsentation der dunklen Farbe, auch «dark module» genannt (4.4)
- Randzone (meist eine weisse Umrandung für klaren Kontrast) (5)
Bildquelle: https://de.wikipedia.org/wiki/QR-Code
QR-Code Generierung und Entschlüsselung in unserer Beispielanwendung
In dem von uns erarbeiteten Beispiel kann ein beliebiger Text in Form eines QR-Codes auf dem Display des STM32H7B3I-DK Discovery Kits angezeigt werden. Der generierte Code hat folgende Merkmale:
- Wählbare QR-Code Version
- Einstellbarer «Error Correction Level»
- Ausgabe des generierten QR-Codes als 2D-Bitmatrix
Für die Entschlüsselung kann eine beliebige Bitmatrix (Version, Error Correction Level) interpretiert und als String zur Weiterverarbeitung ausgegeben werden.
Umsetzung
Als Basis wählten wir ein Beispiel-Programm zur Verwendung des Displays aus der STM32Cube IDE Entwicklungsumgebung. Für die Erstellung der QR-Codes haben wir eine externe C-Library in das Projekt integriert. Die Library konvertiert im gewünschten Fehlerkorrektur-Level einen String in ein eindimensionales Bit-Array. Mittels eines entwickelten Wrappers wurde das Bit-Array in ein zweidimensionales Array konvertiert und grösstmöglich auf dem Display darstellt.
Zur Entschlüsselung des QR-Codes verwendeten wir eine C++ Library. Dazu musste das Beispiel-Projekt so weit angepasst werden, dass auch C++ Code kompiliert und ausgeführt werden konnte.
Die zuvor generierte Matrix wurde als Input für die Entschlüsselung genommen und mithilfe der C++ Library entschlüsselt. Das Resultat ist eine Textfolge (String), die mit der initial gegebenen Information übereinstimmt. Diese wurde in Form einer Textfolge wiederum auf dem Display angezeigt.
Fazit
Durch die Verwendung der beiden Libraries konnten wir die QR-Code Funktionalität rasch und unkompliziert auf dem Mikrokontroller realisieren. Ein Knack-Punkt für die tatsächliche Anwendung bleibt jedoch noch offen: nämlich die Integration einer Kamera und die nötige Bildverarbeitung zur Konvertierung des «Live»-Bilds zu einer Bitmatrix.