Lichtschranke mit TEMIC K153P anschließen

Unter der Bezeichnung TEMIC K153P gibt es ein Paar von Infrarot-Sendern und -Empfängern. Aus diesen kann man sich mit ganz wenigen zusätzlichen Teilen (Spannungsquelle und Widerstand) eine Lichtschranke für viele verschiedene Einsatzzwecke bauen.

Sender

Die Infrarot-LED (blau) verhält sich grundsätzlich gleich wie sonstige LEDs auch. Es gibt eine Betriebsspannung und einen Betriebsstrom, der auch unterschritten werden kann. Regeln muss man beides mit einem Vorwiderstand.

Für den Sender des K153P-Paares sind die vorgesehenen Werte laut Datenblatt 1,25V und 50mA. Ich bin in meinem Schaltplan jedoch auf einen wesentlich geringeren Strom heruntergegangen, da der Raspberry Pi mit nur wenigen Milliampere belastet werden sollte.

Die Ausgangsspannung des Raspberry Pi beträgt 3,3V. Es müssen also 2,05V vernichtet werden. Da noch ein 330-Ohm-Widerstand herumlag, habe ich diesen benutzt. Damit ergibt sich dann rechnerisch eine Stromstärke von .

Empfänger

Der Empfänger (schwarz) wiederum arbeitet wie ein Transistor. Er heißt auch “Fototransistor”. Im Gegensatz zu einem normalen Transistor besitzt er jedoch nicht drei, sondern nur zwei Pins: Emitter und Kollektor. Die Basis wurd durch das einfallende Licht belegt.

Die Basis-Kollektorspannung ist im Datenblatt anscheinend nicht angegeben, scheint jedoch höher als 4V zu sein, denn meine LED leuchtet sowohl in Kollektor- als auch in Emitterschaltung genau gleich hell, d.h. es müssen beide Male 3,3V durch den Transistor fließen.

Möglicherweise kann man aus Kollektor-Emitter-Spannung “min 70V” ableiten, dass immer 70V durchgelassen werden? Umgekehrt ist auch das technische Maximum 70V. Bei so einem kleinen Bauteil würde ich jedoch lieber keine so große Spannung anlegen, da jedes elektrische Gerät irgendeine maximale Leistungsaufnahme hat (z.B. bei Widerständen ist diese immer angegeben). Sicherlich steht es auch irgendwo im Datenblatt des Empfängers, jedoch weiß ich im Moment nicht wo.

Aufbau

Um sich eine Lichtschranke zu bauen, muss man den Sender wie eine LED betreiben. D.h. man schließt ihn an die Spannungsquelle an und verpasst ihm einen geeigneten Vorwiderstand. In meinem Fall habe ich 330 Ohm gewählt, aber rechnerisch wären bei 3,3V nur 50 Ohm nötig. Wie aber oben geschrieben, muss ich meinen Raspberry Pi schützen.

Leider finde ich in der Spezifikation keinen Hinweis darauf, welcher Pin jeweils Anode und Kathode sind. Aus verschiedenen Tutorials wird jedoch klar, dass die Anode rechts ist, wenn man auf den Lichtsender schaut (d.h. wenn man selbst geblendet wäre, sofern man Infrarot sehen könnte).

Gegenüber stellt man den Empfänger auf. Schaut man diesen von vorne an, so ist der Emitter links und der Kollektor rechts. Über diese Kollektor-Emitter-Strecke wird später der Strom fließen.

Wie oben schon geschrieben, schien es in meinem Test egal, ob man eine Kollektor- oder eine Emitterschaltung baut – ob also die Last (bspw. eine LED) vor oder hinter dem Transistor kommt. Bei größeren Spannungen als 3,3V könnte man hier aber vielleicht feststellen, dass nur eine Emitterschaltung funktioniert. Damit jedoch der Basis-Emitter-Strom nicht durch die Last fließt, verwendet man bei Schalteranwendungen wohl die Emitterschaltung (die Last vor den Kollektor).

Schaltbild für eine Infrarot-Lichtschranke

Die Verdrahtung im Schaltbild wirkt etwas kompliziert, was daran liegt, dass ich alle Anschlüsse entsprechend der genannten Pin-Belegung dargestellt sind. Das zuvor verlinkte Arduino-Tutorial hat den Empfänger allerdings umgekehrt angeschlossen. Bei mir floss dann aber kein Strom mehr.

Jetzt sollte die LED leuchten, wenn nichts zwischen Sender und Empfänger steht. Hält man einen Finger oder ein Blatt Papier dazwischen, geht die LED aus.

Mach doch mal ‘ne Pause…

Wenn es noch jemandem so geht, dass er eigentlich stündlich mal aufstehen will, aber es bei spannenden Projekten dann wieder vergisst: Ein einfacher Cronjob kann hier Abhilfe schaffen.

Das Programm zenity ist bereits dafür gemacht, GTK-Meldungen von der Kommandozeile aus zu produzieren. Man muss nur noch ein paar export-Befehle für die grafische Oberfläche einbauen, da cron diese standardmäßig nicht kennt.

Mein stündlicher Cronjob um Halb sieht so aus:

30 * * * * export DISPLAY=:0; export XDG_RUNTIME_DIR=/tmp/; zenity --warning --text="Pause einlegen"

Einen Cross-Compiler erstellen

Wenn man auf seinem eigenen System einen Quelltext kompiliert, so wird dieser üblicherweise gleich für das System kompiliert, auf dem man sich befindet. Der Maschinencode kann dann nur von solchen Computern ausgeführt werden, die den gleichen Maschinenbefehlen folgen.

Um für ein anderes System zu kompilieren, sollte man sich deshalb einen Cross-Compiler erstellen. In früheren Tagen, als alle Heimsysteme noch 32-Bit waren und der 386-Architektur folgten, fiel dies weniger auf. Wenn Kernel-Programmierer heute allerdings zuerst lernen, für die 386-Architektur zu entwickeln und gleichzeitig auf einem 64-Bit-System arbeiten, ist dieser Schritt wichtig.

Eine sehr ausführliche Anleitung zum Bauen eines Cross-Compilers findet sich im OSDev-Wiki. Ich werde mich auch daran orientieren, jedoch nur die wichtigen Schritte beschreiben, die zur Durchführung ausreichen.

Zunächst einmal muss man sich die gewünschten Versionen von binutils und GCC herunterladen. Beim GCC soll man darauf achten, dass die heruntergeladene Version nicht zu sehr von der Version abweicht, mit der man ihn kompilieren will.

Die beiden heruntergeladenen Pakete entpackt man anschließend, z.B. in einen Ordner src.

mkdir $HOME/src
tar xvjf ../path_to_download/binutils-x.y.z.tar.bz2
tar xvjf ../path_to_download/gcc-x.y.z.tar.bz2

Zum Vorbereiten des Vorgangs setzt man sich noch ein paar Umgebungsvariablen. Den Zielpfad der kompilierten Programme (Präfix), die Zielarchitektur und man kann die Pfadvariable um das Präfix erweitern (sofern man denn will).

export PREFIX="$HOME/opt/cross"
export TARGET=i586-elf
export PATH="$PREFIX/bin:$PATH"

Da die Dateien unter $HOME/opt/cross abgelegt werden sollen, sollte man diesen Ordner auch anlegen:

mkdir -p $HOME/opt/cross

Anschließend wechselt man in das Verzeichnis, wo man binutils entpackt hat und kompiliert dieses. Durch Angabe des Präfixes, wird es beim Aufruf von make install an die richtige Stelle kopiert.

cd $HOME/src
./binutils-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --disable-nls
make
make install

Ähnlich kompiliert man auch den GCC:

cd $HOME/src
./gcc-x.y.z/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c --without-headers
make all-gcc
make all-target-libgcc
make install-gcc
make install-target-libgcc

Und schon kann man auch auf einem 64-Bit-System für 32-Bit kompilieren.