Praktikum Mikrocontrollerperipherie

Prof. Jürgen Plate

Praktikum Mikrocontrollerperipherie

Allgemeines

Username und Passwort

Compiler, Editor beim Raspberry Pi bzw. beim Linux-PC im E 204

Der Compiler gcc wird auf der Kommandozeile oder im Makefile aufgerufen (siehe unten). Als Editor können entweder shellbasierte Programme (vi etc.) oder der bildschirmorientierte Editor (gedit) verwendet werden. Wer lieger eine integrierte Oberfläche hat, kann Geany verwenden (gelbes Teekannensymbol auf dem Desktop).

Beachten Sie, dass bei allen Programmen die Warnungen eingeschaltet werden sollen. Ein Programm namens "oops" wird mit folgender Befehlszeile übersetzt:

gcc -Wall -o oops oops.c

Zum Erzeugen der Binärdateien, die aus mehreren Quelldateien bestehen, könnte man ein Makefile anlegen. Man kann dann durch das Kommando make das Compilieren und Linken automatisch erledigen. Unter der Annahme, dass Ihre C-Quelle main.c heisst und Sie die Bibliothek oops verwenden wollen, könnte ein einfaches Makefile folgendermaßen aussehen:

all: main

main: main.c oops
 → gcc -Wall -o main oops.o  main.c


oops: oops.c oops.h
 → gcc -Wall -c oops.c

clean:
 → rm -f oops.o main
Beachten Sie, dass make bei den Einrückungen (oben durch " → " markiert) unbedingt Tabulatorzeichen und keine Leerzeichen benötigt. Normalerweise reicht es aber, einfach alle Quelldateien beim gcc-Aufruf anzugeben:
gcc -Wall -o main main.c oops.c

Wartezeiten (Delay-Funktion) beim Raspberry Pi bzw. beim Linux-PC im E 204

Die Wartezeit bei Blink(), Print() im Scrollmodus bei der Siebensegment-Aufgabe und Wartezeiten bei den anderen Aufgaben (Geigerzähler) können über die Funktion nanosleep() gesteuert werden:

	struct timespec ts;
   ...
	ts.tv_sec  = 0;
	ts.tv_nsec = ???;
   ...
	nanosleep (&ts, NULL);
Bei Werten im Sekundenbereich kann sleep() verwendet werden. Weitergehende Infos bietet das Kapitel Prozesse und Signale des Programmierskripts. Dort erfahren Sie ggf. auch mehr zur Prozesskommunikation.

Bei Multitasking-Betriebssystemen wie Unix oder Linux, aber auch Windows, ist es immer angeraten, kuzte "Schlafpausen" einzubauen, das sonst die Programme eine überproportional hohe Prozessorlast aufnehmen. Werden Wartezeiten mit den o. g. Funktionen realisiert, ermöglicht das dem Scheduler, auch mal andere Programme "ranzulassen". Siehe dazu:

Headerfiles

Für alle Programme genügen in der Regel die folgenden Headerfiles:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <termio.h>
#include <termios.h>

Übrigens: Die Linux-Manualpages bieten auch Infos zu jeder Bibliotheksfunktion von C. Einfach man funktionsname eingeben.

Aufgaben zur seriellen Schnittstelle am PC

Diese Aufgaben lösen Sie am jeweiligen Linux-PC um Labor E 204. Die Programmierung ist eins-zu-eins auf den Raspberry Pi übertrgbar. Der PC dient hier als "RasPi-Simulator".

Ultraschallsensor

Ein Ultraschallsensor, bestehen aus Sender und Empfänger arbeitet wie ein Echolot: Der Sender schickt einen kurzen Burst aus und das Sensorsystem wartet auf das Echo. Ein mit Atmel ATmega bestücktes Mikrocontrollerboard steuert das Ultraschall-System an und liefert kontinuierlich über die USB-Schnittstelle (Pseudo-Seriellschnittstelle) jeweils die Laufzeit in Mikrosekunden als ASCII-String, der durch Carriage-Return und Linefeed abgeschlossen wird.

Einstellung der seriellen Schnittstelle:

Schreiben Sie ein Programm, das die Daten über die Schnittstelle einliest und nach der Formel s = v * t in eine Entfernungsangabe umrechnet. Dabei soll gelten:
v = Schallgeschwindigkeit (bei 20 Grad): 343.0 m/s
t = Laufzeit: Messwert in Mikrosekunden

Anmerkungen:

Grid Eye - Thermopile-Array-Sensor (2x)

Grid-Eye ist ein Thermopile-Array-Sensor in SMD-Bauform von Panasonic. Der Sensor verfügt über 64 Thermopile-Elemente (PIR - Passive Infrared Array), die in einer 8 x 8-Matrix angeordnet sind. Damit lässt sich eine berührungslose Messung von Temperaturverteilungen realisieren. Die Thermopile-Sensoren des Grid-Eye können im Vergleich zu pyroelektrischen Sensoren auch statische Wärmestrahlung messen. Das Versuchssystem mit den Stone-Board liest den Sensor aus, rechnet sie auf die Temperatur in Celsiusgraden um und verschickt sie anschließend als 2-Byte ASCII-Hex-Wert seriell an die USB-Schnittstelle des PC, wo sie über eine pseudo-serielle Schnittstelle verarbeitet werden können (ttyUSB0).

Es werden jeweils acht Werte einer Sensorzeile als Folge zweistelliger Hexzahlen gesendet und mit einen Newline-Zeichen abgeschlossen. Nach jeweils acht Zeilen folgen zusätzlich zwei Newline-Zeichen. Es ergibt sich daher ein Block von ASCII-Zeichen wie in folgendem Beispiel (Newline ist durch ↵ repräsentiert):

   181818191B1B1818↵
   181818191B1B1818↵
   1818181B1B191818↵
   1818181B1B119818↵
   18181B1B19191818↵
   18181B1B11919818↵
   1818181919191818↵
   1818181818181818↵
   ↵
   ↵
Danach folgt der nächste Block usw.

Einstellung der seriellen Schnittstelle:

Schreiben Sie ein Programm, das die Daten über die Schnittstelle einliest und als Matrix von ASCII-Zeichen, jeweils gefolgt von einem Leerzeichen darstellt. Dabei soll gelten:
TemperaturAnzeige
< 24 ' '
24 .. 26'.'
27 .. 29'+'
30 .. 32'*'
33 .. 35'@'
> 35'#'

Die Ausgabe könnte dann folgendermaßen aussehen:

   . . . . + + . . ↵
   . . . . + + . . ↵
   . . . + + . . . ↵
   . . . + + . . . ↵
   . . + + . . . . ↵
   . . + + . . . . ↵
   . . . . . . . . ↵
   . . . . . . . . ↵

Anmerkungen:

Im Hauptprogramm sollen dann Ein- und Ausgabefunktion in einer Endlosschleife aufgerufen werden. Wenn sich nun eine Person (oder auch nur die Hand) vor dem Sensor bewegt, kann dies deutlich erkannt werden.

GPS-Empfang

Das Global Positioning System (GPS), offiziell NAVSTAR GPS, ist ein globales Satellitennavigationssystem zur Positionsbestimmung. Es wurde seit den 1970er Jahren vom US-Verteidigungsministerium entwickelt. GPS ermöglicht seit Mitte 2000 auch zivilen Nutzern eine Genauigkeit von ca. 10 Metern. Die GPS-Satelliten strahlen codierte Radiosignale aus, die ständig ihre aktuelle Position und die genaue Uhrzeit liefern. Aus den Signallaufzeiten können GPS-Empfänger dann ihre eigene Position und Geschwindigkeit berechnen. Theoretisch reichen dazu die Signale von drei Satelliten aus. Da GPS-Empfänger keine Uhr besitzen, die genau genug ist, um die Laufzeiten der Signale korrekt zu messen, ist das Signal eines vierten Satelliten nötig, mit dem dann auch die genaue Zeit im Empfänger bestimmt werden kann.

Als Standardformat von GPS-Daten dient das RINEX-Format, eine Standard- und Formatdefinition, die einen freien Austausch von GPS-Rohdaten ermöglichen soll. Für den Austausch von GPS-Daten in Echtzeitanwendungen ist das RTCM-Format von Bedeutung. Alle Daten des GPS-Empfänger sind ASCII-Zeichen, die zeilenweise gesendet werden, mit einem "$" beginnen und durch Carriage Return (CR) und Linefeed(LF) abgeschlossen sind. Aufschluß über den Inhalt liefert das NMEA-0183-Referenzhandbuch. Von den verschiedenen Datensätzen interessieren uns nur zwei, die unten mit Beispiel und Beschreibung aufgelistet sind:

Die ASCII-Strings werden über die serielle Schnittstelle am den PC gesendet. Die Einstellung der seriellen Schnittstelle ist:

Schreiben Sie ein C-Programm, das aus dem Datenstrom vom GPS-Empfänger die GGA- und RMC-Zeilen extrahiert und auf dem Bildschirm ausgibt.

Erweitern Sie das C-Programm dahingehend, dass die Position, also die geographische Breite (latitude, Nord/Süd), die gegraphische Länge (longitude; Ost/West) und die Höhe (altitude) sowie die Uhrzeit in vom Menschen lesbaren Format (z.B. Stunde, Minute, Sekunde, ...) ausgegeben werden. Die Umrechnung von UTC in eine Zeitangabe aus Datum und Uhrzeit ist weiter unten beschrieben. Die Angabe von Breite und Länge erfogt in Grad (dd), Minuten (mm) und Minutenbruchteilen (mmmm). Die Umrechnung der Minutenbruchteile in Sekunden ist ganz einfach:

Sekunden = Minutenbruchteile * 60

Beispiel: GPS-Angabe (nautisch) 3723.2475

→ 37° 23', Minutenbruchteil: 0.2475

Sekunden = 0.2475 * 60 = 14.85
→ 37° 23' 14.85"
Das Gradsymbol ° ist grundsätzlich eindeutig. Für Minuten, Sekunden und das Dezimaltrennzeichen werden in der Praxis folgende Symbole verwendet:

Farbgrafik-Touchscreen als Statusdisplay (2x)

Programmiert werden soll die Ansteuerung eines Farbgrafik-LCD mit Touchscreen (EA-KIT 129-6) über die serielle Schnittstelle. Gefordert ist ein Entwurf des Bildschirm-Layouts (128 x 64 Pixel) und die Ausgabe unter Verwendung der oben aufgeführten Programm-Bibliothek display_funct:

  1. Uhrzeit → Ausgabe der aktuellen Uhrzeit (date-Kommando)
  2. Netzaktivität (netstat-Kommando)
  3. Rechnerbelastung (uptime-Kommando)
  4. Freier Plattenplatz (df-Kommando)
Beachten Sie dazu die Hinweise weiter unten. Die Ausgabe besteht dann aus vier Zeilen, die ungefähr folgendermaßen aussehen:
26.10.2015 09:50:55
RX: 12226 MB, TX: 578 MB, AK: 67
LD: 0.09, 0.05, 0.01
/dev/sda1 34%
Sorgen Sie im Programm dafür, dass die Informationen im 30-Sekunden-Abstand aktualisiert werden (Endlosschleife, sleep-Kommando).

Die Einstellung der seriellen Schnittstelle ist:

Nach manchen Grafik-Befehlen (z. B. Schriftart ändern, Button zeichnen) muss gewartet werden, damit das Display die folgenden Befehle korrekt ausführt (Auch mit Hardware-Handshake).

Hinweise:

Routinen für das serielle Touch-Terminal:
Da es sich um sehr viele, meist einzeilige Befehle handelt, bitte das Headerfile studieren. Diese Bibliothek ist noch sehr sehr Alpha!
Headerfile display_funct.h
C-Quelle display_funct.c

Aufgaben zur seriellen und parallelen Schnittstelle am Arduino

Zugangskontrolle mit RFID-Lesestation und Arduino (3x)

Die Lesestation besteht aus einem 125-kHz-RFID-Empfänger, der seriell am Arduino angeschlossen ist und einer Anzeigeplatine mit drei LEDs, die an den digitalen Pins 8, 9 und 10 des Arduino hängt. Der RFID-Empfänger dient dem kontaktlosen Auslesen von so genannten Transponderkarten (HF-Tags bzw. Read-Only-Transponderkarten). Die Aufbereitung der von der Transponderkarte gelesenen Daten wird von einem Mikrocontroller übernommen und über die RS232-Schnittstelle an den Arduino gesendet. Der RFID-Empfänger besitzt ein LC-Display auf dem die Daten sofort angezeigt werden.
Nach dem Anlegen der Betriebsspannung erscheint der Text "RFID-Modul with U2270B" im Display. LED 1 und LED 2 werden kurz eingeschalten und nach ca. zwei Sekunden wieder ausgeschalten. Im Display erscheint der Text "check ...". Wird nun eine Transponderkarte in den Empfangsbereich der Spule gehalten und vom Empfänger erkannt, zeigt dies die LED 1 an. Im Display wird der Text "send..." und der 10-stellige Ident-Code der gelesenen Transponderkarte eine Sekunde lang angezeigt und über die RS232-Schnittstelle mit 9600 Baud (8N1) ausgegeben. Dies erfolgt, solange sich die Karte im Empfangsbereich befindet. Andernfalls wird LED 1 wieder umgeschalten und der Text "check ..." im Display angezeigt.

  1. Schreiben Sie ein C-Programm zur Erfassung von Transponderkarten-IDs. Zuerst wird die serielle Schnittstelle initialisiert und dann auf die Daten einer Transponderkarte gewartet. Die gelbe LED (D0) an der Digitalschnittstelle zeigt die Empfangsbereitschaft des Programms an. Sobald eine ID empfangen wurde, wird sie an die serielle Schnittstelle gesendet. Da der RFID-Empfänger nur die Empfangsleitung (RX) des Arduino belegt, können Daten, die vom Arduino seriell ausgegeben werden im seriellen Terminal der Arduino-Oberfläche des PCs empfngen werden. Notieren Sie die Nummern der Transponderkarten.
    Als Quittungssignal wechselt die LED-Anzeige für drei Sekunden von gelb auf grün und danach wieder auf gelb.
  2. Schreiben Sie nun ein C-Programm, das basierend auf den erfassten Transponderkarten eine Zugangskontrolle realisiert. Zuerst wird die serielle Schnittstelle initilisiert und dann auf die Daten einer Transponderkarte gewartet. Die gelbe LED an der Digitalschnittstelle zeigt die Empfangsbereitschaft des Programms an. Sobald eine ID empfangen wurde, vergleicht das Programm eine Liste gültiger Transpondernummern (die unter 1. erfasst wurden) mit der empfangenen und gibt für drei Sekunden den entsprechenden Status über die LEDs an der Parallelschnittstelle aus: Danach wechselt die LED-Anzeige wieder auf gelb.
Beachten Sie beim Einlesen der ID, dass diese im Sekundenabstand wiederholt wird, solange sich die Transponderkarte im Lesebereich befindet. Das Programm darf sie aber nur einmal verarbeiten.

Geigerzähler am Arduino

Der Versuch besteht aus einem Geigerzählerbausatz von Vellemann und einen Optokoppler-Interface für die Parallelschnittstelle (die Arbeitsweise eines Geigerzählers wird in der Vorlesung besprochen). Der folgende Auszug der Schaltung zeigt die relevanten Teile:

Links im Bild sehen Sie eine Teilschaltung des Geigerzählers. An den einen Eingang von IC1 gelangt der sehr kurze Impuls vom Zählrohr, der mittels C14 und R12 verlängert wird. Dieses RC-Glied sowie IC1 und IC2 bilden eine monostabile Kippschaltung, an deren Ausgang ein genügend langer Impuls entsteht. Zwischen dem Kollektor von T3 und Masse war ursprünglich ein Piezo-Signalgeber geschaltet, der durch die grau umrandete neue Schaltung ersetzt wurde. Bei jedem Impuls des Geigerzählers schaltet T3 durch und die Anzeige-LED sowie die LED des Optokopplers leuchten auf. Der Ausgang des Optokopplers zieht darauf hin den Port 8 des Arduino auf Low-Potential. Für die einwandfreie Funktion muss der Kollektorwiderstand des Phototransistors auf High-Potential gezogen werden, was man durch Verbinden mit den 5 V des Arduino erreicht. Der Masseanschluss GND des Arduino verbunden. Damit kann durch kontinuierliche Abfrage des Port 8 der Zählimpuls erkannt werden.

Für erste Tests liegt ein ca. 50 Jahre alter, extrem geschmackvoller Teller bereit, dessen Glasur aus Uranoxid den Geigerzähler "tickern" lässt.

Neben der absoluten Zahl der detektierten Impulse soll nun die Zählrate berechnet werden. Erweitern Sie das Programm so, dass jede Minute die Anzahl der Impulse/Minute errechnet und diesen Wert zusammen mit der absoluten Zahl der Impulse über die Serielle Schnittstelle ausgegeben wird. Berücksichtigen Sie auch den Fall, dass der Absolutzähler überläuft.

Steuern einer Netzwerk-Kamera mit Arduino

Die Netzwerkkamera ist auf einer servogesteuerten Mechanik zum Drehen und Neigen der Kamera montiert ("Pan" and "Tilt"). Die Servo-Ansteuerung erfolgt über den Arduino mit der entsprechenden Bibliothek. Das Kamerabild kann über den Web-Browser (Stream und Snapshot) abgerufen werden:

Schreiben Sie unter Verwendung der o. a. Arduino-Bibliothek ein Programm, das zwei Modi kennt. Im ersten Modus erfolgt die Steuerung der Kamera über vier Tasten für das Neigen ([T1] und [T2]) und Drehen ([T3] und [T4]).

Beim zweiten Modus handelt es sich um einen sogenannten Scan-Modus, der den Raum durch ständiges Drehen und Schwenken der Kamera überwacht. Vom einen in den anderen Modus soll jederzeit per Tastendruck auf [T5] gewechselt werden können.

Die Tasten sind an den Digitalports 3, 4, 5, 6, und 7 angeschlossen und schalten gegen Masse. Da dieser Fall recht häufiger auftritt, wurden im AtMega hierfür passende interne Pullup-Widerstände (ca. 20 kΩ) integriert, die sich bei Bedarf aktivieren lassen:

pinMode(pin, INPUT);      // Anschluss als Eingang definieren
digitalWrite(pin, HIGH);  // Pullup-Widerstand aktivieren 
Ermitteln Sie zunächst durch ein Testprogramm, welche Taste an welchem Port angeschlossen ist.

Für die Servos sind die Ports 8, 9, 10 und 11 vorgesehen. Da nur zwei Servos benötigt werden, verwenden Sie die Ports 8 und 9.

Aufgaben zur Erfassung analoger Sensordaten mit Arduino

3-Achsen-Beschleunigungssensor am Arduino

Es soll die Lage eines "Flugzeugmodells" anhand eines Beschleunigungssensors über das das analoge Interface bestimmt werden. Der Sensor ADXL 335 liefert eine der Beschleunigung proportionale Spannung die per Programm ausgewertet werden soll.

  1. Schreiben Sie ein Rumpfprogramm, das beim Start die aktuellen Werte für X, Y und Z einliest und als "Nullstellung" speichert. Danach sollen im Halbsekunden-Rhythmus die Werte für X, Y und Z eingelesen und auf dem Bildschirm ausgegeben werden. Bestimmen Sie Grenzwerte für die Neigung des "Fliegers" in X- und Y-Richtung für eine Neigung von etwa 30° in jeweils beiden Richtungen (Sie dürfen schätzen).
  2. Nun kommen die vier LEDs ins Spiel. Auf der Basis der gewonnenen Erkenntnisse steuern Sie nun die jeweilige LED an, wenn der Neigungs-Grenzwert überschritten wird.
  3. Ermitteln Sie den Neigungs- und Kipp-Winkel aus dem X-, Y- und Z-Wert bzw. Y- und Z-Wert nach dem Satz des Pythagoras bzw. nach dem Cosinussatz. Beachten Sie dabei, dass alle Winkelfunktionen im Bogenmass arbeiten → Umrechnung im Grad durch Grad = Winkel * 180 / π. Zur Erinnerung:



Modell einer Temperaturregelung mit Arduino

Über das analoge Interface soll eine Temperaturregelung realisiert werden. Über Analogeingang A0 kann der Temperaturwert (PT1000-Interface, siehe Skript) eingelesen werden. Das Interface liefert eine Spannung die einem Zehntel der Temperatur entspricht (z. B. für 24,5° → 2,54 V) Über den Digitalausgang 8 kann ein Heizwiderstand sowie eine rote LED ein- und ausgeschaltet werden und über den Digitalausgang 9 auf die gleiche Art und Weise ein Lüfter und eine blaue LED.

Zum Testen kann das Heizen und Kühlen auch über die beiden Tasten am Interface-Board aktiviert werden. Damit lassen sich dann auch die Reglereigenschaften schnell testen. Zur Kontrolle ist auch noch ein herkömmliches Digitalthermometer angeschlossen.

Schreiben Sie ein Programm, das per Dreipunktregler (Heizen, Kühlen, nichts tun) den Testkörper (Kühlkörper) auf einer bestimmten Temperatur hält. Die aktuelle Temperatur und der Status des Reglers sollen auf dem PC-Bildschirm angezeigt werden. Ist es sinnvoll, einen komplexeren Regelalgorithmus zu verwenden?

Aufgaben zur Parallelschnittstelle am Raspberry Pi

Raspberry Pi als programmierbare Schaltuhr

Die Relaiskarte besitzt sieben Ausgänge (siehe Schaltplan unten, der auch die Zuordnung zu den GPIO_Ports zeigt). Realisieren Sie eine Schaltuhr mit sieben Funktionen. Die Schaltzeitpunkte sollen von einer Steuerdatei eingelesen werden, wobei jede Zeile einen Schaltzeitpunkt enhält. Die Zeilen haben folgendes Format:

Jahr Monat Tag Stunde Minute Sekunde Schaltzustand
Der Schaltzustand wird in Form einer 7-stelligen Biärzahl angegeben, z. B. 0010001 → Relais 1 und 5 an, alle anderen aus.

Der Raspberry Pi mit der Relaiskarte hat den Namen sedna.da.private.hm.edu und die IP-Adresse 10.27.210.233. Er ist per SSH vom Linux-PC aus erreichbar (User: pi, Passwort: raspberry). C-Compiler etc. ist installiert.Im Home-Directory des Users pi befindet sich auch die Basisbibliothek für den GPIO-Zugriff. Compiliert wird auf der Kommandozeile (s. o.), als Editor können Sie den vi (= vim) oder den nano verwenden.

Hinweis zur Programmierung: Beim Einlesen der Schaltzeitpunkte sollen die Datumsangaben in die UNIX-Epoche (Sekunden seit dem 1.1.1970, 0 Uhr) umrechnen. Man erhält dann für jede Zeitangabe einen 32-Bit-Wert, der monoton steigend ist und spart sich jegliche weitere Umrechnerei. Die so konvertierten Schaltzeitpunkte werden sortiert in einem Array gespeichert (Grenzen prüfen).
Zum Ermitteln der aktuellen Zeit als Unix-Epoche und zum Umrechnen von Datum und Uhrzeit werden folgende Standardfunktionen angeboten:

#include <time.h>

time_t time(time_t *ptr);

time()  returns  the  time  as  the  number of seconds since the Epoch,
1970-01-01 00:00:00 +0000 (UTC). If ptr is non-NULL, the return value 
is also stored in the memory pointed to by ptr.

On  success,  the value of time in seconds since the Epoch is returned.
On error, ((time_t) -1) is returned.

time_t mktime(struct tm *timeptr);

timeptr is the pointer to a time_t value representing a calendar 
time broken down into its components. Below is the detail of timeptr 
structure

struct tm {
   int tm_sec;         /* seconds,  range 0 to 59          */
   int tm_min;         /* minutes, range 0 to 59           */
   int tm_hour;        /* hours, range 0 to 23             */
   int tm_mday;        /* day of the month, range 1 to 31  */
   int tm_mon;         /* month, range 0 to 11             */
   int tm_year;        /* The number of years since 1900   */
   int tm_wday;        /* day of the week, range 0 to 6    */
   int tm_yday;        /* day in the year, range 0 to 365  */
   int tm_isdst;       /* daylight saving time             */	
};

On success, the function returns a time_t value corresponding to the calendar 
time passed  as argument. 
On error, ((time_t) -1) is returned.
Das folgende Beispiel verdeutlicht die Anwendung:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main ()
  {
  time_t epoc;                /* 32-Bit-Zahl   */
  struct tm info;             /* Datum/Uhrzeit */
  char buffer[80];            /* Ausgabepuffer */

  info.tm_year = 2013 - 1900; /* Jahr - 1900 */
  info.tm_mon = 11 - 1;       /* Monat geht von 0 - 11! */
  info.tm_mday = 4;
  info.tm_hour = 9;
  info.tm_min = 15;
  info.tm_sec = 1;
  info.tm_isdst = -1;         /* Differenz zu GMT */

  printf("Test mit 4.10.2015, 9:15:01:\n");
  /* Inhalt von info in String umwandeln (fuer Ausgabe) */
  epoc = mktime(&info);
  if( epoc == -1 )
    printf("Error: unable to make time using mktime\n");
   else
     {
     printf("Aus epoc berechnet:  %s",ctime(&epoc));
     strftime(buffer, sizeof(buffer), "%c", &info );
     printf("Aus dem info-Record: %s\n",buffer);
     }

  printf("Nun dasselbe mit 'now': ");
  epoc = time(NULL);
  printf("%s\n",ctime(&epoc));

  return(0);
  }

Text-LCD am I2C-Bus als Statusdisplay am Raspberry Pi

Programmiert werden soll die Ansteuerung eines Text-LCD über die I2C-Schnittstelle. Die Ausgabe gestaltet sich ähnlich wie bei dem Versuch Farbgrafik-Touchscreen als Statusdisplay:

  1. Uhrzeit → Ausgabe der aktuellen Uhrzeit (date-Kommando)
  2. Netzaktivität (netstat-Kommando)
  3. Rechnerbelastung (uptime-Kommando)
  4. Freier Plattenplatz (df-Kommando)
Beachten Sie dazu die Hinweise beim oben angegebenen Versuch. Die Ausgabe besteht dann aus vier Zeilen, die gegenüber dem Farbdisplay auf 20 Zeichen gekürzt werden müssen. Die Ausgabe sollte dann ungefähr folgendermaßen aussehen:
26.10.2015 09:50:55
12226 / 578 / 67
0.09, 0.05, 0.01
/dev/sda1 34%
Sorgen Sie im Programm dafür, dass die Informationen im 30-Sekunden-Abstand aktualisiert werden (Endlosschleife, sleep-Kommando).

Hinweise zum Einsatz des Displays finden Sie unter /skripten/hardware/RasPi/Projekt-LCD

Technische Daten:
Interface: I2C
I2C Address: 0x3F
Pin Definition: GND, VCC, SDA, SCL
Back lit (Blue with White char color)
Supply voltage: 3,3 - 5 V

Dokumentationen zum Praktikum

Software zum Praktikum (Raspberry Pi bzw. Linux-PC)

Alle Programme sind nicht nur hier auf www.netzmafia.de abrufbar, sondern auch auf den Praktikums-PCs im Verzeichnis /global zu finden. Bitte die Kommentierung im jeweiligen Headerfile beachten und ggf. die I/O-Adressen anpassen.

Die Quelldateien können Sie per scp_Kommando zum Raspberry Pi übertragen.
Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
Letzte Aktualisierung: