Embedded Software WS 2015/16 FH Münster FB2 Thomas Brinkmann, Ludwig Horsthemke EasyMeter - Praktikumsaufgaben 14. Dezember 2015 Aufgabe 1: Einrichtung i) Aufbauen der Schaltungen Bauen Sie zunächst die Empfängerschaltung entsprechend der Abbildung 1a mit Hilfe des Fototransistors auf. Denken Sie daran das Signal zu invertieren, bevor Sie es auf den RX-Pin des Raspberry Pi geben. (a) Empfänger (b) Sender Abbildung 1: Schemata Bauen Sie anschließend die Schaltung zur Emulation des EasyMeter entsprechend der Abbildung 1b mit Hilfe eines Arduinos auf. Denken Sie auch hier daran, das Signal zunächst zu invertieren, bevor Sie mit diesem die Infrarot-LED treiben. Zur Spannungsversorgung liegt der Pin D2 des Arduino auf HIGH. Sie können hier 1
alternativ die 3,3V Versorgung nehmen. Tipp: Eine übliche (Handy-)Kamera ist in der Lage Infrarotlicht darzustellen. So lässt sich die generelle Funktion überprüfen. Abbildung 2: Pinout des Raspberry ii) Einrichten des Raspberry Pi Standardmäßig öffnet Linux eine Konsole auf der UART-Schnittstelle, wodurch, wie von ssh bekannt, Befehle abgesetzt und Ausgaben erfolgen können. Da nur Ihr Programm Zugriff auf die UART-Schnittstelle haben soll, müssen Sie die folgenden Änderungen vornehmen. Editieren Sie die Datei /boot/cmdline.txt und entfernen Sie den Teil console=ttyama0,115200 kgdboc=ttyama0,115200. Editieren Sie die Datei /etc/inittab und kommentieren Sie die Zeile T0:23:respawn:/sbin/getty -L ttyama0 115200 vt100 mit dem #-Zeichen aus. Starten Sie den Raspberry Pi nun neu, um die Änderungen zu übernehmen. Jetzt installieren Sie mit sudo apt-get install minicom das Programm minicom zur seriellen Kommunikation. Dies erlaubt Ihnen den Empfang der Datentelegramme zu überprüfen. Starten Sie minicom mit dem Befehl sudo minicom -s und stellen Sie unter Serial port setup als Serial Device /dev/ttyama0 und als Bps/Par/Bits 9600 7E1 ein. Deaktivieren Sie Hardware Flow Control. Speichern Sie die Konfiguration mit Save setup as dfl und starten Sie den Empfang der Daten mit Exit. Sie sollten nun alle 2 Sek. ein Telegramm empfangen. iii) Oszilloskopie der relevanten Signale (optional) Schauen Sie sich die relevanten Signale auf Sender- und Empfängerseite mit Hilfe eines Oszilloskopes an. An welcher Stelle sind die Daten (logisch) invertiert? Warum könnte dies der Fall sein? Identifizieren Sie ein Byte und prüfen Sie dessen Paritätsbit. 2
Aufgabe 2: IRSensor Klasse Im Folgenden erstellen Sie eine Klasse, die Telegramme des EasyMeter entgegennimmt und zur Weiterverarbeitung zwischenspeichert. Es wird sich hierzu sukzessive der Klasse IRSensor angenähert. i) Funktion zum Empfang des Telegramms Schreiben Sie eine Funktion, die Eingaben in die UART-Schnittstelle einliest, zwischenspeichert und den vollständigen Erhalt eines Telegramms feststellt. Hierzu nutzen Sie die Funktionen von wiringpi, um mit dem Gerät /dev/ttyama0 zu kommunizieren. Achten Sie darauf die Kommunikation auf 7E1 einzustellen. Geben Sie die Telegramme nach vollständigem Erhalt aus. Gleicht die Ausgabe derer, die Sie in minicom gesehen haben? Wenn nein, warum nicht? ii) Auslagerung in Thread Nun lagern Sie die erstellte Funktionalität in eine Methode aus, welche sich als pthread starten lässt. Übergeben Sie ihr beim Start die Referenz auf Ihr IRSensor-Objekt und führen Sie einen geeigneten Cast durch, sodass Sie mit dem Objekt wie gewöhnlich arbeiten können. Legen Sie spätestens jetzt die Klasse IRSensor an und starten Sie den Thread an geeigneter Stelle. iii) Implementierung der gesamten Klasse Implementieren Sie nun die restliche Funktionalität der Klasse, wie etwa get-methoden, geeignete Übergabeparameter an den Konstruktor, usw. Sie dürfen sich dabei an der in Abbildung 3 dargestellten Klasse orientieren. 3
Abbildung 3: Klasse IRSensor Aufgabe 3: Zaehlerstand Klasse Da Sie nun Telegramme empfangen und weiterreichen können, gilt es eine Klasse zu implementieren, die aus dem String die relevanten Daten extrahiert und in entsprechenden Attributen speichert. i) Implementierung Legen Sie die Klasse Zaehlerstand (o.ä.) an und geben Sie ihr geeignete Attribute. Sie dürfen sich auch hier an der Klasse aus Abbildung 4 orientieren. ii) Textanalyse Fügen Sie nun eine Methode hinzu, welche ein Telegramm als string entgegen nimmt und eine Zaehlerstand-Instanz befüllt. Nutzen Sie hierzu zum Beispiel den tokenizer. Prüfen Sie nun in Ihrer main-funktion nur noch auf den Erhalt gesamter Telegramme. Lassen Sie sich die Zaehlerstand-Instanz bei Erhalt neu befüllen und geben Sie deren Attribute aus. Als Schutz vor der Kollision der Textanalyse mit dem neuen Befüllen des Telegramms durch den Empfangsthread bietet sich eine Mutex-Variable an. Auch ein FIFO-Puffer für Telegramme wäre hier denkbar. 4
Abbildung 4: Klasse Zaehlerstand iii) Verbrauchsanzeige (optional) Lassen Sie den LED-Bargraph auf Ihrer Platine die aufgenommene Leistung an der Phase L1 anzeigen. 5