Skip to content

Instantly share code, notes, and snippets.

@duk3luk3
Last active August 29, 2015 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save duk3luk3/4390d4735ec84a222b86 to your computer and use it in GitHub Desktop.
Save duk3luk3/4390d4735ec84a222b86 to your computer and use it in GitHub Desktop.
ELi15 Kommunikation
/**
* Bluetooth-Protokoll
*
* Über den UART-Kanal werden die untenstehenden structs direkt verschickt.
* Die Sequenznummer in BTUpdateMessage wird von 0 bis 65535 inkrementiert und rollt dann zu 0 zurück und wird damit nie negativ.
* Auch die restlichen Felder dürfen nicht negativ werden.
* Der Empfänger prüft die Sequenznummer und die Felder um die Integrität der Nachricht sicherzustellen.
**/
typedef struct {
uint16_t laps; /* Anzahl Runden */
uint16_t lap_length; /* Rundenstrecke */
uint16_t time_available; /* Gesamtzeit (Sekunden) */
} BTSettingsMessage;
typedef struct {
int16_t seq; /* Sequenznummer */
int16_t time_elapsed; /* Verstrichene Zeit (Sekunden) */
int16_t distance; /* Gefahrene Strecke (Meter) */
int16_t current_speed; /* Geschwindigkeit-Ist (Meter / h) */
int16_t current_current; /* Fahrstrom-Ist (Dezi-Ampere) */
} BTUpdateMessage;

ELi15 Kommunikationssysteme

  • CAN: Motorcontroller <-> Stromcontroller <-> Displaycontroller
  • Bluetooth-UART: Display-Controller -> Handy

CAN

Byte-Order in CAN-Datenfeldern ist little-endian.

Displaycontroller

ID: 0x01xx

Sendet:

Der Displaycontroller liest die Buttons aus und bestimmt daraus die Sollgeschwindigkeit etc.

Inputs:

  • Totmannschalter
  • Start-Button
  • Hupe-Button
  • Schneller-Button
  • Langsamer-Button
  • Bremssensor

Interner Zustand von eigenen Inputs:

  • Totmannschalter geschlossen / offen
  • Hupe an/aus
  • Motor an/aus
  • Fahrstrom / Geschwindigkeit Sollwert
  • Vergangene Zeit seit Start des Rennens

Interner Zustand von externen Inputs (per CAN):

  • Geschwindigkeit Ist (vom Motorcontroller)
  • Fahrstrom Ist (vom Motorcontroller)
  • Gefahrene Strecke (vom Motorcontroller)
  • Notaus gezogen / nicht gezogen (vom Stromverteiler)
  • Strom- und Spannungswerte (vom Stromverteiler)

Nachricht 0x0101

  • Byte 0+1: Geschwindigkeit-Soll (in Meter / h oder Dezi-Ampere je nach Modus, signed 16-bit integer)
  • Byte 7: Status-Flags (Horn-Flag, Totmann-Flag, TimeRunning-Flag, Speedmodus / Strommodus im Motor-Flag 1)

Motorcontroller

ID: 0x02xx

Sendet:

Der Motorcontroller überwacht die Fahrstrom-Spannung, berechnet die aktuelle Radgeschwindigkeit aus dem Rad-Geschwindigkeitssensor, und berechnet die zurückgelegte Distanz aus der Anzahl der gemessenen Radumdrehungen. Diese Daten werden alle 200ms gesendet.

Nachricht 0x0201:

  • Byte 0+1: Eingangsspannung (Dezi-Volt, unsigned 16-bit integer)
  • Byte 2+3: Geschwindigkeit-Ist (Meter / h, unsigned 16-bit integer)
  • Byte 4+5: Gefahrene Distanz (Meter, unsigned 16-bit integer)

Stromcontroller

ID: 0x03xx

Sendet:

Der Stromcontroller überwacht Spannung und Strom im 48V und 12V Kreis sowie den Notaus-Zustand. Er sendet alle 200ms zwei Nachrichten, eine mit der Spannung (CurrentBit nicht gesetzt) und eine mit dem Strom.

Inputs (an Controller)

  • Stromsensor 48V-Gesamt
  • Stromsensor 12V-Schiene
  • Stromsensor 48V-Output (Motorcontroller)
  • Stromsensor PV
  • Spannungssensor 48V
  • Spannungssensor 12V
  • Notaus

Interner Zustand von eigenen Inputs:

  • ...

Interner Zustand von externen Inputs (per CAN):

  • Motorcontroller an/aus

Nachricht 0x0301

  • Byte 0+1: Spannung 48V (Dezi-Volt, unsigned 16-bit integer)
  • Byte 2+3: Spannung 12V (Dezi-Volt, unsigned 16-bit integer)
  • Byte 7: Statusflags (Notaus-Flag, Strom/Spannung-Flag)

Nachricht 0x0302

  • Byte 0+1: Strom 48V (Dezi-Ampere, unsigned 16-bit integer)
  • Byte 2+3: Strom 12V (Dezi-Ampere, unsigned 16-bit integer)
  • Byte 4+5: Strom PV (Dezi-Ampere)
  • Byte 7: Statusflags (Notaus-Flag, Strom/Spannung-Flag)

Bluetooth

Handy

Das Handy sendet an den Displaycontroller einmalig nach Aufbau der Verbindung:

  • Rundenzahl
  • Rundenstrecken
  • Gesamtzeit

(Der Displaycontroller benutzt für diese Parameter zunächst hardcoded Default-Werte; falls eine SD-Karte eingesteckt ist liest er die Parameter von dieser; falls das Handy verbunden ist, aus der Bluetooth-Kommunikation)

Displaycontroller

Der Displaycontroller sendet an das Handy:

  • Zeit seit Start (in Sekunden)
  • Zurückgelegte Strecke (In Meter)
  • Geschwindigkeit-Ist (In Meter / h)
  • Energieverbrauch (Strom der an den Motorcontroller geht, in Dezi-Ampere)

Das Protokoll dazu sollte so aussehen:

  • Displaycontroller startet
  • Displaycontroller versucht Bluetooth-Verbindung herzustellen
  • Handy schreibt Configdaten als 3 16-bit Unsigned Integers
  • Displaycontroller liest - falls keine Bluetooth-Verbindung vorhanden ist, wird Config von SD-Karte oder aus Default-Wert gelesen
  • Falls Bluetooth-Verbindung vorhanden ist, schreibt Controller alle 100ms die Daten als signed (!) Integers, mit einer Sequenznummer am Anfang.
  • Bei einem Fehler in der Kommunikation versucht das Handy die Bluetooth-Verbindung neu herzustellen
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment