Du bist hier:Start»Projekte»SmartHome»Fernbedienung

Fernbedienung für den Rasperry Pi

18.02.2018

Fernbedienung

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).

Raspberry Pi mit nRF24L01+ und Fernbedienung FUT007

Raspberry Pi mit nRF24L01+ und Fernbedienung FUT007 (zum Vergrößern klicken)

Das folgende Bild zeigt, wie die Funkchips am Raspberry Pi verkabelt werden müssen.

Raspberry Pi mit zwei Funkchips nRF24L01+

Raspberry Pi mit zwei Funkchips nRF24L01+ (zum Vergrößern klicken)

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.

# on the Raspberry Pi

# 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

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.

# on the Raspberry Pi in the directory remote_control
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.

#!/usr/bin/expect -f

# 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:

Kommentar schreiben

Ihre Daten werden verschlüsselt übertragen. Der Kommentar wird gelesen und eventuell veröffentlicht.
Wenn der Inhalt des Kommentars oder Teile des Kommentars nicht veröffentlicht werden, dann werden die gespeicherten Daten nach maximal 4 Wochen gelöscht. Um zukünftigen Missbrauch der Kommentarfunktion zu verhindern, werden die zum Kommentar gehörenden IP Adressen maximal 4 Wochen gespeichert.