Nibo Serial Protocol

Aus Nibo Wiki
Wechseln zu: Navigation, Suche

Das Protokoll dient zur Datenübertragung zwischen einem Host-Gerät (Smartphone/PC) und einem NIBO 2 bzw. NIBObee Roboter.

Mögliche Übertragungsmedien:

Die Standarddatenrate beträgt 9600 Baud.

Grundlagen

Es werden reine Textdaten (ASCII) über eine serielle Verbindung übertragen. Die Datenübertragung ist in Transaktionen unterteilt. Eine einzelne Transaktion besteht immer aus eine Anfrage und einer Antwort. Die Anfrage (request) kommt immer vom Host, die Antwort (reply) vom Roboter. Jede Anfrage und jede Antwort bestehen aus einer Zeile, jede Zeile endet mit einem Zeilenumbruch.

Die Transaktionen können in zwei veschiedenen Formaten erfolgen:

  • Terminalmode: Leicht zu lesendes Übertragungsformat, sehr gut geeignet zum experimentieren.
  • Hexmode: Effizentes Übertragungsformat

Das Format gilt jeweils für eine Transaktion. Beginnt die Anfrage mit request wird der Terminalmodus verwendet, beim Hexmodus beginnt die Anfrage mit einem $-Zeichen.

Für die Verwendung des Protokolls reicht es aus den Terminalmodus zu verstehen. Im Terminalmodus wird nur das dezimale Zahlenformat verwendet.

Befehlsübersicht

Eine Zeile mit der Zeichenkette help gibt eine Hilfe aus, welche die Kommandos und die Registerbelegung enthält:

command     short  parameter           function
-------     -----  ---------           --------
help                                   show this help
request            {sequence}          begin decimal request, sequence number is optional
            $      {sequence}          begin hexadecimal request, sequence number is optional
 set        !      {register},{value}  set register with value
 get        ?      {register}          get register data once
 report     #      {register}          report register data always
 unreport   ~      {register}          don't report register data


Register

Die Daten sind in Registern organisiert. Das Register 0 enthält immer die BOT ID,, mit der der Robotertyp indentifiziert werden kann, das Register 1 die Terminal-Version.

Register können entweder nur gelesen werden [r ] oder sie lassen sich sowohl lesen als auch schreiben [rw].


Register NIBO 2

 0: [r ] BOT ID = 0x4e32
 1: [r ] Version
 2: [r ] Supply Voltage [mV]
 3: [rw] red LEDs
 4: [rw] green LEDs
 5: [rw] PWM white LEDs
 6: [rw] Motor Mode 
 7: [rw] Motor PWM L 
 8: [rw] Motor PWM R 
 9: [rw] Motor PID L 
10: [rw] Motor PID R 
11: [r ] Motor current L 
12: [r ] Motor current R 
13: [r ] Odometry L 
14: [r ] Odometry R 
15: [r ] Floor L
16: [r ] Floor R
17: [r ] Line L
18: [r ] Line R
19: [r ] Dist L
20: [r ] Dist FL
21: [r ] Dist F
22: [r ] Dist FR
23: [r ] Dist R

Register NIBObee

 0: [r ] BOT ID = 0x4e62
 1: [r ] Version
 2: [r ] Supply Voltage [mV]
 3: [rw] LEDs
 4: [r ] Sense
 6: [rw] Motor Mode 
 7: [rw] Motor PWM L 
 8: [rw] Motor PWM R 
 9: [rw] Motor PID L 
10: [rw] Motor PID R 
13: [r ] Odometry L 
14: [r ] Odometry R 
16: [r ] Line C
17: [r ] Line L
18: [r ] Line R

Kommandos

Setzen eines Registers:

Beispiel: Die 4 niedrigsten Bits des LED Registers (Register 0) sollen gesetzt werden (Wert binär: 00001111, dezimal: 15 = 8+4+2+1)

Anfrage:
request set 0, 15

Antwort:
reply

Setzen mehrerer Register:

Beispiel: PID links (Register 3) auf 20 Ticks/sec, rechts (Register 4) auf 25 Ticks/sec und den Motor Mode (Register 5) auf 3 setzen

Anfrage:
request set 3, 20 set 4, 25 set 5, 3

Antwort:
reply

Einmalige Abfrage:

Beispiel: Liniensensoren (Register 8, 9 und 10) abfragen (Werte: Links=111, Mitte=104, Rechts=127)

Anfrage:
request get 8 get 9 get 10

Antwort: 
reply set 8, 111 set 9, 104 set 10, 127

Regelmäßige Abfrage:

Die Werte, die zur regelmäßigen Übermittlung markiert sind, werden bei jeder Antwort mitgesendet.

Beispiel: Odometrie links und rechts anfordern (Werte: Links=1514, Rechts=1520)

Anfrage:
request report 6 report 7

Antwort:
reply set 6, 1514 set 7, 1520

Jede weitere Anfrage enthält die Werte:

Anfrage:
request

Antwort: 
reply set 6, 1514 set 7, 1520

Sequenznummern

Jede Anfrage kann mit einer Sequenznummer versehen werden. Die Nummer wird bei der zugehörigen Antwort wiederholt.

Beispiel: Alle LEDs (Register 0) sollen ausgeschaltet werden, Sequenznummer 33

Anfrage:
request 33 set 0, 0

Antwort:
reply 33

Hexmodus

Im Hexmodus werden die Daten effizienter übertragen. Im Prinzip entspricht die Übertragung dem Terminalmodus. Alle Schlüsselwörter werden durch ihre Kurzform ersetzt, aus request und reply wird ein einzelnes $-Zeichen, aus get ein ?-Zeichen. Zusätzlich entfallen alle Leerzeichen. Die Zahlen werden im hexadezimalen Format übertragen, statt der Dezimalzahl 200 wird die hexadezimale Zahl c8 übertragen.

Als Beispiel die regelmäßige Abfrage der Odometriewerte mit Sequenznummern:

Terminalmode                                 Hexmode
============                                 =======
request 9 report 6 report 7          -->     $9#6#7
reply 9 set 6, 1514 set 7, 1520      -->     $9!6,5ea!7,5f0
request 10                           -->     $a
reply 10 set 6, 1514 set 7, 1520     -->     $a!6,5ea!7,5f0
request 11                           -->     $b
reply 11 set 6, 1514 set 7, 1520     -->     $b!6,5ea!7,5f0

Links