Kart/Sensors

From FSI
(Difference between revisions)
Jump to: navigation, search
(FPGA design)
(HTTP 301)
 
Line 1: Line 1:
{{TOC right}}
+
#REDIRECT [[Kart]]
 
+
[[File:Kart_sensors_module.jpg|center|700px|Sensors module]]
+
 
+
Various sensors can be mounted on the [[Kart/Motherboard|motherboard]] through the exposed [https://digilent.com/reference/pmod/start PMOD] connectors.
+
 
+
Any I/O can be connected on any PMOD connector (either by directly plugging them into the pin headers or through the IDC cables).
+
Only the pins '''6, 7 and 8 of the PMOD8''' CANT be used.
+
 
+
 
+
== Hall sensors ==
+
 
+
One or two Hall sensors are used to track the distance driven by the kart.
+
 
+
The [http://sensing.honeywell.com/honeywell-sensing-ss311pt-ss411p-product-sheet-005914-1-en.pdf SS311PT/SS411P]
+
digital Hall-effect sensors are operated by a magnetic field and designed to respond to alternating North and South poles with their
+
[https://en.wikipedia.org/wiki/Schmitt_trigger Schmitt-trigger] output.
+
 
+
They can be powered between 2.7 Vdc to 7 Vdc, with an open collector output (which integrates a 10 kOhm pull-up resistor already).
+
 
+
Thus it can be operated through any PMOD by wiring it such as:
+
:{| cellpadding="3" cellspacing="0" border="1"
+
! Color
+
! Pin
+
|-
+
| Red
+
| 3.3 V power supply
+
|-
+
| Brown
+
| Hall output
+
|-
+
| Black
+
| GND
+
|}
+
 
+
{{WarningBox|content=
+
No internal pull resistor should be enabled on the FPGA side.
+
}}
+
 
+
==== Operating procedure ====
+
To enable and root the hall sensors, proceed as follow:
+
* Modify the '''Kart/Kart_Student''' package variable '''STD_HALL_NUMBER''' to the number of used hall sensors
+
* Modify the .pdc file to root the halls to the desired pins
+
** <code>set_io {halls[1]} -pinname 86 -fixed yes -DIRECTION Input</code>
+
** ''{halls[n]} with n from 1 to STD_HALL_NUMBERS''
+
 
+
==== FPGA design ====
+
[[File:Kart_hall_block.jpg|right|500px|hall sensors block]]
+
 
+
To begin with, the [[Kart#FPGA_Design|design environment]] has to be downloaded.
+
 
+
It comprises the <code>sensorsController</code> block which contains the registers and events manager
+
and an empty <code>hallCounters</code> block which is to be completed.
+
 
+
The <code>hallPulsesFilter</code> block is already implemented, doing the following:
+
* It receives the raw pulses from the hall sensors
+
* It debounces the input to avoid false-transitions
+
* It finally transmits the filtered pulses
+
 
+
 
+
The <code>hallCounters</code> block then receives the <code>hallPulses</code> signal array (i.e. one signal per hall pulse sensor, from 1 to 2).
+
 
+
''Even if you only use one hall sensor, the second exists, just held to '0' at all time.''
+
 
+
The following behavior must be implemented:
+
* While '''zeroPos''' (also from 1 to 2) is '1' for a sensor, reset the pulses count
+
* Then, if '0', the dedicated counter must be incremented on either:
+
** The '''rising edge''' of the pulse
+
** Both the '''rising and falling edges''' of the pulse
+
{{WarningBox|content=
+
Please modify the '''Kart/Kart_Student''' package variable '''HALLSENS_2PULSES_PER_TURN''' to '1' if the signal is counted
+
on each edge or '0' if counted only on the rising edge.
+
}}
+
* The counters values must be concatenated to the '''hallCount''' signal (for the 2 sensors : hallCount = (COUNTER2 << 16) + COUNTER1)
+
{{WarningBox|content=
+
The output '''hallCount''' must '''AT ALL TIME''' reflect the current counters values
+
}}
+
* When '''zeroPos''' goes to '1', the corresponding counter value must be immediately reset on the next clock
+
*''The signal '''hallChanged''' is unused.''
+
 
+
{{TaskBox|content=
+
Draw the schematics of the <code>hallCounters</code> block.
+
}}
+
 
+
=== Testing ===
+
See [[Kart/Sensors#Testing_3|Testing chapter]].
+
 
+
== Ultrasound ranger ==
+
 
+
An ultrasound ranger can detect if there is an obstacle at the front or back of the kart.
+
 
+
It is based on the [https://digilent.com/reference/pmod/pmodmaxsonar/start PMOD-MAXSONAR] board from Digilent,
+
and can be plugged into any one-row PMOD connector ('''beware not to wire on the +12V pin !''').
+
 
+
The ranger will output a pulse named '''PW''' on the board whose length has to be counted to determine the distance to an object following the rule 147 us / inch.
+
Since the start/stop pin is not reachable, the sensor will continuously output pulses between 0.88 and 37.5 ms, each 49 ms.
+
 
+
{{WarningBox|content=
+
No internal pull resistor should be enabled on the FPGA side.
+
}}
+
 
+
==== Operating procedure ====
+
To root the ranger, proceed as follow:
+
* Modify the .pdc file to root the ranger to the desired pin
+
** <code>set_io distancePulse -pinname 63 -fixed yes -DIRECTION Input</code>
+
** The pin must correspond to the '''PW''' pin on the ranger board
+
 
+
==== FPGA design ====
+
[[File:Kart_ranger_block.jpg|right|500px|hall sensors block]]
+
 
+
To begin with, the [[Kart#FPGA_Design|design environment]] has to be downloaded.
+
 
+
It comprises the <code>sensorsController</code> block which contains the registers and events manager
+
and an empty <code>ultrasoundRanger</code> block which is to be completed.
+
 
+
The <code>rangerSubsignals</code>, already implemented, does the following:
+
* It gets the raw '''distancePulse''' signal, continuously coming in as the sensor is configured to always take measurements
+
* Around each 333 ms, it waits for a fresh measurement (i.e. '''distancePulse''' falling edge indicates the end of the current measure)
+
* The '''countEnable''' signal will then rise to indicate we have to count the pulse
+
* The '''countPulse''' will create pulses each 1 us, that must be counted (it is not possible to count the clock directly, otherwise the [[kart/serial link#Registers|register]] may overflow)
+
* '''countEnable''' will then fall at the end of the measurement, then the block waits another 333 ms to repeat the process
+
 
+
 
+
The block <code>ultrasoundRanger</code>, which must be completed, has the following flow:
+
* Wait for the signal <code>countEnable</code> to be '1'
+
* When so, the pulses from <code>countPulse</code> must be counted as long as <code>countEnable</code> is '1'
+
* When it goes back to '0', the counter value must be output to the <code>distance</code> signal
+
* The counter can be reset at the same moment or at the beginning of the next <code>countEnable</code> pulse
+
{{WarningBox|content=
+
The signal '''rangerDistance''' must be updated only when '''reset = '1'''' or when '''countPulse falls''', the signal being kept intact until the next measurement is completed.
+
}}
+
 
+
{{TaskBox|content=
+
Draw the schematics of the <code>ultrasoundRanger</code> block.
+
}}
+
 
+
=== Testing ===
+
See [[Kart/Sensors#Testing_3|Testing chapter]].
+
 
+
== End of turn switch ==
+
 
+
The end of turn switch can be plugged into any PMOD connector, respecting the following:
+
:{| cellpadding="3" cellspacing="0" border="1"
+
! Color
+
! Pin
+
|-
+
| Green
+
| PMOD I/O
+
|-
+
| Black
+
| GND
+
|}
+
 
+
{{WarningBox|content=
+
An internal pull-up must be enabled on the FPGA side.
+
}}
+
 
+
==== Operating procedure ====
+
To root the switch, proceed as follow:
+
* Modify the .pdc file to root the switch to the desired pin
+
** <code>set_io stepperEnd -pinname 97 -fixed yes -DIRECTION Input -RES_PULL Up</code>
+
 
+
== LEDs / Low-consumption outputs ==
+
 
+
In addition to the [[Kart/Daughterboard#LEDs|3 indication LEDs present on the daughterboard]], one can use any PMOD to drive up to 8 [https://digilent.com/shop/pmod-8ld-eight-high-brightness-leds/ LEDs]
+
or other outputs requiring either ON, OFF, or 50% duty cycle PWM (from 1 to 16383 ms) output.
+
 
+
{{WarningBox|content=
+
The consumption per pin cannot be higher than 8 mA.
+
 
+
To counter this problem, a [https://digilent.com/shop/pmod-od1-open-drain-output/ driver extension board] has been provided to you to control either voltages other than 3.3V or higher currents.
+
Before using it, carefully inspect and understand its [https://digilent.com/reference/_media/reference/pmod/pmodod1/pmodod1_sch.pdf datasheet].
+
 
+
'''Never ever''' wire a voltage different than +3.3V on J4 while JP1 is plugged in. If the jumper is plugged, J4 is used to OUTPUT +3.3V.
+
Else, remove the jumper and wire the correct voltage to power the freewheel diodes. Check the MOSFETs characteristics too !
+
}}
+
 
+
Check with your supervisor before wiring custom systems.
+
I/O lines are '''NOT''' protected against over current and voltage backfeed.
+
You are held responsible for the cost of repair in the event of destruction of the equipment.
+
 
+
[[File:Pmodod1.png|250px]]
+
 
+
==== Operating procedure ====
+
On the FPGA side, those outputs are called leds[n]
+
To root them, proceed as follow:
+
* Modify the '''Kart/Kart_Student''' package variable '''STD_LEDS_NUMBER''' to correspond to how many outputs are used
+
* Modify the .pdc file to root the leds to the desired pins
+
** <code>set_io {leds[1]} -pinname 78 -fixed yes -DIRECTION Output</code>
+
** ''{leds[n]} with n from 1 to STD_LEDS_NUMBER, max 8''
+
 
+
== Buttons / Digital inputs ==
+
 
+
[https://digilent.com/shop/pmod-btn-4-user-pushbuttons/ Buttons] or other digital inputs can be wired to any PMOD '''as long as their levels are in the range 0-3.3V !'''
+
 
+
An event is sent to the smartphone each time the input is rising or falling.
+
 
+
{{WarningBox|content=
+
Inputs are not suitable for signals faster than 5 Hz.
+
 
+
By the design and use of a BLE system, the transmission channel would become congested.
+
 
+
To help with interfacing digital inputs, one can use the provided [https://digilent.com/reference/pmod/pmodcon1/start PMOD-CON1] ([https://digilent.com/reference/_media/reference/pmod/pmodcon1/pmodcon1_sch.pdf datasheet])
+
or the [https://digilent.com/reference/pmod/pmodcon3/start PMOD-CON3] ([https://digilent.com/reference/_media/reference/pmod/pmodcon3/pmodcon3_sch.pdf datasheet]) boards.
+
 
+
''For the latter, the jumper '''MUST''' sit between VCC and VS '''only'''.''
+
}}
+
 
+
[[File:Pmodcon1.png|250px]][[File:Pmodcon3.png|250px]]
+
 
+
==== Operating procedure ====
+
On the FPGA side, those inputs are called endSwitches[n].
+
To root them, proceed as follow:
+
* Modify the '''Kart/Kart_Student''' package variable '''STD_ENDSW_NUMBER''' to correspond to how many inputs are used
+
* Modify the .pdc file to root the inputs to the desired pins
+
** <code>set_io {endSwitches[1]} -pinname 64 -fixed yes -DIRECTION Input</code>
+
** ''{endSwitches[n]} with n from 1 to STD_ENDSW_NUMBER, max 16''
+
** If needed, one can add <code>-RES_PULL Up</code> or <code>-RES_PULL Down</code> to use internal pull resistors
+
 
+
== Custom circuits ==
+
 
+
One can use the provided [https://digilent.com/reference/pmod/pmodbb/start PMOD-BB] ([https://digilent.com/reference/_media/reference/pmod/pmodbb/pmodbb_sch.pdf datasheet]) board to test interfacing custom circuits.
+
[[File:pmodbb.jpg|450px|center]]
+
{{WarningBox|content=
+
Do not solder anything to the board. Rather, use the solderless breadboard block provided along.
+
}}
+
 
+
Take into consideration the requirements given above before interfacing with the FPGA (i.e., test voltages and currents present no risk).
+
 
+
Get your supervisor approval and have fun creating mind-blowing systems !
+
 
+
== Testing ==
+
The Hall sensor functionality can be tested through the '''Sensors_test -> sensors_tb''' block.
+
 
+
[[File:Kart_sensors_tester.jpg|center|600px|sensors tester]]
+
 
+
The corresponding simulation layout file for Modelsim is available under '''$SIMULATION_DIR/Sensors/sensors.do'''.
+
It will automatically run the simulation if it has not been modified.
+
 
+
[[File:Kart_sensors_tester_sim.jpg|right|1000px|sensors tester sim]]
+
 
+
* The '''blue''' header shows which test is performed
+
* The '''yellow''' signals are those generated by the tester
+
* The '''purple''' signals are the one generated by your implementation
+
* ''You can add and remove signals at will, they will not interfere with the tests''
+
 
+
=== Tests ===
+
The following tests are performed for the Hall sensors:
+
* For each sensor, a pulse of a fixed period (n times slower for each new sensor) is generated
+
* The '''hallCount''' is compared to an internal counter, depending on the '''HALLSENS_2PULSES_PER_TURN''' constant
+
* When '''zeroPos''' goes to '1', the '''hallCount''' should be reset
+
 
+
The following tests are performed for the Ranger:
+
* A pulse of '''tbRangerDistanceTarget (1012) * (clockPeriod / 10)'''  will be generated
+
* When the signal '''distancePulse''' falls, the '''rangerDistance''' should be a value within '''1011 to 1013'''
+
 
+
The '''transcript''' window gives you details on if tests passed or not:
+
* For the '''hallCount''' signal, you get <code>Hall count ''n'' OK</code> or <code>Hall count ''n'' error</code>.
+
* For the '''rangerdistance''' signal, you get <code>Ultrasound ranger OK</code> or <code>Ultrasound ranger error</code>.
+
  
 
[[Category:Kart]]
 
[[Category:Kart]]

Latest revision as of 20:36, 17 September 2024

  1. REDIRECT Kart
Personal tools
Namespaces
Variants
Actions
Navigation
Modules / Projects
Browse
Toolbox