Kart/serial link
Axel.amand (Talk | contribs) (→Serial link protocol) |
Axel.amand (Talk | contribs) |
||
Line 108: | Line 108: | ||
| 0x3D | | 0x3D | ||
|} | |} | ||
+ | |||
== Registers == | == Registers == |
Revision as of 11:38, 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
Frame example
For the BLE module to light LED1 with it changing each 500 ms, the following frame is sent:
SoF (1 byte) | Address (1 byte) | Data High (1 byte) | Data Low (1 byte) | EoF (1 byte) |
---|---|---|---|---|
0xAA | 0b10100001 | 0b10000001 | 0b11110100 | 0x74 |
When the stepper end switch is pressed, imagining that the desired position is reached in the meantime, the FPGA will send the following:
SoF (1 byte) | Address (1 byte) | Data High (1 byte) | Data Low (1 byte) | EoF (1 byte) |
---|---|---|---|---|
0xAA | 0b01100011 | 0b00000000 | 0b00000011 | 0x47 |
If the BLE module wants to read the current battery voltage, supposing we have 4 LEDs, the frame is such as:
SoF (1 byte) | Address (1 byte) | Data High (1 byte) | Data Low (1 byte) | EoF (1 byte) |
---|---|---|---|---|
0xAA | 0b10000101 | Any | Any | CRC |
The FPGA will then respond with something like (for a 11.998V reading):
SoF (1 byte) | Address (1 byte) | Data High (1 byte) | Data Low (1 byte) | EoF (1 byte) |
---|---|---|---|---|
0xAA | 0b10000101 | 0x18 | 0x09 | 0x3D |
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) |
Sensors
Reading range : 0x80 to 0x9F
Writing range : 0xA0 to 0xBF
The sensors count may change based on the values given in the Kart -> Kart_Student_pkg. Thus, the registers addresses are based on the following definitions :
- NB_LEDS : the number of LEDs / digital outputs used | NUMBER_OF_LEDS in the package
- NB_ENDSW : the number of end switches / buttons used | NUMBER_OF_EXT_END_SWITCHES in the package
- NB_HALL : the number of hall sensors used | NUMBER_OF_HALL_SENSORS in the package
- NB_PROXI : the number of eproximity sensors used | NUMBER_OF_PROXIMITY_SENSORS in the package
Address | Name | Type | Description | Direction | Event |
---|---|---|---|---|---|
0 | Refresh proximity | - | Send anything to this register to refresh the proximity sensors | Smartphone -> Kart | |
1 | LED1 | Bit + Uint15 | Bit 15: on / off/
Bits 14 -> 0: half-period in ms (if 0, led status = bit 15) |
Smartphone -> Kart | |
NB_LEDS | LEDn | Bit + Uint15 | See LED1 | Smartphone -> Kart | |
NB_LEDS + 1 | Voltage | Uint16 | Battery voltage, U = register * 250*e-6 * 7.8 [V] | Kart -> Smartphone | When a delta of at least SENS_BATT_DELTA_MV (100) from the last registered value happens |
NB_LEDS + 2 | Current | Uint16 | Consumed current, I = register * 250*10*e-6 / (100 * 5*10*e-3) [A] | Kart -> Smartphone | When a delta of at least SENS_CURR_DELTA_MA (50) from the last registered value happens |
NB_LEDS + 3 | Range finder | Uint16 | Distance to sensor, register * 25.4 / (147*10*e-6 * (10M / 10)) [mm]
Register zeroed if less than 152 mm (sensor min distance) or greater than 1500 mm (arbitrary max distance), event not sent in such case |
Kart -> Smartphone | When a delta of at least SENS_RANGEFNDR_MM (100) from the last registered value happens |
NB_LEDS + 4 | End switches | Vector(NB_ENDSW) | Sensors current values, right justified (sensor 1 is bit 0) | Kart -> Smartphone | On any edge change of any sensor |
NB_LEDS + 5 | Hall1 | Uint5 + Uint11 | Uint5 (left justified) : number of 1/2 turns counted
Uint11 : time in steps of 4 ms |
Kart -> Smartphone | When a count of at least SENS_HALLCOUNT_HALF_TURN_DELTA (20) happens |
NB_LEDS + NB_HALL + 4 | Halln | Uint5 + Uint11 | See Hall1 | Kart -> Smartphone | See Hall1 |
NB_LEDS + NB_HALL + 5 | Proxy1 | Uint16 | Proximity value in unknown unit (tests should be conducted, the highest the closest) | Kart -> Smartphone | When a delta of at least SENS_PROXI_DELTA (255) from the last registered value happens |
NB_LEDS + NB_HALL + NB_PROXI + 4 | Proxyn | Uint16 | See Proxy1 | Kart -> Smartphone | See Proxy1 |
NB_LEDS + NB_HALL + NB_PROXI + 5 | Ambient1 | Uint16 | Ambient light, E = register * 250*10*e-3 [lx] (clear sensor cover) | Kart -> Smartphone | When a delta of at least SENS_AMBIENT_DELTA (255) from the last registered value happens |
NB_LEDS + NB_HALL + 2* NB_PROXI + 4 | Ambientn | Uint16 | See ambient1 | Kart -> Smartphone | See ambient1 |
Control Registers
Reading range : 0xC0 to 0xDF
Writing range : 0xE0 to 0xFF
Address | Name | Type | Description | Direction | Event |
---|---|---|---|---|---|
0 | Hardware Control | Vector6 | Bit 0: when '0', the Kart goes backwards when the motor turns foward
Bit 1: when '1', the Kart turns to the right as the stepper coils go from 1 to 4 Bit 2: when '1', the angles are measured clockwise Bit 3: emulates the end switch contact for the stepper motor Bit 4: restart the stepperMotor module, stops the DC motor while '1' Bit 5: when '1', the BLE connection has been established (otherwise, the Kart should not be able to move) |
Smartphone -> Kart | The end sensor always defines angle 0. Angles are always positive numbers in registers.
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 not yet re-implemented. The old behavior, kept for reference, is the following:
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
|
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 |