CarPi: Anschluss der Rückfahrkamera
Wenn man schon einen Monitor (und erst recht mit einem angeschlossenen Rechner) in ein Auto einbaut, liegt doch der Einsatzzweck nahe, dass man auch eine Rückfahrkamera einbaut, sofern sie nicht bereits schon im Auto verbaut ist.
Das von mir verwendete Display hat mehrere Video-Eingänge, so auch einen Cinch-Video-Eingang. Eine Kamera mit einem solchen Ausgang habe ich auch gefunden.
Die Betriebsspannung für die Kamera wird an die Spannungsversorgung für das Rückfahrlicht angeschlossen, damit die Kamera nur in Betrieb ist, wenn auch der Rückwärtsgang eingelegt ist. Zusätzlich hat die Kamera noch zwei Schaltleitungen, die Spannung führen, wenn auch die Kamera mit Spannung versorgt ist. Diese Leitungen verwende ich, um das Display automatisch umzuschalten bzw. den Eingangskanal automatisch zu wechseln. Bei dem Pollin-Display ist ein Board mit physischen Buttons dabei, die gedrückt werden müssen, damit der Kanalwechsel ausgeführt wird. Um z. B. von HDMI auf FBAS zu wechseln, muss der Select
-Button 3 mal gedrückt werden. Dieses Button-Board habe ich aber bei meinem Radio innen verbaut, das bedeutet, dass ich nicht mehr an die Buttons heran komme. Ich habe den Select
-Button nach außen neben das Display geführt (in dem entsprechenden Beitrag zu sehen), aber trotzdem will ich nicht per Hand den Kanal wechseln müssen, wenn ich den Rückwärtsgang einlege. Aus diesem Grund wollte ich zusätzlich noch eine Umschaltung per Software ermöglichen.
Hardware
Realisiert sind die Knöpfe auf dem Board über verschiedene Widerstände, die beim Drücken der Buttons die anliegende Spannung nach unten ziehen. Ein einfaches Spannung anlegen (z. B. über einen GPIO-Pin) ist also nicht möglich. Also muss ein elektrischer Schalter her, den ich per Software schalten kann. Am einfachsten wird das über einen Transistor realisiert. Ich nutze dafür den NPN-Transistor BC548B. An dessen Basis wird über einen Widerstand ein freier GPIO-Pin angeschlossen. Der Kollektor wird an SAR1
des Button-Boards angeschlossen, der Emitter an GND
.
Damit ich noch ermitteln kann, ob die Kamera eingeschaltet, d. h. der Rückwärtsgang eingelegt ist, muss ich das entsprechende Signal abgreifen. Dieses beträgt ja im Autospannungsnetz 12 Volt. Für die GPIO-Pins des Raspberry Pi is das aber bei Weitem zu viel. Aus diesem Grund nutze ich einen entsprechenden DC/DC-Wandler, der die 12 Volt auf 3,3 Volt herunterregelt. Der positive Ausgang wird dabei an einen freien GPIO-Pin angeschlossen.
Software
Nachdem die Vorbereitung abgeschlossen ist, habe ich ein Python-Skript geschrieben, das beim Systemstart ausgeführt wird.
import time
import RPi.GPIO as GPIO
HIGH = 1
LOW = 0
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(21, GPIO.OUT)
lastState = not GPIO.input(26)
def switch():
for i in xrange(3):
GPIO.output(21, GPIO.HIGH)
time.sleep(.2)
GPIO.output(21, GPIO.LOW)
time.sleep(.2)
try:
while 1:
# reverse gear and showing kodi
if GPIO.input(26) and lastState:
switch()
lastState = LOW
# forward gear and showing reverse cam
if not GPIO.input(26) and not lastState:
switch()
lastState = HIGH
time.sleep(.5)
finally:
GPIO.cleanup()
Das Skript konfiguriert GPIO26 (Pin 37) als Eingang mit aktiviertem Pulldown-Widerstand. Der GPIO21 (Pin 40) dient als Ausgang und dabei als Verbindung zum Transistor.
Am Beginn wird der Status lastState
auf den negierten Wert des GPIO26 gesetzt. Wenn der Rückwärtsgang eingelegt ist, hat GPIO26 den Wert HIGH
, lastState
ist dann also LOW
. Ist der Rückwärtsgang nicht eingelegt, kehren sich die Werte entsprechend um.
In der Schleife wird geprüft, ob der Rückwärtsgang eingelegt ist und zusätzlich derzeit Kodi angezeigt wird (GPIO.input(26) and lastState
). Ist das der Fall, wird die Funktion switch
aufgerufen, die 3 mal hintereinander HIGH
und LOW
sendet, das das Drücken auf den Button simuliert. Außerdem wird nun lastState
auf LOW
gesetzt, was bedeutet, dass das Bild der Kamera angezeigt wird.
Das andere Umschalten erfolgt, wenn der Rückwärtsgang herausgenommen wird und vorher das Kamerabild gezeigt wurde.