Fernbedienung für den Rasperry Pi
18.02.2018

2017 habe ich Fernbedienungen vorgestellt, die auf der Frequenz 433 MHz funken. Wenn sich die Fernbedienung im selben Raum wie der Kleincomputer Raspberry Pi befindet, dann können die Signale bei 433 MHz (Megahertz) ganz gut am Raspberry empfangen werden. Durch mehrere Betonwände hindurch sind 433 MHz jedoch schwierig. Deshalb habe ich mich nach einer Alternative umgesehen. Im Jahr 2015 hatte ich den Funkchip "nRF24L01+" zur Steuerung von Funk LEDs benutzt. Dieser Funkchip kann mit der Fernbedienung der Milight LEDs auch als Fernsteuerung für den Raspberry Pi benutzt werden.
Hardware
Die Fernbedienung der LED von Milight funkt auf der Frequenz 2.4 GHz (Gigahertz) und funkt auch durch Betonwände relativ gut. Es gibt Fernbedienungen für RGB LEDs (Rot,Grün,Blau) mit der Bezeichnung FUT095 und FUT096. Außerdem gibt es noch die Fernbedienungen für die kalt-weißen LEDs mit der Bezeichnung FUT006 und FUT007. Als Fernbedienung für den Raspberry Pi bevorzuge ich die FUT007, da sie fühlbare Tasten hat und auch in der Dunkelheit gut bedienbar ist. Über Amazon gibt es die Fernbedienung Milight FUT007 für etwa 10 Euro zuzüglich Versandkosten (Stand Februar 2018). Die Bezeichnung "FUT007" bringt aber nicht bei allen Suchmaschinen gute Ergebnisse. Dann helfen Suchanfragen, wie zum Beispiel "Fernbedienung Milight" weiter. Außerdem gibt es noch den Wandhalter Milight FUT099 für etwa 6 Euro inklusive Versandkosten. Hier eine kleine Liste mit möglicher Hardware:
- FUT006 Fernbedienung mit Tasten und Drehrad
- FUT007 Fernbedienung mit Tasten ohne Drehrad (etwa 10 Euro + Versand + Batterien)
- FUT095 Fernbedienung mit Tasten für RGB LED
- FUT096 Fernbedienung ohne Tasten für RGB LED (die Standard-Fernbedienung)
- FUT099 Wandhalter für die oberen Fernbedienungen (etwa 6 Euro inkl. Versand)
Zum Empfang der Funkdaten auf 2,4 GHz am Raspberry Pi wird (mindestens) ein Funkchip nRF24L01+ benötigt. Auf Ebay gab es zwei Funkchips nRF24L01+ für etwa 5 Euro (Stand 2018). Aus China mit Wartezeit gibt es den Chip noch günstiger. Die Funkchips werden am Raspberry Pi mit Jumper Wires angeschlossen (Female zu Female).
Das folgende Bild zeigt, wie die Funkchips am Raspberry Pi verkabelt werden müssen.
Das obere Bild ist mit der Layout-Software Fritzing erstellt. This image was created with Fritzing.
Ich habe zwei Funkchips nRF24L01+ an meinem Raspberry Pi 2 angeschlossen. Die Chips kommunizieren über das Serial Peripheral Interface (SPI) mit dem Raspberry Pi. Am Raspberry Pi 2 sind zwei SPI-Schnittstellen vorgesehen. Durch das Bus-Protokoll von SPI ließen sich theoretisch auch noch weitere Chips benutzen. Aber die zwei Chips reichen mir. Ein Chip schaltet meine LEDs, der andere Chip empfängt die Funkdaten der Fernbedienung.
Die folgende Webseite stellt die Pins des Raspberry Pi für SPI ganz gut dar: https://pinout.xyz/pinout/spi. Ich hoffe aber, dass meine Zeichnung und die folgenden Tabellen zur Erklärung der Verkabelung ausreichen.
Verkabelung für die Schnittstelle SPI0
Leitung | Kabelfarbe | Pin beim Raspberry Pi 2 | Pin beim Funkchip nRF24L01+ |
3,3 Volt | rot | 1 | 2 |
GND (Ground / Erdung) | schwarz | 6 | 1 |
MOSI (Master Output Slave Input) | blau | 19 | 6 |
MISO (Master Input Slave Output) | braun | 21 | 7 |
CE (chip enable bzw. slave select) | gelb | 22 | 3 |
SCLK (serial clock) | violett | 23 | 5 |
CSN (chip select not) | orange | 24 | 4 |
Verkabelung für die Schnittstelle SPI1
Leitung | Kabelfarbe | Pin beim Raspberry Pi 2 | Pin beim Funkchip nRF24L01+ |
3,3 Volt | rot | 17 | 2 |
GND (Ground / Erdung) | schwarz | 39 | 1 |
MOSI (Master Output Slave Input) | blau | 38 | 6 |
MISO (Master Input Slave Output) | braun | 35 | 7 |
CE (chip enable bzw. slave select) | gelb | 36 | 3 |
SCLK (serial clock) | violett | 40 | 5 |
CSN (chip select not) | orange | 37 | 4 |
Source Code
Mein Quellcode zum Empfangen der Funkdaten basiert auf der Openmili-Software von Henryk Plötz. Allerdings habe ich einen Teil des Ballasts rausgeworfen und den Quellcode in eine Datei mit etwa 100 Zeilen zusammengefaßt.
Außerdem mußte ich noch die Programmierbibliothek RF24 des Raspberry Pi erweitern, da sie nur die Schnittstelle SPI0 zur Verfügung stellt, aber ich zusätzlich noch SPI1 über die RF24 Bibliothek ansprechen wollte. Getestet habe ich den Quellcode auf einem Raspberry Pi 2 mit dem Betriebssystem Raspbian Jessie. Es sollten auch andere Hardware-Versionen des Raspberry und neuere Betriebssysteme funktionieren.
# enable SPI in raspi-config - Advanced Options - SPI
# in newer versions of Raspbian it is under: "Interfacing Options" - SPI
sudo raspi-config
# edit the boot file as super user: /boot/config.txt
sudo bash
echo "dtoverlay=spi1-1cs,cs0_pin=36" >> /boot/config.txt
# if you need more devices use: "dtoverlay=spi1-3cs,cs0_pin=36"
# reboot the pi
reboot
# after the reboot the relevant kernel module should be loaded
lsmod | grep spi
# should list: spi_bcm2835 and spi_bcm2835aux
mkdir ~/remote_control
cd ~/remote_control
# get the RF24 library with SPI1 for the Raspberry Pi
wget https://www.torsten-traenkner.de/projects/smarthome/remote_control/librf24-bcm-spi1.tgz
tar xzvf librf24-bcm-spi1.tgz
cd librf24-bcm-spi1
# the Makefile contains the correct memory address for Raspberry Pi 2 0x3F000000
# on a Raspberry Pi 1 or Raspberry Pi Zero W use 0x20000000
# sed -i 's|BCM2835_PERI_BASE=0x.*|BCM2835_PERI_BASE=0x20000000|g' Makefile
# build the RF24 library for SPI0 and SPI1
make
# update 2024 for Raspbian Debian 12 bookworm: # if the compiler complains about the compiler flags update the Makefile
# wget https://www.torsten-traenkner.de/projects/smarthome/remote_control/Makefile
# install the libraries on the Raspberry Pi
sudo make install
# download the receiver for the milight remote
cd ~/remote_control
wget https://www.torsten-traenkner.de/projects/smarthome/remote_control/milight_receive.cpp
# compile the version that you want:
g++ -Wall -D RGB -D SPI1 milight_receive.cpp -o milight_rgb_spi1 -lrf24-bcm-spi1
g++ -Wall -D WHITE -D SPI1 milight_receive.cpp -o milight_white_spi1 -lrf24-bcm-spi1
g++ -Wall -D RGB -D SPI0 milight_receive.cpp -o milight_rgb_spi0 -lrf24-bcm
g++ -Wall -D WHITE -D SPI0 milight_receive.cpp -o milight_white_spi0 -lrf24-bcm
# run as root
sudo bash
# e.g. the remote for white LEDs (FUT007) on SPI1
./milight_white_spi1
Den Quellcode habe ich auf meinem Raspberry Pi 2 getestet. Die Anleitung sollte jedoch ebenfalls für einen Raspberry Pi 3 funktionieren. Außerdem konnte ich den Quellcode auch auf dem Raspberry Pi Zero W (WiFi) erfolgreich zum Laufen bringen. Da der Raspberry Pi Zero W aber nur 500 MB Arbeitsspeicher hat, muss die Speicheradresse BCM2835_PERI_BASE auf 0x20000000 über das oben beschriebene sed-Kommando gesetzt werden.
Update 2024: Nach 6 Jahren Benutzung kamen aus einem Funkchip nRF24L01 nur unsinnige Daten raus. Die Hardware war defekt und nach einem Wechsel des Funkchips funktioniert wieder alles.
Benutzung
Der obere Quellcode kann zum Beispiel in einem expect-Skript benutzt werden. In dem expect-Skript werden die Tastencodes der Fernbedienung mit Aktionen verbunden. In folgendem Bild sind die hexadezimalen Tastencodes zu sehen:

Milight Fernbedienung FUT007 mit Codes
Hexadezimaler Wert | Taste |
0x02 / 0x12 | 4 einschalten |
0x03 / 0x13 | 2 ausschalten |
0x04 / 0x14 | Rad unten |
0x05 / 0x15 | alle einschalten |
0x06 / 0x16 | 4 ausschalten |
0x07 / 0x17 | 3 einschalten |
0x08 / 0x18 | 1 einschalten |
0x09 / 0x19 | alle ausschalten |
0x0A / 0x1A | 3 ausschalten |
0x0B / 0x1B | 1 ausschalten |
0x0C / 0x1C | Rad oben |
0x0D / 0x1D | 2 einschalten |
0x0E / 0x1E | Rad links |
0x0F / 0x1F | Rad rechts |
Als Beispiel habe ich ein generisches Expect-Skript geschrieben, das mit der Nummer der Fernbedienung und mit konkreten Aktionen erweitert werden kann.
cd ~/remote_control
# get the expect script
wget https://www.torsten-traenkner.de/projects/smarthome/remote_control/receive_milight_white_spi1_test.exp
chmod 755 receive_milight_white_spi1_test.exp
# run as root
sudo bash
./receive_milight_white_spi1_test.exp
# now you can press keys
spawn ./milight_white_spi1
Packet received: 07 5A 12 34 01 08 4E E0
# | | | | /
# | / | sequence number
# 2 byte ID pressed key
Received button 1 on
Packet received: 07 5A 12 34 01 0B 4F E4
Received button 1 off
Expect Skript anpassen
In folgendem Beispiel habe ich die Nummer 1234 der Fernbedienung und als Aktion das Einschalten bzw. Ausschalten der roten Power-LED am Raspberry Pi 2 eingetragen.
# start receiver for milight remote
spawn ./milight_white_spi1
while {1} {
expect {
-re "Packet received: .. .. 12 34 .. .8"
{
puts "\nReceived button 1 on\n";
exec echo 1 >/sys/class/leds/led1/brightness
}
-re "Packet received: .. .. 12 34 .. .B"
{
puts "\nReceived button 1 off\n";
exec echo 0 >/sys/class/leds/led1/brightness
}
}
}
Fazit
Während die Fernbedienung mit 433 MHz im selben Raum wie der Raspberry Pi ganz gut funktioniert, hat die Fernbedienung von Milight eine höhere Reichweite. Die Fernbedienung sendet wegen der 2,4 GHz und der höheren Signalstärke auch 10 Meter durch mehrere Wände zuverlässig hindurch. Die Kosten von 10 Euro für eine Milight Fernbedienung sind aus meiner Sicht auch in Ordnung und günstiger als manch andere Fernbedienung. Ich benutze die Fernbedienung unter anderem um meine Rollos hoch und runter zu fahren.
Kleine Warnung am Schluss: Da ich den Quellcode relativ schnell zusammengehackt habe und noch keinen Langzeittest hinter mir habe, kann die Software noch Fehler enthalten. Es empfiehlt sich eine Schleife um das Expect-Skript zu schreiben. Falls das Programm abstürzt, dann wird es automatisch neu gestartet.
Falls noch etwas unklar sein sollte, dann schreib einen Kommentar: