Beschreibung
Inhalt dieses Projekts war die Entwicklung einer Sensorplatine für die Hausüberwachung im Hinblick auf die Erkennung von Einbrüchen. Diese Sensoren bzw. Sensorplatinen können sich an Türen und Fenstern befinden
oder auch an Stellen, an denen Bewegungen im Innenraum detektiert werden können. Sie melden geänderte Sensorwerte bzw. Kontaktstellungen an eine Zentraleinheit, die diese Meldungen dann per SMS weiterleitet.
Folgende Ziele waren Grundlage für die Entwicklung von Hard- und Software:
- Überwachung von zwei Kontakten (zum Beispiel Reed-Kontakte) pro Modul.
- Verbindung zu einer Basisstation mittels eines RFM12-Moduls für die Auslösung von Alarmen und Statusmeldungen
- Stromversorgung durch zwei AA-Batterien, sehr stromsparendes Design und Selbstüberwachung der Betriebsspannung
Die Verbindung zwischen Sensormodul und Basisstation ist besonders abgesichert:
- Symmetrische Verschlüsselung der Daten mit eigenem Schlüssel für jede Sensorplatine
- CRC-Berechnung für jede Nachricht
- Botschaftszähler für Konsistenzüberprüfung der Verbindung
- Regelmäßige Statusnachrichten an Basisstation, um einen Ausfall eines Sensors schnell detektieren zu können
Schaltung
Grundlage der Sensorplatine ist ein ATmega328 (ein ATmega88 würde ohne Debug-Ausgaben auf einem LCD ebenfalls ausreichen). Neben der Standardbeschaltung des ATmega inklusive Stromversorgung und Sicherung existiert eine Schaltung zur Abfrage von zwei Kontaktsensoren.
Der Controller setzt die Pins
SEN_DR1 und
SEN_DR2 zyklisch auf High und liest den Pegel der Pins
SEN_MES1 und
SEN_MES2 ein, um die Stellung des Kontaktes zu ermitteln.
Die zyklische Erfassung der eigenen Betriebsspannung erfolgt mit Hilfe eines Spannungsteilers am ADC2-Pin des Controllers unter Verwendung der internen Referenzspannungsquelle von 1,1 V. Die Schaltung deckt einen Eingangsspannungsbereich
von etwa 1,0...3,6 V ab. Um Strom zu sparen ist diese Schaltung nicht dauerhaft aktiv, sondern wird mittels eines MOSFETS (
IRLML6402) nur kurzzeitig zur Messung aktiviert.
Die Platine besitzt Anschlüsse für die Programmierung des Controllers per ISP, eine Stiftleiste mit den Pins PD0...PD7 für den Anschluss eines Displays und eine Buchsenleiste für das Aufstecken
eines
RFM12-Moduls.
Als Taktquelle dient der interne Oszillator des ATmega mit gesetzter DIV8-Fuse, das entspricht der Konfiguration des ATmega im Auslieferungszustand. Der Takt beträgt damit 1 MHz, was ausreichend für die
Verarbeitung ist und den Stromverbrauch senkt.
Quellen
Die Schaltung bis hin zu den notwendigen Dateien für die Produktion der Platine entstanden mit Hilfe von
KiCAD.
- Dieses Paket enthält alle Quellen der Schaltung für KiCAD.
- Alles, was für eine Leiterplattenproduktion notwendig ist, befindet sich in diesem Paket.
Die Software für die Platine ist ebenfalls verfügbar:
Die Quellen enthalten bereits die Hex-Files für den ATmega328. Die ID der jeweiligen Sensorplatine ist in der Datei
alarm_sensor.h durch
ALARM_SENSOR_ID definiert. Diese ID bestimmt gleichzeitig auch den Schlüssel für die
Verschlüsselung der Kommunikation mit der Basisstation. Die Schlüssel für die jeweiligen Sensor IDs befinden sich in der Datei
encryption_keys.h.
Achtung: Die Schlüssel sollten vor Verwendung der Software unbedingt neu generiert werden, beispielsweise mit Hilfe des Bash-Skripts
generatey_keys!
Derzeit sind bis zu 21 Sensorplatinen parallel betreibbar. Dies lässt sich einfach erweitern: Hinzufügen von neuen Schlüsseltabellen in der Datei
encryption_keys.h und die Anpassung von
ALARM_SENSOR_ID in
der Datei
alarm_sensor.h.
Kommunikations-Interface
Das Sensormodul kommuniziert mit einer Basisstation mittels
RFM12-Modul, derzeit in der 868 MHz-Version. Es sendet zyklisch aller etwa 40 Sekunden seine
Statusinformationen und im Alarmzustand (geöffneter Kontakt) aller 0,5 Sekunden, für etwa 15 Sekunden lang.
Der Inhalt der Nutzdaten ist folgendermaßen aufgebaut:
Zusätzlich berechnet die Software noch die 32 Bit-CRC dieser Nutzdaten. Damit stehen zwei 32 Bit-Werte zur Übertragung bereit. Vor der Übertragung werden sie allerdings verschlüsselt, in dieser Reihenfolge:
- CRC (32 Bit)
- Nutzdaten (32 Bit)
Die Verschlüsselung startet mit dem CRC-Block und nutzt
Cipher Block Chaining, damit auch sehr kleine Änderungen in den Nutzdaten nach der Verschlüsselung nicht nachvollziehbar sind und zu einer komplett anderen Ausgabe führen.
Die Verschlüsselung erfolgt in der Funktion
sym_encrypt_buffer() in der Datei
encryption.c. Ergebnis sind zwei verschlüsselte 32 Bit-Blöcke.
Das gesamte Datenpaket enthält allerdings noch einige zusätzliche Elemente wie CRC, Sensor ID (für die Entschlüsselung) und Synchronisations-Bytes für die Funkübertragung:
Lizenz
Alle hier veröffentlichten Quellen stehen unter der
LGPLv3.
Versionsinfo
- Version 0.1, 30.03.2019: erste Version
Anregungen oder weitere Informationen
Hier kann ein Kommentar hinterlassen werden: