<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.elcanoproject.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=JosephBreithaupt</id>
	<title>Elcano Project Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.elcanoproject.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=JosephBreithaupt"/>
	<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/Special:Contributions/JosephBreithaupt"/>
	<updated>2026-04-04T01:21:21Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.32.2</generator>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=242</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=242"/>
		<updated>2019-08-14T20:01:01Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* CAN Bus and SAMD21 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Elcano Remote Control =&lt;br /&gt;
&lt;br /&gt;
The Elcano system can run autonomously or by remote control. There have been four systems built for manual or remote control.&lt;br /&gt;
&lt;br /&gt;
== Joystick ==&lt;br /&gt;
The first system used an APEM 9000 joystick. The part has five wires: 5V power, ground, and three analog lines. The joystick has two axes. The vertical axis is used for throttle (up) and brakes (down). The third analog signal is the voltage of the joystick when centered. The joystick was used in 2014 and is described in http://www.elcanoproject.org/tutorial/lab2.php.  The Low-level code may still contain inputs and processing for an analog joystick.&lt;br /&gt;
&lt;br /&gt;
== Bluetooth ==&lt;br /&gt;
In 2015 students built a control system using a Bluetooth receiver to the Arduino. The transmitter was a TI Sitara running Android. &lt;br /&gt;
&lt;br /&gt;
== 5- and 6-channel RC Controller ==&lt;br /&gt;
The system has been run from either a Hitec Optics 5 2.4 five channel unit or a Spektrum DX6i six channel controller. The Low level circuit board has a3x7 pin socket in the corner to accommodate the receiver. Each channel needs to be on its own interrupt. Since the Arduino Mega has only 6 interrupts and the Arduino Micro has 5, this can be a problem, especially since we want another one or two interrupts to handle the speed. Low level code may still have software to handle these interrupts. The RC controllers send a 1.0 to 2.0 ms pulse on each channel at 30 Hz. Some controllers send these signals in turn. We have built a six-input OR circuit to combine all signals, which would allow processing with just one interrupt. Unfortunately, there is no good way to predict whether the RC unit will send pulses in turn or all at once. In fact, the behavior seems to be determined by the receive unit, not the transmitter. Thus a separate interrupt is required for each channel used. Interrupt processing consists of interrupting on a rising edge, then switching to a falling edge interrupt and logging the pulse width. A width of 1.0 ms typically means one extreme, 1.5 ms is centered, and 2.0 ms is the other extreme., This system can get confusing about which channel is assigned which behavior, and the two controllers assign their channels differently. To go beyond the Arduino interrupt limit, the V2 Low Level board has all RC inputs assigned to Analog Input 8 to 13 of the Arduino. These pins are used digitally. Pins A8-A15 on Arduino Mega, all go to the same port. Thus we can use the pin change interrupt, which is activated whenever any bit of the 8-bit port changes.&lt;br /&gt;
&lt;br /&gt;
== Amplitude Shift Keying (ASK) RC Controller ==&lt;br /&gt;
&lt;br /&gt;
Elcano project used a custom-built radio control system with two arduinos, one in the remote control that collects manual inputs and transmits them with a 433MHz ASK radio transmitter, and one on the Elcano vehicle which receives the information sent over radio and converts it into an ElcanoSerial drive packet which is transmitted to C2 over ElcanoSerial. This information is used to manually drive the trike, begin an autonomous routine, or activate the emergency brake and stop the trike. The RH_ASK system was limited to 40 feet (12 meters) in practice and was never use to drive the vehicle.&lt;br /&gt;
&lt;br /&gt;
== RFM69HCW and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RFM69HCW (915MHz) transceiver offers several benefits over the 433MHz ASK radios:&lt;br /&gt;
* greater range with higher transmit power&lt;br /&gt;
* much higher raw bitrate&lt;br /&gt;
* half-duplex communication and received signal strength indicator (RSSI)&lt;br /&gt;
* compatibility with higher-performance 3.3V ARM boards like SAMD21&lt;br /&gt;
&lt;br /&gt;
Using the RF69 RadioHead library, the RC system has expanded capabilities from the RH ASK implementation. Data is stored on both ends as a C struct, which is broken down and transmitted as bytes by the RF69 library. After successful transmission, the data is accessible directly from the struct and variables larger than one byte need no additional processing before use. After successfully receiving a packet from the remote control, the receiver sends a packet back with an RSSI value. The remote control uses this reply message to indicate radio communication is active. &lt;br /&gt;
&lt;br /&gt;
=== Transmitted data to vehicle ===&lt;br /&gt;
* unsigned 12-bit throttle (0-4095)&lt;br /&gt;
* unsigned 12-bit turn &lt;br /&gt;
* boolean emergency stop&lt;br /&gt;
* boolean autonomous mode&lt;br /&gt;
* signed RSSI of last received packet (from vehicle)&lt;br /&gt;
&lt;br /&gt;
=== Received data from vehicle ===&lt;br /&gt;
* signed RSSI of last received packet (from remote)&lt;br /&gt;
&lt;br /&gt;
== CAN Bus and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RC transceiver board mounted on the vehicle communicates drive commands over CAN bus. This software is in development. &lt;br /&gt;
&lt;br /&gt;
'''NOTE: Resetting the SAMD21 mini dev board requires two quick taps of the reset button. After a reset, the blue LED on the board will pulse slowly for a few seconds. If the board is unresponsive, try resetting this way first.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NEXT . [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=241</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=241"/>
		<updated>2019-08-14T20:00:03Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Elcano Remote Control =&lt;br /&gt;
&lt;br /&gt;
The Elcano system can run autonomously or by remote control. There have been four systems built for manual or remote control.&lt;br /&gt;
&lt;br /&gt;
== Joystick ==&lt;br /&gt;
The first system used an APEM 9000 joystick. The part has five wires: 5V power, ground, and three analog lines. The joystick has two axes. The vertical axis is used for throttle (up) and brakes (down). The third analog signal is the voltage of the joystick when centered. The joystick was used in 2014 and is described in http://www.elcanoproject.org/tutorial/lab2.php.  The Low-level code may still contain inputs and processing for an analog joystick.&lt;br /&gt;
&lt;br /&gt;
== Bluetooth ==&lt;br /&gt;
In 2015 students built a control system using a Bluetooth receiver to the Arduino. The transmitter was a TI Sitara running Android. &lt;br /&gt;
&lt;br /&gt;
== 5- and 6-channel RC Controller ==&lt;br /&gt;
The system has been run from either a Hitec Optics 5 2.4 five channel unit or a Spektrum DX6i six channel controller. The Low level circuit board has a3x7 pin socket in the corner to accommodate the receiver. Each channel needs to be on its own interrupt. Since the Arduino Mega has only 6 interrupts and the Arduino Micro has 5, this can be a problem, especially since we want another one or two interrupts to handle the speed. Low level code may still have software to handle these interrupts. The RC controllers send a 1.0 to 2.0 ms pulse on each channel at 30 Hz. Some controllers send these signals in turn. We have built a six-input OR circuit to combine all signals, which would allow processing with just one interrupt. Unfortunately, there is no good way to predict whether the RC unit will send pulses in turn or all at once. In fact, the behavior seems to be determined by the receive unit, not the transmitter. Thus a separate interrupt is required for each channel used. Interrupt processing consists of interrupting on a rising edge, then switching to a falling edge interrupt and logging the pulse width. A width of 1.0 ms typically means one extreme, 1.5 ms is centered, and 2.0 ms is the other extreme., This system can get confusing about which channel is assigned which behavior, and the two controllers assign their channels differently. To go beyond the Arduino interrupt limit, the V2 Low Level board has all RC inputs assigned to Analog Input 8 to 13 of the Arduino. These pins are used digitally. Pins A8-A15 on Arduino Mega, all go to the same port. Thus we can use the pin change interrupt, which is activated whenever any bit of the 8-bit port changes.&lt;br /&gt;
&lt;br /&gt;
== Amplitude Shift Keying (ASK) RC Controller ==&lt;br /&gt;
&lt;br /&gt;
Elcano project used a custom-built radio control system with two arduinos, one in the remote control that collects manual inputs and transmits them with a 433MHz ASK radio transmitter, and one on the Elcano vehicle which receives the information sent over radio and converts it into an ElcanoSerial drive packet which is transmitted to C2 over ElcanoSerial. This information is used to manually drive the trike, begin an autonomous routine, or activate the emergency brake and stop the trike. The RH_ASK system was limited to 40 feet (12 meters) in practice and was never use to drive the vehicle.&lt;br /&gt;
&lt;br /&gt;
== RFM69HCW and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RFM69HCW (915MHz) transceiver offers several benefits over the 433MHz ASK radios:&lt;br /&gt;
* greater range with higher transmit power&lt;br /&gt;
* much higher raw bitrate&lt;br /&gt;
* half-duplex communication and received signal strength indicator (RSSI)&lt;br /&gt;
* compatibility with higher-performance 3.3V ARM boards like SAMD21&lt;br /&gt;
&lt;br /&gt;
Using the RF69 RadioHead library, the RC system has expanded capabilities from the RH ASK implementation. Data is stored on both ends as a C struct, which is broken down and transmitted as bytes by the RF69 library. After successful transmission, the data is accessible directly from the struct and variables larger than one byte need no additional processing before use. After successfully receiving a packet from the remote control, the receiver sends a packet back with an RSSI value. The remote control uses this reply message to indicate radio communication is active. &lt;br /&gt;
&lt;br /&gt;
=== Transmitted data to vehicle ===&lt;br /&gt;
* unsigned 12-bit throttle (0-4095)&lt;br /&gt;
* unsigned 12-bit turn &lt;br /&gt;
* boolean emergency stop&lt;br /&gt;
* boolean autonomous mode&lt;br /&gt;
* signed RSSI of last received packet (from vehicle)&lt;br /&gt;
&lt;br /&gt;
=== Received data from vehicle ===&lt;br /&gt;
* signed RSSI of last received packet (from remote)&lt;br /&gt;
&lt;br /&gt;
== CAN Bus and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RC transceiver board mounted on the vehicle communicates drive commands over CAN bus. This software is in development. &lt;br /&gt;
&lt;br /&gt;
'''NOTE: Resetting the SAMD21 mini dev board requires two quick taps of the reset button. After a reset, the blue LED on the board will pulse slowly for a few seconds. If the board is unresponsive, try resetting this way first.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Main.JosephBreithaupt - 2017-10-11&lt;br /&gt;
&lt;br /&gt;
NEXT . [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=ElcanoIntro&amp;diff=212</id>
		<title>ElcanoIntro</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=ElcanoIntro&amp;diff=212"/>
		<updated>2019-07-12T19:12:23Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Vehicles */ added CAN link, removed table formatting on introductory paragraph&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Elcano Project Introduction =&lt;br /&gt;
&lt;br /&gt;
== Vehicles ==&lt;br /&gt;
&lt;br /&gt;
A self-driving vehicle does not have to be a car. It can be a bicycle or motorcycle. We work with tricycles so that we do not need to worry about balance. Other vehicles could be karts or toy cars.  At University of Washington Bothell we have two Catrike recumbents and an Organic Transit ELF. In 2018, version 3 of the High Level System was built. It has the capability of outputting in [[ Communication |CAN Bus format]], which is the standard for automotive control. With a CAN Bus interface on Low Level a trike can present the same automation interface as a car.&lt;br /&gt;
&lt;br /&gt;
[[File:ELF.JPG|1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Automation of the ELF vehicle has started with the steering system, which is described in the attached document.&lt;br /&gt;
&lt;br /&gt;
== Theory ==&lt;br /&gt;
&lt;br /&gt;
Self-driving vehicles like Elcano can increase passenger safety, reduce the energy used for urban transportation, and reduce vehicle congestion. Over 90% of traffic accidents are caused by driver error, so the safety potential of self-drive is well-understood.  When self-drive almost eliminates traffic accidents, a motorcycle is almost as safe as a full-frame automobile. Vehicle weights could fall to the point that pod-cars weighing less than the riders are the preferred choice in urban environments. Since 65% of U.S. vehicle miles traveled (VMT) are urban, the ramifications are enormous. Self-driving vehicles can drive a pre-determined speed on a pre-determined route, eliminating unpredictable driver behavior that causes sudden traffic stoppage and congestion. An aerodynamic ultra-light vehicle that avoids stop-and-go traffic needs less than one-tenth the energy of an automobile; a 25 pound rechargeable battery and a small electric motor on a light vehicle achieves the speed and range required for urban transportation. Light batteries can be easily swapped when exhausted, eliminating range anxiety. A bank of batteries can be recharged when the wind blows and the sun shines. Fossil fuel demand, pollution and green house gas production could fall dramatically.&lt;br /&gt;
&lt;br /&gt;
For most people, transportation automation is rocket science.  The Elcano Project aims to make self-drive real for students and hobbyists, and build a popular demand to adopt traffic automation. The technology is here; laws and policies to take advantage of it are not.&lt;br /&gt;
&lt;br /&gt;
An isolated autonomous car can improve safety, but the other benefits require choreographing road users; when done right, highway capacity goes up three times and congestion mostly disappears. If manual and automated traffic were allowed to mix, the manually driven cars would snarl up the automated lane; thus there needs to be separated lanes. A lane set apart for automated vehicles looks a lot like Personal Rapid Transit (PRT), a technology that has been around for more than 40 years. Today PRT systems are in operation; other automated road systems are only at the testing phase.&lt;br /&gt;
&lt;br /&gt;
When an automated vehicle is in a reserved lane, the sensors get simpler and less expensive; there is no need for lidar, radar or extensive machine vision because lane traffic is synchronized and predictable. The Elcano Project provides a blueprint for building your own inexpensive experimental automated vehicle using electronics and sensors.  A tricycle with an electric motor under 750 Watt and top speed under 20 mph is legally a bicycle, and thus street-legal without license, registration or insurance.&lt;br /&gt;
&lt;br /&gt;
== Use of Arduino microcontrollers for Elcano ==&lt;br /&gt;
As you might be just taking your first dive into this project, it is important to know that most of our microcontrollers are manufactured by Arduino. Arduino is one of the largest producers of such development tools and have found great success in creating cheap ways to make them available to the public. Although generally affordable, these boards are mainly intended for prototyping and have rates of failure that may be too high for a production system. It still provides a great base for developers to create new systems.&lt;br /&gt;
For more information refer to https://www.arduino.cc/&lt;br /&gt;
--&amp;gt; the website also has a lot of information about their products from programming to forums so don't be afraid to look things up! Note that Arduino hardware is an open source design based on Atmel AVR. Since our boards are also open source, you have the possibility of designing a single board that merges the Arduino and Elcano functionality.&lt;br /&gt;
&lt;br /&gt;
== System Architecture Overview ==&lt;br /&gt;
Elcano converts an ordinary vehicle to self-drive by adding several classes of hardware, including:&lt;br /&gt;
* [[ProcessorGeneral | Processors]] that use data from the sensors and data from on-board storage to control where the vehicle goes.&lt;br /&gt;
* '''Actuators''' to control steering, braking, and vehicle speed. Actuators are often servomotors but can be other devices.&lt;br /&gt;
* '''Sensors''' to measure vehicle speed, vehicle location, vehicle direction, obstacle distance, and other information about the vehicle and its surroundings.&lt;br /&gt;
* '''Electrical Power''' comes from a bank of batteries, either tapped for multiple voltages or through power converters.&lt;br /&gt;
The processors, actuators, sensors, and power subsystem are all located somewhere on the vehicle. &lt;br /&gt;
Physical Architecture describes where each part is on the vehicle and the location of wires connecting each subsystem.&lt;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[System Architecture]]&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=ProcessorGeneral&amp;diff=211</id>
		<title>ProcessorGeneral</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=ProcessorGeneral&amp;diff=211"/>
		<updated>2019-07-12T19:07:47Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* General Processor Information */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= General Processor Information =&lt;br /&gt;
&lt;br /&gt;
This is the landing page for the different modules of the Elcano system, combined with an overview about how the system functions together. &lt;br /&gt;
&lt;br /&gt;
The version 2 system depended on the ElcanoSerial library for async UART communication between the modules.  The modules were arranged in a loop, so that any module can communicate with each other. As discussed in the ElcanoIntro these modules work together in a way that, if they receive a message they cannot interpret, they will send it to the next module without modifying it in any way. This allows us to send a signal, for example, from a device at the beginning of the loop to a device at the end of the loop without needing a direct connection between the two.&lt;br /&gt;
&lt;br /&gt;
[[Communication | The version 3 system]] replaces the serial loop with CAN bus, an automotive standard introduced by Bosch in the 1990s. CAN is a no-host network, with arbitration performed in hardware to favor messages with higher priority IDs. In version 2, there were separate processors for C3 (Pilot), C4 (Planner) and C6 (Navigator). In version 3, these tasks are handled by a single Arduino Due on the High-Level Board.&lt;br /&gt;
&lt;br /&gt;
-------&lt;br /&gt;
&lt;br /&gt;
=Overview =&lt;br /&gt;
Below is the link to the Master Schematic file that allows anyone to easily locate all components and their intended connections. Please note that this schematic is not to scale, but all components are textually marked with the terminology commonly used throughout the Wiki.&lt;br /&gt;
[[%PUBURLPATH%/%WEB%/%TOPIC%/Master_Schematic.sch | Master_Schematic.sch]]: Master_Schematic.sch  (version 2)&lt;br /&gt;
&lt;br /&gt;
[[System Architecture]] (version 3)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modules =&lt;br /&gt;
&lt;br /&gt;
* [[Power System]] Includes a PowerOn circuit board, sometimes called C1&lt;br /&gt;
&lt;br /&gt;
==Low-level ==&lt;br /&gt;
&lt;br /&gt;
Drive-by-wire actuator controller software&lt;br /&gt;
&lt;br /&gt;
* [[LowLevelBoard | Low Level Board v3 and v2]]&lt;br /&gt;
* [[LowLevel | C2 Low Level v2 ]] &lt;br /&gt;
&lt;br /&gt;
== High-Level ==&lt;br /&gt;
&lt;br /&gt;
* [[HighLevel | High-Level Board v3]] &lt;br /&gt;
&lt;br /&gt;
Information for v2:&lt;br /&gt;
* [[PilotPage | C3 Pilot]]  task on HighLevel board&lt;br /&gt;
* [[PlannerPage | C4 Planner]] task on HighLevel Board&lt;br /&gt;
* [[NavigatorPage | C6] Navigator]]   task on HighLevel board&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
* [[Sonar]]   C5&lt;br /&gt;
* [[SweepObstacleDetector | Sweep Obstacle Detector]]&lt;br /&gt;
* [[VisionPage | Vision]] C7&lt;br /&gt;
&lt;br /&gt;
The version 2 order of communication connections is specified in ElcanoIntro. Version 3 is asynchronous, with priorities determined by CAN message ID.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT NOTE: Throughout older articles and descriptions processors are referred to as C1-C7 while printed circuit boards are described using their own names such as &amp;quot;HighLevel&amp;quot; and &amp;quot;LowLevel&amp;quot;.&lt;br /&gt;
-----  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[%PUBURLPATH%/%WEB%/%TOPIC%/LowLevelV2_1Signals.xls | LowLevelV2_1Signals.xls]]: Signals on LowLevel board&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=System_Architecture&amp;diff=210</id>
		<title>System Architecture</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=System_Architecture&amp;diff=210"/>
		<updated>2019-07-12T19:05:58Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Internal Links: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Elcano architecture features a series of microcontrollers connected over the automotive standard [[Communication |CAN bus]]. CAN is a no-host networking protocol with much of the overhead done in hardware. All Arduino processors are bare bones with no operating system. Messages sent over the bus are low bandwidth; any intense processing such as vision  or lidar uses its own processor. Modularization reduces the size of the code running on any one processor. Reliability and security are enhanced since the core processors are not connected to the Internet and do not do machine learning.&lt;br /&gt;
&lt;br /&gt;
[[File:Architecture CAN.png]]&lt;br /&gt;
&lt;br /&gt;
= Internal Links: =&lt;br /&gt;
&lt;br /&gt;
* [[LowLevelBoard]]&lt;br /&gt;
&lt;br /&gt;
* [[HighLevelHWv3]]&lt;br /&gt;
&lt;br /&gt;
* [[HighLevelSWv3]]&lt;br /&gt;
&lt;br /&gt;
*[[Communication | CAN Communication]]&lt;br /&gt;
&lt;br /&gt;
* [[SteeringSensor]]&lt;br /&gt;
&lt;br /&gt;
* [[ActuatorPage]]&lt;br /&gt;
&lt;br /&gt;
* [[Sonar]]&lt;br /&gt;
&lt;br /&gt;
* [[SweepObstacleDetector]]&lt;br /&gt;
&lt;br /&gt;
* [[Camera]]&lt;br /&gt;
&lt;br /&gt;
= External Links: =&lt;br /&gt;
&lt;br /&gt;
* Arduino SAMD21: https://www.sparkfun.com/products/13664&lt;br /&gt;
&lt;br /&gt;
* Arduino Mega: https://store.arduino.cc/usa/mega-2560-r3&lt;br /&gt;
&lt;br /&gt;
* Arduino Due: https://store.arduino.cc/usa/due&lt;br /&gt;
&lt;br /&gt;
* Arduino Micro: https://store.arduino.cc/usa/arduino-micro&lt;br /&gt;
&lt;br /&gt;
* Kelly E-bike controller: https://www.kellycontroller.com/shop/kbs-e/&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi: https://www.raspberrypi.org/products/raspberry-pi-3-model-b/&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi CAN interface: https://copperhilltech.com/pican2-can-interface-for-raspberry-pi-2-3-with-smps/&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi Camera: https://www.raspberrypi.org/products/camera-module-v2/&lt;br /&gt;
&lt;br /&gt;
* Maxbotix 123x sonars: https://www.maxbotix.com/Ultrasonic_Sensors/MB1230.htm&lt;br /&gt;
&lt;br /&gt;
* Adafruit GPS breakout: https://www.adafruit.com/product/746&lt;br /&gt;
&lt;br /&gt;
* Adafruit INU: https://www.adafruit.com/product/1120&lt;br /&gt;
&lt;br /&gt;
* Adafruit Gyro: https://www.adafruit.com/product/1032&lt;br /&gt;
&lt;br /&gt;
* ADNS 3080 Optical Mouse: https://www.openimpulse.com/blog/products-page/product-category/adns-3080-optical-flow-sensor-module/&lt;br /&gt;
&lt;br /&gt;
* Adafruit SD card: https://www.adafruit.com/product/254&lt;br /&gt;
&lt;br /&gt;
* Scanse sweep: https://www.sparkfun.com/products/retired/14117&lt;br /&gt;
&lt;br /&gt;
* Honeywell rotary sensor (Wheel angle): https://www.alliedelec.com/product/honeywell/rty060lvnax/70235872/&lt;br /&gt;
&lt;br /&gt;
* Solenoid for brakes: https://www.alliedelec.com/m/d/6f3135ea4c7b055fa61164ffeb128a2c.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[Power System]]&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=System_Architecture&amp;diff=209</id>
		<title>System Architecture</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=System_Architecture&amp;diff=209"/>
		<updated>2019-07-12T19:04:58Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: link to CAN page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Elcano architecture features a series of microcontrollers connected over the automotive standard [[Communication |CAN bus]]. CAN is a no-host networking protocol with much of the overhead done in hardware. All Arduino processors are bare bones with no operating system. Messages sent over the bus are low bandwidth; any intense processing such as vision  or lidar uses its own processor. Modularization reduces the size of the code running on any one processor. Reliability and security are enhanced since the core processors are not connected to the Internet and do not do machine learning.&lt;br /&gt;
&lt;br /&gt;
[[File:Architecture CAN.png]]&lt;br /&gt;
&lt;br /&gt;
= Internal Links: =&lt;br /&gt;
&lt;br /&gt;
* [[LowLevelBoard]]&lt;br /&gt;
&lt;br /&gt;
* [[HighLevelHWv3]]&lt;br /&gt;
&lt;br /&gt;
* [[HighLevelSWv3]]&lt;br /&gt;
&lt;br /&gt;
* [[SteeringSensor]]&lt;br /&gt;
&lt;br /&gt;
* [[ActuatorPage]]&lt;br /&gt;
&lt;br /&gt;
* [[Sonar]]&lt;br /&gt;
&lt;br /&gt;
* [[SweepObstacleDetector]]&lt;br /&gt;
&lt;br /&gt;
* [[Camera]]&lt;br /&gt;
&lt;br /&gt;
= External Links: =&lt;br /&gt;
&lt;br /&gt;
* Arduino SAMD21: https://www.sparkfun.com/products/13664&lt;br /&gt;
&lt;br /&gt;
* Arduino Mega: https://store.arduino.cc/usa/mega-2560-r3&lt;br /&gt;
&lt;br /&gt;
* Arduino Due: https://store.arduino.cc/usa/due&lt;br /&gt;
&lt;br /&gt;
* Arduino Micro: https://store.arduino.cc/usa/arduino-micro&lt;br /&gt;
&lt;br /&gt;
* Kelly E-bike controller: https://www.kellycontroller.com/shop/kbs-e/&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi: https://www.raspberrypi.org/products/raspberry-pi-3-model-b/&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi CAN interface: https://copperhilltech.com/pican2-can-interface-for-raspberry-pi-2-3-with-smps/&lt;br /&gt;
&lt;br /&gt;
* Raspberry Pi Camera: https://www.raspberrypi.org/products/camera-module-v2/&lt;br /&gt;
&lt;br /&gt;
* Maxbotix 123x sonars: https://www.maxbotix.com/Ultrasonic_Sensors/MB1230.htm&lt;br /&gt;
&lt;br /&gt;
* Adafruit GPS breakout: https://www.adafruit.com/product/746&lt;br /&gt;
&lt;br /&gt;
* Adafruit INU: https://www.adafruit.com/product/1120&lt;br /&gt;
&lt;br /&gt;
* Adafruit Gyro: https://www.adafruit.com/product/1032&lt;br /&gt;
&lt;br /&gt;
* ADNS 3080 Optical Mouse: https://www.openimpulse.com/blog/products-page/product-category/adns-3080-optical-flow-sensor-module/&lt;br /&gt;
&lt;br /&gt;
* Adafruit SD card: https://www.adafruit.com/product/254&lt;br /&gt;
&lt;br /&gt;
* Scanse sweep: https://www.sparkfun.com/products/retired/14117&lt;br /&gt;
&lt;br /&gt;
* Honeywell rotary sensor (Wheel angle): https://www.alliedelec.com/product/honeywell/rty060lvnax/70235872/&lt;br /&gt;
&lt;br /&gt;
* Solenoid for brakes: https://www.alliedelec.com/m/d/6f3135ea4c7b055fa61164ffeb128a2c.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[Power System]]&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Communication&amp;diff=208</id>
		<title>Communication</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Communication&amp;diff=208"/>
		<updated>2019-07-12T18:39:34Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Elcano CAN Commands==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| CAN ID&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Origin&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 1&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 2&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 3&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 4&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 5&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 6&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 7&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 8&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Function&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x050&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x80&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| E-stop request&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x050&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x40&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Manual/Auto&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x050&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x0X&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Forward/Reverse&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x100&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x80&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| E-stop request&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x100&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x40&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Manual/Auto&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x100&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x0X&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Forward/Reverse&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x101&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal reached&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x200&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lo-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x80&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| E-stop active&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x200&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lo-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x40&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Manual/Auto&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x200&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lo-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x0X&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Forward/Reverse&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x300&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Throttle&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x300&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Brake&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x300&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Steer&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x350&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Drive Speed cm/s&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x350&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Brake&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x350&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Drive angle (10 times degrees)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x400&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lo-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Actual Speed cm/s&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x400&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lo-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Actual angle (10 times degrees)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x420&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lidar&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ww&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| qq&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Obstacle Data&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x440&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Sonar&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ww&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| qq&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Obstacle Data&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x460&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Camera&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ww&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| qq&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Obstacle Data&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x480&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Camera&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ww&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| qq&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Cone Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4A0&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Camera&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| zz&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| zz&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Right road edge&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4A1&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Camera&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| zz&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| zz&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Left road edge&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C1&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 1 Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C2&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 2 Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C3&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 3 Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C4&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 4 Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C5&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 5 Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C6&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 6 Position&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
'''&amp;lt;nowiki&amp;gt;** Please be aware of the initial CAN-Bus baud rate. If you use MCP2515 module for testing, the baud rate needs to be set to twice the due CAN baud rate&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Not all commands will be implemented. All data are given in integer; floating point is not used.&lt;br /&gt;
&lt;br /&gt;
===Command 0x50, 0x100, and 0x200 (status change) ===&lt;br /&gt;
&lt;br /&gt;
use Byte 1.&lt;br /&gt;
&lt;br /&gt;
If bit 0x80 is set, emergency stop is active. &lt;br /&gt;
&lt;br /&gt;
Bit 0x40 when set puts the trike in autonomous mode; reset puts it in manual mode.&lt;br /&gt;
&lt;br /&gt;
If bit 0x04 is zero, the trike is going forward. When the receiver (0x50) sets bit 0x04, it is requesting reverse. Low Level responds with a 0x200 message with bit 0x04 set meaning that reverse is active, bit 0x02 set meaning that reverse is pending or bit 0x01 set meaning that reverse is not available.&lt;br /&gt;
&lt;br /&gt;
The Receiver would output a 0x50 message only when the status changes. It expects to receive a 0x200 message for e-stop active shortly afterwards (maybe 100 ms), and will resend 0x50 until it receives a 0x200. &lt;br /&gt;
&lt;br /&gt;
===Goal Reached (CANID 0x101)===&lt;br /&gt;
&lt;br /&gt;
One byte&lt;br /&gt;
&lt;br /&gt;
If 0x80 is set, all goals have been reached and the vehicle should stop.&lt;br /&gt;
&lt;br /&gt;
Bit 0x01: goal one has been reached and goal two is next.&lt;br /&gt;
&lt;br /&gt;
Bits 0x02, 0x04, 0x08, 0x10, 0x20: Reached goals 2, 3, 4, 5, and 6 respectively.&lt;br /&gt;
&lt;br /&gt;
===Command 0x300===&lt;br /&gt;
&lt;br /&gt;
gives the relative amount to go, stop or turn. For each, 12 bits will suffice, and fewer bytes than indicated could be used. These are uncalibrated relative amounts from minimum to maximum. At present, positive values are throttle and negative values are brake, and it is impossible to accelerate of brake at the same time. In the future, we may want to allow both simultaneously. At present brakes are either on or off; we may use intermediate values to pulse the brakes. A negative steering value indicates left; positive value indicates right; 0 is straight.&lt;br /&gt;
&lt;br /&gt;
===DRIVE (CANID 0x350) ===&lt;br /&gt;
&lt;br /&gt;
0x350 ComandedSpeed, Brake, ComandedSteerAngle&lt;br /&gt;
&lt;br /&gt;
ID350 gives the command drive speed, brake and angle.&lt;br /&gt;
&lt;br /&gt;
This utilizes 6 of the 8 data bytes&lt;br /&gt;
&lt;br /&gt;
ComandedSpeed is a 16-bit signed integer giving the speed for the rear wheel in centimeters per second. It occupies data bytes 1 and 2. The value is the speed, in centimeters / second. Maximum value is 0x7FFF = 32767 cm/s = 730 mph.&lt;br /&gt;
&lt;br /&gt;
Brake is a 16-bit signed integer giving signal to brake. Currently brake is only on or off, but could have pulses added later to be different levels of braking.&lt;br /&gt;
&lt;br /&gt;
ComandedSteerAngle is a16-bit signed integer that specifies the steer angle (in degrees times 10) of the vehicle. Negative value indicates left; positive value indicates right; 0 is straight. It occupies data bytes 5 and 6. Maximum value is 1800; Minimum value is -1800. The trikes are not capable of turning more than ±30°, but other vehicles could be holomorphic.&lt;br /&gt;
&lt;br /&gt;
e.g. &amp;amp;nbsp;commanding 1.5 m/s with a 2.1° left turn gives&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 288&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 1500&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| -21&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| decimal&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 120&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 05 DC&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| FF EB&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| hex&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===ACTUAL (CANID 0x400) ===&lt;br /&gt;
&lt;br /&gt;
0x400 ActualSpeed, ActualAngle&lt;br /&gt;
&lt;br /&gt;
ID400 gives the reports the actual speed and angle from the low-level board to the high-level.&lt;br /&gt;
&lt;br /&gt;
This utilizes 4 of the 8 data bytes&lt;br /&gt;
&lt;br /&gt;
ActualSpeed is a 16-bit signed integer giving the speed for the rear wheel in centimeters per second. It occupies data bytes 1 and 2, formatted identically to ComandedSpeed in DRIVE(0x350) above.&lt;br /&gt;
&lt;br /&gt;
ActualAngle is a16-bit signed integer that specifies the steer angle (in degrees times 10) of the vehicle. It occupies data bytes 5 and 6, formatted identically to ComandedSteerAngle in DRIVE(0x350) above.&lt;br /&gt;
&lt;br /&gt;
===Obstacle Data (0x420, 0x440, 0x460)===&lt;br /&gt;
&lt;br /&gt;
Uses 6 or 8 bytes&lt;br /&gt;
&lt;br /&gt;
Bytes 1,2: Range to obstacle centroid in cm.&lt;br /&gt;
&lt;br /&gt;
Bytes 3,4: Bearing to obstacle centroid in degrees times 10. Negative is left; positive is right.&lt;br /&gt;
&lt;br /&gt;
Byte 5: Obstacle half-width in degrees times 10. If bearing is b and half-width is w, obstacle extends from b-w to b+w. For sensors with limited resolution, byte 5 gives the resolution. For example, a sonar that covers 30 degrees would set byte 5 to 150.&lt;br /&gt;
&lt;br /&gt;
Byte 6: Quality of the signal/data. 0 = no data; 255 = highest quality&lt;br /&gt;
&lt;br /&gt;
Bytes 7,8: Obstacle slant in degrees times 10 (optional). If omitted or 0, the obstacle is perpendicular to the bearing. Otherwise a negative angle indicates that the left side of the obstacle is closer, and a positive angle means the left side is farther than the centroid.&lt;br /&gt;
&lt;br /&gt;
===Cone Position (0x480)===&lt;br /&gt;
&lt;br /&gt;
Position of the next cone, using 6 bytes in the same format as obstacle data.&lt;br /&gt;
&lt;br /&gt;
Byte 5 is the half-width of the cone at the base.&lt;br /&gt;
&lt;br /&gt;
===Road Edge (0x4A0, 0x4A1)===&lt;br /&gt;
&lt;br /&gt;
Estimated distance from vehicle edge to road edge in cm based on present trajectory.&lt;br /&gt;
&lt;br /&gt;
Bytes 1,2: At present vehicle position&lt;br /&gt;
&lt;br /&gt;
Bytes 3,4: At a near future position (to be defined)&lt;br /&gt;
&lt;br /&gt;
Bytes 5,6: At a farther future position (to be defined)&lt;br /&gt;
&lt;br /&gt;
===Goal Positions (0x4C1 … 0x4C6)===&lt;br /&gt;
&lt;br /&gt;
Positions of cones or other goals. Not defined how this would be input; perhaps from a user interface. They can be hard coded for now.&lt;br /&gt;
&lt;br /&gt;
Bytes 1-4: East position in cm&lt;br /&gt;
&lt;br /&gt;
Bytes 5-8 North position in cm.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Communication&amp;diff=207</id>
		<title>Communication</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Communication&amp;diff=207"/>
		<updated>2019-07-12T18:36:20Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Adding content from most recent Elcano CAN protocol document&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Revised Elcano CAN Commands==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| CAN ID&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Origin&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 1&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 2&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 3&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 4&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 5&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 6&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 7&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Byte 8&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Function&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x050&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x80&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| E-stop request&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x050&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x40&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Manual/Auto&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x050&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x0X&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Forward/Reverse&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x100&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x80&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| E-stop request&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x100&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x40&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Manual/Auto&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x100&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x0X&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Forward/Reverse&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x101&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal reached&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x200&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lo-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x80&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| E-stop active&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x200&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lo-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x40&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Manual/Auto&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x200&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lo-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x0X&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Forward/Reverse&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x300&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Throttle&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x300&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Brake&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x300&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Receiver&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Steer&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x350&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Drive Speed cm/s&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x350&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Brake&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x350&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Hi-Level&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Drive angle (10 times degrees)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x400&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lo-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Actual Speed cm/s&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x400&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lo-Level&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;background-color:#d0cece;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Actual angle (10 times degrees)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x420&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Lidar&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ww&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| qq&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Obstacle Data&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x440&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Sonar&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ww&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| qq&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Obstacle Data&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x460&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Camera&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ww&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| qq&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ss&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Obstacle Data&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x480&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Camera&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| rr&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| bb&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ww&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| qq&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Cone Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4A0&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Camera&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| zz&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| zz&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Right road edge&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4A1&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Camera&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| zz&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| zz&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| &lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Left road edge&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C1&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 1 Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C2&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 2 Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C3&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 3 Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C4&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 4 Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C5&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 5 Position&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 0x4C6&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| ?&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| xx&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| yy&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| Goal 6 Position&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
'''&amp;lt;nowiki&amp;gt;** Please be aware of the initial CAN-Bus baud rate. If you use MCP2515 module for testing, the baud rate needs to be set to twice the due CAN baud rate&amp;lt;/nowiki&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Not all commands will be implemented. All data are given in integer; floating point is not used.&lt;br /&gt;
&lt;br /&gt;
===Command 0x50, 0x100, and 0x200 (status change) ===&lt;br /&gt;
&lt;br /&gt;
use Byte 1.&lt;br /&gt;
&lt;br /&gt;
If bit 0x80 is set, emergency stop is active. &lt;br /&gt;
&lt;br /&gt;
Bit 0x40 when set puts the trike in autonomous mode; reset puts it in manual mode.&lt;br /&gt;
&lt;br /&gt;
If bit 0x04 is zero, the trike is going forward. When the receiver (0x50) sets bit 0x04, it is requesting reverse. Low Level responds with a 0x200 message with bit 0x04 set meaning that reverse is active, bit 0x02 set meaning that reverse is pending or bit 0x01 set meaning that reverse is not available.&lt;br /&gt;
&lt;br /&gt;
The Receiver would output a 0x50 message only when the status changes. It expects to receive a 0x200 message for e-stop active shortly afterwards (maybe 100 ms), and will resend 0x50 until it receives a 0x200. &lt;br /&gt;
&lt;br /&gt;
===Goal Reached (CANID 0x101)===&lt;br /&gt;
&lt;br /&gt;
One byte&lt;br /&gt;
&lt;br /&gt;
If 0x80 is set, all goals have been reached and the vehicle should stop.&lt;br /&gt;
&lt;br /&gt;
Bit 0x01: goal one has been reached and goal two is next.&lt;br /&gt;
&lt;br /&gt;
Bits 0x02, 0x04, 0x08, 0x10, 0x20: Reached goals 2, 3, 4, 5, and 6 respectively.&lt;br /&gt;
&lt;br /&gt;
===Command 0x300===&lt;br /&gt;
&lt;br /&gt;
gives the relative amount to go, stop or turn. For each, 12 bits will suffice, and fewer bytes than indicated could be used. These are uncalibrated relative amounts from minimum to maximum. At present, positive values are throttle and negative values are brake, and it is impossible to accelerate of brake at the same time. In the future, we may want to allow both simultaneously. At present brakes are either on or off; we may use intermediate values to pulse the brakes. A negative steering value indicates left; positive value indicates right; 0 is straight.&lt;br /&gt;
&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
===DRIVE (CANID 0x350) ===&lt;br /&gt;
&lt;br /&gt;
0x350 ComandedSpeed, Brake, ComandedSteerAngle&lt;br /&gt;
&lt;br /&gt;
ID350 gives the command drive speed, brake and angle.&lt;br /&gt;
&lt;br /&gt;
This utilizes 6 of the 8 data bytes&lt;br /&gt;
&lt;br /&gt;
ComandedSpeed is a 16-bit signed integer giving the speed for the rear wheel in centimeters per second. It occupies data bytes 1 and 2. The value is the speed, in centimeters / second. Maximum value is 0x7FFF = 32767 cm/s = 730 mph.&lt;br /&gt;
&lt;br /&gt;
Brake is a 16-bit signed integer giving signal to brake. Currently brake is only on or off, but could have pulses added later to be different levels of braking.&lt;br /&gt;
&lt;br /&gt;
ComandedSteerAngle is a16-bit signed integer that specifies the steer angle (in degrees times 10) of the vehicle. Negative value indicates left; positive value indicates right; 0 is straight. It occupies data bytes 5 and 6. Maximum value is 1800; Minimum value is -1800. The trikes are not capable of turning more than ±30°, but other vehicles could be holomorphic.&lt;br /&gt;
&lt;br /&gt;
e.g. &amp;amp;nbsp;commanding 1.5 m/s with a 2.1° left turn gives&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 288&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 1500&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| -21&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| decimal&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 120&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| 05 DC&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| FF EB&lt;br /&gt;
| style=&amp;quot;border:0.0007in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;&amp;quot;| hex&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
===ACTUAL (CANID 0x400) ===&lt;br /&gt;
&lt;br /&gt;
0x400 ActualSpeed, ActualAngle&lt;br /&gt;
&lt;br /&gt;
ID400 gives the reports the actual speed and angle from the low-level board to the high-level.&lt;br /&gt;
&lt;br /&gt;
This utilizes 4 of the 8 data bytes&lt;br /&gt;
&lt;br /&gt;
ActualSpeed is a 16-bit signed integer giving the speed for the rear wheel in centimeters per second. It occupies data bytes 1 and 2, formatted identically to ComandedSpeed in DRIVE(0x350) above.&lt;br /&gt;
&lt;br /&gt;
ActualAngle is a16-bit signed integer that specifies the steer angle (in degrees times 10) of the vehicle. It occupies data bytes 5 and 6, formatted identically to ComandedSteerAngle in DRIVE(0x350) above.&lt;br /&gt;
&lt;br /&gt;
===Obstacle Data (0x420, 0x440, 0x460)===&lt;br /&gt;
&lt;br /&gt;
Uses 6 or 8 bytes&lt;br /&gt;
&lt;br /&gt;
Bytes 1,2: Range to obstacle centroid in cm.&lt;br /&gt;
&lt;br /&gt;
Bytes 3,4: Bearing to obstacle centroid in degrees times 10. Negative is left; positive is right.&lt;br /&gt;
&lt;br /&gt;
Byte 5: Obstacle half-width in degrees times 10. If bearing is b and half-width is w, obstacle extends from b-w to b+w. For sensors with limited resolution, byte 5 gives the resolution. For example, a sonar that covers 30 degrees would set byte 5 to 150.&lt;br /&gt;
&lt;br /&gt;
Byte 6: Quality of the signal/data. 0 = no data; 255 = highest quality&lt;br /&gt;
&lt;br /&gt;
Bytes 7,8: Obstacle slant in degrees times 10 (optional). If omitted or 0, the obstacle is perpendicular to the bearing. Otherwise a negative angle indicates that the left side of the obstacle is closer, and a positive angle means the left side is farther than the centroid.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Cone Position (0x480)===&lt;br /&gt;
&lt;br /&gt;
Position of the next cone, using 6 bytes in the same format as obstacle data.&lt;br /&gt;
&lt;br /&gt;
Byte 5 is the half-width of the cone at the base.&lt;br /&gt;
&lt;br /&gt;
===Road Edge (0x4A0, 0x4A1)===&lt;br /&gt;
&lt;br /&gt;
Estimated distance from vehicle edge to road edge in cm based on present trajectory.&lt;br /&gt;
&lt;br /&gt;
Bytes 1,2: At present vehicle position&lt;br /&gt;
&lt;br /&gt;
Bytes 3,4: At a near future position (to be defined)&lt;br /&gt;
&lt;br /&gt;
Bytes 5,6: At a farther future position (to be defined)&lt;br /&gt;
&lt;br /&gt;
===Goal Positions (0x4C1 … 0x4C6)===&lt;br /&gt;
&lt;br /&gt;
Positions of cones or other goals. Not defined how this would be input; perhaps from a user interface. They can be hard coded for now.&lt;br /&gt;
&lt;br /&gt;
Bytes 1-4: East position in cm&lt;br /&gt;
&lt;br /&gt;
Bytes 5-8 North position in cm.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=206</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=206"/>
		<updated>2019-07-12T18:24:00Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: adding a communication page for Canbus&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Welcome to the Elcano Project Wiki =&lt;br /&gt;
As the title says, WELCOME TO THE ELCANO PROJECT! Over the past few years many different teams have been working hard to create Cheap and Modular autonomy at the University of Washington Bothell. We are currently working on our first two prototypes which are now in the form of tricycles. With the use of affordable microcontrollers, such as the Arduino Mega 2560 and Raspberry PI, we are working towards creating Autonomy for anyone to rebuild anywhere, and that under $2000 and fully open-source. But we don't plan to stop there, no. That is just the first step in reaching our ultimate goal, which is making our systems applicable to any desired ground vehicles, such as cars and other vehicles. Autonomy is nothing new, in fact it has been around for over 40 years, the difference is that now we have the ability to make it available for anyone who desires furthering their knowledge or simply finding a safer way to work.&lt;br /&gt;
&lt;br /&gt;
To '''edit articles''' or '''upload files''', please create an account and request editing rights from a [//www.elcanoproject.org/wiki/index.php?title=Special:ListUsers&amp;amp;group=bureaucrat member of the &amp;quot;bureaucrat&amp;quot; group].&lt;br /&gt;
&lt;br /&gt;
For editing help visit https://www.mediawiki.org/wiki/Help:Editing_pages or https://www.mediawiki.org/wiki/Help:Formatting.&lt;br /&gt;
--------&lt;br /&gt;
[[File:Catrikes.JPG|1000px]]&lt;br /&gt;
== [[ElcanoIntro | Overview]] ==&lt;br /&gt;
Basic concept of how the Elcano Project vehicle works.&lt;br /&gt;
&lt;br /&gt;
== [[System Architecture]] ==&lt;br /&gt;
How processors connect to sensors, each other, actuators, and other hardware. Includes processor-to-processor communication protocol.&lt;br /&gt;
&lt;br /&gt;
== [[Communication | Communication (CAN Bus)]] ==&lt;br /&gt;
How processors exchange data on the vehicle and a description of data packet contents.&lt;br /&gt;
&lt;br /&gt;
== [[Power System]] ==&lt;br /&gt;
How different modules connect to the batteries or power subsystem hardware.&lt;br /&gt;
&lt;br /&gt;
== [[Low Level]] ==&lt;br /&gt;
How the Low Level system uses inputs to control actuators to steer, move, and stop the vehicle.&lt;br /&gt;
&lt;br /&gt;
== [[High Level]] ==&lt;br /&gt;
How the High Level system uses stored maps and inputs from navigational sensors to formulate movement instructions sent to Low Level.&lt;br /&gt;
&lt;br /&gt;
== [[RemoteControl]] ==&lt;br /&gt;
Human control of trike movements through Low Level using hardware connected to Low Level by a radio communication link (drive by radio). Includes on-board controls (drive by wire).&lt;br /&gt;
&lt;br /&gt;
== [[SensorsPage]] ==&lt;br /&gt;
&lt;br /&gt;
=== [[SteeringSensor]] ===&lt;br /&gt;
The front wheel angle detector.&lt;br /&gt;
&lt;br /&gt;
=== [[Sonar]] === &lt;br /&gt;
How the sonar subsystem connected to High Level works.&lt;br /&gt;
&lt;br /&gt;
=== [[Lidar]] ===&lt;br /&gt;
How the lidar subsystem connected to High Level works.&lt;br /&gt;
&lt;br /&gt;
=== [[ Camera]] ===&lt;br /&gt;
How the camera and vision subsystem connected to High Level works.&lt;br /&gt;
&lt;br /&gt;
== [[ActuatorPage]] ==&lt;br /&gt;
&lt;br /&gt;
== [[ Board Diagrams]] ==&lt;br /&gt;
Images of Elcano Project's printed circuit boards for reference. PCB source files and schematics are maintained and stored at [//github.com/elcano].&lt;br /&gt;
&lt;br /&gt;
== [[GitUsage | Using Git and GitHub]] ==&lt;br /&gt;
Practices for maintaining code and source files on Elcano Project's Github.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[FilesPage | Files]] ==&lt;br /&gt;
These are media files (pictures, videos, etc.) that are part of the project, but are not maintained under version control.&lt;br /&gt;
&lt;br /&gt;
== Elcano Project Main Website ==&lt;br /&gt;
* [//www.elcanoproject.org]&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=200</id>
		<title>SteeringSensor</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=200"/>
		<updated>2019-07-09T05:33:45Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Ackermann Steering Geometry: wheel angle and turning radius */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Steering Angle Sensor =&lt;br /&gt;
&lt;br /&gt;
To change or maintain travel direction, the system must know which way the front wheels are pointing. Elcano tricycles accomplish this task with a rotational position sensor placed on the front steer wheels. Each trike has two steering columns, and both are instrumented for redundancy. The sensor is mechanically mounted to the shaft.  Since the system uses Ackerman steering, the turn angle of the two wheels will be slightly different. More information is below.&lt;br /&gt;
Rotational position sensors may be incremental or absolute. An incremental position sensor only reports discrete changes in rotational position and possibly direction of rotation. Absolute position sensors report the current angle of the sensor shaft. Absolute position sensors have advantages for sensing wheel angle, such as always knowing the current wheel angle at the power-on state. Elcano test vehicles use absolute rotation sensors.&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Analog ==&lt;br /&gt;
&lt;br /&gt;
Analog position sensors typically communicate angle using current or voltage levels. In these devices, current or voltage is a function of the angle. Example:&lt;br /&gt;
&lt;br /&gt;
[[File:wheel-turn-angle_360-degree-sensor.png | border | 640px]]&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Digital ==&lt;br /&gt;
&lt;br /&gt;
Digital position sensors communicate angle digitally. Two ways a sensor can accomplish this task is by encoding the measured position into a binary stream (serial communication) or by encoding the position in binary by driving several output pins high or low (parallel communication). &lt;br /&gt;
&lt;br /&gt;
== Reducing Sensor Noise ==&lt;br /&gt;
&lt;br /&gt;
The problem with sending an analog signal over a long wire to the Arduino is that the wire acts as an antenna and picks up noise. Thus we connect a twisted wire pair from sensor to Arduino that has Signal In as well as the return. The return wire is connected to the ground wire at the sensor. The return wire may have picked up noise when it gets to the Arduino. The Arduino subtracts the analog value of return from the Signal In. Since both wires have picked up approximately the same noise, subtracting them gives a more robust reading. The Signal In return signal goes to an analog input on the Arduino, and is not connected to Arduino ground. The test vehicle analog sensor uses four wires: power, ground, signal, and signal return.  &lt;br /&gt;
&lt;br /&gt;
Another alternative is to use an analog-to-digital converter to digitize the voltage reading from the sensor before it reaches [[C2]]. All analog signals are sensitive to noise from the environment, especially nearby electronics. This noise appears as voltage changes on the power and signal wires of the turn sensors and is visible with an oscilloscope. Because noise creates changes in voltage on the signal and power wires, it creates erroneous angle readings.&lt;br /&gt;
&lt;br /&gt;
--Main.JosephBreithaupt - 2017-02-11&lt;br /&gt;
&lt;br /&gt;
== Sensors used ==&lt;br /&gt;
&lt;br /&gt;
We have gotten the best results from RTY060LVNAX  60 degree analog rotary encoder with a 5V range. &lt;br /&gt;
Other possibilities:&lt;br /&gt;
&lt;br /&gt;
- TT Electronics 6127 sensor giving 5V analog output over 360 degrees https://www.digikey.com/products/en?keywords=987-1393-ND . Has six times less resolution than a 60 degree sensor, and the minimum resolution can get lost in the noise.&lt;br /&gt;
&lt;br /&gt;
- EMS22A50-M25-LD6 Digital rotary encoder. This produces 1024 steps over 360 degrees, in SPI.  It will give a resolution of 0.35 degrees. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- TLC1549CP 10-bit analog-to-digital converter with serial control. This could be used to digitize the voltage from the RTY060LVNAX, reducing noise from analog transmission. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- AMS5043 Magnetic Angle Encoder. This requires that a cylindrical magnet be mounted precisely on the shaft. The sensor has an indent for the magnet, but the indent in not in the right place. Difficult to get robust readings from the part.&lt;br /&gt;
&lt;br /&gt;
- It is possible to tap into the feedback wire on the linear actuator. This reading suffers from hysteresis.&lt;br /&gt;
&lt;br /&gt;
- Putting a current sensor on the actuator lets us measure the power draw, but this is not adequate for control.&lt;br /&gt;
&lt;br /&gt;
== Mounting the Steering Angle Sensor ==&lt;br /&gt;
&lt;br /&gt;
The steering sensor is mounted directly the top of the steering knuckle. In the top if the steering knuckle is threaded rod that is kept in place using a jam nut. On the end of that threaded rod is a coupling nut that has been locked in place using a jam nut. From the coupling nut an adapter has been 3d printed that connects the coupling nut to the Steering angle sensor. The steering angle sensor is help in place using a piece of flat metal bar with a 90 degree bend. &lt;br /&gt;
&lt;br /&gt;
Mounting in this position is beneficial by reducing the amount of mechanical play that the system is exposed to and therefore reducing false readings. &lt;br /&gt;
&lt;br /&gt;
== Ackermann Steering Geometry: wheel angle and turning radius ==&lt;br /&gt;
&lt;br /&gt;
Many road vehicles use a variation of Ackermann Steering to allow a vehicle with more than two wheels to turn smoothly. The challenge of steering a multi-wheel vehicle in a circle is that all wheels are at different distances to the center of that circle, so they must turn to different angles and spin at different speeds. The trike used in the current Elcano system solves the speed differential problem by having only one drive wheel and un-driven steering wheels. The steering differential problem is solved using Ackermann steering geometry. With a basic understanding of Ackermann steering and right triangle geometry, we can predict variables like the turning radius of each wheel and the steering angle of the two front wheels. The inner turning wheel and outer turning wheel turn at different angles and have different turning radii. These calculations find both dimensions when given the inner turning radius (R1 in the image), wheelbase, and front wheel distance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ackermann steering geometry is based on two right triangles. Every calculation comes from right triangle trigonometry and the Pythagorean Theorem.&lt;br /&gt;
&lt;br /&gt;
[[File:wheel-angles-small.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Variables:'''&lt;br /&gt;
&lt;br /&gt;
Bicycle Image:&lt;br /&gt;
&lt;br /&gt;
R = bicycle turning radius&lt;br /&gt;
&lt;br /&gt;
A = bicycle front wheel angle&lt;br /&gt;
&lt;br /&gt;
A' = A&lt;br /&gt;
&lt;br /&gt;
L = wheelbase&lt;br /&gt;
&lt;br /&gt;
[[File:bicycle-form.png|center]]&lt;br /&gt;
&lt;br /&gt;
Ackermann Image:&lt;br /&gt;
&lt;br /&gt;
R1 = inner turning radius&lt;br /&gt;
&lt;br /&gt;
R2 = outer turning radius&lt;br /&gt;
&lt;br /&gt;
A1 = inner front wheel angle&lt;br /&gt;
&lt;br /&gt;
A2 - outer front wheel angle&lt;br /&gt;
&lt;br /&gt;
W = distance between front wheels&lt;br /&gt;
&lt;br /&gt;
L = wheelbase&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:ackermann-form.png|center]]&lt;br /&gt;
&lt;br /&gt;
TODO: determine if these equations accurately predict the inputs from the turn angle sensors while the trike is stationary or moving.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=199</id>
		<title>SteeringSensor</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=199"/>
		<updated>2019-07-09T05:28:21Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Ackermann Steering Geometry: wheel angle and turning radius */ added images&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Steering Angle Sensor =&lt;br /&gt;
&lt;br /&gt;
To change or maintain travel direction, the system must know which way the front wheels are pointing. Elcano tricycles accomplish this task with a rotational position sensor placed on the front steer wheels. Each trike has two steering columns, and both are instrumented for redundancy. The sensor is mechanically mounted to the shaft.  Since the system uses Ackerman steering, the turn angle of the two wheels will be slightly different. More information is below.&lt;br /&gt;
Rotational position sensors may be incremental or absolute. An incremental position sensor only reports discrete changes in rotational position and possibly direction of rotation. Absolute position sensors report the current angle of the sensor shaft. Absolute position sensors have advantages for sensing wheel angle, such as always knowing the current wheel angle at the power-on state. Elcano test vehicles use absolute rotation sensors.&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Analog ==&lt;br /&gt;
&lt;br /&gt;
Analog position sensors typically communicate angle using current or voltage levels. In these devices, current or voltage is a function of the angle. Example:&lt;br /&gt;
&lt;br /&gt;
[[File:wheel-turn-angle_360-degree-sensor.png | border | 640px]]&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Digital ==&lt;br /&gt;
&lt;br /&gt;
Digital position sensors communicate angle digitally. Two ways a sensor can accomplish this task is by encoding the measured position into a binary stream (serial communication) or by encoding the position in binary by driving several output pins high or low (parallel communication). &lt;br /&gt;
&lt;br /&gt;
== Reducing Sensor Noise ==&lt;br /&gt;
&lt;br /&gt;
The problem with sending an analog signal over a long wire to the Arduino is that the wire acts as an antenna and picks up noise. Thus we connect a twisted wire pair from sensor to Arduino that has Signal In as well as the return. The return wire is connected to the ground wire at the sensor. The return wire may have picked up noise when it gets to the Arduino. The Arduino subtracts the analog value of return from the Signal In. Since both wires have picked up approximately the same noise, subtracting them gives a more robust reading. The Signal In return signal goes to an analog input on the Arduino, and is not connected to Arduino ground. The test vehicle analog sensor uses four wires: power, ground, signal, and signal return.  &lt;br /&gt;
&lt;br /&gt;
Another alternative is to use an analog-to-digital converter to digitize the voltage reading from the sensor before it reaches [[C2]]. All analog signals are sensitive to noise from the environment, especially nearby electronics. This noise appears as voltage changes on the power and signal wires of the turn sensors and is visible with an oscilloscope. Because noise creates changes in voltage on the signal and power wires, it creates erroneous angle readings.&lt;br /&gt;
&lt;br /&gt;
--Main.JosephBreithaupt - 2017-02-11&lt;br /&gt;
&lt;br /&gt;
== Sensors used ==&lt;br /&gt;
&lt;br /&gt;
We have gotten the best results from RTY060LVNAX  60 degree analog rotary encoder with a 5V range. &lt;br /&gt;
Other possibilities:&lt;br /&gt;
&lt;br /&gt;
- TT Electronics 6127 sensor giving 5V analog output over 360 degrees https://www.digikey.com/products/en?keywords=987-1393-ND . Has six times less resolution than a 60 degree sensor, and the minimum resolution can get lost in the noise.&lt;br /&gt;
&lt;br /&gt;
- EMS22A50-M25-LD6 Digital rotary encoder. This produces 1024 steps over 360 degrees, in SPI.  It will give a resolution of 0.35 degrees. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- TLC1549CP 10-bit analog-to-digital converter with serial control. This could be used to digitize the voltage from the RTY060LVNAX, reducing noise from analog transmission. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- AMS5043 Magnetic Angle Encoder. This requires that a cylindrical magnet be mounted precisely on the shaft. The sensor has an indent for the magnet, but the indent in not in the right place. Difficult to get robust readings from the part.&lt;br /&gt;
&lt;br /&gt;
- It is possible to tap into the feedback wire on the linear actuator. This reading suffers from hysteresis.&lt;br /&gt;
&lt;br /&gt;
- Putting a current sensor on the actuator lets us measure the power draw, but this is not adequate for control.&lt;br /&gt;
&lt;br /&gt;
== Mounting the Steering Angle Sensor ==&lt;br /&gt;
&lt;br /&gt;
The steering sensor is mounted directly the top of the steering knuckle. In the top if the steering knuckle is threaded rod that is kept in place using a jam nut. On the end of that threaded rod is a coupling nut that has been locked in place using a jam nut. From the coupling nut an adapter has been 3d printed that connects the coupling nut to the Steering angle sensor. The steering angle sensor is help in place using a piece of flat metal bar with a 90 degree bend. &lt;br /&gt;
&lt;br /&gt;
Mounting in this position is beneficial by reducing the amount of mechanical play that the system is exposed to and therefore reducing false readings. &lt;br /&gt;
&lt;br /&gt;
== Ackermann Steering Geometry: wheel angle and turning radius ==&lt;br /&gt;
&lt;br /&gt;
Many road vehicles use a variation of Ackermann Steering to allow a vehicle with more than two wheels to turn smoothly. The challenge of steering a multi-wheel vehicle in a circle is that all wheels are at different distances to the center of that circle, so they must turn to different angles and spin at different speeds. The trike used in the current Elcano system solves the speed differential problem by having only one drive wheel and un-driven steering wheels. The steering differential problem is solved using Ackermann steering geometry. With a basic understanding of Ackermann steering and right triangle geometry, we can predict variables like the turning radius of different wheels and the steering angle of different wheels. The inner turning wheel and outer turning wheel turn at different angles and have different turning radii. These calculations find both dimensions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ackermann steering geometry is based on two right triangles. Every calculation comes from right triangle trigonometry and the Pythagorean Theorem.&lt;br /&gt;
&lt;br /&gt;
[[File:wheel-angles-small.png|center]]&lt;br /&gt;
&lt;br /&gt;
'''Variables:'''&lt;br /&gt;
&lt;br /&gt;
Bicycle Image:&lt;br /&gt;
&lt;br /&gt;
R = bicycle turning radius&lt;br /&gt;
&lt;br /&gt;
A = bicycle front wheel angle&lt;br /&gt;
&lt;br /&gt;
A' = A&lt;br /&gt;
&lt;br /&gt;
L = wheelbase&lt;br /&gt;
&lt;br /&gt;
[[File:bicycle-form.png|center]]&lt;br /&gt;
&lt;br /&gt;
Ackermann Image:&lt;br /&gt;
&lt;br /&gt;
R1 = inner turning radius&lt;br /&gt;
&lt;br /&gt;
R2 = outer turning radius&lt;br /&gt;
&lt;br /&gt;
A1 = inner front wheel angle&lt;br /&gt;
&lt;br /&gt;
A2 - outer front wheel angle&lt;br /&gt;
&lt;br /&gt;
W = distance between front wheels&lt;br /&gt;
&lt;br /&gt;
L = wheelbase&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:ackermann-form.png|center]]&lt;br /&gt;
&lt;br /&gt;
TODO: determine if these equations accurately predict the inputs from the turn angle sensors while the trike is stationary or moving.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:Wheel-angles-small.png&amp;diff=198</id>
		<title>File:Wheel-angles-small.png</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:Wheel-angles-small.png&amp;diff=198"/>
		<updated>2019-07-09T05:17:57Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Idealized turning radius geometry for a vehicle with one (bicycle) or two (Ackermann steering) front wheels.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Idealized turning radius geometry for a vehicle with one (bicycle) or two (Ackermann steering) front wheels.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:Ackermann-form.png&amp;diff=197</id>
		<title>File:Ackermann-form.png</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:Ackermann-form.png&amp;diff=197"/>
		<updated>2019-07-09T05:16:03Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Calculations for turning radius and steering angles of a vehicle with two front wheels with ideal Ackermann geometry.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Calculations for turning radius and steering angles of a vehicle with two front wheels with ideal Ackermann geometry.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:Bicycle-form.png&amp;diff=196</id>
		<title>File:Bicycle-form.png</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:Bicycle-form.png&amp;diff=196"/>
		<updated>2019-07-09T05:13:37Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Turning radius calculation for a vehicle with a single steering wheel.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Turning radius calculation for a vehicle with a single steering wheel.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=195</id>
		<title>SteeringSensor</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=195"/>
		<updated>2019-07-09T04:44:09Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Ackermann Steering Geometry: wheel angle and turning radius */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Steering Angle Sensor =&lt;br /&gt;
&lt;br /&gt;
To change or maintain travel direction, the system must know which way the front wheels are pointing. Elcano tricycles accomplish this task with a rotational position sensor placed on the front steer wheels. Each trike has two steering columns, and both are instrumented for redundancy. The sensor is mechanically mounted to the shaft.  Since the system uses Ackerman steering, the turn angle of the two wheels will be slightly different. More information is below.&lt;br /&gt;
Rotational position sensors may be incremental or absolute. An incremental position sensor only reports discrete changes in rotational position and possibly direction of rotation. Absolute position sensors report the current angle of the sensor shaft. Absolute position sensors have advantages for sensing wheel angle, such as always knowing the current wheel angle at the power-on state. Elcano test vehicles use absolute rotation sensors.&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Analog ==&lt;br /&gt;
&lt;br /&gt;
Analog position sensors typically communicate angle using current or voltage levels. In these devices, current or voltage is a function of the angle. Example:&lt;br /&gt;
&lt;br /&gt;
[[File:wheel-turn-angle_360-degree-sensor.png | border | 640px]]&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Digital ==&lt;br /&gt;
&lt;br /&gt;
Digital position sensors communicate angle digitally. Two ways a sensor can accomplish this task is by encoding the measured position into a binary stream (serial communication) or by encoding the position in binary by driving several output pins high or low (parallel communication). &lt;br /&gt;
&lt;br /&gt;
== Reducing Sensor Noise ==&lt;br /&gt;
&lt;br /&gt;
The problem with sending an analog signal over a long wire to the Arduino is that the wire acts as an antenna and picks up noise. Thus we connect a twisted wire pair from sensor to Arduino that has Signal In as well as the return. The return wire is connected to the ground wire at the sensor. The return wire may have picked up noise when it gets to the Arduino. The Arduino subtracts the analog value of return from the Signal In. Since both wires have picked up approximately the same noise, subtracting them gives a more robust reading. The Signal In return signal goes to an analog input on the Arduino, and is not connected to Arduino ground. The test vehicle analog sensor uses four wires: power, ground, signal, and signal return.  &lt;br /&gt;
&lt;br /&gt;
Another alternative is to use an analog-to-digital converter to digitize the voltage reading from the sensor before it reaches [[C2]]. All analog signals are sensitive to noise from the environment, especially nearby electronics. This noise appears as voltage changes on the power and signal wires of the turn sensors and is visible with an oscilloscope. Because noise creates changes in voltage on the signal and power wires, it creates erroneous angle readings.&lt;br /&gt;
&lt;br /&gt;
--Main.JosephBreithaupt - 2017-02-11&lt;br /&gt;
&lt;br /&gt;
== Sensors used ==&lt;br /&gt;
&lt;br /&gt;
We have gotten the best results from RTY060LVNAX  60 degree analog rotary encoder with a 5V range. &lt;br /&gt;
Other possibilities:&lt;br /&gt;
&lt;br /&gt;
- TT Electronics 6127 sensor giving 5V analog output over 360 degrees https://www.digikey.com/products/en?keywords=987-1393-ND . Has six times less resolution than a 60 degree sensor, and the minimum resolution can get lost in the noise.&lt;br /&gt;
&lt;br /&gt;
- EMS22A50-M25-LD6 Digital rotary encoder. This produces 1024 steps over 360 degrees, in SPI.  It will give a resolution of 0.35 degrees. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- TLC1549CP 10-bit analog-to-digital converter with serial control. This could be used to digitize the voltage from the RTY060LVNAX, reducing noise from analog transmission. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- AMS5043 Magnetic Angle Encoder. This requires that a cylindrical magnet be mounted precisely on the shaft. The sensor has an indent for the magnet, but the indent in not in the right place. Difficult to get robust readings from the part.&lt;br /&gt;
&lt;br /&gt;
- It is possible to tap into the feedback wire on the linear actuator. This reading suffers from hysteresis.&lt;br /&gt;
&lt;br /&gt;
- Putting a current sensor on the actuator lets us measure the power draw, but this is not adequate for control.&lt;br /&gt;
&lt;br /&gt;
== Mounting the Steering Angle Sensor ==&lt;br /&gt;
&lt;br /&gt;
The steering sensor is mounted directly the top of the steering knuckle. In the top if the steering knuckle is threaded rod that is kept in place using a jam nut. On the end of that threaded rod is a coupling nut that has been locked in place using a jam nut. From the coupling nut an adapter has been 3d printed that connects the coupling nut to the Steering angle sensor. The steering angle sensor is help in place using a piece of flat metal bar with a 90 degree bend. &lt;br /&gt;
&lt;br /&gt;
Mounting in this position is beneficial by reducing the amount of mechanical play that the system is exposed to and therefore reducing false readings. &lt;br /&gt;
&lt;br /&gt;
== Ackermann Steering Geometry: wheel angle and turning radius ==&lt;br /&gt;
&lt;br /&gt;
Many road vehicles use a variation of Ackermann Steering to allow a vehicle with more than two wheels to turn smoothly. The challenge of steering a multi-wheel vehicle in a circle is that all wheels are at different distances to the center of that circle, so they must turn to different angles and spin at different speeds. The trike used in the current Elcano system solves the speed differential problem by having only one drive wheel and un-driven steering wheels. The steering differential problem is solved using Ackermann steering geometry. With a basic understanding of Ackermann steering and right triangle geometry, we can predict variables like the turning radius of different wheels and the steering angle of different wheels. The inner turning wheel and outer turning wheel turn at different angles and have different turning radii. These calculations find both dimensions.&lt;br /&gt;
&lt;br /&gt;
'''Principle Formulas:'''&lt;br /&gt;
Ackermann steering geometry is based on two right triangles. Every calculation comes from right triangle trigonometry and the Pythagorean Theorem.&lt;br /&gt;
&lt;br /&gt;
PUT STEERING ANGLE IMAGES HERE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TODO: determine if these equations accurately predict the inputs from the turn angle sensors while the trike is stationary or moving.&lt;br /&gt;
&lt;br /&gt;
-- Main.JosephDonan - 2017-05-17&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=194</id>
		<title>SteeringSensor</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=194"/>
		<updated>2019-07-02T03:43:02Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Absolute wheel position: Analog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Steering Angle Sensor =&lt;br /&gt;
&lt;br /&gt;
To change or maintain travel direction, the system must know which way the front wheels are pointing. Elcano tricycles accomplish this task with a rotational position sensor placed on the front steer wheels. Each trike has two steering columns, and both are instrumented for redundancy. The sensor is mechanically mounted to the shaft.  Since the system uses Ackerman steering, the turn angle of the two wheels will be slightly different. More information is below.&lt;br /&gt;
Rotational position sensors may be incremental or absolute. An incremental position sensor only reports discrete changes in rotational position and possibly direction of rotation. Absolute position sensors report the current angle of the sensor shaft. Absolute position sensors have advantages for sensing wheel angle, such as always knowing the current wheel angle at the power-on state. Elcano test vehicles use absolute rotation sensors.&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Analog ==&lt;br /&gt;
&lt;br /&gt;
Analog position sensors typically communicate angle using current or voltage levels. In these devices, current or voltage is a function of the angle. Example:&lt;br /&gt;
&lt;br /&gt;
[[File:wheel-turn-angle_360-degree-sensor.png | border | 640px]]&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Digital ==&lt;br /&gt;
&lt;br /&gt;
Digital position sensors communicate angle digitally. Two ways a sensor can accomplish this task is by encoding the measured position into a binary stream (serial communication) or by encoding the position in binary by driving several output pins high or low (parallel communication). &lt;br /&gt;
&lt;br /&gt;
== Reducing Sensor Noise ==&lt;br /&gt;
&lt;br /&gt;
The problem with sending an analog signal over a long wire to the Arduino is that the wire acts as an antenna and picks up noise. Thus we connect a twisted wire pair from sensor to Arduino that has Signal In as well as the return. The return wire is connected to the ground wire at the sensor. The return wire may have picked up noise when it gets to the Arduino. The Arduino subtracts the analog value of return from the Signal In. Since both wires have picked up approximately the same noise, subtracting them gives a more robust reading. The Signal In return signal goes to an analog input on the Arduino, and is not connected to Arduino ground. The test vehicle analog sensor uses four wires: power, ground, signal, and signal return.  &lt;br /&gt;
&lt;br /&gt;
Another alternative is to use an analog-to-digital converter to digitize the voltage reading from the sensor before it reaches [[C2]]. All analog signals are sensitive to noise from the environment, especially nearby electronics. This noise appears as voltage changes on the power and signal wires of the turn sensors and is visible with an oscilloscope. Because noise creates changes in voltage on the signal and power wires, it creates erroneous angle readings.&lt;br /&gt;
&lt;br /&gt;
--Main.JosephBreithaupt - 2017-02-11&lt;br /&gt;
&lt;br /&gt;
== Sensors used ==&lt;br /&gt;
&lt;br /&gt;
We have gotten the best results from RTY060LVNAX  60 degree analog rotary encoder with a 5V range. &lt;br /&gt;
Other possibilities:&lt;br /&gt;
&lt;br /&gt;
- TT Electronics 6127 sensor giving 5V analog output over 360 degrees https://www.digikey.com/products/en?keywords=987-1393-ND . Has six times less resolution than a 60 degree sensor, and the minimum resolution can get lost in the noise.&lt;br /&gt;
&lt;br /&gt;
- EMS22A50-M25-LD6 Digital rotary encoder. This produces 1024 steps over 360 degrees, in SPI.  It will give a resolution of 0.35 degrees. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- TLC1549CP 10-bit analog-to-digital converter with serial control. This could be used to digitize the voltage from the RTY060LVNAX, reducing noise from analog transmission. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- AMS5043 Magnetic Angle Encoder. This requires that a cylindrical magnet be mounted precisely on the shaft. The sensor has an indent for the magnet, but the indent in not in the right place. Difficult to get robust readings from the part.&lt;br /&gt;
&lt;br /&gt;
- It is possible to tap into the feedback wire on the linear actuator. This reading suffers from hysteresis.&lt;br /&gt;
&lt;br /&gt;
- Putting a current sensor on the actuator lets us measure the power draw, but this is not adequate for control.&lt;br /&gt;
&lt;br /&gt;
== Mounting the Steering Angle Sensor ==&lt;br /&gt;
&lt;br /&gt;
The steering sensor is mounted directly the top of the steering knuckle. In the top if the steering knuckle is threaded rod that is kept in place using a jam nut. On the end of that threaded rod is a coupling nut that has been locked in place using a jam nut. From the coupling nut an adapter has been 3d printed that connects the coupling nut to the Steering angle sensor. The steering angle sensor is help in place using a piece of flat metal bar with a 90 degree bend. &lt;br /&gt;
&lt;br /&gt;
Mounting in this position is beneficial by reducing the amount of mechanical play that the system is exposed to and therefore reducing false readings. &lt;br /&gt;
&lt;br /&gt;
== Ackermann Steering Geometry: wheel angle and turning radius ==&lt;br /&gt;
&lt;br /&gt;
Many road vehicles use a variation of Ackermann Steering to allow a vehicle with more than two wheels to turn smoothly. The challenge of steering a multi-wheel vehicle in a circle is that all wheels are at different distances to the center of that circle, so they must turn to different angles and spin at different speeds. The trike used in the current Elcano system solves the speed differential problem by having only one drive wheel and un-driven steering wheels. The steering differential problem is solved using Ackermann steering geometry. With a basic understanding of Ackermann steering and right triangle geometry, we can predict variables like the turning radius of different wheels and the steering angle of different wheels. The inner turning wheel and outer turning wheel turn at different angles and have different turning radii. These calculations find both dimensions.&lt;br /&gt;
&lt;br /&gt;
'''Principle Formulas:'''&lt;br /&gt;
Ackermann steering geometry is based on two right triangles. Every calculation comes from right triangle trigonometry and the Pythagorean Theorem.&lt;br /&gt;
&lt;br /&gt;
%ATTACHURL%/Angles.png  &lt;br /&gt;
&lt;br /&gt;
'''Key Variables:'''&lt;br /&gt;
* Length = vehicle wheel base length, measured from front hub center to back hub center&lt;br /&gt;
* Width = distance between center of the front wheels&lt;br /&gt;
* A_inner = turning angle of inner front wheel&lt;br /&gt;
* A_outer = turning angle of outer front wheel; A_outer &amp;lt; A_inner&lt;br /&gt;
* R_inner = turning radius of the inner front turning wheel&lt;br /&gt;
* R_outer = turning radius of the outer front wheel&lt;br /&gt;
&lt;br /&gt;
%ATTACHURL%/TrikeTurning.png  &lt;br /&gt;
&lt;br /&gt;
Initial known variables: Length, Width, A_inner&lt;br /&gt;
&lt;br /&gt;
Unknowns: A_outer, R_outer, R_inner&lt;br /&gt;
&lt;br /&gt;
'''Calculations:'''&lt;br /&gt;
First, create the inner wheel right triangle:&lt;br /&gt;
* R_inner = hypotenuse&lt;br /&gt;
* Length and &amp;quot;x_inner&amp;quot; = remaining sides&lt;br /&gt;
* Tan(A_inner) = Length / x_inner&lt;br /&gt;
* x_inner = = Length / Tan(A_inner)&lt;br /&gt;
* R_inner = sqrt[(x_inner)^2 + (Length)^2]&lt;br /&gt;
&lt;br /&gt;
Now create the outer wheel right triangle:&lt;br /&gt;
* R_outer = hypotenuse&lt;br /&gt;
* Length and &amp;quot;x_outer&amp;quot; = remaining sides&lt;br /&gt;
* x_outer = x_inner + Width&lt;br /&gt;
* R_outer = sqrt[(x_outer)^2 + (Length)^2]&lt;br /&gt;
* A_outer = Tanh(Length / x_outer)&lt;br /&gt;
&lt;br /&gt;
Now check that the dimensions make sense:&lt;br /&gt;
* R_outer should be larger than R_inner&lt;br /&gt;
* A_outer should be smaller than A_inner&lt;br /&gt;
&lt;br /&gt;
'''Important:''' These idealized calculations do not replace experimentation. Turn radius accuracy will suffer if there are traction losses, changes in road surface height, geometry changes during steering, and other variables not considered in these calculations. Furthermore, if the vehicle is moving during a steering angle change, the turning radius changes while moving and the vehicle will not turn in a circle with a fixed radius.&lt;br /&gt;
&lt;br /&gt;
-- Main.JosephDonan - 2017-05-17&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=193</id>
		<title>SteeringSensor</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=193"/>
		<updated>2019-07-02T03:40:56Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Absolute wheel position: Analog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Steering Angle Sensor =&lt;br /&gt;
&lt;br /&gt;
To change or maintain travel direction, the system must know which way the front wheels are pointing. Elcano tricycles accomplish this task with a rotational position sensor placed on the front steer wheels. Each trike has two steering columns, and both are instrumented for redundancy. The sensor is mechanically mounted to the shaft.  Since the system uses Ackerman steering, the turn angle of the two wheels will be slightly different. More information is below.&lt;br /&gt;
Rotational position sensors may be incremental or absolute. An incremental position sensor only reports discrete changes in rotational position and possibly direction of rotation. Absolute position sensors report the current angle of the sensor shaft. Absolute position sensors have advantages for sensing wheel angle, such as always knowing the current wheel angle at the power-on state. Elcano test vehicles use absolute rotation sensors.&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Analog ==&lt;br /&gt;
&lt;br /&gt;
Analog position sensors typically communicate angle using current or voltage levels. In these devices, current or voltage is a function of the angle. Example:&lt;br /&gt;
&lt;br /&gt;
[[File:wheel-turn-angle_360-degree-sensor.png | border]]&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Digital ==&lt;br /&gt;
&lt;br /&gt;
Digital position sensors communicate angle digitally. Two ways a sensor can accomplish this task is by encoding the measured position into a binary stream (serial communication) or by encoding the position in binary by driving several output pins high or low (parallel communication). &lt;br /&gt;
&lt;br /&gt;
== Reducing Sensor Noise ==&lt;br /&gt;
&lt;br /&gt;
The problem with sending an analog signal over a long wire to the Arduino is that the wire acts as an antenna and picks up noise. Thus we connect a twisted wire pair from sensor to Arduino that has Signal In as well as the return. The return wire is connected to the ground wire at the sensor. The return wire may have picked up noise when it gets to the Arduino. The Arduino subtracts the analog value of return from the Signal In. Since both wires have picked up approximately the same noise, subtracting them gives a more robust reading. The Signal In return signal goes to an analog input on the Arduino, and is not connected to Arduino ground. The test vehicle analog sensor uses four wires: power, ground, signal, and signal return.  &lt;br /&gt;
&lt;br /&gt;
Another alternative is to use an analog-to-digital converter to digitize the voltage reading from the sensor before it reaches [[C2]]. All analog signals are sensitive to noise from the environment, especially nearby electronics. This noise appears as voltage changes on the power and signal wires of the turn sensors and is visible with an oscilloscope. Because noise creates changes in voltage on the signal and power wires, it creates erroneous angle readings.&lt;br /&gt;
&lt;br /&gt;
--Main.JosephBreithaupt - 2017-02-11&lt;br /&gt;
&lt;br /&gt;
== Sensors used ==&lt;br /&gt;
&lt;br /&gt;
We have gotten the best results from RTY060LVNAX  60 degree analog rotary encoder with a 5V range. &lt;br /&gt;
Other possibilities:&lt;br /&gt;
&lt;br /&gt;
- TT Electronics 6127 sensor giving 5V analog output over 360 degrees https://www.digikey.com/products/en?keywords=987-1393-ND . Has six times less resolution than a 60 degree sensor, and the minimum resolution can get lost in the noise.&lt;br /&gt;
&lt;br /&gt;
- EMS22A50-M25-LD6 Digital rotary encoder. This produces 1024 steps over 360 degrees, in SPI.  It will give a resolution of 0.35 degrees. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- TLC1549CP 10-bit analog-to-digital converter with serial control. This could be used to digitize the voltage from the RTY060LVNAX, reducing noise from analog transmission. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- AMS5043 Magnetic Angle Encoder. This requires that a cylindrical magnet be mounted precisely on the shaft. The sensor has an indent for the magnet, but the indent in not in the right place. Difficult to get robust readings from the part.&lt;br /&gt;
&lt;br /&gt;
- It is possible to tap into the feedback wire on the linear actuator. This reading suffers from hysteresis.&lt;br /&gt;
&lt;br /&gt;
- Putting a current sensor on the actuator lets us measure the power draw, but this is not adequate for control.&lt;br /&gt;
&lt;br /&gt;
== Mounting the Steering Angle Sensor ==&lt;br /&gt;
&lt;br /&gt;
The steering sensor is mounted directly the top of the steering knuckle. In the top if the steering knuckle is threaded rod that is kept in place using a jam nut. On the end of that threaded rod is a coupling nut that has been locked in place using a jam nut. From the coupling nut an adapter has been 3d printed that connects the coupling nut to the Steering angle sensor. The steering angle sensor is help in place using a piece of flat metal bar with a 90 degree bend. &lt;br /&gt;
&lt;br /&gt;
Mounting in this position is beneficial by reducing the amount of mechanical play that the system is exposed to and therefore reducing false readings. &lt;br /&gt;
&lt;br /&gt;
== Ackermann Steering Geometry: wheel angle and turning radius ==&lt;br /&gt;
&lt;br /&gt;
Many road vehicles use a variation of Ackermann Steering to allow a vehicle with more than two wheels to turn smoothly. The challenge of steering a multi-wheel vehicle in a circle is that all wheels are at different distances to the center of that circle, so they must turn to different angles and spin at different speeds. The trike used in the current Elcano system solves the speed differential problem by having only one drive wheel and un-driven steering wheels. The steering differential problem is solved using Ackermann steering geometry. With a basic understanding of Ackermann steering and right triangle geometry, we can predict variables like the turning radius of different wheels and the steering angle of different wheels. The inner turning wheel and outer turning wheel turn at different angles and have different turning radii. These calculations find both dimensions.&lt;br /&gt;
&lt;br /&gt;
'''Principle Formulas:'''&lt;br /&gt;
Ackermann steering geometry is based on two right triangles. Every calculation comes from right triangle trigonometry and the Pythagorean Theorem.&lt;br /&gt;
&lt;br /&gt;
%ATTACHURL%/Angles.png  &lt;br /&gt;
&lt;br /&gt;
'''Key Variables:'''&lt;br /&gt;
* Length = vehicle wheel base length, measured from front hub center to back hub center&lt;br /&gt;
* Width = distance between center of the front wheels&lt;br /&gt;
* A_inner = turning angle of inner front wheel&lt;br /&gt;
* A_outer = turning angle of outer front wheel; A_outer &amp;lt; A_inner&lt;br /&gt;
* R_inner = turning radius of the inner front turning wheel&lt;br /&gt;
* R_outer = turning radius of the outer front wheel&lt;br /&gt;
&lt;br /&gt;
%ATTACHURL%/TrikeTurning.png  &lt;br /&gt;
&lt;br /&gt;
Initial known variables: Length, Width, A_inner&lt;br /&gt;
&lt;br /&gt;
Unknowns: A_outer, R_outer, R_inner&lt;br /&gt;
&lt;br /&gt;
'''Calculations:'''&lt;br /&gt;
First, create the inner wheel right triangle:&lt;br /&gt;
* R_inner = hypotenuse&lt;br /&gt;
* Length and &amp;quot;x_inner&amp;quot; = remaining sides&lt;br /&gt;
* Tan(A_inner) = Length / x_inner&lt;br /&gt;
* x_inner = = Length / Tan(A_inner)&lt;br /&gt;
* R_inner = sqrt[(x_inner)^2 + (Length)^2]&lt;br /&gt;
&lt;br /&gt;
Now create the outer wheel right triangle:&lt;br /&gt;
* R_outer = hypotenuse&lt;br /&gt;
* Length and &amp;quot;x_outer&amp;quot; = remaining sides&lt;br /&gt;
* x_outer = x_inner + Width&lt;br /&gt;
* R_outer = sqrt[(x_outer)^2 + (Length)^2]&lt;br /&gt;
* A_outer = Tanh(Length / x_outer)&lt;br /&gt;
&lt;br /&gt;
Now check that the dimensions make sense:&lt;br /&gt;
* R_outer should be larger than R_inner&lt;br /&gt;
* A_outer should be smaller than A_inner&lt;br /&gt;
&lt;br /&gt;
'''Important:''' These idealized calculations do not replace experimentation. Turn radius accuracy will suffer if there are traction losses, changes in road surface height, geometry changes during steering, and other variables not considered in these calculations. Furthermore, if the vehicle is moving during a steering angle change, the turning radius changes while moving and the vehicle will not turn in a circle with a fixed radius.&lt;br /&gt;
&lt;br /&gt;
-- Main.JosephDonan - 2017-05-17&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:Wheel-turn-angle_360-degree-sensor.png&amp;diff=192</id>
		<title>File:Wheel-turn-angle 360-degree-sensor.png</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:Wheel-turn-angle_360-degree-sensor.png&amp;diff=192"/>
		<updated>2019-07-02T03:31:57Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Shows output from a wheel turn sensor during slow steering servo extension and retraction. Input (x-axis) is pulse width in microseconds. Output (y-axis) is wheel angle, converted from the Arduino's 10-bit ADC (0-1023). Values were converted by multipl...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Shows output from a wheel turn sensor during slow steering servo extension and retraction. Input (x-axis) is pulse width in microseconds. Output (y-axis) is wheel angle, converted from the Arduino's 10-bit ADC (0-1023). Values were converted by multiplying the 10-bit integer by (360/1024) in a spreadsheet. The gap between extension and retraction values is explained by slippage in the steering mechanism.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=191</id>
		<title>SteeringSensor</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=SteeringSensor&amp;diff=191"/>
		<updated>2019-07-02T03:22:42Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Absolute wheel position: Analog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Steering Angle Sensor =&lt;br /&gt;
&lt;br /&gt;
To change or maintain travel direction, the system must know which way the front wheels are pointing. Elcano tricycles accomplish this task with a rotational position sensor placed on the front steer wheels. Each trike has two steering columns, and both are instrumented for redundancy. The sensor is mechanically mounted to the shaft.  Since the system uses Ackerman steering, the turn angle of the two wheels will be slightly different. More information is below.&lt;br /&gt;
Rotational position sensors may be incremental or absolute. An incremental position sensor only reports discrete changes in rotational position and possibly direction of rotation. Absolute position sensors report the current angle of the sensor shaft. Absolute position sensors have advantages for sensing wheel angle, such as always knowing the current wheel angle at the power-on state. Elcano test vehicles use absolute rotation sensors.&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Analog ==&lt;br /&gt;
&lt;br /&gt;
Analog position sensors typically communicate angle using current or voltage levels. In these devices, current or voltage is a function of the angle. Example:&lt;br /&gt;
&lt;br /&gt;
== Absolute wheel position: Digital ==&lt;br /&gt;
&lt;br /&gt;
Digital position sensors communicate angle digitally. Two ways a sensor can accomplish this task is by encoding the measured position into a binary stream (serial communication) or by encoding the position in binary by driving several output pins high or low (parallel communication). &lt;br /&gt;
&lt;br /&gt;
== Reducing Sensor Noise ==&lt;br /&gt;
&lt;br /&gt;
The problem with sending an analog signal over a long wire to the Arduino is that the wire acts as an antenna and picks up noise. Thus we connect a twisted wire pair from sensor to Arduino that has Signal In as well as the return. The return wire is connected to the ground wire at the sensor. The return wire may have picked up noise when it gets to the Arduino. The Arduino subtracts the analog value of return from the Signal In. Since both wires have picked up approximately the same noise, subtracting them gives a more robust reading. The Signal In return signal goes to an analog input on the Arduino, and is not connected to Arduino ground. The test vehicle analog sensor uses four wires: power, ground, signal, and signal return.  &lt;br /&gt;
&lt;br /&gt;
Another alternative is to use an analog-to-digital converter to digitize the voltage reading from the sensor before it reaches [[C2]]. All analog signals are sensitive to noise from the environment, especially nearby electronics. This noise appears as voltage changes on the power and signal wires of the turn sensors and is visible with an oscilloscope. Because noise creates changes in voltage on the signal and power wires, it creates erroneous angle readings.&lt;br /&gt;
&lt;br /&gt;
--Main.JosephBreithaupt - 2017-02-11&lt;br /&gt;
&lt;br /&gt;
== Sensors used ==&lt;br /&gt;
&lt;br /&gt;
We have gotten the best results from RTY060LVNAX  60 degree analog rotary encoder with a 5V range. &lt;br /&gt;
Other possibilities:&lt;br /&gt;
&lt;br /&gt;
- TT Electronics 6127 sensor giving 5V analog output over 360 degrees https://www.digikey.com/products/en?keywords=987-1393-ND . Has six times less resolution than a 60 degree sensor, and the minimum resolution can get lost in the noise.&lt;br /&gt;
&lt;br /&gt;
- EMS22A50-M25-LD6 Digital rotary encoder. This produces 1024 steps over 360 degrees, in SPI.  It will give a resolution of 0.35 degrees. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- TLC1549CP 10-bit analog-to-digital converter with serial control. This could be used to digitize the voltage from the RTY060LVNAX, reducing noise from analog transmission. Requires a change to Arduino.&lt;br /&gt;
&lt;br /&gt;
- AMS5043 Magnetic Angle Encoder. This requires that a cylindrical magnet be mounted precisely on the shaft. The sensor has an indent for the magnet, but the indent in not in the right place. Difficult to get robust readings from the part.&lt;br /&gt;
&lt;br /&gt;
- It is possible to tap into the feedback wire on the linear actuator. This reading suffers from hysteresis.&lt;br /&gt;
&lt;br /&gt;
- Putting a current sensor on the actuator lets us measure the power draw, but this is not adequate for control.&lt;br /&gt;
&lt;br /&gt;
== Mounting the Steering Angle Sensor ==&lt;br /&gt;
&lt;br /&gt;
The steering sensor is mounted directly the top of the steering knuckle. In the top if the steering knuckle is threaded rod that is kept in place using a jam nut. On the end of that threaded rod is a coupling nut that has been locked in place using a jam nut. From the coupling nut an adapter has been 3d printed that connects the coupling nut to the Steering angle sensor. The steering angle sensor is help in place using a piece of flat metal bar with a 90 degree bend. &lt;br /&gt;
&lt;br /&gt;
Mounting in this position is beneficial by reducing the amount of mechanical play that the system is exposed to and therefore reducing false readings. &lt;br /&gt;
&lt;br /&gt;
== Ackermann Steering Geometry: wheel angle and turning radius ==&lt;br /&gt;
&lt;br /&gt;
Many road vehicles use a variation of Ackermann Steering to allow a vehicle with more than two wheels to turn smoothly. The challenge of steering a multi-wheel vehicle in a circle is that all wheels are at different distances to the center of that circle, so they must turn to different angles and spin at different speeds. The trike used in the current Elcano system solves the speed differential problem by having only one drive wheel and un-driven steering wheels. The steering differential problem is solved using Ackermann steering geometry. With a basic understanding of Ackermann steering and right triangle geometry, we can predict variables like the turning radius of different wheels and the steering angle of different wheels. The inner turning wheel and outer turning wheel turn at different angles and have different turning radii. These calculations find both dimensions.&lt;br /&gt;
&lt;br /&gt;
'''Principle Formulas:'''&lt;br /&gt;
Ackermann steering geometry is based on two right triangles. Every calculation comes from right triangle trigonometry and the Pythagorean Theorem.&lt;br /&gt;
&lt;br /&gt;
%ATTACHURL%/Angles.png  &lt;br /&gt;
&lt;br /&gt;
'''Key Variables:'''&lt;br /&gt;
* Length = vehicle wheel base length, measured from front hub center to back hub center&lt;br /&gt;
* Width = distance between center of the front wheels&lt;br /&gt;
* A_inner = turning angle of inner front wheel&lt;br /&gt;
* A_outer = turning angle of outer front wheel; A_outer &amp;lt; A_inner&lt;br /&gt;
* R_inner = turning radius of the inner front turning wheel&lt;br /&gt;
* R_outer = turning radius of the outer front wheel&lt;br /&gt;
&lt;br /&gt;
%ATTACHURL%/TrikeTurning.png  &lt;br /&gt;
&lt;br /&gt;
Initial known variables: Length, Width, A_inner&lt;br /&gt;
&lt;br /&gt;
Unknowns: A_outer, R_outer, R_inner&lt;br /&gt;
&lt;br /&gt;
'''Calculations:'''&lt;br /&gt;
First, create the inner wheel right triangle:&lt;br /&gt;
* R_inner = hypotenuse&lt;br /&gt;
* Length and &amp;quot;x_inner&amp;quot; = remaining sides&lt;br /&gt;
* Tan(A_inner) = Length / x_inner&lt;br /&gt;
* x_inner = = Length / Tan(A_inner)&lt;br /&gt;
* R_inner = sqrt[(x_inner)^2 + (Length)^2]&lt;br /&gt;
&lt;br /&gt;
Now create the outer wheel right triangle:&lt;br /&gt;
* R_outer = hypotenuse&lt;br /&gt;
* Length and &amp;quot;x_outer&amp;quot; = remaining sides&lt;br /&gt;
* x_outer = x_inner + Width&lt;br /&gt;
* R_outer = sqrt[(x_outer)^2 + (Length)^2]&lt;br /&gt;
* A_outer = Tanh(Length / x_outer)&lt;br /&gt;
&lt;br /&gt;
Now check that the dimensions make sense:&lt;br /&gt;
* R_outer should be larger than R_inner&lt;br /&gt;
* A_outer should be smaller than A_inner&lt;br /&gt;
&lt;br /&gt;
'''Important:''' These idealized calculations do not replace experimentation. Turn radius accuracy will suffer if there are traction losses, changes in road surface height, geometry changes during steering, and other variables not considered in these calculations. Furthermore, if the vehicle is moving during a steering angle change, the turning radius changes while moving and the vehicle will not turn in a circle with a fixed radius.&lt;br /&gt;
&lt;br /&gt;
-- Main.JosephDonan - 2017-05-17&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=179</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=179"/>
		<updated>2019-06-28T21:42:48Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* RFM68HCW and SAMD21 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Elcano Remote Control =&lt;br /&gt;
&lt;br /&gt;
The Elcano system can run autonomously or by remote control. There have been four systems built for manual or remote control.&lt;br /&gt;
&lt;br /&gt;
== Joystick ==&lt;br /&gt;
The first system used an APEM 9000 joystick. The part has five wires: 5V power, ground, and three analog lines. The joystick has two axes. The vertical axis is used for throttle (up) and brakes (down). The third analog signal is the voltage of the joystick when centered. The joystick was used in 2014 and is described in http://www.elcanoproject.org/tutorial/lab2.php.  The Low-level code may still contain inputs and processing for an analog joystick.&lt;br /&gt;
&lt;br /&gt;
== Bluetooth ==&lt;br /&gt;
In 2015 students built a control system using a Bluetooth receiver to the Arduino. The transmitter was a TI Sitara running Android. &lt;br /&gt;
&lt;br /&gt;
== 5- and 6-channel RC Controller ==&lt;br /&gt;
The system has been run from either a Hitec Optics 5 2.4 five channel unit or a Spektrum DX6i six channel controller. The Low level circuit board has a3x7 pin socket in the corner to accommodate the receiver. Each channel needs to be on its own interrupt. Since the Arduino Mega has only 6 interrupts and the Arduino Micro has 5, this can be a problem, especially since we want another one or two interrupts to handle the speed. Low level code may still have software to handle these interrupts. The RC controllers send a 1.0 to 2.0 ms pulse on each channel at 30 Hz. Some controllers send these signals in turn. We have built a six-input OR circuit to combine all signals, which would allow processing with just one interrupt. Unfortunately, there is no good way to predict whether the RC unit will send pulses in turn or all at once. In fact, the behavior seems to be determined by the receive unit, not the transmitter. Thus a separate interrupt is required for each channel used. Interrupt processing consists of interrupting on a rising edge, then switching to a falling edge interrupt and logging the pulse width. A width of 1.0 ms typically means one extreme, 1.5 ms is centered, and 2.0 ms is the other extreme., This system can get confusing about which channel is assigned which behavior, and the two controllers assign their channels differently. To go beyond the Arduino interrupt limit, the V2 Low Level board has all RC inputs assigned to Analog Input 8 to 13 of the Arduino. These pins are used digitally. Pins A8-A15 on Arduino Mega, all go to the same port. Thus we can use the pin change interrupt, which is activated whenever any bit of the 8-bit port changes.&lt;br /&gt;
&lt;br /&gt;
== Amplitude Shift Keying (ASK) RC Controller ==&lt;br /&gt;
&lt;br /&gt;
Elcano project used a custom-built radio control system with two arduinos, one in the remote control that collects manual inputs and transmits them with a 433MHz ASK radio transmitter, and one on the Elcano vehicle which receives the information sent over radio and converts it into an ElcanoSerial drive packet which is transmitted to C2 over ElcanoSerial. This information is used to manually drive the trike, begin an autonomous routine, or activate the emergency brake and stop the trike. The RH_ASK system was limited to 40 feet (12 meters) in practice and was never use to drive the vehicle.&lt;br /&gt;
&lt;br /&gt;
== RFM69HCW and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RFM69HCW (915MHz) transceiver offers several benefits over the 433MHz ASK radios:&lt;br /&gt;
* greater range with higher transmit power&lt;br /&gt;
* much higher raw bitrate&lt;br /&gt;
* half-duplex communication and received signal strength indicator (RSSI)&lt;br /&gt;
* compatibility with higher-performance 3.3V ARM boards like SAMD21&lt;br /&gt;
&lt;br /&gt;
Using the RF69 RadioHead library, the RC system has expanded capabilities from the RH ASK implementation. Data is stored on both ends as a C struct, which is broken down and transmitted as bytes by the RF69 library. After successful transmission, the data is accessible directly from the struct and variables larger than one byte need no additional processing before use. After successfully receiving a packet from the remote control, the receiver sends a packet back with an RSSI value. The remote control uses this reply message to indicate radio communication is active. &lt;br /&gt;
&lt;br /&gt;
=== Transmitted data to vehicle ===&lt;br /&gt;
* unsigned 12-bit throttle (0-4095)&lt;br /&gt;
* unsigned 12-bit turn &lt;br /&gt;
* boolean emergency stop&lt;br /&gt;
* boolean autonomous mode&lt;br /&gt;
* signed RSSI of last received packet (from vehicle)&lt;br /&gt;
&lt;br /&gt;
=== Received data from vehicle ===&lt;br /&gt;
* signed RSSI of last received packet (from remote)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Main.JosephBreithaupt - 2017-10-11&lt;br /&gt;
&lt;br /&gt;
NEXT . [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Lidar&amp;diff=84</id>
		<title>Lidar</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Lidar&amp;diff=84"/>
		<updated>2019-06-06T21:04:30Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hardware =&lt;br /&gt;
&lt;br /&gt;
Scanse Sweep is a portable, rotating, horizontal-plane lidar unit. It has a maximum specified range of 40 meters and works best at ranges greater than 0.5 meter. '''Range data''' precision is 1 centimeter and range values are in centimeters. Angular resolution is user-configurable by adjusting sample rate and motor rotation frequency. Surface variables like reflectivity and environmental variables like strong illumination by sunlight limit measurement signal quality. '''Signal quality''' is a number between 0-255, with smaller numbers indicating poorer signal quality. '''Angle data''' precision is 0.0625 degrees and angle values are in degrees, expressed as a 16-bit fixed-point number with twelve integer bits and four fractional bits.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Angle bits&lt;br /&gt;
! Angle decimal (degrees)&lt;br /&gt;
|-&lt;br /&gt;
| ...0000'''0001'''&lt;br /&gt;
| 0.0625&lt;br /&gt;
|-&lt;br /&gt;
| ...0001'''0000'''&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| ...0001'''0001'''&lt;br /&gt;
| 1.0625&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Scanse Sweep lidar unit is connected to an Arduino Micro to capture and process range, angle, and signal quality data during a scan.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
Software on the Arduino Micro controls the Scanse Sweep. On startup, the '''setup()''' procedure resets the lidar, configures scan frequency and motor rotation frequency, waits for the motor to come up to speed, and configures the lidar to begin scanning. The '''loop()''' procedure requests the most recent complete scan reading, filters out invalid readings, and processes the signal for transmission to high level.&lt;br /&gt;
&lt;br /&gt;
== Filtering ==&lt;br /&gt;
Readings should be rejected if:&lt;br /&gt;
* '''Range''' is greater than 4000cm or equal to 1cm &lt;br /&gt;
* '''Angle''' is not within desired scan angles &lt;br /&gt;
* '''Signal quality''' is above an arbitrary value&lt;br /&gt;
&lt;br /&gt;
Warning: the lidar is always scanning during operation unless the software signals it to stop (not implemented). The Scanse Sweep is a class 1 laser device and designed to be eye-safe, but placing the eye directly in the path of the beam or the scan plane should be avoided or prevented.&lt;br /&gt;
&lt;br /&gt;
== Signal processing ==&lt;br /&gt;
&lt;br /&gt;
Signal processing is required to limit bytes sent to [[HighLevel]] but still allow HighLevel to reconstruct obstacle data from the scan. At maximum sampling frequency, the lidar unit collects 1000 range readings per second. Some of these reading are filtered out. This results in tens or hundreds of readings during each pass. To reduce data bandwidth, the software uses a &amp;quot;max delta&amp;quot; value to break the scan into segments beginning and ending at points with a change in range greater than the max delta. This discards small changes in range, but detects larger changes in range that indicate obstacles. This balances the need to detect both obstacles and continuous surfaces like walls. A single straight surface is broken into several segments centered on the closest point. If obstacles are placed on front of the surface, the change in range for each obstacle produces one or more segments for each obstacle and one or more segments for each section of straight surface. How accurately this process reconstructs the field of obstacles depends on how many points are filtered out before signal processing: if obstacle data is missing, it will not begin or end a segment.&lt;br /&gt;
&lt;br /&gt;
= Scanse Sweep =&lt;br /&gt;
&lt;br /&gt;
The Scanse Sweep is a lidar sensor. Its head spins around multiple times per second, and collects information about its lateral surroundings. The spin speed and sampling rate can be changed.&lt;br /&gt;
&lt;br /&gt;
It sends readings over a serial connection, each of which includes the angle, distance, signal strength, and other information.&lt;br /&gt;
&lt;br /&gt;
Blasé Johnson worked on the sweep in the summer of 2017. The following is from his 6/22/17 report.&lt;br /&gt;
&lt;br /&gt;
= Basic Sweep Obstacle Detection Algorithm =&lt;br /&gt;
Goal&lt;br /&gt;
&lt;br /&gt;
To use the readings from the sweep to determine if there is an obstacle present within a given distance in front of the trike, and to stop the trike if this is so.&lt;br /&gt;
Sweep Operation&lt;br /&gt;
Rotation and Speed&lt;br /&gt;
The Sweep rotates counterclockwise. Its rotational speed can be set to any integral value between 0 Hz and 10 Hz (number of full rotations per second).&lt;br /&gt;
&lt;br /&gt;
= Sampling Rate =&lt;br /&gt;
&lt;br /&gt;
The sweep obtains readings according to a given sample rate. Three distinct sample rates can be used for the Sweep:&lt;br /&gt;
500 – 600 Hz&lt;br /&gt;
750 – 800 Hz&lt;br /&gt;
1000 – 1075 Hz\&lt;br /&gt;
&lt;br /&gt;
= 	Sample Data =&lt;br /&gt;
&lt;br /&gt;
Each reading from the Sweep contains these data:&lt;br /&gt;
&lt;br /&gt;
* A byte with sync/error bits, where the sync bit indicates whether the current reading is the first reading since the sensor last made a full rotation, one of the error bits indicates a communication error with the Lidar module, and the rest of the bits are reserved for future uses.&lt;br /&gt;
&lt;br /&gt;
* The azimuth (degree of angle with starting position), transmitted as a 16-bit fixed point number, where the 12 MSBs are the integral part and the 4 LSBs are the fractional part.&lt;br /&gt;
&lt;br /&gt;
* The distance from the nearest obstacle in centimeters, transmitted as a 16-bit integer.&lt;br /&gt;
&lt;br /&gt;
* A value representing the signal strength, transmitted as an unsigned 8-bit integer, where 0 is the lowest strength, and 255 is the highest strength.&lt;br /&gt;
&lt;br /&gt;
* A checksum, which is the remainder of the sum of the six previous bytes divided by 255.&lt;br /&gt;
&lt;br /&gt;
= Math =&lt;br /&gt;
&lt;br /&gt;
The trike will be expected to stop if an obstacle is detected within a certain distance from the front side of the vehicle, within the horizontal span of the trike. These distances are illustrated in Figure 1 as DISTANCE and WIDTH, respectively.&amp;amp;#8195;&lt;br /&gt;
The grey lines in Figure 1 show the distances that will be measured by the Sweep if it detects an obstacle at the line. The formula for this distance is DISTANCE/cos(AZIMUTH) .&lt;br /&gt;
The range of azimuths for the front side of the trike can be computed from the formula  sarcsin(WIDTH/(2*DISTANCE))&lt;br /&gt;
and&lt;br /&gt;
360-arcsin(WIDTH/(2*DISTANCE))&lt;br /&gt;
for the right and left corners, respectively.&lt;br /&gt;
&lt;br /&gt;
= 	Process =&lt;br /&gt;
&lt;br /&gt;
Once the Sweep begins taking measurements, check the measurements whose azimuths lie within the boundaries of the front side of the trike. For each measurement within this range, determine if the distance from an obstacle in centimeters is equal to or less than DISTANCE/cos(AZIMUTH) . If so, stop the vehicle until a search of the measurements within the front boundary comes back negative, and a certain amount of time has passed since the last obstacle was detected.W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
&lt;br /&gt;
[http://scanse.io/ Scanse]&lt;br /&gt;
&lt;br /&gt;
-- Main.JohnsonB - 2017-11-07&lt;br /&gt;
* Figure 1: Distance from trike to detect obstacle &amp;amp; trike width: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;%PUBURLPATH%/%WEB%/%TOPIC%/ScanseTrike.png&amp;quot; alt=&amp;quot;ScanseTrike.png&amp;quot; width=&amp;quot;397&amp;quot; height=&amp;quot;463&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Lidar&amp;diff=83</id>
		<title>Lidar</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Lidar&amp;diff=83"/>
		<updated>2019-06-06T21:02:04Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hardware =&lt;br /&gt;
&lt;br /&gt;
Scanse Sweep is a portable, rotating, horizontal-plane lidar unit. It has a maximum specified range of 40 meters and works best at ranges greater than 0.5 meter. '''Range data''' precision is 1 centimeter and range values are in centimeters. Angular resolution is user-configurable by adjusting sample rate and motor rotation frequency. Surface variables like reflectivity and environmental variables like strong illumination by sunlight limit measurement signal quality. '''Signal quality''' is a number between 0-255, with smaller numbers indicating poorer signal quality. '''Angle data''' precision is 0.0625 degrees and angle values are in degrees, expressed as a 16-bit fixed-point number with twelve integer bits and four fractional bits.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Angle bits&lt;br /&gt;
! Angle decimal (degrees)&lt;br /&gt;
|-&lt;br /&gt;
| ...0000'''0001'''&lt;br /&gt;
| 0.0625&lt;br /&gt;
|-&lt;br /&gt;
| ...0001'''0000'''&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| ...0001'''0001'''&lt;br /&gt;
| 1.0625&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Scanse Sweep lidar unit is connected to an Arduino Micro to capture and process range, angle, and signal quality data during a scan.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
Software on the Arduino Micro controls the Scanse Sweep. On startup, the '''setup()''' procedure resets the lidar, configures scan frequency and motor rotation frequency, waits for the motor to come up to speed, and sets the lidar to begin scanning. The '''loop()''' procedure requests the most recent complete scan reading, filters out invalid readings, and processes the signal for transmission to high level.&lt;br /&gt;
&lt;br /&gt;
== Filtering ==&lt;br /&gt;
Readings should be rejected if:&lt;br /&gt;
* '''Range''' is greater than 4000cm or equal to 1cm &lt;br /&gt;
* '''Angle''' is not within desired scan angles &lt;br /&gt;
* '''Signal quality''' is above an arbitrary value&lt;br /&gt;
&lt;br /&gt;
Warning: the lidar is always scanning during operation unless the software signals it to stop (not implemented). The Scanse Sweep is a class 1 laser device and designed to be eye-safe, but placing the eye directly in the path of the beam or the scan plane should be avoided or prevented.&lt;br /&gt;
&lt;br /&gt;
== Signal processing ==&lt;br /&gt;
&lt;br /&gt;
Signal processing is required to limit bytes sent to [[HighLevel]] but still allow HighLevel to reconstruct obstacle data from the scan. At maximum sampling frequency, the lidar unit collects 1000 range readings per second. Some of these reading are filtered out. This results in tens or hundreds of readings during each pass. To reduce data bandwidth, the software uses a &amp;quot;max delta&amp;quot; value to break the scan into segments beginning and ending at points with a change in range greater than the max delta. This discards small changes in range, but detects larger changes in range that indicate obstacles. This balances the need to detect both obstacles and continuous surfaces like walls. A single straight surface is broken into several segments centered on the closest point. If obstacles are placed on front of the surface, the change in range for each obstacle produces one or more segments for each obstacle and one or more segments for each section of straight surface. How accurately this process reconstructs the field of obstacles depends on how many points are filtered out before signal processing: if obstacle data is missing, it will not begin or end a segment. &lt;br /&gt;
&lt;br /&gt;
= Scanse Sweep =&lt;br /&gt;
&lt;br /&gt;
The Scanse Sweep is a lidar sensor. Its head spins around multiple times per second, and collects information about its lateral surroundings. The spin speed and sampling rate can be changed.&lt;br /&gt;
&lt;br /&gt;
It sends readings over a serial connection, each of which includes the angle, distance, signal strength, and other information.&lt;br /&gt;
&lt;br /&gt;
Blasé Johnson worked on the sweep in the summer of 2017. The following is from his 6/22/17 report.&lt;br /&gt;
&lt;br /&gt;
= Basic Sweep Obstacle Detection Algorithm =&lt;br /&gt;
Goal&lt;br /&gt;
&lt;br /&gt;
To use the readings from the sweep to determine if there is an obstacle present within a given distance in front of the trike, and to stop the trike if this is so.&lt;br /&gt;
Sweep Operation&lt;br /&gt;
Rotation and Speed&lt;br /&gt;
The Sweep rotates counterclockwise. Its rotational speed can be set to any integral value between 0 Hz and 10 Hz (number of full rotations per second).&lt;br /&gt;
&lt;br /&gt;
= Sampling Rate =&lt;br /&gt;
&lt;br /&gt;
The sweep obtains readings according to a given sample rate. Three distinct sample rates can be used for the Sweep:&lt;br /&gt;
500 – 600 Hz&lt;br /&gt;
750 – 800 Hz&lt;br /&gt;
1000 – 1075 Hz\&lt;br /&gt;
&lt;br /&gt;
= 	Sample Data =&lt;br /&gt;
&lt;br /&gt;
Each reading from the Sweep contains these data:&lt;br /&gt;
&lt;br /&gt;
* A byte with sync/error bits, where the sync bit indicates whether the current reading is the first reading since the sensor last made a full rotation, one of the error bits indicates a communication error with the Lidar module, and the rest of the bits are reserved for future uses.&lt;br /&gt;
&lt;br /&gt;
* The azimuth (degree of angle with starting position), transmitted as a 16-bit fixed point number, where the 12 MSBs are the integral part and the 4 LSBs are the fractional part.&lt;br /&gt;
&lt;br /&gt;
* The distance from the nearest obstacle in centimeters, transmitted as a 16-bit integer.&lt;br /&gt;
&lt;br /&gt;
* A value representing the signal strength, transmitted as an unsigned 8-bit integer, where 0 is the lowest strength, and 255 is the highest strength.&lt;br /&gt;
&lt;br /&gt;
* A checksum, which is the remainder of the sum of the six previous bytes divided by 255.&lt;br /&gt;
&lt;br /&gt;
= Math =&lt;br /&gt;
&lt;br /&gt;
The trike will be expected to stop if an obstacle is detected within a certain distance from the front side of the vehicle, within the horizontal span of the trike. These distances are illustrated in Figure 1 as DISTANCE and WIDTH, respectively.&amp;amp;#8195;&lt;br /&gt;
The grey lines in Figure 1 show the distances that will be measured by the Sweep if it detects an obstacle at the line. The formula for this distance is DISTANCE/cos(AZIMUTH) .&lt;br /&gt;
The range of azimuths for the front side of the trike can be computed from the formula  sarcsin(WIDTH/(2*DISTANCE))&lt;br /&gt;
and&lt;br /&gt;
360-arcsin(WIDTH/(2*DISTANCE))&lt;br /&gt;
for the right and left corners, respectively.&lt;br /&gt;
&lt;br /&gt;
= 	Process =&lt;br /&gt;
&lt;br /&gt;
Once the Sweep begins taking measurements, check the measurements whose azimuths lie within the boundaries of the front side of the trike. For each measurement within this range, determine if the distance from an obstacle in centimeters is equal to or less than DISTANCE/cos(AZIMUTH) . If so, stop the vehicle until a search of the measurements within the front boundary comes back negative, and a certain amount of time has passed since the last obstacle was detected.W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
&lt;br /&gt;
[http://scanse.io/ Scanse]&lt;br /&gt;
&lt;br /&gt;
-- Main.JohnsonB - 2017-11-07&lt;br /&gt;
* Figure 1: Distance from trike to detect obstacle &amp;amp; trike width: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;%PUBURLPATH%/%WEB%/%TOPIC%/ScanseTrike.png&amp;quot; alt=&amp;quot;ScanseTrike.png&amp;quot; width=&amp;quot;397&amp;quot; height=&amp;quot;463&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Lidar&amp;diff=82</id>
		<title>Lidar</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Lidar&amp;diff=82"/>
		<updated>2019-06-06T20:00:50Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hardware =&lt;br /&gt;
&lt;br /&gt;
Scanse Sweep is a portable, rotating, horizontal-plane lidar unit. It has a maximum specified range of 40 meters and works best at ranges greater than 0.5 meter. '''Range data''' precision is 1 centimeter and range values are in centimeters. Angular resolution is user-configurable by adjusting sample rate and motor rotation frequency. Surface variables like reflectivity and environmental variables like strong illumination by sunlight limit measurement signal quality. Not every reading is good quality, leaving blind spots in the scan. '''Angle data''' precision is 0.0625 degrees and angle values are in degrees, expressed as a 16-bit fixed-point number with twelve integer bits and four fractional bits.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Angle bits&lt;br /&gt;
! Angle decimal (degrees)&lt;br /&gt;
|-&lt;br /&gt;
| ...0000'''0001'''&lt;br /&gt;
| 0.0625&lt;br /&gt;
|-&lt;br /&gt;
| ...0001'''0000'''&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| ...0001'''0001'''&lt;br /&gt;
| 1.0625&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Scanse Sweep lidar unit is connected to an Arduino Micro to capture and process range, angle, and signal quality data during a scan.&lt;br /&gt;
&lt;br /&gt;
= Scanse Sweep =&lt;br /&gt;
&lt;br /&gt;
The Scanse Sweep is a lidar sensor. Its head spins around multiple times per second, and collects information about its lateral surroundings. The spin speed and sampling rate can be changed.&lt;br /&gt;
&lt;br /&gt;
It sends readings over a serial connection, each of which includes the angle, distance, signal strength, and other information.&lt;br /&gt;
&lt;br /&gt;
Blasé Johnson worked on the sweep in the summer of 2017. The following is from his 6/22/17 report.&lt;br /&gt;
&lt;br /&gt;
= Basic Sweep Obstacle Detection Algorithm =&lt;br /&gt;
Goal&lt;br /&gt;
&lt;br /&gt;
To use the readings from the sweep to determine if there is an obstacle present within a given distance in front of the trike, and to stop the trike if this is so.&lt;br /&gt;
Sweep Operation&lt;br /&gt;
Rotation and Speed&lt;br /&gt;
The Sweep rotates counterclockwise. Its rotational speed can be set to any integral value between 0 Hz and 10 Hz (number of full rotations per second).&lt;br /&gt;
&lt;br /&gt;
= Sampling Rate =&lt;br /&gt;
&lt;br /&gt;
The sweep obtains readings according to a given sample rate. Three distinct sample rates can be used for the Sweep:&lt;br /&gt;
500 – 600 Hz&lt;br /&gt;
750 – 800 Hz&lt;br /&gt;
1000 – 1075 Hz\&lt;br /&gt;
&lt;br /&gt;
= 	Sample Data =&lt;br /&gt;
&lt;br /&gt;
Each reading from the Sweep contains these data:&lt;br /&gt;
&lt;br /&gt;
* A byte with sync/error bits, where the sync bit indicates whether the current reading is the first reading since the sensor last made a full rotation, one of the error bits indicates a communication error with the Lidar module, and the rest of the bits are reserved for future uses.&lt;br /&gt;
&lt;br /&gt;
* The azimuth (degree of angle with starting position), transmitted as a 16-bit fixed point number, where the 12 MSBs are the integral part and the 4 LSBs are the fractional part.&lt;br /&gt;
&lt;br /&gt;
* The distance from the nearest obstacle in centimeters, transmitted as a 16-bit integer.&lt;br /&gt;
&lt;br /&gt;
* A value representing the signal strength, transmitted as an unsigned 8-bit integer, where 0 is the lowest strength, and 255 is the highest strength.&lt;br /&gt;
&lt;br /&gt;
* A checksum, which is the remainder of the sum of the six previous bytes divided by 255.&lt;br /&gt;
&lt;br /&gt;
= Math =&lt;br /&gt;
&lt;br /&gt;
The trike will be expected to stop if an obstacle is detected within a certain distance from the front side of the vehicle, within the horizontal span of the trike. These distances are illustrated in Figure 1 as DISTANCE and WIDTH, respectively.&amp;amp;#8195;&lt;br /&gt;
The grey lines in Figure 1 show the distances that will be measured by the Sweep if it detects an obstacle at the line. The formula for this distance is DISTANCE/cos(AZIMUTH) .&lt;br /&gt;
The range of azimuths for the front side of the trike can be computed from the formula  sarcsin(WIDTH/(2*DISTANCE))&lt;br /&gt;
and&lt;br /&gt;
360-arcsin(WIDTH/(2*DISTANCE))&lt;br /&gt;
for the right and left corners, respectively.&lt;br /&gt;
&lt;br /&gt;
= 	Process =&lt;br /&gt;
&lt;br /&gt;
Once the Sweep begins taking measurements, check the measurements whose azimuths lie within the boundaries of the front side of the trike. For each measurement within this range, determine if the distance from an obstacle in centimeters is equal to or less than DISTANCE/cos(AZIMUTH) . If so, stop the vehicle until a search of the measurements within the front boundary comes back negative, and a certain amount of time has passed since the last obstacle was detected.W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
&lt;br /&gt;
[http://scanse.io/ Scanse]&lt;br /&gt;
&lt;br /&gt;
-- Main.JohnsonB - 2017-11-07&lt;br /&gt;
* Figure 1: Distance from trike to detect obstacle &amp;amp; trike width: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;%PUBURLPATH%/%WEB%/%TOPIC%/ScanseTrike.png&amp;quot; alt=&amp;quot;ScanseTrike.png&amp;quot; width=&amp;quot;397&amp;quot; height=&amp;quot;463&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Lidar&amp;diff=81</id>
		<title>Lidar</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Lidar&amp;diff=81"/>
		<updated>2019-06-06T19:57:35Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hardware =&lt;br /&gt;
&lt;br /&gt;
Scanse Sweep is a portable, rotating, horizontal-plane lidar unit. It has a maximum specified range of 40 meters and works best at ranges greater than 0.5 meter. '''Range data''' precision is 1 centimeter and range values are in centimeters. Angular resolution is user-configurable by adjusting sample rate and motor rotation frequency. Surface variables like reflectivity and environmental variables like strong illumination by sunlight limit measurement signal quality. Not every reading is good quality, leaving blind spots in the scan. '''Angle data''' precision is 0.0625 degrees and angle values are in degrees, expressed as a 16-bit fixed-point number with twelve integer bits and four fractional bits.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Angle bits&lt;br /&gt;
! Angle decimal&lt;br /&gt;
|-&lt;br /&gt;
| ...0000'''0001'''&lt;br /&gt;
| 0.0625&lt;br /&gt;
|-&lt;br /&gt;
| ...0001'''0000'''&lt;br /&gt;
| 1.0&lt;br /&gt;
|-&lt;br /&gt;
| ...0001'''0001'''&lt;br /&gt;
| 1.0625&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Scanse Sweep lidar unit is connected to an Arduino Micro to capture and process range, angle, and signal quality data during a scan. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Scanse Sweep =&lt;br /&gt;
&lt;br /&gt;
The Scanse Sweep is a lidar sensor. Its head spins around multiple times per second, and collects information about its lateral surroundings. The spin speed and sampling rate can be changed.&lt;br /&gt;
&lt;br /&gt;
It sends readings over a serial connection, each of which includes the angle, distance, signal strength, and other information.&lt;br /&gt;
&lt;br /&gt;
Blasé Johnson worked on the sweep in the summer of 2017. The following is from his 6/22/17 report.&lt;br /&gt;
&lt;br /&gt;
= Basic Sweep Obstacle Detection Algorithm =&lt;br /&gt;
Goal&lt;br /&gt;
&lt;br /&gt;
To use the readings from the sweep to determine if there is an obstacle present within a given distance in front of the trike, and to stop the trike if this is so.&lt;br /&gt;
Sweep Operation&lt;br /&gt;
Rotation and Speed&lt;br /&gt;
The Sweep rotates counterclockwise. Its rotational speed can be set to any integral value between 0 Hz and 10 Hz (number of full rotations per second).&lt;br /&gt;
&lt;br /&gt;
= Sampling Rate =&lt;br /&gt;
&lt;br /&gt;
The sweep obtains readings according to a given sample rate. Three distinct sample rates can be used for the Sweep:&lt;br /&gt;
500 – 600 Hz&lt;br /&gt;
750 – 800 Hz&lt;br /&gt;
1000 – 1075 Hz\&lt;br /&gt;
&lt;br /&gt;
= 	Sample Data =&lt;br /&gt;
&lt;br /&gt;
Each reading from the Sweep contains these data:&lt;br /&gt;
&lt;br /&gt;
* A byte with sync/error bits, where the sync bit indicates whether the current reading is the first reading since the sensor last made a full rotation, one of the error bits indicates a communication error with the Lidar module, and the rest of the bits are reserved for future uses.&lt;br /&gt;
&lt;br /&gt;
* The azimuth (degree of angle with starting position), transmitted as a 16-bit fixed point number, where the 12 MSBs are the integral part and the 4 LSBs are the fractional part.&lt;br /&gt;
&lt;br /&gt;
* The distance from the nearest obstacle in centimeters, transmitted as a 16-bit integer.&lt;br /&gt;
&lt;br /&gt;
* A value representing the signal strength, transmitted as an unsigned 8-bit integer, where 0 is the lowest strength, and 255 is the highest strength.&lt;br /&gt;
&lt;br /&gt;
* A checksum, which is the remainder of the sum of the six previous bytes divided by 255.&lt;br /&gt;
&lt;br /&gt;
= Math =&lt;br /&gt;
&lt;br /&gt;
The trike will be expected to stop if an obstacle is detected within a certain distance from the front side of the vehicle, within the horizontal span of the trike. These distances are illustrated in Figure 1 as DISTANCE and WIDTH, respectively.&amp;amp;#8195;&lt;br /&gt;
The grey lines in Figure 1 show the distances that will be measured by the Sweep if it detects an obstacle at the line. The formula for this distance is DISTANCE/cos(AZIMUTH) .&lt;br /&gt;
The range of azimuths for the front side of the trike can be computed from the formula  sarcsin(WIDTH/(2*DISTANCE))&lt;br /&gt;
and&lt;br /&gt;
360-arcsin(WIDTH/(2*DISTANCE))&lt;br /&gt;
for the right and left corners, respectively.&lt;br /&gt;
&lt;br /&gt;
= 	Process =&lt;br /&gt;
&lt;br /&gt;
Once the Sweep begins taking measurements, check the measurements whose azimuths lie within the boundaries of the front side of the trike. For each measurement within this range, determine if the distance from an obstacle in centimeters is equal to or less than DISTANCE/cos(AZIMUTH) . If so, stop the vehicle until a search of the measurements within the front boundary comes back negative, and a certain amount of time has passed since the last obstacle was detected.W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
&lt;br /&gt;
[http://scanse.io/ Scanse]&lt;br /&gt;
&lt;br /&gt;
-- Main.JohnsonB - 2017-11-07&lt;br /&gt;
* Figure 1: Distance from trike to detect obstacle &amp;amp; trike width: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;%PUBURLPATH%/%WEB%/%TOPIC%/ScanseTrike.png&amp;quot; alt=&amp;quot;ScanseTrike.png&amp;quot; width=&amp;quot;397&amp;quot; height=&amp;quot;463&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Lidar&amp;diff=79</id>
		<title>Lidar</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Lidar&amp;diff=79"/>
		<updated>2019-06-06T19:24:48Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: JosephBreithaupt moved page ScanseSweep to Lidar: this is our lidar page discussing hardware and software&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Scanse Sweep =&lt;br /&gt;
&lt;br /&gt;
The Scanse Sweep is a lidar sensor. Its head spins around multiple times per second, and collects information about its lateral surroundings. The spin speed and sampling rate can be changed.&lt;br /&gt;
&lt;br /&gt;
It sends readings over a serial connection, each of which includes the angle, distance, signal strength, and other information.&lt;br /&gt;
&lt;br /&gt;
Blasé Johnson worked on the sweep in the summer of 2017. The following is from his 6/22/17 report.&lt;br /&gt;
&lt;br /&gt;
= Basic Sweep Obstacle Detection Algorithm =&lt;br /&gt;
Goal&lt;br /&gt;
&lt;br /&gt;
To use the readings from the sweep to determine if there is an obstacle present within a given distance in front of the trike, and to stop the trike if this is so.&lt;br /&gt;
Sweep Operation&lt;br /&gt;
Rotation and Speed&lt;br /&gt;
The Sweep rotates counterclockwise. Its rotational speed can be set to any integral value between 0 Hz and 10 Hz (number of full rotations per second).&lt;br /&gt;
&lt;br /&gt;
= Sampling Rate =&lt;br /&gt;
&lt;br /&gt;
The sweep obtains readings according to a given sample rate. Three distinct sample rates can be used for the Sweep:&lt;br /&gt;
500 – 600 Hz&lt;br /&gt;
750 – 800 Hz&lt;br /&gt;
1000 – 1075 Hz\&lt;br /&gt;
&lt;br /&gt;
= 	Sample Data =&lt;br /&gt;
&lt;br /&gt;
Each reading from the Sweep contains these data:&lt;br /&gt;
&lt;br /&gt;
* A byte with sync/error bits, where the sync bit indicates whether the current reading is the first reading since the sensor last made a full rotation, one of the error bits indicates a communication error with the Lidar module, and the rest of the bits are reserved for future uses.&lt;br /&gt;
&lt;br /&gt;
* The azimuth (degree of angle with starting position), transmitted as a 16-bit fixed point number, where the 12 MSBs are the integral part and the 4 LSBs are the fractional part.&lt;br /&gt;
&lt;br /&gt;
* The distance from the nearest obstacle in centimeters, transmitted as a 16-bit integer.&lt;br /&gt;
&lt;br /&gt;
* A value representing the signal strength, transmitted as an unsigned 8-bit integer, where 0 is the lowest strength, and 255 is the highest strength.&lt;br /&gt;
&lt;br /&gt;
* A checksum, which is the remainder of the sum of the six previous bytes divided by 255.&lt;br /&gt;
&lt;br /&gt;
= Math =&lt;br /&gt;
&lt;br /&gt;
The trike will be expected to stop if an obstacle is detected within a certain distance from the front side of the vehicle, within the horizontal span of the trike. These distances are illustrated in Figure 1 as DISTANCE and WIDTH, respectively.&amp;amp;#8195;&lt;br /&gt;
The grey lines in Figure 1 show the distances that will be measured by the Sweep if it detects an obstacle at the line. The formula for this distance is DISTANCE/cos(AZIMUTH) .&lt;br /&gt;
The range of azimuths for the front side of the trike can be computed from the formula  sarcsin(WIDTH/(2*DISTANCE))&lt;br /&gt;
and&lt;br /&gt;
360-arcsin(WIDTH/(2*DISTANCE))&lt;br /&gt;
for the right and left corners, respectively.&lt;br /&gt;
&lt;br /&gt;
= 	Process =&lt;br /&gt;
&lt;br /&gt;
Once the Sweep begins taking measurements, check the measurements whose azimuths lie within the boundaries of the front side of the trike. For each measurement within this range, determine if the distance from an obstacle in centimeters is equal to or less than DISTANCE/cos(AZIMUTH) . If so, stop the vehicle until a search of the measurements within the front boundary comes back negative, and a certain amount of time has passed since the last obstacle was detected.W&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
&lt;br /&gt;
[http://scanse.io/ Scanse]&lt;br /&gt;
&lt;br /&gt;
-- Main.JohnsonB - 2017-11-07&lt;br /&gt;
* Figure 1: Distance from trike to detect obstacle &amp;amp; trike width: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;%PUBURLPATH%/%WEB%/%TOPIC%/ScanseTrike.png&amp;quot; alt=&amp;quot;ScanseTrike.png&amp;quot; width=&amp;quot;397&amp;quot; height=&amp;quot;463&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=ScanseSweep&amp;diff=80</id>
		<title>ScanseSweep</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=ScanseSweep&amp;diff=80"/>
		<updated>2019-06-06T19:24:48Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: JosephBreithaupt moved page ScanseSweep to Lidar: this is our lidar page discussing hardware and software&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Lidar]]&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=ElcanoIntro&amp;diff=70</id>
		<title>ElcanoIntro</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=ElcanoIntro&amp;diff=70"/>
		<updated>2019-06-03T20:26:17Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Elcano Project Introduction =&lt;br /&gt;
&lt;br /&gt;
== Vehicles ==&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|A self-driving vehicle does not have to be a car. It can be a bicycle or motorcycle. We work with tricycles so that we do not need to worry about balance. Other vehicles could be karts or toy cars.  At University of Washington || Bothell we have two Catrike recumbents and an Organic Transit ELF. In 2018, version 3 of the High Level System was built. It has the capability of outputting in CAN Bus format, which is the standard for automotive control. With a CAN Bus interface on Low Level (currently under development) a trike can present the same automation interface as a car.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Automation of the ELF vehicle has started with the steering system, which is described in the attached document.&lt;br /&gt;
&lt;br /&gt;
== Theory ==&lt;br /&gt;
&lt;br /&gt;
Self-driving vehicles like Elcano can increase passenger safety, reduce the energy used for urban transportation, and reduce vehicle congestion. Over 90% of traffic accidents are caused by driver error, so the safety potential of self-drive is well-understood.  When self-drive almost eliminates traffic accidents, a motorcycle is almost as safe as a full-frame automobile. Vehicle weights could fall to the point that pod-cars weighing less than the riders are the preferred choice in urban environments. Since 65% of U.S. vehicle miles traveled (VMT) are urban, the ramifications are enormous. Self-driving vehicles can drive a pre-determined speed on a pre-determined route, eliminating unpredictable driver behavior that causes sudden traffic stoppage and congestion. An aerodynamic ultra-light vehicle that avoids stop-and-go traffic needs less than one-tenth the energy of an automobile; a 25 pound rechargeable battery and a small electric motor on a light vehicle achieves the speed and range required for urban transportation. Light batteries can be easily swapped when exhausted, eliminating range anxiety. A bank of batteries can be recharged when the wind blows and the sun shines. Fossil fuel demand, pollution and green house gas production could fall dramatically.&lt;br /&gt;
&lt;br /&gt;
For most people, transportation automation is rocket science.  The Elcano Project aims to make self-drive real for students and hobbyists, and build a popular demand to adopt traffic automation. The technology is here; laws and policies to take advantage of it are not.&lt;br /&gt;
&lt;br /&gt;
An isolated autonomous car can improve safety, but the other benefits require choreographing road users; when done right, highway capacity goes up three times and congestion mostly disappears. If manual and automated traffic were allowed to mix, the manually driven cars would snarl up the automated lane; thus there needs to be separated lanes. A lane set apart for automated vehicles looks a lot like Personal Rapid Transit (PRT), a technology that has been around for more than 40 years. Today PRT systems are in operation; other automated road systems are only at the testing phase.&lt;br /&gt;
&lt;br /&gt;
When an automated vehicle is in a reserved lane, the sensors get simpler and less expensive; there is no need for lidar, radar or extensive machine vision because lane traffic is synchronized and predictable. The Elcano Project provides a blueprint for building your own inexpensive experimental automated vehicle using electronics and sensors.  A tricycle with an electric motor under 750 Watt and top speed under 20 mph is legally a bicycle, and thus street-legal without license, registration or insurance.&lt;br /&gt;
&lt;br /&gt;
== Use of Arduino microcontrollers for Elcano ==&lt;br /&gt;
As you might be just taking your first dive into this project, it is important to know that most of our microcontrollers are manufactured by Arduino. Arduino is one of the largest producers of such development tools and have found great success in creating cheap ways to make them available to the public. Although generally affordable, these boards are mainly intended for prototyping and have rates of failure that may be too high for a production system. It still provides a great base for developers to create new systems.&lt;br /&gt;
For more information refer to https://www.arduino.cc/&lt;br /&gt;
--&amp;gt; the website also has a lot of information about their products from programming to forums so don't be afraid to look things up! Note that Arduino hardware is an open source design based on Atmel AVR. Since our boards are also open source, you have the possibility of designing a single board that merges the Arduino and Elcano functionality.&lt;br /&gt;
&lt;br /&gt;
== System Architecture Overview ==&lt;br /&gt;
Elcano converts an ordinary vehicle to self-drive by adding several classes of hardware, including:&lt;br /&gt;
* [[ProcessorGeneral | Processors]] that use data from the sensors and data from on-board storage to control where the vehicle goes.&lt;br /&gt;
* '''Actuators''' to control steering, braking, and vehicle speed. Actuators are often servomotors but can be other devices.&lt;br /&gt;
* '''Sensors''' to measure vehicle speed, vehicle location, vehicle direction, obstacle distance, and other information about the vehicle and its surroundings.&lt;br /&gt;
* '''Electrical Power''' comes from a bank of batteries, either tapped for multiple voltages or through power converters.&lt;br /&gt;
The processors, actuators, sensors, and power subsystem are all located somewhere on the vehicle. &lt;br /&gt;
Physical Architecture describes where each part is on the vehicle and the location of wires connecting each subsystem.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=ActuatorPage&amp;diff=69</id>
		<title>ActuatorPage</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=ActuatorPage&amp;diff=69"/>
		<updated>2019-06-03T20:24:41Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Actuators and Motor =&lt;br /&gt;
&lt;br /&gt;
==Description and Function ==&lt;br /&gt;
Elcano uses a linear servo (actuator) to control steering  hardware.  Brake control had used a linear servo, but in Spring 2018, brake control was replaced by a Solenoid system. An electric bicycle controller drives the rear wheel.The recumbent Catrikes use a hub motor. The ELF uses an electric motor that drives a chain on the left side of the vehicle. The ELF uses a rotary servo for steering.&lt;br /&gt;
&lt;br /&gt;
== Parts and Materials ==&lt;br /&gt;
&lt;br /&gt;
# Two solenoids and assembly for braking.  See '''&amp;quot;Creating and assembling a solenoid mount&amp;quot;''')&lt;br /&gt;
# 4in or 6&amp;quot; linear servo (steering)&lt;br /&gt;
# servo mounts&lt;br /&gt;
# linkage hardware to connect servos to brakes and steering&lt;br /&gt;
# electric bike conversion kit&lt;br /&gt;
# power subsystems (batteries, connectors, wiring) for servos and motor&lt;br /&gt;
&lt;br /&gt;
Detailed bill of materials: https://github.com/elcano/elcano/blob/master/Documentation/Elcano_BOM.xls&lt;br /&gt;
&lt;br /&gt;
== Steering System ==&lt;br /&gt;
There are two main steering signals: &lt;br /&gt;
&lt;br /&gt;
1. Signal Out is a 1 to 2 ms pulse sent from the Arduino to control the steering actuator.&lt;br /&gt;
&lt;br /&gt;
2. Signal In is a 5 V analog feedback signal that gives the pointing angle of the wheel. There is one such signal for each of the two front wheels.&lt;br /&gt;
&lt;br /&gt;
The linear steering actuator on the Catrikes  https://www.servocity.com/motors-actuators/linear-actuators/heavy-duty-linear-actuators has 25 lb. thrust with either a 4� or 6� throw. &lt;br /&gt;
&lt;br /&gt;
The steering actuator is powered by 12V DC. It produces 5V DC which can be used by other equipment. Steering is controlled by sending a pulse to the actuator. A pulse width of approximately 1 ms will cause the actuator to fully extend (right turn on Catrike). A pulse of about 2 ms will fully retract the actuator. A pulse of 1.5 ms will keep the vehicle pointed straight ahead. There is some variation in these voltages; thus the Catrikes have a mechanical adjustment for fine-tuning the position for going straight. Typically there are about 30 pulses per second; the exact rate does not matter. At 12V, servo operating speed is 56mm/s with no load or 35 mm/s at maximum load. It is important to note that under certain circumstances the actuator can critically damage itself. A full understanding has not be ascertained as of Spring 2019, but it is hypothesized that the actuator needs its power turned on only AFTER providing it a PWM signal. Further, providing it a signal corresponding to its current position will prevent it from trying to move during startup.&lt;br /&gt;
The low-level firmware (Winter 2019) has been adapted to perform this, with an optional external relay board.&lt;br /&gt;
&lt;br /&gt;
The actuator interfaces to the Arduino over a three wire servo connector that is standard for RC planes and cars. The three wires are Signal Out, Ground, and Power. The power wire is not used since both the actuator and Arduino have their own sources of power. The actuator is fused for 5 Amps and has blown fuses. Be careful not to drive it beyond physical limits.&lt;br /&gt;
&lt;br /&gt;
== Braking System ==&lt;br /&gt;
Two solenoids (Johnson Electric 150 174432-024; available from Newark/Element14) connected directly to the brake cables control braking. This system has some advantages and disadvantages over connecting the brake cables to a servo. Advantages are that a solenoid provides full braking force in milliseconds. Disadvantages include a lack of control over braking force and brake failure on loss of power: a solenoid alone will not hold position without adequate current from the batteries. Using a solenoid instead of a servo also requires additional hardware and software to control the solenoid.&lt;br /&gt;
&lt;br /&gt;
=== Building a solenoid mount for braking ===&lt;br /&gt;
==== Creating and assembling a solenoid mount ====&lt;br /&gt;
&lt;br /&gt;
# Select a solenoid according to required braking force and throw. Information like force as a function of throw is provided in product data sheets&lt;br /&gt;
## measure how much force is required to initially pull the brake cable from rest (against spring tension and friction) and to completely close the brake, stopping the loaded vehicle&lt;br /&gt;
## measure the distance the brake cable travels from rest to closed position; this is the required throw&lt;br /&gt;
## select a solenoid that provides adequate force over the entire throw &lt;br /&gt;
## be aware that a solenoid provides less force when heated by environment and electrical load&lt;br /&gt;
# Because solenoids generate heat, select metal stock with enough area to radiate heat from the solenoid; this information may be contained in the solenoid's data sheet &lt;br /&gt;
# If needed: use measurements from the solenoid or solenoid data sheet to modify the drilling template provided below to fit the mounting plate on the selected solenoid. Make sure holes are not too close to the edge of the material so there is enough room to drill&lt;br /&gt;
# Adhere the printed drilling template to the metal stock using rubber cement. Work quickly (&amp;lt; 30 seconds after application of rubber cement) to apply the paper template smoothly on the surface before the adhesive dries&lt;br /&gt;
# Drill holes where shown on the template. Drill pilot holes using a small bit before using large drill bits &lt;br /&gt;
# Check that all parts (including the solenoid) fit the drilled screw holes and use screws and nuts to attach the two angle bracket stops and the solenoid base plate to the solenoid mount&lt;br /&gt;
# install the brake shield ends (threaded metal parts) to the brake shield end mount and thread the brake cable through&lt;br /&gt;
# Screw the three bridle pieces together around the barrel end of the brake cable and attach to the solenoid arm with a screw and nut (or other hardware, depending on the solenoid arm end) &lt;br /&gt;
# Check that the solenoid arm moves freely along its entire throw with the bridle and brake cable attached&lt;br /&gt;
# Attach electrical connectors to the solenoid and attach the solenoid to the solenoid controller to test that brakes open and close when the solenoid is switched off and on&lt;br /&gt;
&lt;br /&gt;
==== Supplies ====&lt;br /&gt;
# existing bicycle braking system using barrel-ended brake cable (to use our brake cable bridle)&lt;br /&gt;
# one solenoid for each brake (it may be possible to alter the design included on this page to use one solenoid for two brakes, but make sure it has enough force for two brakes)&lt;br /&gt;
# metal stock large enough to create an entire mount for each solenoid; this mount doubles as a heat sink and should have enough total area to radiate heat&lt;br /&gt;
# metal stock to create a bridle attaching the solenoid arm to the brake cable&lt;br /&gt;
# metal stock to create a stop for the bridle on the solenoid arm and a mount for the brake cable end&lt;br /&gt;
(have extra metal stock to recreate each drilled piece in case of mistakes)&lt;br /&gt;
# material such as screws, plates, or u-bolts to attach the solenoid mount to the vehicle&lt;br /&gt;
# screws and nuts to hold all solenoid mount parts together&lt;br /&gt;
# a printed drilling template, modified to fit your hardware if needed, one for each solenoid mount (neatly cut out individual pieces)&lt;br /&gt;
# rubber cement or other adhesive for adhering the drilling template&lt;br /&gt;
# hand drill or drill press&lt;br /&gt;
# clamps and disposable wood block(s) for drilling&lt;br /&gt;
# files or other abrasive for removing metal burs and sharp edges&lt;br /&gt;
# personal safety equipment such as gloves and eye protection for when cutting, drilling, and filing&lt;br /&gt;
&lt;br /&gt;
=== Wiring the solenoid ===&lt;br /&gt;
The solenoids are connected in parallel to the [[LowLevel]] board's relay outputs. This is a hight current connection, and is mean to switch between 24v (for striking) and 12v (for maintaining). The solenoids only have a 25% duty cycle at 24v, so be careful not to leave them connected to power for too long. It is also critically important to include a snubbing diode in parallel with any inductive load. &lt;br /&gt;
As of version 3.0 the [[LowLevel]] board includes one on its brake output. We are using a pair of 1N400x series diodes rated for &amp;gt;50v and 1A (specifically 1N4001). This prevents extreme high voltage transients generated by switching the inductor from finding an inconvenient path to ground via our sensitive electronics. Quite a few relay shields have lost their driving transistors prior to the addition of these diodes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Links and Resources ==&lt;br /&gt;
See the attached solenoid data sheet for its specific characteristics.&lt;br /&gt;
Other linear servos: https://www.servocity.com/servos/heavy-duty-linear-servos&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Low_Level&amp;diff=68</id>
		<title>Low Level</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Low_Level&amp;diff=68"/>
		<updated>2019-06-03T20:12:43Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
=LowLevel v2.1 PCB =&lt;br /&gt;
&lt;br /&gt;
==Functionality: ==&lt;br /&gt;
&lt;br /&gt;
* The LowLevel Board (LLB) a daughter board (shield) for an Arduino Mega microcontroller. It interprets messages from higher-level autonomous systems or manual controls (RC, joystick). It directly manages the state of the actuators; the hub motor, the turning servo, and the brakes. &lt;br /&gt;
&lt;br /&gt;
* The first version of the LLB was called MegaShieldDB. It had similar functionality, but different connectors. &lt;br /&gt;
&lt;br /&gt;
* Depending on the current firmware or operating mode, motion directives are received on one of three interfaces;&lt;br /&gt;
** [[ElcanoSerial]] from the combined [[PilotPage | C3]]/[[PlannerPage | C4]]/[[NavigatorPage | C6]] High Level board &lt;br /&gt;
** RC receiver&lt;br /&gt;
** Manual Joystick&lt;br /&gt;
&lt;br /&gt;
* LLB v2.x has the following low-level interfaces:&lt;br /&gt;
** X2 Cruise (DB-25F) - [[ElcanoSerial]] messages from High Level.&lt;br /&gt;
** X3 Motor ([[DB15M | DB-15M]]): Analog voltage (0,4v) output hub motor.&lt;br /&gt;
** X1/X5 Turn Sensors (RJ45): SPI wheel angle sensor digital inputs. (These are not used. They are provided if the turn sensor is digitized to reduce noise. Present turn sensors are analog.)&lt;br /&gt;
** X4 (ODO): Cyclometer (reed switch) input jack.    Board layout was incorrect. This signal should connect to Arduino pin D2, but it does not.&lt;br /&gt;
** JP9 (8 pin): Joystick analog input signals. (not currently used) &lt;br /&gt;
** JP12 (3 pin): Pulse output signal to steer.  (Need signal and ground. 5V is not used since both the steer servo and low-level board produce 5V)&lt;br /&gt;
** JP11 (3 pin): Pulse output signal to apply main brakes. (No longer used)&lt;br /&gt;
** JP5 (4 pin): Left wheel angle sensor analog input. (Little used since it covers 360 degrees and is less accurate)&lt;br /&gt;
** JP6 (4 pin): Right wheel angle sensor analog input. (Trike prefer this, since it is +/- 30 degrees, and more accurate)&lt;br /&gt;
&lt;br /&gt;
* LLB v3.x makes significant wiring changes:&lt;br /&gt;
** Removes the ElcanoSerial connection and the DB-25F.&lt;br /&gt;
** Removes JP9, joystick analog inputs.&lt;br /&gt;
** Removes headers currently used to interface the RC receiver.&lt;br /&gt;
** Adds one CANbus interface on a DE-9F socket. For legacy compatibility ElcanoSerial may be available on this interface as well.&lt;br /&gt;
&lt;br /&gt;
* The LowLevel runs on 5V power, which it provides to sensors and servos on JP9, JP12, JP11, JP5 and JP6. A 9.6V battery supplies Vin to the Arduino, which regulates it to 5V and 3.3V. The RJ45 connectors send Vin, which must be regulated on the other end to 5V. Our trike uses a 36V battery to drive the hub motor and a 12V battery to drive the steering and brake servos. Each of these three actuators has a separate electronic subsystem, which generates 5V, but are not used by LowLevel. The 5V supply from the motor is used as an indication of whether 36V power is switched on.&lt;br /&gt;
&lt;br /&gt;
=LowLevel v3.1 PCB =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Functionality: ==&lt;br /&gt;
&lt;br /&gt;
* The LowLevel Board (LLB) a daughter board (shield) for an Arduino Mega microcontroller. It interprets messages from higher-level autonomous systems or manual controls (RC, joystick). It directly manages the state of the actuators; the hub motor, the turning servo, and the brakes. &lt;br /&gt;
&lt;br /&gt;
* The first version of the LLB was called MegaShieldDB. It had similar functionality, but different connectors. &lt;br /&gt;
&lt;br /&gt;
* Motion directives are received on a CANbus interface, processed, and articulated.&lt;br /&gt;
* System status (turn angle, wheel linear velocity) is reported back to CANbus.&lt;br /&gt;
&lt;br /&gt;
* LLB v3.x has the following interfaces:&lt;br /&gt;
** One CANbus channel on two connectors; a DB9-M and a three-pin screw terminal. The board includes a 120 ohm terminating resistor.&lt;br /&gt;
** X3 Motor (DB-15M):&lt;br /&gt;
*** Analog voltage (approximately 0v to 4v) output hub motor&lt;br /&gt;
*** Digital outputs for activating reverse/regenerate&lt;br /&gt;
*** PWM output for theoretical PWM-operated braking&lt;br /&gt;
*** Analog inputs for hall sensor feedback from motor controllers supporting this feature. These inputs are NOT 36V SAFE. They absolutely require external supporting circuitry.&lt;br /&gt;
*** A few spare connections for future expandability, such as a second DAC output and one digital GPIO.&lt;br /&gt;
** Steering Header (RJ45): &lt;br /&gt;
*** Two sets of pins to support analog potentiometers (5v, signal input, ground)&lt;br /&gt;
*** One PWM output (with its own ground) to drive the steering actuator.&lt;br /&gt;
*** This cable is broken out into its component signals using an RJ45 patch jack, mounted near the steering actuator.&lt;br /&gt;
** X4 (ODO): Cyclometer (reed switch) input jack. This is pulled high by default, and brought low when the magnet passes the sensor.&lt;br /&gt;
** High current pluggable terminal for solenoid brakes:&lt;br /&gt;
*** Connections for ground, 12v, and 24v.&lt;br /&gt;
*** Solenoid output, connected exclusively to either ground, 12v, or 24v.&lt;br /&gt;
&lt;br /&gt;
* The LowLevel runs on 5V power, and provides outputs for sensors. Note that the Arduino Mega 2560's regulator has a fairly low current limit, and should not be used for any significant current supply. The Arduino's DC input jack will accept a 9.6V battery, and its USB port may be connected to a typical USB battery.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Low_Level&amp;diff=67</id>
		<title>Low Level</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Low_Level&amp;diff=67"/>
		<updated>2019-06-03T20:12:05Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
==LowLevel v2.1 PCB ==&lt;br /&gt;
&lt;br /&gt;
=Functionality: =&lt;br /&gt;
&lt;br /&gt;
* The LowLevel Board (LLB) a daughter board (shield) for an Arduino Mega microcontroller. It interprets messages from higher-level autonomous systems or manual controls (RC, joystick). It directly manages the state of the actuators; the hub motor, the turning servo, and the brakes. &lt;br /&gt;
&lt;br /&gt;
* The first version of the LLB was called MegaShieldDB. It had similar functionality, but different connectors. &lt;br /&gt;
&lt;br /&gt;
* Depending on the current firmware or operating mode, motion directives are received on one of three interfaces;&lt;br /&gt;
** [[ElcanoSerial]] from the combined [[PilotPage | C3]]/[[PlannerPage | C4]]/[[NavigatorPage | C6]] High Level board &lt;br /&gt;
** RC receiver&lt;br /&gt;
** Manual Joystick&lt;br /&gt;
&lt;br /&gt;
* LLB v2.x has the following low-level interfaces:&lt;br /&gt;
** X2 Cruise (DB-25F) - [[ElcanoSerial]] messages from High Level.&lt;br /&gt;
** X3 Motor ([[DB15M | DB-15M]]): Analog voltage (0,4v) output hub motor.&lt;br /&gt;
** X1/X5 Turn Sensors (RJ45): SPI wheel angle sensor digital inputs. (These are not used. They are provided if the turn sensor is digitized to reduce noise. Present turn sensors are analog.)&lt;br /&gt;
** X4 (ODO): Cyclometer (reed switch) input jack.    Board layout was incorrect. This signal should connect to Arduino pin D2, but it does not.&lt;br /&gt;
** JP9 (8 pin): Joystick analog input signals. (not currently used) &lt;br /&gt;
** JP12 (3 pin): Pulse output signal to steer.  (Need signal and ground. 5V is not used since both the steer servo and low-level board produce 5V)&lt;br /&gt;
** JP11 (3 pin): Pulse output signal to apply main brakes. (No longer used)&lt;br /&gt;
** JP5 (4 pin): Left wheel angle sensor analog input. (Little used since it covers 360 degrees and is less accurate)&lt;br /&gt;
** JP6 (4 pin): Right wheel angle sensor analog input. (Trike prefer this, since it is +/- 30 degrees, and more accurate)&lt;br /&gt;
&lt;br /&gt;
* LLB v3.x makes significant wiring changes:&lt;br /&gt;
** Removes the ElcanoSerial connection and the DB-25F.&lt;br /&gt;
** Removes JP9, joystick analog inputs.&lt;br /&gt;
** Removes headers currently used to interface the RC receiver.&lt;br /&gt;
** Adds one CANbus interface on a DE-9F socket. For legacy compatibility ElcanoSerial may be available on this interface as well.&lt;br /&gt;
&lt;br /&gt;
* The LowLevel runs on 5V power, which it provides to sensors and servos on JP9, JP12, JP11, JP5 and JP6. A 9.6V battery supplies Vin to the Arduino, which regulates it to 5V and 3.3V. The RJ45 connectors send Vin, which must be regulated on the other end to 5V. Our trike uses a 36V battery to drive the hub motor and a 12V battery to drive the steering and brake servos. Each of these three actuators has a separate electronic subsystem, which generates 5V, but are not used by LowLevel. The 5V supply from the motor is used as an indication of whether 36V power is switched on.&lt;br /&gt;
&lt;br /&gt;
==LowLevel v3.1 PCB ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Functionality: =&lt;br /&gt;
&lt;br /&gt;
* The LowLevel Board (LLB) a daughter board (shield) for an Arduino Mega microcontroller. It interprets messages from higher-level autonomous systems or manual controls (RC, joystick). It directly manages the state of the actuators; the hub motor, the turning servo, and the brakes. &lt;br /&gt;
&lt;br /&gt;
* The first version of the LLB was called MegaShieldDB. It had similar functionality, but different connectors. &lt;br /&gt;
&lt;br /&gt;
* Motion directives are received on a CANbus interface, processed, and articulated.&lt;br /&gt;
* System status (turn angle, wheel linear velocity) is reported back to CANbus.&lt;br /&gt;
&lt;br /&gt;
* LLB v3.x has the following interfaces:&lt;br /&gt;
** One CANbus channel on two connectors; a DB9-M and a three-pin screw terminal. The board includes a 120 ohm terminating resistor.&lt;br /&gt;
** X3 Motor (DB-15M):&lt;br /&gt;
*** Analog voltage (approximately 0v to 4v) output hub motor&lt;br /&gt;
*** Digital outputs for activating reverse/regenerate&lt;br /&gt;
*** PWM output for theoretical PWM-operated braking&lt;br /&gt;
*** Analog inputs for hall sensor feedback from motor controllers supporting this feature. These inputs are NOT 36V SAFE. They absolutely require external supporting circuitry.&lt;br /&gt;
*** A few spare connections for future expandability, such as a second DAC output and one digital GPIO.&lt;br /&gt;
** Steering Header (RJ45): &lt;br /&gt;
*** Two sets of pins to support analog potentiometers (5v, signal input, ground)&lt;br /&gt;
*** One PWM output (with its own ground) to drive the steering actuator.&lt;br /&gt;
*** This cable is broken out into its component signals using an RJ45 patch jack, mounted near the steering actuator.&lt;br /&gt;
** X4 (ODO): Cyclometer (reed switch) input jack. This is pulled high by default, and brought low when the magnet passes the sensor.&lt;br /&gt;
** High current pluggable terminal for solenoid brakes:&lt;br /&gt;
*** Connections for ground, 12v, and 24v.&lt;br /&gt;
*** Solenoid output, connected exclusively to either ground, 12v, or 24v.&lt;br /&gt;
&lt;br /&gt;
* The LowLevel runs on 5V power, and provides outputs for sensors. Note that the Arduino Mega 2560's regulator has a fairly low current limit, and should not be used for any significant current supply. The Arduino's DC input jack will accept a 9.6V battery, and its USB port may be connected to a typical USB battery.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=66</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=66"/>
		<updated>2019-06-02T05:45:45Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Elcano Remote Control =&lt;br /&gt;
&lt;br /&gt;
The Elcano system can run autonomously or by remote control. There have been four systems built for manual or remote control.&lt;br /&gt;
&lt;br /&gt;
== Joystick ==&lt;br /&gt;
The first system used an APEM 9000 joystick. The part has five wires: 5V power, ground, and three analog lines. The joystick has two axes. The vertical axis is used for throttle (up) and brakes (down). The third analog signal is the voltage of the joystick when centered. The joystick was used in 2014 and is described in http://www.elcanoproject.org/tutorial/lab2.php.  The Low-level code may still contain inputs and processing for an analog joystick.&lt;br /&gt;
&lt;br /&gt;
== Bluetooth ==&lt;br /&gt;
In 2015 students built a control system using a Bluetooth receiver to the Arduino. The transmitter was a TI Sitara running Android. &lt;br /&gt;
&lt;br /&gt;
== 5- and 6-channel RC Controller ==&lt;br /&gt;
The system has been run from either a Hitec Optics 5 2.4 five channel unit or a Spektrum DX6i six channel controller. The Low level circuit board has a3x7 pin socket in the corner to accommodate the receiver. Each channel needs to be on its own interrupt. Since the Arduino Mega has only 6 interrupts and the Arduino Micro has 5, this can be a problem, especially since we want another one or two interrupts to handle the speed. Low level code may still have software to handle these interrupts. The RC controllers send a 1.0 to 2.0 ms pulse on each channel at 30 Hz. Some controllers send these signals in turn. We have built a six-input OR circuit to combine all signals, which would allow processing with just one interrupt. Unfortunately, there is no good way to predict whether the RC unit will send pulses in turn or all at once. In fact, the behavior seems to be determined by the receive unit, not the transmitter. Thus a separate interrupt is required for each channel used. Interrupt processing consists of interrupting on a rising edge, then switching to a falling edge interrupt and logging the pulse width. A width of 1.0 ms typically means one extreme, 1.5 ms is centered, and 2.0 ms is the other extreme., This system can get confusing about which channel is assigned which behavior, and the two controllers assign their channels differently. To go beyond the Arduino interrupt limit, the V2 Low Level board has all RC inputs assigned to Analog Input 8 to 13 of the Arduino. These pins are used digitally. Pins A8-A15 on Arduino Mega, all go to the same port. Thus we can use the pin change interrupt, which is activated whenever any bit of the 8-bit port changes.&lt;br /&gt;
&lt;br /&gt;
== Amplitude Shift Keying (ASK) RC Controller ==&lt;br /&gt;
&lt;br /&gt;
Elcano project used a custom-built radio control system with two arduinos, one in the remote control that collects manual inputs and transmits them with a 433MHz ASK radio transmitter, and one on the Elcano vehicle which receives the information sent over radio and converts it into an ElcanoSerial drive packet which is transmitted to C2 over ElcanoSerial. This information is used to manually drive the trike, begin an autonomous routine, or activate the emergency brake and stop the trike. The RH_ASK system was limited to 40 feet (12 meters) in practice and was never use to drive the vehicle.&lt;br /&gt;
&lt;br /&gt;
== RFM68HCW and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RFM68HCW (915MHz) transceiver offers several benefits over the 433MHz ASK radios:&lt;br /&gt;
* greater range with higher transmit power&lt;br /&gt;
* much higher raw bitrate&lt;br /&gt;
* half-duplex communication and received signal strength indicator (RSSI)&lt;br /&gt;
* compatibility with higher-performance 3.3V ARM boards like SAMD21&lt;br /&gt;
&lt;br /&gt;
Using the RF69 RadioHead library, the RC system has expanded capabilities from the RH ASK implementation. Data is stored on both ends as a C struct, which is broken down and transmitted as bytes by the RF69 library. After successful transmission, the data is accessible directly from the struct and variables larger than one byte need no additional processing before use. After successfully receiving a packet from the remote control, the receiver sends a packet back with an RSSI value. The remote control uses this reply message to indicate radio communication is active. &lt;br /&gt;
&lt;br /&gt;
=== Transmitted data to vehicle ===&lt;br /&gt;
* unsigned 12-bit throttle (0-4095)&lt;br /&gt;
* unsigned 12-bit turn &lt;br /&gt;
* boolean emergency stop&lt;br /&gt;
* boolean autonomous mode&lt;br /&gt;
* signed RSSI of last received packet (from vehicle)&lt;br /&gt;
&lt;br /&gt;
=== Received data from vehicle ===&lt;br /&gt;
* signed RSSI of last received packet (from remote)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Main.JosephBreithaupt - 2017-10-11&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=65</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=65"/>
		<updated>2019-05-31T22:00:48Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Welcome to the Elcano Project Wiki =&lt;br /&gt;
As the title says, WELCOME TO THE ELCANO PROJECT! Over the past few years many different teams have been working hard to create Cheap and Modular autonomy at the University of Washington Bothell. We are currently working on our first two prototypes which are now in the form of tricycles. With the use of affordable microcontrollers, such as the Arduino Mega 2560 and Raspberry PI, we are working towards creating Autonomy for anyone to rebuild anywhere, and that under $2000 and fully open-source. But we don't plan to stop there, no. That is just the first step in reaching our ultimate goal, which is making our systems applicable to any desired ground vehicles, such as cars and other vehicles. Autonomy is nothing new, in fact it has been around for over 40 years, the difference is that now we have the ability to make it available for anyone who desires furthering their knowledge or simply finding a safer way to work.&lt;br /&gt;
&lt;br /&gt;
To '''edit articles''' or '''upload files''', please create an account and request editing rights from a [//www.elcanoproject.org/wiki/index.php?title=Special:ListUsers&amp;amp;group=bureaucrat member of the &amp;quot;bureaucrat&amp;quot; group].&lt;br /&gt;
&lt;br /&gt;
For editing help visit https://www.mediawiki.org/wiki/Help:Editing_pages or https://www.mediawiki.org/wiki/Help:Formatting.&lt;br /&gt;
--------&lt;br /&gt;
== [[ElcanoIntro | Overview]] ==&lt;br /&gt;
Basic concept of how the Elcano Project vehicle works.&lt;br /&gt;
&lt;br /&gt;
== [[System Architecture]] ==&lt;br /&gt;
How processors connect to sensors, each other, actuators, and other hardware. Includes processor-to-processor communication protocol.&lt;br /&gt;
&lt;br /&gt;
== [[Power System]] ==&lt;br /&gt;
How different modules connect to the batteries or power subsystem hardware.&lt;br /&gt;
&lt;br /&gt;
== [[Low Level]] ==&lt;br /&gt;
How the Low Level system uses inputs to control actuators to steer, move, and stop the vehicle.&lt;br /&gt;
&lt;br /&gt;
== [[High Level]] ==&lt;br /&gt;
How the High Level system uses stored maps and inputs from navigational sensors to formulate movement instructions sent to Low Level.&lt;br /&gt;
&lt;br /&gt;
== [[Remote Control]] ==&lt;br /&gt;
Human control of trike movements through Low Level using hardware connected to Low Level by a radio communication link (drive by radio). Includes on-board controls (drive by wire). &lt;br /&gt;
&lt;br /&gt;
== [[Sonar]] == &lt;br /&gt;
How the sonar subsystem connected to High Level works.&lt;br /&gt;
&lt;br /&gt;
== [[Lidar]] ==&lt;br /&gt;
How the lidar subsystem connected to High Level works.&lt;br /&gt;
&lt;br /&gt;
== [[ Camera]] ==&lt;br /&gt;
How the camera and vision susbsystem connected to High Level works.&lt;br /&gt;
&lt;br /&gt;
== [[ Board Diagrams]] ==&lt;br /&gt;
Images of Elcano Project's printed circuit boards for reference. PCB source files and schematics are maintained and stored at [//github.com/elcano].&lt;br /&gt;
&lt;br /&gt;
== [[GitUsage | Using Git and GitHub]] ==&lt;br /&gt;
Practices for maintaining code and source files on Elcano Project's Github.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==[[FilesPage | Files]] ==&lt;br /&gt;
These are media files (pictures, videos, etc.) that are part of the project, but are not maintained under version control.&lt;br /&gt;
&lt;br /&gt;
== Elcano Project Main Website ==&lt;br /&gt;
* [//www.elcanoproject.org]&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=64</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=64"/>
		<updated>2019-05-31T20:57:43Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /*  Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Welcome to the Elcano Project Wiki =&lt;br /&gt;
As the title says, WELCOME TO THE ELCANO PROJECT! Over the past few years many different teams have been working hard to create Cheap and Modular autonomy at the University of Washington Bothell. We are currently working on our first two prototypes which are now in the form of tricycles. With the use of affordable microcontrollers, such as the Arduino Mega 2560 and Raspberry PI, we are working towards creating Autonomy for anyone to rebuild anywhere, and that under $2000 and fully open-source. But we don't plan to stop there, no. That is just the first step in reaching our ultimate goal, which is making our systems applicable to any desired ground vehicles, such as cars and other vehicles. Autonomy is nothing new, in fact it has been around for over 40 years, the difference is that now we have the ability to make it available for anyone who desires furthering their knowledge or simply finding a safer way to work.&lt;br /&gt;
&lt;br /&gt;
To '''edit articles''' or '''upload files''', please create an account and request editing rights from a [https://www.elcanoproject.org/wiki/index.php?title=Special:ListUsers&amp;amp;group=bureaucrat member of the &amp;quot;bureaucrat&amp;quot; group].&lt;br /&gt;
&lt;br /&gt;
For editing help visit https://www.mediawiki.org/wiki/Help:Editing_pages or https://www.mediawiki.org/wiki/Help:Formatting.&lt;br /&gt;
--------&lt;br /&gt;
== [[ElcanoIntro | Overview]] ==&lt;br /&gt;
&lt;br /&gt;
Basic concept of the Elcano Project system.&lt;br /&gt;
&lt;br /&gt;
== [[ProcessorGeneral | Processors and Boards]] ==&lt;br /&gt;
Click above to find more information about the different boards and processors that are currently being used. This includes and information on the in-house designed boards that go hand-in- hand with our processors&lt;br /&gt;
== [[ActuatorPage | Actuators and motor]] ==&lt;br /&gt;
Click above for details pertaining to the actuators and motor used&lt;br /&gt;
== [[SensorsPage | Sensors]] ==&lt;br /&gt;
Click above to find out more about the sensors that give our vehicle its eyes and ears&lt;br /&gt;
== [[RemoteControl | Remote Control]] ==&lt;br /&gt;
Click above to access remote control Arduino sketches and documents/schematics (move these to Elcano/elcano repository as needed)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[LibrariesPage | Libraries]] ==&lt;br /&gt;
* [[Settings.h]]&lt;br /&gt;
* [[ElcanoSerial]]&lt;br /&gt;
* Media Storage &lt;br /&gt;
** SD card (maps/routes)&lt;br /&gt;
* [[Electronics]] Schematics, Wiring, etc&lt;br /&gt;
* Custom mounts and parts&lt;br /&gt;
&lt;br /&gt;
== Hardware and Software tutorials ==&lt;br /&gt;
* [[CSVtoTwiki | Converting Excel table (.CSV) to Twiki table]]&lt;br /&gt;
* [[TemplateArticle | Template Wiki Article (copy me)]]&lt;br /&gt;
* [[GitUsage | Using Git and GitHub]]&lt;br /&gt;
== Bill of Materials ==&lt;br /&gt;
* [[LegacySonarsBOM | Sonars_BOM.xls]] (Mostly Current)&lt;br /&gt;
&lt;br /&gt;
==[[FilesPage | Files]] ==&lt;br /&gt;
These are media files (pictures, videos, etc.) that are part of the project, but are not maintained under version control.&lt;br /&gt;
&lt;br /&gt;
== Elcano Project Website ==&lt;br /&gt;
* https://www.elcanoproject.org&lt;br /&gt;
&lt;br /&gt;
== [[LegacyPage | Legacy Documents !!(Out-of-date, no longer used)]] ==&lt;br /&gt;
Click above to access deprecated Elcano documents. &lt;br /&gt;
&lt;br /&gt;
== Site Map ==&lt;br /&gt;
&lt;br /&gt;
%INCLUDE{%SYSTEMWEB%.SiteMap}%&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=63</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=63"/>
		<updated>2019-05-31T20:47:40Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Welcome to the Elcano Project Wiki =&lt;br /&gt;
As the title says, WELCOME TO THE ELCANO PROJECT! Over the past few years many different teams have been working hard to create Cheap and Modular autonomy at the University of Washington Bothell. We are currently working on our first two prototypes which are now in the form of tricycles. With the use of affordable microcontrollers, such as the Arduino Mega 2560 and Raspberry PI, we are working towards creating Autonomy for anyone to rebuild anywhere, and that under $2000 and fully open-source. But we don't plan to stop there, no. That is just the first step in reaching our ultimate goal, which is making our systems applicable to any desired ground vehicles, such as cars and other vehicles. Autonomy is nothing new, in fact it has been around for over 40 years, the difference is that now we have the ability to make it available for anyone who desires furthering their knowledge or simply finding a safer way to work.&lt;br /&gt;
&lt;br /&gt;
To '''edit articles''' or '''upload files''', please create an account and request editing rights from a [https://www.elcanoproject.org/wiki/index.php?title=Special:ListUsers&amp;amp;group=bureaucrat member of the &amp;quot;bureaucrat&amp;quot; group].&lt;br /&gt;
&lt;br /&gt;
For editing help visit https://www.mediawiki.org/wiki/Help:Editing_pages or https://www.mediawiki.org/wiki/Help:Formatting.&lt;br /&gt;
--------&lt;br /&gt;
== [[ElcanoIntro | Introduction]] ==&lt;br /&gt;
Click above for a more in depth introduction into the Elcano project and what we do.&lt;br /&gt;
== [[ProcessorGeneral | Processors and Boards]] ==&lt;br /&gt;
Click above to find more information about the different boards and processors that are currently being used. This includes and information on the in-house designed boards that go hand-in- hand with our processors&lt;br /&gt;
== [[ActuatorPage | Actuators and motor]] ==&lt;br /&gt;
Click above for details pertaining to the actuators and motor used&lt;br /&gt;
== [[SensorsPage | Sensors]] ==&lt;br /&gt;
Click above to find out more about the sensors that give our vehicle its eyes and ears&lt;br /&gt;
== [[RemoteControl | Remote Control]] ==&lt;br /&gt;
Click above to access remote control Arduino sketches and documents/schematics (move these to Elcano/elcano repository as needed)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[LibrariesPage | Libraries]] ==&lt;br /&gt;
* [[Settings.h]]&lt;br /&gt;
* [[ElcanoSerial]]&lt;br /&gt;
* Media Storage &lt;br /&gt;
** SD card (maps/routes)&lt;br /&gt;
* [[Electronics]] Schematics, Wiring, etc&lt;br /&gt;
* Custom mounts and parts&lt;br /&gt;
&lt;br /&gt;
== Hardware and Software tutorials ==&lt;br /&gt;
* [[CSVtoTwiki | Converting Excel table (.CSV) to Twiki table]]&lt;br /&gt;
* [[TemplateArticle | Template Wiki Article (copy me)]]&lt;br /&gt;
* [[GitUsage | Using Git and GitHub]]&lt;br /&gt;
== Bill of Materials ==&lt;br /&gt;
* [[LegacySonarsBOM | Sonars_BOM.xls]] (Mostly Current)&lt;br /&gt;
&lt;br /&gt;
==[[FilesPage | Files]] ==&lt;br /&gt;
These are media files (pictures, videos, etc.) that are part of the project, but are not maintained under version control.&lt;br /&gt;
&lt;br /&gt;
== Elcano Project Website ==&lt;br /&gt;
* https://www.elcanoproject.org&lt;br /&gt;
&lt;br /&gt;
== [[LegacyPage | Legacy Documents !!(Out-of-date, no longer used)]] ==&lt;br /&gt;
Click above to access deprecated Elcano documents. &lt;br /&gt;
&lt;br /&gt;
== Site Map ==&lt;br /&gt;
&lt;br /&gt;
%INCLUDE{%SYSTEMWEB%.SiteMap}%&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=User:JosephBreithaupt&amp;diff=61</id>
		<title>User:JosephBreithaupt</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=User:JosephBreithaupt&amp;diff=61"/>
		<updated>2019-05-31T03:43:28Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Created page with &amp;quot;Joseph Breithaupt created this wiki site for the [//elcanoproject.org Elcano Project].&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Joseph Breithaupt created this wiki site for the [//elcanoproject.org Elcano Project].&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=51</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=51"/>
		<updated>2019-05-24T03:57:21Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Welcome to the Elcano Project Wiki */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Welcome to the Elcano Project Wiki =&lt;br /&gt;
As the title says, WELCOME TO THE ELCANO PROJECT! Over the past few years many different teams have been working hard to create Cheap and Modular autonomy at the University of Washington Bothell. We are currently working on our first two prototypes which are now in the form of tricycles. With the use of affordable microcontrollers, such as the Arduino Mega 2560 and Raspberry PI, we are working towards creating Autonomy for anyone to rebuild anywhere, and that under $2000 and fully open-source. But we don't plan to stop there, no. That is just the first step in reaching our ultimate goal, which is making our systems applicable to any desired ground vehicles, such as cars and other vehicles. Autonomy is nothing new, in fact it has been around for over 40 years, the difference is that now we have the ability to make it available for anyone who desires furthering their knowledge or simply finding a safer way to work.&lt;br /&gt;
&lt;br /&gt;
To '''edit articles''' or '''upload files''', please create an account, log in, and confirm your email using the '''Preferences''' page: https://www.elcanoproject.org/wiki/Special:Preferences.&lt;br /&gt;
&lt;br /&gt;
For editing help visit https://www.mediawiki.org/wiki/Help:Editing_pages or https://www.mediawiki.org/wiki/Help:Formatting.&lt;br /&gt;
--------&lt;br /&gt;
== [[ElcanoIntro | Introduction]] ==&lt;br /&gt;
Click above for a more in depth introduction into the Elcano project and what we do.&lt;br /&gt;
== [[ProcessorGeneral | Processors and Boards]] ==&lt;br /&gt;
Click above to find more information about the different boards and processors that are currently being used. This includes and information on the in-house designed boards that go hand-in- hand with our processors&lt;br /&gt;
== [[ActuatorPage | Actuators and motor]] ==&lt;br /&gt;
Click above for details pertaining to the actuators and motor used&lt;br /&gt;
== [[SensorsPage | Sensors]] ==&lt;br /&gt;
Click above to find out more about the sensors that give our vehicle its eyes and ears&lt;br /&gt;
== [[RemoteControl | Remote Control]] ==&lt;br /&gt;
Click above to access remote control Arduino sketches and documents/schematics (move these to Elcano/elcano repository as needed)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[LibrariesPage | Libraries]] ==&lt;br /&gt;
* [[Settings.h]]&lt;br /&gt;
* [[ElcanoSerial]]&lt;br /&gt;
* Media Storage &lt;br /&gt;
** SD card (maps/routes)&lt;br /&gt;
* [[Electronics]] Schematics, Wiring, etc&lt;br /&gt;
* Custom mounts and parts&lt;br /&gt;
&lt;br /&gt;
== Hardware and Software tutorials ==&lt;br /&gt;
* [[CSVtoTwiki | Converting Excel table (.CSV) to Twiki table]]&lt;br /&gt;
* [[TemplateArticle | Template Wiki Article (copy me)]]&lt;br /&gt;
* [[GitUsage | Using Git and GitHub]]&lt;br /&gt;
== Bill of Materials ==&lt;br /&gt;
* [[LegacySonarsBOM | Sonars_BOM.xls]] (Mostly Current)&lt;br /&gt;
&lt;br /&gt;
==[[FilesPage | Files]] ==&lt;br /&gt;
These are media files (pictures, videos, etc.) that are part of the project, but are not maintained under version control.&lt;br /&gt;
&lt;br /&gt;
== Elcano Project Website ==&lt;br /&gt;
* https://www.elcanoproject.org&lt;br /&gt;
&lt;br /&gt;
== [[LegacyPage | Legacy Documents !!(Out-of-date, no longer used)]] ==&lt;br /&gt;
Click above to access deprecated Elcano documents. &lt;br /&gt;
&lt;br /&gt;
== Site Map ==&lt;br /&gt;
&lt;br /&gt;
%INCLUDE{%SYSTEMWEB%.SiteMap}%&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=DB15M&amp;diff=50</id>
		<title>DB15M</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=DB15M&amp;diff=50"/>
		<updated>2019-05-23T06:03:19Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Created page with &amp;quot;%META:TOPICINFO{author=&amp;quot;TylerCFolsom&amp;quot; date=&amp;quot;1526595460&amp;quot; format=&amp;quot;1.1&amp;quot; version=&amp;quot;1.2&amp;quot;}% %META:TOPICPARENT{name=&amp;quot;LowLevel&amp;quot;}% The most useful signal pins are 11 and 12:  1: PWM out...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;%META:TOPICINFO{author=&amp;quot;TylerCFolsom&amp;quot; date=&amp;quot;1526595460&amp;quot; format=&amp;quot;1.1&amp;quot; version=&amp;quot;1.2&amp;quot;}%&lt;br /&gt;
%META:TOPICPARENT{name=&amp;quot;LowLevel&amp;quot;}%&lt;br /&gt;
The most useful signal pins are 11 and 12:&lt;br /&gt;
&lt;br /&gt;
1: PWM output to brakes to JP11 pin 2 and Arduino pin D6. (Obsolete)&lt;br /&gt;
&lt;br /&gt;
2. Hall Phase A to Arduino pin D21 (input from hub motor. Intended for accurate speed information. Not implemented)&lt;br /&gt;
&lt;br /&gt;
3 Hall Phase B to Arduino D20&lt;br /&gt;
&lt;br /&gt;
4: Output to drive in reverse (not implemented)&lt;br /&gt;
&lt;br /&gt;
5. Output to use regenerative braking (not implemented)&lt;br /&gt;
&lt;br /&gt;
6. Emergency stop. Goes to Arduino pin D10&lt;br /&gt;
&lt;br /&gt;
7: Available, Goes to Arduino pin D36&lt;br /&gt;
&lt;br /&gt;
8. Hall Phase C to Arduino D19&lt;br /&gt;
&lt;br /&gt;
9. to Arduino D34  &lt;br /&gt;
&lt;br /&gt;
10. Live E-bike control. Input to Arduino D18. This signal goes to 5V if the 36V power is on, or to 0 if it is off.&lt;br /&gt;
&lt;br /&gt;
11: Ground&lt;br /&gt;
&lt;br /&gt;
12: Analog throttle output to e-bike controller &lt;br /&gt;
&lt;br /&gt;
13: An alternate analog output&lt;br /&gt;
&lt;br /&gt;
14: Input for a speedometer click; attaches to Arduino D3.&lt;br /&gt;
&lt;br /&gt;
15: Watchdog pet output. (not implemented)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Main.TylerCFolsom - 2018-05-17&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Low_Level&amp;diff=49</id>
		<title>Low Level</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Low_Level&amp;diff=49"/>
		<updated>2019-05-23T06:02:57Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Functionality: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
==!! LowLevel v2.1 PCB ==&lt;br /&gt;
&lt;br /&gt;
This Document contains:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Functionality: =&lt;br /&gt;
&lt;br /&gt;
* The LowLevel Board (LLB) a daughter board (shield) for an Arduino Mega microcontroller. It interprets messages from higher-level autonomous systems or manual controls (RC, joystick). It directly manages the state of the actuators; the hub motor, the turning servo, and the brakes. &lt;br /&gt;
&lt;br /&gt;
* The first version of the LLB was called MegaShieldDB. It had similar functionality, but different connectors. &lt;br /&gt;
&lt;br /&gt;
* Depending on the current firmware or operating mode, motion directives are received on one of three interfaces;&lt;br /&gt;
** [[ElcanoSerial]] from the combined [[PilotPage | C3]]/[[PlannerPage | C4]]/[[NavigatorPage | C6]] High Level board &lt;br /&gt;
** RC receiver&lt;br /&gt;
** Manual Joystick&lt;br /&gt;
&lt;br /&gt;
* LLB v2.x has the following low-level interfaces:&lt;br /&gt;
** X2 Cruise (DB-25F) - [[ElcanoSerial]] messages from High Level.&lt;br /&gt;
** X3 Motor ([[DB15M | DB-15M]]): Analog voltage (0,4v) output hub motor.&lt;br /&gt;
** X1/X5 Turn Sensors (RJ45): SPI wheel angle sensor digital inputs. (These are not used. They are provided if the turn sensor is digitized to reduce noise. Present turn sensors are analog.)&lt;br /&gt;
** X4 (ODO): Cyclometer (reed switch) input jack.    Board layout was incorrect. This signal should connect to Arduino pin D2, but it does not.&lt;br /&gt;
** JP9 (8 pin): Joystick analog input signals. (not currently used) &lt;br /&gt;
** JP12 (3 pin): Pulse output signal to steer.  (Need signal and ground. 5V is not used since both the steer servo and low-level board produce 5V)&lt;br /&gt;
** JP11 (3 pin): Pulse output signal to apply main brakes. (No longer used)&lt;br /&gt;
** JP5 (4 pin): Left wheel angle sensor analog input. (Little used since it covers 360 degrees and is less accurate)&lt;br /&gt;
** JP6 (4 pin): Right wheel angle sensor analog input. (Trike prefer this, since it is +/- 30 degrees, and more accurate)&lt;br /&gt;
&lt;br /&gt;
* LLB v3.x makes significant wiring changes:&lt;br /&gt;
** Removes the ElcanoSerial connection and the DB-25F.&lt;br /&gt;
** Removes JP9, joystick analog inputs.&lt;br /&gt;
** Removes headers currently used to interface the RC receiver.&lt;br /&gt;
** Adds one CANbus interface on a DE-9F socket. For legacy compatibility ElcanoSerial may be available on this interface as well.&lt;br /&gt;
&lt;br /&gt;
* The LowLevel runs on 5V power, which it provides to sensors and servos on JP9, JP12, JP11, JP5 and JP6. A 9.6V battery supplies Vin to the Arduino, which regulates it to 5V and 3.3V. The RJ45 connectors send Vin, which must be regulated on the other end to 5V. Our trike uses a 36V battery to drive the hub motor and a 12V battery to drive the steering and brake servos. Each of these three actuators has a separate electronic subsystem, which generates 5V, but are not used by LowLevel. The 5V supply from the motor is used as an indication of whether 36V power is switched on.&lt;br /&gt;
&lt;br /&gt;
=Board Schematic for LLB v2: =&lt;br /&gt;
* Refer to connections spreadsheet for pin mapping (still in progress) &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;%PUBURLPATH%/%WEB%/%TOPIC%/Board-LowLevel.png&amp;quot; alt=&amp;quot;Board-LowLevel.png&amp;quot; width=&amp;quot;1228&amp;quot; height=&amp;quot;959&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Assembly Guide for LLB v2: =&lt;br /&gt;
* Step by step instructions for building your own LowLevel board, complete with pictures and schematics. &lt;br /&gt;
* Download: [[%PUBURLPATH%/%WEB%/%TOPIC%/LowLevel_v2.docx | LowLevel_v2.docx]]&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=48</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=48"/>
		<updated>2019-05-23T05:59:32Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /* Elcano Project Website */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Welcome to the Elcano Project Wiki =&lt;br /&gt;
As the title says, WELCOME TO THE ELCANO PROJECT! Over the past few years many different teams have been working hard to create Cheap and Modular autonomy at the University of Washington Bothell. We are currently working on our first two prototypes which are now in the form of tricycles. With the use of affordable microcontrollers, such as the Arduino Mega 2560 and Raspberry PI, we are working towards creating Autonomy for anyone to rebuild anywhere, and that under $2000 and fully open-source. But we don't plan to stop there, no. That is just the first step in reaching our ultimate goal, which is making our systems applicable to any desired ground vehicles, such as cars and other vehicles. Autonomy is nothing new, in fact it has been around for over 40 years, the difference is that now we have the ability to make it available for anyone who desires furthering their knowledge or simply finding a safer way to work.&lt;br /&gt;
&lt;br /&gt;
For editing help visit https://www.mediawiki.org/wiki/Help:Editing_pages or https://www.mediawiki.org/wiki/Help:Formatting.&lt;br /&gt;
--------&lt;br /&gt;
== [[ElcanoIntro | Introduction]] ==&lt;br /&gt;
Click above for a more in depth introduction into the Elcano project and what we do.&lt;br /&gt;
== [[ProcessorGeneral | Processors and Boards]] ==&lt;br /&gt;
Click above to find more information about the different boards and processors that are currently being used. This includes and information on the in-house designed boards that go hand-in- hand with our processors&lt;br /&gt;
== [[ActuatorPage | Actuators and motor]] ==&lt;br /&gt;
Click above for details pertaining to the actuators and motor used&lt;br /&gt;
== [[SensorsPage | Sensors]] ==&lt;br /&gt;
Click above to find out more about the sensors that give our vehicle its eyes and ears&lt;br /&gt;
== [[RemoteControl | Remote Control]] ==&lt;br /&gt;
Click above to access remote control Arduino sketches and documents/schematics (move these to Elcano/elcano repository as needed)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[LibrariesPage | Libraries]] ==&lt;br /&gt;
* [[Settings.h]]&lt;br /&gt;
* [[ElcanoSerial]]&lt;br /&gt;
* Media Storage &lt;br /&gt;
** SD card (maps/routes)&lt;br /&gt;
* [[Electronics]] Schematics, Wiring, etc&lt;br /&gt;
* Custom mounts and parts&lt;br /&gt;
&lt;br /&gt;
== Hardware and Software tutorials ==&lt;br /&gt;
* [[CSVtoTwiki | Converting Excel table (.CSV) to Twiki table]]&lt;br /&gt;
* [[TemplateArticle | Template Wiki Article (copy me)]]&lt;br /&gt;
* [[GitUsage | Using Git and GitHub]]&lt;br /&gt;
== Bill of Materials ==&lt;br /&gt;
* [[LegacySonarsBOM | Sonars_BOM.xls]] (Mostly Current)&lt;br /&gt;
&lt;br /&gt;
==[[FilesPage | Files]] ==&lt;br /&gt;
These are media files (pictures, videos, etc.) that are part of the project, but are not maintained under version control.&lt;br /&gt;
&lt;br /&gt;
== Elcano Project Website ==&lt;br /&gt;
* https://www.elcanoproject.org&lt;br /&gt;
&lt;br /&gt;
== [[LegacyPage | Legacy Documents !!(Out-of-date, no longer used)]] ==&lt;br /&gt;
Click above to access deprecated Elcano documents. &lt;br /&gt;
&lt;br /&gt;
== Site Map ==&lt;br /&gt;
&lt;br /&gt;
%INCLUDE{%SYSTEMWEB%.SiteMap}%&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=VisionPage&amp;diff=47</id>
		<title>VisionPage</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=VisionPage&amp;diff=47"/>
		<updated>2019-05-23T05:48:53Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Created page with &amp;quot;  ==Introduction == Elcano bike requires an eye to see the world surrounding it in order to make appropriate decisions. Elcano Vision System would do such tasks as detecting s...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
==Introduction ==&lt;br /&gt;
Elcano bike requires an eye to see the world surrounding it in order to make appropriate decisions. Elcano Vision System would do such tasks as detecting surrounding objects and behaving responsively.  The system is built with a help from computer vision open source OpenCV and a variety of programming languages (currently Python). It employs Raspberry Pi (currently version 3) as the controller to process inputs and generate essential outputs. In further development of Vision system, machine learning achievements can solve a lot of problems and extend its ability unimaginably. &lt;br /&gt;
&lt;br /&gt;
==Where to Start and Experience ==&lt;br /&gt;
'''1.Setup OpenCV on Raspberry Pi'''&lt;br /&gt;
'''- Install OS for Raspberry Pi:'''&lt;br /&gt;
&lt;br /&gt;
This link will explain why NOOBs &lt;br /&gt;
https://www.raspberrypi.org/documentation/installation/noobs.md&lt;br /&gt;
This link will help download NOOBs &lt;br /&gt;
https://www.raspberrypi.org/downloads/noobs/&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Raspberry Pi stores OS on SD card , I suggest to use 32GB cards to have no worries about memory. &lt;br /&gt;
&lt;br /&gt;
'''- Install OpenCV:''' http://www.pyimagesearch.com/2016/04/18/install-guide-raspberry-pi-3-raspbian-jessie-opencv-3/&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Notice on Version issues while setting up&lt;br /&gt;
&lt;br /&gt;
'''2.Setup Picam Camera'''&lt;br /&gt;
-Setting Up Camera &amp;amp; Basic Functions : https://www.raspberrypi.org/learning/getting-started-with-picamera/&lt;br /&gt;
&lt;br /&gt;
Note: Straight forward&lt;br /&gt;
&lt;br /&gt;
-Formal Doc for Pi Cam: https://www.raspberrypi.org/documentation/usage/camera/python/README.md&lt;br /&gt;
&lt;br /&gt;
Note: Ctrl-D doesn’t work on my Pi &lt;br /&gt;
&lt;br /&gt;
-Setup Pi Cam with OpenCV &amp;amp; Basic Functions: http://www.pyimagesearch.com/2015/03/30/accessing-the-raspberry-pi-camera-with-opencv-and-python/&lt;br /&gt;
&lt;br /&gt;
Note: Straightforward&lt;br /&gt;
&lt;br /&gt;
'''4. Useful links on Detecting Objects'''&lt;br /&gt;
-Detect Motion: http://www.pyimagesearch.com/2015/05/25/basic-motion-detection-and-tracking-with-python-and-opencv/&lt;br /&gt;
&lt;br /&gt;
-Detect A Ball: http://www.pyimagesearch.com/2015/09/14/ball-tracking-with-opencv/&lt;br /&gt;
&lt;br /&gt;
-OpenCV Python commands on finding contours and enclosing objects: http://docs.opencv.org/3.1.0/dd/d49/tutorial_py_contour_features.html  &lt;br /&gt;
&lt;br /&gt;
-OpenCV C++ commands on finding contours and enclosing objects: http://docs.opencv.org/3.1.0/d3/dc0/group__imgproc__shape.html#ga556a180f43cab22649c23ada36a8a139&lt;br /&gt;
&lt;br /&gt;
Note :&lt;br /&gt;
- For some reason my Pi does not have connection to bcm2835-v4l2 . So I need to connect to it &amp;quot;sudo modprobe bcm2835-v4l2&amp;quot; . Without this command, VideoCapture() will not run, and no video is captured. &lt;br /&gt;
Further information on v4l2 : https://www.raspberrypi.org/forums/viewtopic.php?f=43&amp;amp;t=62364&lt;br /&gt;
&lt;br /&gt;
'''3.Further Pi Usage'''&lt;br /&gt;
&lt;br /&gt;
-Reset Pi : connect 2 holes next to Pi Cam port in the Pi &lt;br /&gt;
&lt;br /&gt;
==Cone Detection Method ==&lt;br /&gt;
The color of the cone is orange. Elcano Cone Detection currently is based on detecting regions of orange color on the images. Our algorithm automatically encloses those regions in a rectangle, and the height of rectangle (the vertical side) will be used to calculate the range. &lt;br /&gt;
&lt;br /&gt;
For more information, you can go to Camera Sensor article by Professor Folsom on Elcano Wiki .  http://elcanoproject.com/wiki/bin/view/Main/Camera&lt;br /&gt;
==Useful References  ==&lt;br /&gt;
1. Package Management ( virtuallenv, conda ): https://classroom.udacity.com/courses/ud889-preview/lessons/68e18f19-2a9a-4419-a491-b2a005f299c0/concepts/4cdc5a26-1e54-4a69-8eb4-f15e37aaab7b&lt;br /&gt;
&lt;br /&gt;
-- Main.HuyNguyen - 2017-06-15&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=46</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=46"/>
		<updated>2019-05-23T05:31:42Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Welcome to the Elcano Project Wiki =&lt;br /&gt;
As the title says, WELCOME TO THE ELCANO PROJECT! Over the past few years many different teams have been working hard to create Cheap and Modular autonomy at the University of Washington Bothell. We are currently working on our first two prototypes which are now in the form of tricycles. With the use of affordable microcontrollers, such as the Arduino Mega 2560 and Raspberry PI, we are working towards creating Autonomy for anyone to rebuild anywhere, and that under $2000 and fully open-source. But we don't plan to stop there, no. That is just the first step in reaching our ultimate goal, which is making our systems applicable to any desired ground vehicles, such as cars and other vehicles. Autonomy is nothing new, in fact it has been around for over 40 years, the difference is that now we have the ability to make it available for anyone who desires furthering their knowledge or simply finding a safer way to work.&lt;br /&gt;
&lt;br /&gt;
For editing help visit https://www.mediawiki.org/wiki/Help:Editing_pages or https://www.mediawiki.org/wiki/Help:Formatting.&lt;br /&gt;
--------&lt;br /&gt;
== [[ElcanoIntro | Introduction]] ==&lt;br /&gt;
Click above for a more in depth introduction into the Elcano project and what we do.&lt;br /&gt;
== [[ProcessorGeneral | Processors and Boards]] ==&lt;br /&gt;
Click above to find more information about the different boards and processors that are currently being used. This includes and information on the in-house designed boards that go hand-in- hand with our processors&lt;br /&gt;
== [[ActuatorPage | Actuators and motor]] ==&lt;br /&gt;
Click above for details pertaining to the actuators and motor used&lt;br /&gt;
== [[SensorsPage | Sensors]] ==&lt;br /&gt;
Click above to find out more about the sensors that give our vehicle its eyes and ears&lt;br /&gt;
== [[RemoteControl | Remote Control]] ==&lt;br /&gt;
Click above to access remote control Arduino sketches and documents/schematics (move these to Elcano/elcano repository as needed)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[LibrariesPage | Libraries]] ==&lt;br /&gt;
* [[Settings.h]]&lt;br /&gt;
* [[ElcanoSerial]]&lt;br /&gt;
* Media Storage &lt;br /&gt;
** SD card (maps/routes)&lt;br /&gt;
* [[Electronics]] Schematics, Wiring, etc&lt;br /&gt;
* Custom mounts and parts&lt;br /&gt;
&lt;br /&gt;
== Hardware and Software tutorials ==&lt;br /&gt;
* [[CSVtoTwiki | Converting Excel table (.CSV) to Twiki table]]&lt;br /&gt;
* [[TemplateArticle | Template Wiki Article (copy me)]]&lt;br /&gt;
* [[GitUsage | Using Git and GitHub]]&lt;br /&gt;
== Bill of Materials ==&lt;br /&gt;
* [[LegacySonarsBOM | Sonars_BOM.xls]] (Mostly Current)&lt;br /&gt;
&lt;br /&gt;
==[[FilesPage | Files]] ==&lt;br /&gt;
These are media files (pictures, videos, etc.) that are part of the project, but are not maintained under version control.&lt;br /&gt;
&lt;br /&gt;
== Elcano Project Website ==&lt;br /&gt;
* http://www.elcanoproject.org&lt;br /&gt;
* [[WordpressBackup | Backing up the website]]&lt;br /&gt;
* [[WordpressUpdate | Updating Wordpress]]&lt;br /&gt;
&lt;br /&gt;
== [[LegacyPage | Legacy Documents !!(Out-of-date, no longer used)]] ==&lt;br /&gt;
Click above to access deprecated Elcano documents. &lt;br /&gt;
&lt;br /&gt;
== Site Map ==&lt;br /&gt;
&lt;br /&gt;
%INCLUDE{%SYSTEMWEB%.SiteMap}%&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=ElcanoSerial&amp;diff=45</id>
		<title>ElcanoSerial</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=ElcanoSerial&amp;diff=45"/>
		<updated>2019-05-23T05:26:23Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Created page with &amp;quot;  == Abstract ==  The library is meant to send a packet of data from one Arduino in the system to the next over serial connections.  When a connection is normally made, the Ar...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
&lt;br /&gt;
The library is meant to send a packet of data from one Arduino in the system to the next over serial connections.&lt;br /&gt;
&lt;br /&gt;
When a connection is normally made, the Arduino must block until it has finished reading a continuous block of text. However, as these are nearly-real time embedded systems, we cannot do this, and it must read the data asynchronously.&lt;br /&gt;
&lt;br /&gt;
The way that we chose to do this was with a state machine that can update one character at a time without loosing track of where it is in the processing stage. As a result, the data is updated in such a way that no blocking is required between reads, and if a batch of data is not fully read at the right time, the device can come back and keep going later.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;ParseState&amp;lt;/tt&amp;gt; data structure contains a pointer to the resulting data (where it places information it has read from the input), and a flag that tells the state machine what part of the structure it is currently at.&lt;br /&gt;
&lt;br /&gt;
The Arduinos are arranged into a ring, so that all data will eventually reach its target, as the Arduinos pass data they don't need back into the ring.&lt;br /&gt;
&lt;br /&gt;
== Data Format ==&lt;br /&gt;
&lt;br /&gt;
A message shall always begin with 1 header character ('D', 'S', 'G', or 'X').&lt;br /&gt;
&lt;br /&gt;
The message body shall consist of 0 or more flags, up to a maximum of 7 (which is the number of distinct attribute types). No single attribute type can be used for 2 or more flags in 1 message.&lt;br /&gt;
&lt;br /&gt;
Flags shall consist of the left curly bracket ('{'), followed in order by an attribute type character ('n', 's', 'a', 'o', 'b', 'r', 'p'), and by 1 value (in the case of 'n', 's', 'a', 'o', 'b', 'r') or by 2 values (in the case of 'p'). The order of given flags is not significant. For the number, sensor, angle, bearing, and probability attribute types, the value is a single decimal number composed of, optionally, an ASCII hyphen-minus character ('-') (for negative integers), followed by the ASCII characters '0' through '9'. For the &amp;quot;Position&amp;quot; attribute type, the values are 2 such decimal numbers separated by a comma (',').&lt;br /&gt;
&lt;br /&gt;
Each message type uses a subset of the available attribute types. Any flag that contains an attribute that is incompatible with the given message type will be ignored.&lt;br /&gt;
&lt;br /&gt;
The message ends with an 8-bit SMBUS CRC checksum, followed by a newline ('\n') character. Other space characters have no significance to the message.&lt;br /&gt;
&lt;br /&gt;
=== Header Types ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|| *Header Type* || *Character* || *Purpose* || *Used Attribute Types* &lt;br /&gt;
|-&lt;br /&gt;
|| Drive || 'D' || Sends data to [[C2]] || Speed, Angle &lt;br /&gt;
|-&lt;br /&gt;
|| Sensor || 'S' || Sends data to [[C3]] and [[C6]] || Speed, Angle, Obstacle, Bearing, Position &lt;br /&gt;
|-&lt;br /&gt;
|| Goal || 'G' || Communicates the location of an object to [[C4]] || Number, Bearing, Probability, Position &lt;br /&gt;
|-&lt;br /&gt;
|| Segment || 'X' || Communicates part of the navigation path to [[C3]] || Number, Speed, Bearing, Position &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Attribute Types ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|| *Attribute Type* || *Character* &lt;br /&gt;
|-&lt;br /&gt;
|| Number || 'n' &lt;br /&gt;
|-&lt;br /&gt;
|| Speed || 's' &lt;br /&gt;
|-&lt;br /&gt;
|| Angle || 'a' &lt;br /&gt;
|-&lt;br /&gt;
|| Obstacle || 'o' &lt;br /&gt;
|-&lt;br /&gt;
|| Bearing || 'b' &lt;br /&gt;
|-&lt;br /&gt;
|| Probability || 'r' &lt;br /&gt;
|-&lt;br /&gt;
|| Position || 'p' &lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Message Examples ===&lt;br /&gt;
&lt;br /&gt;
(Without checksums)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D{s 300}{a 0}\n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, 'D' is the header, followed by a body which contains the flags '{s 300}' and '{a 0}'.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
S {s 256} {b45} {a30} {p 0, 0} {r 56} \n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In the above example, the spaces and the order of the flags do not matter. Because the Sensor message type does not use the Probability attribute type, the Probability flag is ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
X\n&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The above example is a valid message, but it is useless.&lt;br /&gt;
&lt;br /&gt;
=== Parsing Expression Grammar ===&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This section does not take into account space characters or the checksum.&lt;br /&gt;
&lt;br /&gt;
A PEG for the data that gets passed around is as follows:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
('D' / 'S' / 'G' / 'X') ('{' ('n' / 's' / 'a' / 'o' / 'b' / 'r') '-'? [0-9]+ '}')+&lt;br /&gt;
\--------header-------/ \-------------------------body---------------------------/&lt;br /&gt;
\------------attribute------------/ \value(s)-/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The various components of the string have been labeled for your convenience.&lt;br /&gt;
&lt;br /&gt;
This PEG does not include the Position attribute type ('p'), which sends a pair of numbers. Replace the body section of the PEG with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;'{' 'p' '-'? [0-9]+ ',' '-'? [0-9]+ '}'&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any spaces sent are ignored by the parser. Given all of the above, a complete PEG would look like the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Message = ('D' / 'S' / 'G' / 'X') ('{' (&lt;br /&gt;
('n' / 's' / 'a' / 'o' / 'b' / 'r') '-'? [0-9]+&lt;br /&gt;
/ 'p' '-'? [0-9]+ ',' '-'? [0-9]+&lt;br /&gt;
) '}')+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This may be of use to you if you need to re-implement this in the future.&lt;br /&gt;
&lt;br /&gt;
== Code Skeleton ==&lt;br /&gt;
&lt;br /&gt;
Here is some example code, which you can use as a skeleton for writing your own stuff.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;ElcanoSerial.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
elcano::ParseState ps;&lt;br /&gt;
elcano::SerialData dt;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
Serial1.begin(elcano::baudrate);&lt;br /&gt;
Serial2.begin(elcano::baudrate);&lt;br /&gt;
&lt;br /&gt;
ps.dt  = &amp;amp;dt;&lt;br /&gt;
ps.input = &amp;amp;Serial1;&lt;br /&gt;
ps.output = &amp;amp;Serial2;&lt;br /&gt;
ps.capture = elcano::MsgType::DESIRED_TYPE;&lt;br /&gt;
dt.clear();&lt;br /&gt;
&lt;br /&gt;
// Any other initialization code goes here&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop1() {&lt;br /&gt;
// Update code here that depends on having received a data set&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop2() {&lt;br /&gt;
// Update code here that does not depend on having received a data set&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
elcano::ParseStateError r = ps.update();&lt;br /&gt;
if (r == elcano::ParseStateError::success) {&lt;br /&gt;
loop1();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
loop2();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Replace &amp;lt;tt&amp;gt;DESIRED_TYPE&amp;lt;/tt&amp;gt; with &amp;lt;tt&amp;gt;drive&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;sensor&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;goal&amp;lt;/tt&amp;gt;, or &amp;lt;tt&amp;gt;seg&amp;lt;/tt&amp;gt; depending on your component. The specific serial port used by your component may vary, so you may have to change &amp;lt;tt&amp;gt;Serial1&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Serial2&amp;lt;/tt&amp;gt; around.&lt;br /&gt;
&lt;br /&gt;
The error handling code in the skeleton is enough to get you started, but may be a little bit lacking if you want more fine grained control, especially if you are debugging. That can be accomplished with a switch statement in the &amp;lt;tt&amp;gt;loop&amp;lt;/tt&amp;gt; function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void loop() {&lt;br /&gt;
elcano::ParseStateError r = ps.update();&lt;br /&gt;
switch (r) {&lt;br /&gt;
case elcano::ParseStateError::success:&lt;br /&gt;
loop1();&lt;br /&gt;
break;&lt;br /&gt;
&amp;lt;other cases go here&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
loop2();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
The Arduino has a hard limit of 32 characters which it can store at a time from the serial port. It can also only write to the serial far faster than it can read and parse. This combined leads to a situation where if you write too quickly, you will overwhelm the reader and get garbage results. This can be countered in 2 ways:&lt;br /&gt;
&lt;br /&gt;
# Put a wait between writes. Hold on, I hear you say! Isn't the point of the asynchronous system that no blocking is required? The difference between this and naive blocking serial usage is that this blocks on write, while the other blocks on read, and this is purely due to the memory constraints on the Arduinos.&lt;br /&gt;
# Only write to the message loop after you have just recieved from the message loop. Based on our usage example above this, you would only write in loop1 and not in loop2. This ensures that nothing gets written until something is received, which forces all delay necessary to prevent a problem.&lt;br /&gt;
&lt;br /&gt;
If at some point in the future, the hardware gets updated to something without the hard Arduino requirements, then feel free to experiment with removing these limitations.&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
&lt;br /&gt;
!ElcanoSerial: https://github.com/elcano/elcano/tree/master/libraries/ElcanoSerial&lt;br /&gt;
&lt;br /&gt;
!FastCRC: https://github.com/FrankBoesing/FastCRC&lt;br /&gt;
&lt;br /&gt;
-- Main.JohnsonB - 2017-06-30&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=44</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=44"/>
		<updated>2019-05-23T05:24:08Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: /*  Libraries */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Welcome to the Elcano Project Wiki =&lt;br /&gt;
As the title says, WELCOME TO THE ELCANO PROJECT! Over the past few years many different teams have been working hard to create Cheap and Modular autonomy at the University of Washington Bothell. We are currently working on our first two prototypes which are now in the form of tricycles. With the use of affordable microcontrollers, such as the Arduino Mega 2560 and Raspberry PI, we are working towards creating Autonomy for anyone to rebuild anywhere, and that under $2000 and fully open-source. But we don't plan to stop there, no. That is just the first step in reaching our ultimate goal, which is making our systems applicable to any desired ground vehicles, such as cars and other vehicles. Autonomy is nothing new, in fact it has been around for over 40 years, the difference is that now we have the ability to make it available for anyone who desires furthering their knowledge or simply finding a safer way to work.&lt;br /&gt;
&lt;br /&gt;
For editing capabilities and more info please visit the NewUsers page.&lt;br /&gt;
--------&lt;br /&gt;
== [[ElcanoIntro | Introduction]] ==&lt;br /&gt;
Click above for a more in depth introduction into the Elcano project and what we do.&lt;br /&gt;
== [[ProcessorGeneral | Processors and Boards]] ==&lt;br /&gt;
Click above to find more information about the different boards and processors that are currently being used. This includes and information on the in-house designed boards that go hand-in- hand with our processors&lt;br /&gt;
== [[ActuatorPage | Actuators and motor]] ==&lt;br /&gt;
Click above for details pertaining to the actuators and motor used&lt;br /&gt;
== [[SensorsPage | Sensors]] ==&lt;br /&gt;
Click above to find out more about the sensors that give our vehicle its eyes and ears&lt;br /&gt;
== [[RemoteControl | Remote Control]] ==&lt;br /&gt;
Click above to access remote control Arduino sketches and documents/schematics (move these to Elcano/elcano repository as needed)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== [[LibrariesPage | Libraries]] ==&lt;br /&gt;
* [[Settings.h]]&lt;br /&gt;
* [[ElcanoSerial]]&lt;br /&gt;
* Media Storage &lt;br /&gt;
** SD card (maps/routes)&lt;br /&gt;
* [[Electronics]] Schematics, Wiring, etc&lt;br /&gt;
* Custom mounts and parts&lt;br /&gt;
&lt;br /&gt;
== Hardware and Software tutorials ==&lt;br /&gt;
* [[CSVtoTwiki | Converting Excel table (.CSV) to Twiki table]]&lt;br /&gt;
* [[TemplateArticle | Template Wiki Article (copy me)]]&lt;br /&gt;
* [[GitUsage | Using Git and GitHub]]&lt;br /&gt;
== Bill of Materials ==&lt;br /&gt;
* [[LegacySonarsBOM | Sonars_BOM.xls]] (Mostly Current)&lt;br /&gt;
&lt;br /&gt;
==[[FilesPage | Files]] ==&lt;br /&gt;
These are media files (pictures, videos, etc.) that are part of the project, but are not maintained under version control.&lt;br /&gt;
&lt;br /&gt;
== Elcano Project Website ==&lt;br /&gt;
* http://www.elcanoproject.org&lt;br /&gt;
* [[WordpressBackup | Backing up the website]]&lt;br /&gt;
* [[WordpressUpdate | Updating Wordpress]]&lt;br /&gt;
&lt;br /&gt;
== [[LegacyPage | Legacy Documents !!(Out-of-date, no longer used)]] ==&lt;br /&gt;
Click above to access deprecated Elcano documents. &lt;br /&gt;
&lt;br /&gt;
== Site Map ==&lt;br /&gt;
&lt;br /&gt;
%INCLUDE{%SYSTEMWEB%.SiteMap}%&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=PlannerPage&amp;diff=43</id>
		<title>PlannerPage</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=PlannerPage&amp;diff=43"/>
		<updated>2019-05-23T05:21:39Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Created page with &amp;quot;  C4 is the component of the Elcano Project which handles path finding using maps of roads and trails. It is currently a ~1000 line Arduino project which loads mapping data fr...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
C4 is the component of the Elcano Project which handles path finding using maps of roads and trails. It is currently a ~1000 line Arduino project which loads mapping data from an inserted SD card and loads GPS data from C6, though the code is rather rigid, and has yet to be adapted to the ElcanoSerial protocol.&lt;br /&gt;
&lt;br /&gt;
== Rewrite Effort ==&lt;br /&gt;
&lt;br /&gt;
There has been some effort put into replacing it with a new model, as the current model may not be maintainable, and does not provide an interface for letting the bike know your destination. We could replace the Arduino with a Raspberry PI (or other single board computer) and it would open up the project to some new options: given a large enough SD card, which we have, we could store all of the information for the entire planet (via OpenStreetMaps) at once (it's only about 10GB), and the C6 GPS can be replaced with a cheap USB GPS antenna.&lt;br /&gt;
&lt;br /&gt;
With that in mind, some interfaces already exist for this type of thing. Given a USB GPS and gpsd, the Navit project has already made a mobile interface and routing engine to provide users with the ability to navigate from point A to point B. We could extend the project to directly write out navigation instructions to the Raspberry Pi's GPIO, which can then be sent directly to C3.&lt;br /&gt;
&lt;br /&gt;
If this proves to be too difficult of a task, there are other options as well. The OSRM project has developed another routing system, which can be connected to remotely, and we would just have to write a client application (probably in node.js). It would require the presence of gpsd for location services, and an internet connection to load data. Then, the raspberry pi can connect to a touch screen interface to provide the user with a way to put in location information. This would be a large endeavor, but would probably be the best option in the long run for making a working product.&lt;br /&gt;
&lt;br /&gt;
Here are some links that we may find useful on the topic of a complete rewrite:&lt;br /&gt;
&lt;br /&gt;
* https://www.amazon.com/GlobalSat-BU-353-S4-USB-Receiver-Black/dp/B008200LHW&lt;br /&gt;
* http://www.catb.org/gpsd/&lt;br /&gt;
* http://www.navit-project.org/  (Currently down)&lt;br /&gt;
* http://project-osrm.org/&lt;br /&gt;
&lt;br /&gt;
-- Main.DylanKatz - 2017-03-17&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=SweepObstacleDetector&amp;diff=42</id>
		<title>SweepObstacleDetector</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=SweepObstacleDetector&amp;diff=42"/>
		<updated>2019-05-23T05:19:42Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Created page with &amp;quot;  = Sweep Obstacle Detector =  == Purpose ==  The purpose of this board is to use the  Scanse Sweep lidar sensor to detect obstacles in front of the vehicle a...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Sweep Obstacle Detector =&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
The purpose of this board is to use the [[ScanseSweep | Scanse Sweep]] lidar sensor to detect obstacles in front of the vehicle and signal to the [[LowLevel | C2]] when an obstacle is present.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The Sweep is mounted on the front of the bike and is controlled by an Arduino Micro. It is connected to the C2 by TX and GND wires.&lt;br /&gt;
&lt;br /&gt;
=== Pin connections ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|| *Pin* | *Connection* &lt;br /&gt;
|-&lt;br /&gt;
|| 1 || Serial TX to C2 &lt;br /&gt;
|-&lt;br /&gt;
|| 2 || Sweep Power Enable &lt;br /&gt;
|-&lt;br /&gt;
|| 3 || Sweep Sync / Device Ready &lt;br /&gt;
|-&lt;br /&gt;
|| 8 || Serial RX to Sweep (!SoftwareSerial) &lt;br /&gt;
|-&lt;br /&gt;
|| 9 || Serial TX to Sweep (!SoftwareSerial) &lt;br /&gt;
|-&lt;br /&gt;
|| 1st GND || Sweep GND |&lt;br /&gt;
|-&lt;br /&gt;
|| 2nd GND || C2 GND |&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
=== Distance Lookup Table ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DistanceLookupTable.h&lt;br /&gt;
DistanceLookupTable.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This class is used to generate a lookup table to represent the field around the trike wherein an obstacle can be found. Objects detected outside of this field are '''not''' obstacles. &lt;br /&gt;
&lt;br /&gt;
==== How to Use ====&lt;br /&gt;
&lt;br /&gt;
Create a DistanceLookupTable object like so, passing in the width of your vehicle, the speed of your vehicle, and the time to fully stop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DistanceLookupTable table(vehicleWidth_cm, vehicleSpeed_cmPs, brakeTime_ms);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, query the table by passing in the angle (in degrees) of the reading:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
uint16_t distance = table.getDistance(angle);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sweep Obstacle Detector ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sweep_Obstacle_Detector.ino&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This Arduino Micro sketch runs the Sweep and constantly checks readings to determine if an obstacle is present. If so, it writes an ElcanoSerial message to the C2.&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/scanse/sweep-arduino sweep-arduino] library is needed to compile this sketch.&lt;br /&gt;
&lt;br /&gt;
=== LowLevel Test ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LowLevel_Test.ino&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is a simple test to be used with the LowLevel board. It tests the connection to the Sweep Arduino, and control of the brakes.&lt;br /&gt;
&lt;br /&gt;
=== Distance Lookup Table Test ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DistanceLookupTableTest.cpp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This utility takes command-line arguments, constructs a DistanceLookupTable object based on those arguments, and prints out the table.&lt;br /&gt;
&lt;br /&gt;
-- Main.JohnsonB - 2017-11-06&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Master_Schematic&amp;diff=41</id>
		<title>Master Schematic</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Master_Schematic&amp;diff=41"/>
		<updated>2019-05-23T05:13:12Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Created page with &amp;quot;  === Master Schematic ===  This Schematic contains an Overview page as well as all other Schematics in subpages within the file. This DOES NOT contain any board files.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
=== Master Schematic ===&lt;br /&gt;
&lt;br /&gt;
This Schematic contains an Overview page as well as all other Schematics in subpages within the file.&lt;br /&gt;
This DOES NOT contain any board files.&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Electronics&amp;diff=40</id>
		<title>Electronics</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Electronics&amp;diff=40"/>
		<updated>2019-05-23T05:09:57Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Created page with &amp;quot;%META:TOPICINFO{author=&amp;quot;TimK&amp;quot; date=&amp;quot;1491688406&amp;quot; format=&amp;quot;1.1&amp;quot; reprev=&amp;quot;1.1&amp;quot; version=&amp;quot;1.1&amp;quot;}% %META:TOPICPARENT{name=&amp;quot;WebHome&amp;quot;}% ---++ Description  Here you will find any document...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;%META:TOPICINFO{author=&amp;quot;TimK&amp;quot; date=&amp;quot;1491688406&amp;quot; format=&amp;quot;1.1&amp;quot; reprev=&amp;quot;1.1&amp;quot; version=&amp;quot;1.1&amp;quot;}%&lt;br /&gt;
%META:TOPICPARENT{name=&amp;quot;WebHome&amp;quot;}%&lt;br /&gt;
---++ Description &lt;br /&gt;
Here you will find any documents relating to schematics and wiring. Most files listed here were created in the EAGLE CAD Software available for free from Autodesk.&lt;br /&gt;
If you don't yet have EAGLE installed please click here to download: http://www.autodesk.com/products/eagle/overview&lt;br /&gt;
&lt;br /&gt;
Wiring Overview File is currently under works and will be posted here once complete&lt;br /&gt;
&lt;br /&gt;
---++ Content&lt;br /&gt;
&lt;br /&gt;
   * [[Master Schematic]] Contains all Schematics in sub pages&lt;br /&gt;
   * [[C2]] Low-Level&lt;br /&gt;
   * [[C3]] Pilot&lt;br /&gt;
   * [[C4]] Path Planner&lt;br /&gt;
   * [[C5]] Sonar&lt;br /&gt;
   * [[C6]] Navigator&lt;br /&gt;
   * [[C7]] Vision&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Main.TimK - 2017-04-08&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=PilotPage&amp;diff=39</id>
		<title>PilotPage</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=PilotPage&amp;diff=39"/>
		<updated>2019-05-23T05:08:13Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= C3 processor =&lt;br /&gt;
This Arduino Micro processor is in charge of piloting the trike as well as:&lt;br /&gt;
&lt;br /&gt;
* processes Data from other modules&lt;br /&gt;
* based on this data decides the speed of the vehicle&lt;br /&gt;
* as well as turnangle&lt;br /&gt;
--------&lt;br /&gt;
==Obstacle Avoidance ==&lt;br /&gt;
This is a specification of the operation of the obstacle avoidance system. These requirements are not final and may be changed, appended, or removed at any time.&lt;br /&gt;
&lt;br /&gt;
=== Basic Information ===&lt;br /&gt;
&lt;br /&gt;
The Elcano system shall be able to determine the presence of obstacles, and respond appropriately to these obstacles. The system shall prevent the vehicle from ever colliding with an obstacle. To avoid obstacles, the system shall gather data from sensors in use, interpret this data, and determine the change to make to the vehicle’s speed and turn angle.&lt;br /&gt;
&lt;br /&gt;
=== Sensors ===&lt;br /&gt;
&lt;br /&gt;
This is a list of sensors which will be used to obtain information about the vehicle’s surroundings.&lt;br /&gt;
&lt;br /&gt;
==== Sonar ====&lt;br /&gt;
&lt;br /&gt;
A board containing a set of sonar sensors arranged in a semicircle has already been produced. This system is already available to be tested; however, the sonar sensors have issues with noise and have a low range (exact range?).&lt;br /&gt;
&lt;br /&gt;
==== Scanse Sweep ====&lt;br /&gt;
&lt;br /&gt;
The Scanse Sweep is a spinning lidar device; the spinning head eliminates(?) the need to have multiple sensors for different angles. This device has a range of 40 meters. It may be useful enough to replace the existing sonar board; however, as of June 22, 2017, the Scanse Sweep sensors have not yet arrived.&lt;br /&gt;
&lt;br /&gt;
Store Page (as of June 22, 2017): https://www.sparkfun.com/products/14117&lt;br /&gt;
&lt;br /&gt;
==== Vision ====&lt;br /&gt;
&lt;br /&gt;
The Raspberry Pi component for computer vision obstacle detection is currently being developed. It may be possible to use data from this component for the obstacle avoidance algorithm.&lt;br /&gt;
&lt;br /&gt;
=== Processor Configuration ===&lt;br /&gt;
&lt;br /&gt;
The sensors and their corresponding processors(?) will provide data to the C3 Pilot Arduino. The C3 Pilot will use this data to determine whether there is an obstacle present that will affect the vehicle path, and the C3 pilot adjusts the vehicle speed and turn angle accordingly.&lt;br /&gt;
&lt;br /&gt;
=== Operation Requirements ===&lt;br /&gt;
&lt;br /&gt;
==== Collision Avoidance ====&lt;br /&gt;
&lt;br /&gt;
The vehicle shall avoid collision with any obstacle. To avoid obstacles, the vehicle may stop, slow down, or turn left or right.&lt;br /&gt;
&lt;br /&gt;
Before making a turn, the vehicle should consider the presence of obstacles to the left or right of itself.&lt;br /&gt;
&lt;br /&gt;
==== Pathfinding ====&lt;br /&gt;
&lt;br /&gt;
The vehicle should consider the path it is supposed to take when it makes decisions to avoid obstacles. The C3 pilot shall use data from the C4 Planner and/or C5 Navigator to choose the best way to avoid any obstacle, so that the vehicle does not unnecessarily deviate from its path(?).&lt;br /&gt;
&lt;br /&gt;
The vehicle should take the road width into consideration so that it does not drive off of the road.&lt;br /&gt;
&lt;br /&gt;
If possible, the vehicle should be able to backtrack if it comes to a dead end. (As of June 22, 2017, the vehicle is not capable of driving in reverse.)&lt;br /&gt;
&lt;br /&gt;
==== Interface ====&lt;br /&gt;
&lt;br /&gt;
The algorithm should be easily connected to the sonar component, the lidar component, or the vision component. The C3 Pilot should make use of whatever data is available to it. If multiple sensor components are connected to the C3 Pilot, The C3 Pilot should have a means to choose the most accurate data, combine the data to get a more accurate survey of the vehicle surroundings, etc.&lt;br /&gt;
&lt;br /&gt;
==HighLevel board ==&lt;br /&gt;
&lt;br /&gt;
==C3 to C5 SPI (Serial Peripheral Interface) Communication  ==&lt;br /&gt;
The way this communication is set up may look difficult at first, but with a closer look it is actually quite simple. Both on the C5 Sonar board and the printed Highlevel main board you will find various chips, most commonly designated with the letters &amp;quot;IC&amp;quot; (Integrated Circuits) or &amp;quot;V&amp;quot;. The ICs used for SPI communication are DS 8291N chips designated as IC2 and IC3 on the HighLevel board and V1 and V2 on the Sonar board.&lt;br /&gt;
&lt;br /&gt;
* Test board constructed to provide correct wiring reference for noise reduction chip setup: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;%PUBURLPATH%/%WEB%/%TOPIC%/C3-C5_SPI_test_board.png&amp;quot; alt=&amp;quot;C3-C5_SPI_test_board.png&amp;quot; width=&amp;quot;873.5&amp;quot; height=&amp;quot;369&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=NavigatorPage&amp;diff=38</id>
		<title>NavigatorPage</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=NavigatorPage&amp;diff=38"/>
		<updated>2019-05-23T05:04:02Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Created page with &amp;quot;  = Surface Navigation for Robots =  == From Raw GPS == GPS coordinates are spherical: Latitude, Longitude and distance from the center of the earth (or altitude above mean se...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Surface Navigation for Robots =&lt;br /&gt;
&lt;br /&gt;
== From Raw GPS ==&lt;br /&gt;
GPS coordinates are spherical: Latitude, Longitude and distance from the center of the earth (or altitude above mean sea level). Angle measurements are given in either decimal degrees or degrees, minutes and seconds. This paper assumes use of decimal degrees.&lt;br /&gt;
Local maps are in two dimensions; the Earth is locally flat. We will assume that the robot is operating in a small enough area where the curvature of the Earth is not significant. We will pick an origin for a local map, and measure distances in meters. The positive X-axis measures distance east from the origin and the Y-axis gives distance north. Compass direction uses 0 degrees as north, 90 degrees as east, 180 as south, and 270 as west. Compass direction will be referred to as “bearing”. It differs from the “angle” of a standard coordinate system in which 0 is east and 90 is north.&lt;br /&gt;
angle = 90 - bearing&lt;br /&gt;
&lt;br /&gt;
There are sophisticated algorithms to find the great circle distance between two (latitude, longitude) readings. These algorithms are good for plotting airplane flight paths, but they do not apply to local navigation. With the flat earth assumption, conversion between the two coordinate systems is simple.&lt;br /&gt;
&lt;br /&gt;
x = EARTH_RADIUS * (Longitude – LONGITUDE_ORIGIN) * (&amp;amp;#960; / 180) * cos(LATITUDE_ORIGIN *&amp;amp;#960; /180)&lt;br /&gt;
y = EARTH_RADIUS * (Latitude – LATITUDE_ORIGIN) * &amp;amp;#960; / 180&lt;br /&gt;
z =  EARTH_RADIUS&lt;br /&gt;
Latitude = (y * 180) / (&amp;amp;#960;  * EARTH_RADIUS) +  LATITUDE_ORIGIN&lt;br /&gt;
Longitude = (x * cos(LATITUDE_ORIGIN *&amp;amp;#960; /180) * 180) / (&amp;amp;#960;  * EARTH_RADIUS) +  LONGITUDE_ORIGIN&lt;br /&gt;
You should set the origin to be near the center of the area in which you intend to operate. &lt;br /&gt;
&lt;br /&gt;
Example: using Seattle Center House as the origin&lt;br /&gt;
LATITUDE_ORIGIN = 47.6213&lt;br /&gt;
LONGITUDE_ORIGIN = -122.3509&lt;br /&gt;
EARTH_RADIUS = 6371000&lt;br /&gt;
A reading of (47.620941, -122.351206) is 22.934 meters west of Center House and 39.918 meters south. A point 151.77 meters east and 66.16 meters north is at (47.621895, -122.348875).&lt;br /&gt;
&lt;br /&gt;
Note that measuring distance to a centimeter requires about 7 places beyond the decimal point in latitude and longitude. Thus latitudes and longitudes should be stored as 64 bit doubles. If your processor (such as the Arduino) does not have this capability, an alternative is to record distances in mm as a 32 bit long integer, which will provide a range of 2147 km from the origin. If you travel that far, the flat earth assumption is no longer valid, and you are on a new map with a new origin.&lt;br /&gt;
GPS is not sufficiently accurate for robot navigation. It typically has a standard deviation of 3-5 meters, which would mean that it can drift by 15 meters. Even if you achieve a 1 meter standard deviation, you do not have enough accuracy to keep a vehicle in its lane. The GPGGA format includes latitude, longitude, time and Horizontal Dilution of Precision (HDOP). The standard deviation of the GPS reading can be estimated as&lt;br /&gt;
&lt;br /&gt;
sigma = sqrt((3.04*HDOP)2 + 3.572)&lt;br /&gt;
&lt;br /&gt;
GPS can be further degraded by multipath reflections from buildings. It may become unavailable indoors, in tunnels, or if satellites are not properly positioned.&lt;br /&gt;
Latitude and longitude coordinates are available from Google Earth, Google Maps, and OpenStreetMaps. Open Street maps lets you download the positions of streets and buildings in latitude and longitude coordinates precise to seven decimal places. Thus you can construct a map of your robot's expected environment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Main.JosephBreithaupt - 2017-07-06&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=PilotPage&amp;diff=37</id>
		<title>PilotPage</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=PilotPage&amp;diff=37"/>
		<updated>2019-05-23T04:53:45Z</updated>

		<summary type="html">&lt;p&gt;JosephBreithaupt: Created page with &amp;quot;  = C3 processor = This Arduino Micro processor is in charge of piloting the trike as well as:  * processes Data from other modules * based on this data decides the speed of t...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= C3 processor =&lt;br /&gt;
This Arduino Micro processor is in charge of piloting the trike as well as:&lt;br /&gt;
&lt;br /&gt;
* processes Data from other modules&lt;br /&gt;
* based on this data decides the speed of the vehicle&lt;br /&gt;
* as well as turnangle&lt;br /&gt;
--------&lt;br /&gt;
==Obstacle Avoidance ==&lt;br /&gt;
ObstacleAvoidanceSpecification&lt;br /&gt;
&lt;br /&gt;
==HighLevel board ==&lt;br /&gt;
&lt;br /&gt;
==C3 to C5 SPI (Serial Peripheral Interface) Communication  ==&lt;br /&gt;
The way this communication is set up may look difficult at first, but with a closer look it is actually quite simple. Both on the C5 Sonar board and the printed Highlevel main board you will find various chips, most commonly designated with the letters &amp;quot;IC&amp;quot; (Integrated Circuits) or &amp;quot;V&amp;quot;. The ICs used for SPI communication are DS 8291N chips designated as IC2 and IC3 on the HighLevel board and V1 and V2 on the Sonar board.&lt;br /&gt;
&lt;br /&gt;
* Test board constructed to provide correct wiring reference for noise reduction chip setup: &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;%PUBURLPATH%/%WEB%/%TOPIC%/C3-C5_SPI_test_board.png&amp;quot; alt=&amp;quot;C3-C5_SPI_test_board.png&amp;quot; width=&amp;quot;873.5&amp;quot; height=&amp;quot;369&amp;quot; /&amp;gt;&lt;/div&gt;</summary>
		<author><name>JosephBreithaupt</name></author>
		
	</entry>
</feed>