Der Kettler-Hack


Heimtrainer sind langweilig. Daher suche ich auch jede Gelegenheit, mich bei schönem Wetter lieber draußen zu betätigen. Um wenigstens etwas Outdoor-Feeling bei schlechtem Wetter in den Keller zu bringen, kam mir die Idee, einen "First Person View"-Film beim Radeln auf dem Ergometer ablaufen zu lassen. Richtig realistisch wird das aber erst, wenn die Filmgeschwindigkeit auch proportional zur Tretdrehzahl ist.
Eine Mikrocontroller-Lösung muss also her...

Bild "KettlerHack_Uebersicht.jpg"

Natürlich erfordert das auch eine feste Anbringung des Bildschirms. In meinem Fall musste ein alter Laptop dazu herhalten. Das alte Windows-XP Teil ist so ziemlich für alles zu langsam, ein Video spielt er aber dennoch flüssig genug ab.

Die Hardware

Mein Ergometer (Kettler Golf-E) verfügt über eine RS232 Schnittstelle, die eine spezielle Trainingssoftware von Kettler mit Daten versorgen können sollte. Allerdings lies sich diese auch mit allen möglichen Tricks nicht dazu bewegen irgend ein aktives Signal auszugeben. Also habe ich mir lediglich das Signal herausgesucht, das die Drehzahl darstellt, um dann einen Mikrocontroller den Rest der Arbeit erledigen zu lassen.
Vorteile:

Das Signal fand sich schnell auf der Platine mittels Oszilloskop (siehe Pfeil im Bild rechts).

Bild "KettlerHack_Werkstatt.jpg" Bild "KettlerHack_OffenDetail.jpg"

Bei meinem Ergometer wird pro Umdrehung der Schwungscheibe ein Puls erzeugt, bei dem das Signal für ca. 5ms von 5V auf 0V springt. Die Aufgabe des Mikrocontrollers ist simpel. Es muss lediglich der Abstand zwischen zwei Pulsen gemessen werden und per RS232-Schnittstelle an den PC gesendet werden.
Hier wäre ein kompletter Arduino verschwendet mit seinen vielen Steckern. Eine Spannungsversorgung per USB-Schnittstelle ist hier auch nicht nötig, da das Ergometer die 5V zur Verfügung stellt. Also griff ich wieder einmal zum Selbstbau wie hier beschrieben: Arduino.
So konnte auch gleich eine Stiftleiste eingebaut werden, die zum vorhandenen Pfostenstecker der (nicht funktionierenden) PC-Schnittstelle des Fahrrads passt.

Bild "KettlerHack_Arduino.jpg"

Kettler war so nett, dass Gehäuse der Bordcomputers so groß auszulegen, dass die zusätzliche Platine bequem darin Platz fand.

Bild "KettlerHack_Offen.jpg"

Die 5V Versorgung ließ sich am einfachsten an einem TTL IC auf der Platine abgreifen, das Groundlevel findet sich auf der großen Ground-Plane der Platine.

Bild "KettlerHack_Verdrahtung.jpg"

Der gesamte Aufbau der Schaltung sieht dann so aus:

Bild "KettlerHack_Blockschaltbild.png"

Die Software

Zum Anzeigen der Videos habe ich VLC verwendet (http://www.videolan.org/vlc/. Der lässt sich per Tastendruck in 10%-Schritten schneller oder langsamer machen. So kann man einen Film vom Stillstand über extreme Zeitlupe über Normalgeschwindigkeit bis zu mehrfacher Normalgeschwindigkeit abspielen. Das brauchen wir, um die Fahrgeschwindigkeit zu simulieren.
Da das vom PC basiert auf den empfangenen Geschwindigkeitsdaten gemacht werden soll, nutze ich hier die remote Schnittstelle, die VLC zur Verfügung stellt.

Dazu muss VLC per Command-line so gestartet werden:

vlc video.mp4  --intf rc --rc-host 127.0.0.1:1234

Dadurch startet das Video in einem Fenster ohne Menü.
--intf rc  gibt an, dass sich VLC durch eine Telnet Verbindung steuern lässt.
--rc-host  weist VLC an, auf der IP-Adresse 127.0.0.1 unter dem Port 1234 ansprechbar zu sein.

Meine bevorzugte Programmiersprache für grafische Programme auf dem PC ist Processing (http://processing.org).
Auch hier passt das prima, weil sich so ein einfacher grafischer Tacho auf dem Bildschirm ausgeben lässt. Die Telnet-Verbindung zu VLC implementiert man in Processing so:

import processing.net.*;
Client client;

void setup(){
  size(200, 200);
  client = new Client(this, "127.0.0.1", 1234);
}

void draw() {
}

void keyPressed()
{
  if (key == 'p')
  {
    client.write("pause" +"\r\n");
    client.clear();
  } 

In diesem einfachen Beispiel öffnet sich ein kleines Fenster auf dem Bildschirm. Ist das Fenster selektiert, dann löst man mit der Taste "p" einen Pause-Befehl aus. Das Video bleibt stehen.
Man kann auch jeden Hotkey von VLC auslösen.
Um das Video um 10% schneller bzw. langsamer zu machen habe ich diese Befehle verwendet:
    client.write("key key-rate-faster-fine" +"\r\n");
    client.write("key key-rate-slower-fine" +"\r\n");


Leider gibt es keine Möglichkeit die Abspielgeschwindigkeit als absolute Größe anzugeben. Daher stelle ich am Anfang die Geschwindigkeit auf "Normal" und setzte sie dann schrittweise auf 0% zurück.
Die PC-Software gleicht sie dann immer sukzessive an die gefahrene Geschwindigkeit an. Das funktioniert genauso, wie ein I-Regler.
Der Einfachheit halber gibt der Arduino die Periodendauer als Byte zurück. Somit kann diese zwischen 0 und 255 liegen.
Erst auf dem PC wird diese dann per 5000/Periode auf eine Frequenz bzw, Geschwindigkeit gerechnet, weil der PC schneller rechnet als der Mikrocontroller. Die 5000 im Zähler sorgt dafür, dass eine sinnvolle Integer-Zahl dabei herauskommt.  

Hier gibt es den Code (derzeit noch sehr rudimentär):
Arduino-Sketch: KettlerArduino.ino
PC-Sketch:  KettlerVLC.pde

Derzeit muss man zuerst noch manuell den VLC aus der Command line starten. Das sollte natürlich noch automatisiert werden.

Filme bekommt man am einfachsten aus YouTube. Jede Menge Radfahrer schnallen sich eine Helmkamera an und filmen ihre Radfahrten. So kann man selber wählen, ob man über einen Alpenkamm fahren will oder einfach durch ein Waldstück in der Pfalz.
Man sollte aber nach Videos suchen, bei der der Fahrer wenig bis gar nicht den Kopf dreht und möglichst mit gleichmäßiger Geschwindigkeit fährt.

Bild "KettlerHack_Bildschirm.jpg"

Und wie so oft konnte ich mir nicht verkneifen, einen Artikel in meiner Lieblingszeitschrift meines Lieblingsverlags darüber zu schreiben...

Bild "KettlerHack_MakeTitel.png"

Das Heft kann man hier bestellen.