Kart/serial link

(Difference between revisions)
Jump to: navigation, search
Line 45: Line 45:
 
** The FPGA will '''send data on predefined events''' with the W bit set to '1'
 
** The FPGA will '''send data on predefined events''' with the W bit set to '1'
 
* RRRRR : targeted register
 
* RRRRR : targeted register
 +
  
 
== Registers ==
 
== Registers ==
Line 116: Line 117:
 
| Stepper HW
 
| Stepper HW
 
| Vector2
 
| Vector2
| Bit 0 : stepper end
+
| Bit 0: stepper end
Bit 1 : position reached
+
Bit 1: position reached
 
| Kart -> Smartphone
 
| Kart -> Smartphone
 
| Sent when stepper end is pressed (rising edge) or position reached (rising edge)
 
| Sent when stepper end is pressed (rising edge) or position reached (rising edge)
Line 123: Line 124:
  
  
 +
=== 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
== Registers ==
+
* '''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
=== SmartPhone to Kart ===
+
* '''NB_PROXI''' : the number of eproximity sensors used | '''NUMBER_OF_PROXIMITY_SENSORS''' in the package
 +
{{WarningBox|content=
 +
Beware that the last address is not bigger than 31 !
 +
}}
  
 
{| cellpadding="4" cellspacing="0" border="1"
 
{| cellpadding="4" cellspacing="0" border="1"
 
! Address
 
! Address
! Datatype
+
! Name
 +
! Type
 
! Description
 
! Description
 +
! Direction
 +
! Event
 
|-
 
|-
 
| 0
 
| 0
| UINT16
+
| Refresh proximity
| DC motor PWM period
+
| -
 +
| Send anything to this register to refresh the proximity sensors
 +
| Smartphone -> Kart
 +
|  
 
|-
 
|-
 
| 1
 
| 1
| INT5
+
| LED1
| DC motor speed: -15 to 15 (negative numbers = backwards)
+
| Bit + Uint15
 +
| Bit 15: on / off/
 +
Bits 14 -> 0: half-period in ms (if 0, led status = bit 15)
 +
| Smartphone -> Kart
 +
|
 
|-
 
|-
| 2
+
| NB_LEDS
| UINT16
+
| LEDn
| Stepper motor period (speed proportional to 1/period)
+
| Bit + Uint15
 +
| ''See LED1''
 +
| Smartphone -> Kart
 +
|  
 
|-
 
|-
| 3
+
| NB_LEDS + 1
| UINT16
+
| Voltage
| Desired steering angle (in motor steps, 0 = end switch)
+
| 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
 
|-
 
|-
| 4
+
| NB_LEDS + 2
| UINT5
+
| Current
| End switch address
+
| 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
 
|-
 
|-
| 5
+
| NB_LEDS + 3
| UINT5
+
| Range finder
| [[Kart/serial_link#Hardware_control_register|Hardware control]]
+
| 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
 
|-
 
|-
| 6
+
| NB_LEDS + 4
| UINT4
+
| End switches
| LEDs
+
| Vector(NB_ENDSW)
 +
| Sensors current values, right justified (sensor 1 is bit 0)
 +
| Kart -> Smartphone
 +
| On any edge change of any sensor
 
|-
 
|-
| 7
+
| NB_LEDS + 5
| UINT2
+
| Hall1
| Sequence control register
+
| 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
 
|-
 
|-
| 8
+
| NB_LEDS + NB_HALL + 4
| UINT16
+
| Halln
| Sequence operations register
+
| 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
 
|-
 
|-
| 15
+
| NB_LEDS + NB_HALL + NB_PROXI + 4
| UINT16
+
| Proxyn
| Serial link update interval [ms]
+
| 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] ''([https://www.vishay.com/docs/83372/vcnl4000.pdf 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''
 
|}
 
|}
  
==== Hardware control register ====
 
  
The hardware control register allows to adapt the controls to the hardware of the car
+
=== Control Registers ===
and to simulate events such as a stepper end switch.
+
 
 +
Reading range : 0xC0 to 0xDF
 +
 
 +
Writing range : 0xE0 to 0xFF
 +
{{WarningBox|content=
 +
The control registers module is '''WRITE ONLY''' for now !
 +
}}
  
 
{| cellpadding="4" cellspacing="0" border="1"
 
{| cellpadding="4" cellspacing="0" border="1"
! Bit
+
! Address
! Meaning
+
! Name
 +
! Type
 
! Description
 
! Description
 +
! Direction
 +
! Event
 
|-
 
|-
 
| 0
 
| 0
| Kart goes as DC motor
+
| Hardware Control
| When '0', the kart goes backwards when the motor turns forwards
+
| Vector6
|-
+
| Bit 0: when '0', the Kart goes backwards when the motor turns foward
| 1
+
Bit 1: when '1', the Kart turns to the right as the stepper coils go from 1 to 4
| Kart turns right (clockwise)
+
Bit 2: when '1', the angles are measured clockwise
| When '1', kart turns to the right as stepper motor phases go from 1 to 4
+
Bit 3: emulates the end switch contact for the stepper motor
|-
+
Bit 4: restart the stepperMotor module, stops the DC motor while '1'
| 2
+
Bit 5: when '1', the BLE connection has been established (otherwise, the Kart should not be able to move)
| End sensor is on left side
+
| Smartphone -> Kart
| If '1', the angles are measured clockwise
+
| 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.
| 3
+
If the Bluetooth connection is lost, the DC motor has to be stopped.
| Stepper end
+
| Emulates an end switch contact for the direction motor
+
|-
+
| 4
+
| Restart
+
| Puts following slaves back in startup mode: stepper motor<br />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 ====
 
==== 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.
 
The sequence control register is used to load a new sequence from start of memory as well as to start and stop a sequence.
Line 238: Line 300:
 
|}
 
|}
  
==== Sequence operations register ====
+
===== Sequence operations register =====
  
 
The sequence memory is made out of 16-bit controls and the sequence can range up to 2<sup>10</sup> operations.
 
The sequence memory is made out of 16-bit controls and the sequence can range up to 2<sup>10</sup> operations.
Line 289: Line 351:
 
|}
 
|}
  
=== Kart to SmartPhone ===
+
===== Sequence status register =====
 
+
{| cellpadding="4" cellspacing="0" border="1"
+
! 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.
 
The sequence status register tells what operation is currently active.
Line 378: Line 368:
 
| indicates that a sequence is currently running
 
| indicates that a sequence is currently running
 
|}
 
|}
 
=== Kart I2C bus ===
 
 
The data on the kart's [[kart/I2C link|I2C bus]] reflects the one on the RS232 link.
 
On the I2C, both data and addresses are 8-bit.
 
  
 
[[Category:Kart]]
 
[[Category:Kart]]

Revision as of 10:02, 28 June 2022

Contents

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)


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

Dialog-warning.png

Beware that the last address is not bigger than 31 !

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

Dialog-warning.png

The control registers module is WRITE ONLY for now !

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
Personal tools
Namespaces
Variants
Actions
Navigation
Modules / Projects
Browse
Toolbox