Kart/serial link
Axel.amand (Talk | contribs) (→Message Format) |
Axel.amand (Talk | contribs) |
||
Line 2: | Line 2: | ||
== Serial link protocol == | == Serial link protocol == | ||
− | This section defines the serial link protocol used to communicate between the Kart and the | + | This section defines the serial link protocol used to communicate between the Kart and the BLE module / PC. |
− | + | ||
+ | === General principle === | ||
+ | The system using a [[Kart/Bluetooth|BLE]] module, the throughput is limited by design to a payload of 27 bytes each connection interval (from 7.5 ms to 4 s). | ||
+ | |||
+ | To avoid congesting the line, data are sent from the Kart to the User on specific '''events''' or if '''requested''' by the User. | ||
=== Serial port=== | === Serial port=== | ||
Communication is done with: | Communication is done with: | ||
− | * | + | * Resting state : HIGH |
− | * 8 bits | + | * Data bits : 8 |
− | * | + | * Parity : none |
− | * | + | * Stop bits : 1 |
+ | * Handshake : none | ||
+ | * Baudrate : 115'200 | ||
+ | * Bit order : LSB first | ||
=== Message Format === | === Message Format === | ||
Line 21: | Line 28: | ||
! EoF (1 byte) | ! EoF (1 byte) | ||
|- | |- | ||
− | |||
− | |||
− | |||
| 0xAA | | 0xAA | ||
+ | | UINT8 | ||
+ | | UINT16/INT16/VECTOR16 (MSB first) | ||
+ | | [https://crccalc.com/ CRC8/ITU] | ||
|} | |} | ||
− | == | + | The address is decomposed as follows: 0bMMWRRRRR |
− | {| cellpadding=" | + | * MM : targeted module |
− | ! | + | ** 0b00 : DC Motor |
− | ! | + | ** 0b01 : Stepper Motor |
− | ! | + | ** 0b10 : Sensors |
− | ! | + | ** 0b11 : Control Registers |
+ | * W : defines if the data is saved to ('1') or read from ('0') the FPGA | ||
+ | ** The FPGA will '''respond to a request''' with the exact same address when W = '0' | ||
+ | ** The FPGA will '''save incoming data in the targeted register''' when W = '1' | ||
+ | ** The FPGA will '''send data on predefined events''' with the W bit set to '1' | ||
+ | * RRRRR : targeted register | ||
+ | |||
+ | == Registers == | ||
+ | |||
+ | === DC Motor === | ||
+ | |||
+ | Reading range : 0x00 to 0x1F | ||
+ | |||
+ | Writing range : 0x20 to 0x3F | ||
+ | |||
+ | {| cellpadding="4" cellspacing="0" border="1" | ||
+ | ! Address | ||
+ | ! Name | ||
+ | ! Type | ||
+ | ! Description | ||
+ | ! Direction | ||
+ | ! Event | ||
|- | |- | ||
− | | | + | | 0 |
− | | | + | | Prescaler |
− | | | + | | Uint16 |
− | | | + | | DC PWM frequency, as fclk / (PWMsteps * prescaler) = 10M / (16 * prescaler) |
+ | | Smartphone -> Kart | ||
+ | | | ||
+ | |- | ||
+ | | 1 | ||
+ | | Speed | ||
+ | | Int5 | ||
+ | | Desired speed, from -15 (0xFFF1) to 15 (0x000F) (negative = backward) | ||
+ | | Smartphone -> Kart | ||
+ | | | ||
|} | |} | ||
+ | |||
+ | |||
+ | === Stepper Motor === | ||
+ | |||
+ | Reading range : 0x40 to 0x5F | ||
+ | |||
+ | Writing range : 0x60 to 0x7F | ||
+ | |||
+ | {| cellpadding="4" cellspacing="0" border="1" | ||
+ | ! Address | ||
+ | ! Name | ||
+ | ! Type | ||
+ | ! Description | ||
+ | ! Direction | ||
+ | ! Event | ||
+ | |- | ||
+ | | 0 | ||
+ | | Prescaler | ||
+ | | Uint16 | ||
+ | | Stepper switching frequency, as 100k / prescaler | ||
+ | | Smartphone -> Kart | ||
+ | | | ||
+ | |- | ||
+ | | 1 | ||
+ | | Target angle | ||
+ | | Uint16 | ||
+ | | Desired steering angle, in motor steps (0 = end switch) | ||
+ | | Smartphone -> Kart | ||
+ | | | ||
+ | |- | ||
+ | | 2 | ||
+ | | Actual angle | ||
+ | | Uint16 | ||
+ | | Actual steering angle, in motor steps (0 = end switch) | ||
+ | | Kart -> Smartphone | ||
+ | | When a delta of at least STP_ANGLE_DELTA_DEG (10°) from the last registered value happens | ||
+ | |- | ||
+ | | 3 | ||
+ | | Stepper HW | ||
+ | | Vector2 | ||
+ | | Bit 0 : stepper end | ||
+ | Bit 1 : position reached | ||
+ | | Kart -> Smartphone | ||
+ | | Sent when stepper end is pressed (rising edge) or position reached (rising edge) | ||
+ | |} | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
== Registers == | == Registers == |
Revision as of 07:57, 28 June 2022
|
Serial link protocol
This section defines the serial link protocol used to communicate between the Kart and the BLE module / PC.
General principle
The system using a BLE module, the throughput is limited by design to a payload of 27 bytes each connection interval (from 7.5 ms to 4 s).
To avoid congesting the line, data are sent from the Kart to the User on specific events or if requested by the User.
Serial port
Communication is done with:
- Resting state : HIGH
- Data bits : 8
- Parity : none
- Stop bits : 1
- Handshake : none
- Baudrate : 115'200
- Bit order : LSB first
Message Format
SoF (1 byte) | Address (1 byte) | Data (2 bytes) | EoF (1 byte) |
---|---|---|---|
0xAA | UINT8 | UINT16/INT16/VECTOR16 (MSB first) | CRC8/ITU |
The address is decomposed as follows: 0bMMWRRRRR
- MM : targeted module
- 0b00 : DC Motor
- 0b01 : Stepper Motor
- 0b10 : Sensors
- 0b11 : Control Registers
- W : defines if the data is saved to ('1') or read from ('0') the FPGA
- The FPGA will respond to a request with the exact same address when W = '0'
- The FPGA will save incoming data in the targeted register when W = '1'
- The FPGA will send data on predefined events with the W bit set to '1'
- RRRRR : targeted register
Registers
DC Motor
Reading range : 0x00 to 0x1F
Writing range : 0x20 to 0x3F
Address | Name | Type | Description | Direction | Event |
---|---|---|---|---|---|
0 | Prescaler | Uint16 | DC PWM frequency, as fclk / (PWMsteps * prescaler) = 10M / (16 * prescaler) | Smartphone -> Kart | |
1 | Speed | Int5 | Desired speed, from -15 (0xFFF1) to 15 (0x000F) (negative = backward) | Smartphone -> Kart |
Stepper Motor
Reading range : 0x40 to 0x5F
Writing range : 0x60 to 0x7F
Address | Name | Type | Description | Direction | Event |
---|---|---|---|---|---|
0 | Prescaler | Uint16 | Stepper switching frequency, as 100k / prescaler | Smartphone -> Kart | |
1 | Target angle | Uint16 | Desired steering angle, in motor steps (0 = end switch) | Smartphone -> Kart | |
2 | Actual angle | Uint16 | Actual steering angle, in motor steps (0 = end switch) | Kart -> Smartphone | When a delta of at least STP_ANGLE_DELTA_DEG (10°) from the last registered value happens |
3 | Stepper HW | Vector2 | Bit 0 : stepper end
Bit 1 : position reached |
Kart -> Smartphone | Sent when stepper end is pressed (rising edge) or position reached (rising edge) |
Registers
SmartPhone to Kart
Address | Datatype | Description |
---|---|---|
0 | UINT16 | DC motor PWM period |
1 | INT5 | DC motor speed: -15 to 15 (negative numbers = backwards) |
2 | UINT16 | Stepper motor period (speed proportional to 1/period) |
3 | UINT16 | Desired steering angle (in motor steps, 0 = end switch) |
4 | UINT5 | End switch address |
5 | UINT5 | Hardware control |
6 | UINT4 | LEDs |
7 | UINT2 | Sequence control register |
8 | UINT16 | Sequence operations register |
15 | UINT16 | Serial link update interval [ms] |
Hardware control register
The hardware control register allows to adapt the controls to the hardware of the car and to simulate events such as a stepper end switch.
Bit | Meaning | Description |
---|---|---|
0 | Kart goes as DC motor | When '0', the kart goes backwards when the motor turns forwards |
1 | Kart turns right (clockwise) | When '1', kart turns to the right as stepper motor phases go from 1 to 4 |
2 | End sensor is on left side | If '1', the angles are measured clockwise |
3 | Stepper end | Emulates an end switch contact for the direction motor |
4 | Restart | Puts following slaves back in startup mode: stepper motor The DC motor is stopped as long as the signal is active |
5 | Bluetooth connected | Indicates that the Bluetooth connection is established |
The end sensor always defines position 0. Angles are always positive.
If bits 1 and 2 are different, the stepper motor phase sequence has to be inverted.
If the Bluetooth connection is lost, the DC motor has to be stopped.
Sequence control register
The sequence control register is used to load a new sequence from start of memory as well as to start and stop a sequence.
Bit | Meaning | Description |
---|---|---|
0 | Reset sequence | sets the sequence RAM write and read addresses back to 0 |
1 | Run / stop | starts or stops a sequence |
Sequence operations register
The sequence memory is made out of 16-bit controls and the sequence can range up to 210 operations.
From the communication point of view, the sequence memory is seen as a FIFO :
the sequence operations are pushed one after the other into the sequence register,
starting at the first one of the list after the reset sequence
bit
has been set in the control register
The sequence operations are split into 2 parts: a 4-bit command and optional parameters.
A sequence register has been defined in order to build loops:
the goto
operation is only carried out if the register is not zero.
The register is initialised with all bits to '1'.
command | parameter | comment | ||
---|---|---|---|---|
Bits | 15 ÷ 12 | 11 ÷ 0 | ||
0 | nop | |||
1 | set speed | speed | set the propulsion motor speed | |
2 | set angle | angle | set the direction motor angle | |
3 | drive LEDs | pattern | specify a given pattern for turning the LEDs on or off | |
4 | set LEDs | mask | set bits from '1's of mask | |
5 | clear LEDs | mask | clear bits from '1's of mask | |
6 | blink LEDs | period, mask | not implemented yet | |
8 | run distance | hall ticks | run until the Hall counter has augmented by at least a given tick number | |
9 | run for | milliseconds | run for a specified time span | |
A | run until | event | not implemented yet | |
D | modify register | operation, operand | bits 11÷10 : 00 = set, 10 = add, 11 = sub / bits 9÷0 : operand | |
E | goto nz | address | jumps to the specified sequence step as long as the register is not zero | |
F | end | the sequence controller in the FPGA stops and the running status bit is cleared, announcing that the sequence is terminated
|
Kart to SmartPhone
Address | Datatype | Description |
---|---|---|
0 | UINT16 | Hall speed count 1 |
1 | UINT16 | Hall speed count 2 |
2 | UINT2 | Steering status: bit 0 stepper end, bit 1 position reached |
3 | UINT16 | Actual Steering Angle |
4 | UINT1 | Stepper End from I/O board, bit 0 |
5 | UINT16 | ADC Value of the Battery Voltage Level |
6 | UINT16 | Distance |
7 | UINT16 | Sequence status |
8 | UINT16 | Proximity 4 |
9 | UINT16 | Proximity 3 |
10 | UINT16 | Proximity 2 |
11 | UINT16 | Proximity 1 |
12 | UINT16 | Ambient Light 4 |
13 | UINT16 | Ambient Light 3 |
14 | UINT16 | Ambient Light 2 |
15 | UINT16 | Ambient Light 1 |
Sequence status register
The sequence status register tells what operation is currently active.
Bit | Meaning | Description |
---|---|---|
15 ÷ 12 | Current command | indicates which command is currently being processed |
0 | Running | indicates that a sequence is currently running |
Kart I2C bus
The data on the kart's I2C bus reflects the one on the RS232 link. On the I2C, both data and addresses are 8-bit.