-
Notifications
You must be signed in to change notification settings - Fork 5
BT Communication Structure
Nerdboy_Q edited this page Feb 3, 2021
·
4 revisions
- A byte is usually represented in hexadecimal format, or Hex for short.
- Hex numeral system is the base 16 representation of number values.
- It is called base 16 as it is represented in a range of 16 Values: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
Integer | Hex | Binary |
---|---|---|
0 | 0 | 0000 |
1 | 1 | 0001 |
2 | 2 | 0010 |
3 | 3 | 0011 |
4 | 4 | 0100 |
5 | 5 | 0101 |
6 | 6 | 0110 |
7 | 7 | 0111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
10 | A | 1010 |
11 | B | 1011 |
12 | C | 1100 |
13 | D | 1101 |
14 | E | 1110 |
15 | F | 1111 |
- As opposed to binary, which is base 2, as it represented with two values: 1 or 0
- Bytes are generally represented as a pair of 4 bit arrays with the prefix "0x" : i.e. 0xFA = 1111 1010
NOTE : 8 bits is referred to as a byte, and 4 bits is referred to as a nibble.
All messages will be 8 bytes long
-
"Request" will be used to refer to messages sent from the Pi
- The status byte will just be empty in requests
-
"Response" will be used to refer to messages sent from the Arduino
-
The status byte in the response will help with error messaging:
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 byte0 error byte1 error byte2 error byte4 error byte5 error byte6 error byte7 error Fail (1)/Success(0)
-
Example : [FA,8A,00,00,00,00,00,00]
Description | [byte 0] | [byte 1] | [byte 2] | [byte 3] | [byte 4] | [byte 5] | [byte 6] | [byte 7] |
---|---|---|---|---|---|---|---|---|
sanity bt | Command | Dummy | Dummy | Dummy | Dummy | Dummy | Reserve | Status |
sanity servo | Command | Dummy | Dummy | Dummy | Dummy | Dummy | Reserve | Status |
sanity sensor | Command | Dummy | Dummy | Dummy | Dummy | Dummy | Reserve | Status |
sanity servo/sensor | Command | Dummy | Dummy | Dummy | Dummy | Dummy | Reserve | Status |
sanity PID | Command | Dummy | Dummy | Dummy | Dummy | Dummy | Reserve | Status |
Run PID controller | Command | Constants Multiplier | Balance Set point | Kp | Ki | Kd | Reserve | Status |
- bit7 : test type flag [1 = sanity check, 0 = regular PID run]
- bit5 & bit 4 : test type
bit5 | bit4 | sanity check |
---|---|---|
0 | 0 | BT Echo |
0 | 1 | Servo Position |
1 | 0 | Sensor Read |
1 | 1 | Tilt & measure |
Sero Position
- bit3, bit2, bit1, bit0 : Servo Target Angle
bit3 | bit2 | bit1 | bit0 | angle |
---|---|---|---|---|
1 | 1 | 0 | 0 | 180 |
1 | 0 | 0 | 0 | 150 |
0 | 1 | 0 | 0 | 120 |
0 | 0 | 0 | 0 | 90 |
0 | 0 | 0 | 1 | 60 |
0 | 0 | 1 | 0 | 30 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 1 | 0 | sweep |
Tilt & Measure
- bit3 Tile direction [1 = full left tilt, 0 = full right tilt]
- bit2, bit1, bit0
bit3 | bit2 | bit1 | wait time |
---|---|---|---|
0 | 0 | 1 | 5s |
0 | 1 | 0 | 10s |
1 | 0 | 0 | 15s |
Hex | Binary | Test Type | Action | LED | Details |
---|---|---|---|---|---|
0x8X | 1000XXXX | BT Echo | Blue LED on Arduino should blink | Blue | the last 4 bits can be anything |
0x9B | 10011100 | Adjust Servo | Servo Tilts Left | Both | |
0x96 | 10010110 | Adjust Servo | Servo Centers | Both | |
0x93 | 10010011 | Adjust Servo | Servo Tilts Right | Both | |
0x99 | 10001001 | Adjust Servo | Servo should loop left tilt->center->right tilt twice | Both | |
0xAX | 1100XXXX | Read Sensor | Sensor reading is made | Yellow | the last 4 bits can be anything |
The upper nibble is to trigger a PID command [bits 4-7]
The lower nibble is to set the start position of the balance beam [bits 0-3]
Hex | Binary | Start Position | Action | LED | Details |
---|---|---|---|---|---|
0x4A | 01001100 | full left | PID Controller Starts tilted left | Blue | Kp, Ki, & Kd values required |
0x46 | 01000110 | centered | PID Controller Starts centered | Blue | Kp, Ki, & Kd values required |
0x43 | 01000011 | full right | PID Controller Starts tilted right | Blue | Kp, Ki, & Kd values required |
The upper nibble represents which constants to multiply by [bits 4-7]
The lower nibble represents where to move the decimal place [bits 0-3]
HEX | Binary | Constants to Multiply | Decimal place position | Example Input (pi) | Expected Output (Arduino) |
---|---|---|---|---|---|
0x0E | 00001110 | Null/Default | Null/Default | [125,125,125] | [125,125,125] |
0x1E | 00011110 | Kd | Null/Default | [125,125,125] | [125,125,125] |
0x2D | 00101101 | Ki | 1 to the left | [125,125,125] | [125,12.5,125] |
0x3B | 00111011 | Ki & Kd | 2 to the left | [125,125,85] | [125,1.25,0.85] |
0x4E | 01001110 | Kp | Null/Default | [125,125,125] | [125,125,125] |
0x5E | 01011110 | Kp & Kd | Null/Default | [125,125,125] | [125,125,125] |
0x6E | 01101110 | Kp & Ki | Null/Default | [125,125,125] | [125,125,125] |
0x7E | 01111110 | Kp, Ki, & Kd | Null/Default | [125,125,125] | [125,125,125] |
- Multipliers should only be set on non-zero values.
- Default constant values should be zero.
- Each constant will have a range of 0-255 (including the multiplier).
- Currently all tested values are floats less than 3.00.