Nibo Serial Protocol
Das Protokoll dient zur Datenübertragung zwischen einem Host-Gerät (Smartphone/PC) und einem NIBO 2 bzw. NIBObee Roboter.
Mögliche Übertragungsmedien:
- Bluetooth: NIBObee mit Blue-Modul in Verbindung mit einem Android Gerät (oder einer anderen Gegenstation)
- Raspberry Pi: Übertragung mit dem NIBObee/Berry
- XBee-Modul in Verbindung mit NXB2 und UCOM-XBEE
- 6 poliges Programmierkabel zwischen NIBO 2 und UCOM-IR2-X
Die Standarddatenrate beträgt 9600 Baud.
Inhaltsverzeichnis
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
- NIBO2 - Terminal Terminalfirmware für den NIBO 2
- NIBObee - Terminal Terminalfirmware für den NIBObee