<?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=Tfolsom</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=Tfolsom"/>
	<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/Special:Contributions/Tfolsom"/>
	<updated>2026-04-04T00:11:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.32.2</generator>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=364</id>
		<title>Mapping System</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=364"/>
		<updated>2020-08-06T19:45:02Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Sensor Hub has a low-definition digital map of its operating area. That map is a directed graph of intersections. The files system on the SD card is organized at the original PC MS-DOS system: file names of up to 8 characters, a dot, and an extension of up to three characters.&lt;br /&gt;
&lt;br /&gt;
==Master File==&lt;br /&gt;
The master file is named MAP_DEFS.TXT&lt;br /&gt;
It may look like this:&lt;br /&gt;
&lt;br /&gt;
﻿47.758949, -122.190746, UWB_CAMP.TXT&lt;br /&gt;
&lt;br /&gt;
47.6213  , -122.3509  , SEATTCEN.TXT&lt;br /&gt;
&lt;br /&gt;
47.662   , -122.115   , MARYMOOE.TXT&lt;br /&gt;
&lt;br /&gt;
47.660   , -122.185   , BRIDLETR.TXT&lt;br /&gt;
&lt;br /&gt;
47.760854, -122.190033, UWB_SCCR.TXT&lt;br /&gt;
&lt;br /&gt;
49, 8, CARLA.TXT&lt;br /&gt;
&lt;br /&gt;
The first two numbers are the latitude and longitude of the origin of the map file. The third item is the name of the file.&lt;br /&gt;
When the robot powers up, it will acquire a GPS fix for its present position. It will find the closest latitude and longitude to its position and load that file.&lt;br /&gt;
&lt;br /&gt;
==Local Maps==&lt;br /&gt;
&lt;br /&gt;
For instance, the first few entries of MARYMOOE.TXT are&lt;br /&gt;
&lt;br /&gt;
  -775855,  -78948, 1 ,  END,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -598367,   16679, 0 ,   2 ,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -426121,  137882, 3 ,   17,   19,  END,  1, 1, 1, 1&lt;br /&gt;
  -345240,  149001, 4 ,   18,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -216431,  154561, 18,   15,    5,  END,  1, 1, 1, 1&lt;br /&gt;
  -34449,   174576, 4 ,   6 ,   14,  END,  1, 1, 1, 1&lt;br /&gt;
  89118,    116792, 5 ,   7 ,   13,  END,  1, 1, 1, 1&lt;br /&gt;
  148281,   165680, 6 ,   8 ,   12,  END,  1, 1, 1, 1&lt;br /&gt;
&lt;br /&gt;
[[File:Marymoor.PNG]]&lt;br /&gt;
&lt;br /&gt;
Each line corresponds to one of the numbered intersections (nodes) in the figure, starting at 0 and increasing by 1. The fist number is the distance north from the origin in millimeters (or distance south for a negative number). The second number is the distance east in mm if positive or distance west if negative.&lt;br /&gt;
The third, forth, fifth and sixth numbers are the nodes connected to the present node, or &amp;quot;END&amp;quot; if none. An intersection of more than four ways can be handled by introducing a helper node at the same location.&lt;br /&gt;
&lt;br /&gt;
Distances are given in mm so that they can be stored in a 32-bit integer and will not overflow until the distance is over 2147 km. Arithmetic in integers is much faster than floating point, especially on micro-controllers that do not have hardware floating point. &lt;br /&gt;
&lt;br /&gt;
The last four numbers are the relative costs of the paths linking the nodes.  Path planning is done with A*, which makes the assumption that the distance between nodes is Euclidean. If this is not the case, due to road curvature or speed restriction, the multiplier should be modified.&lt;br /&gt;
&lt;br /&gt;
The vehicle will find a path that goes from node to node until it reaches the destination that was entered. To do so, it finds the closest road (where roads are the lines connecting nodes and takes the shortest path to that road. It then follows the road network from node to node until it gets close to the destination. If the destination is not on a road, the vehicle will follow a path to the origin that is perpendicular to the nearest road.&lt;br /&gt;
&lt;br /&gt;
The map should be laid out to give preferred robot paths that do not contain any fixed obstacles. Nodes should be provided to approximate road curvature.&lt;br /&gt;
&lt;br /&gt;
==Enhanced Mapping==&lt;br /&gt;
This basic map structure should be augmented by a secondary file that describes the road. This supplemental file may include road curvature, number of lanes, lane width, lane markings, and speed.&lt;br /&gt;
&lt;br /&gt;
The SD card has a simple files system where only one file can be open at a time. After MAP_DEFS.TXT is read, that file is closed, and the file for the directed graph is read into memory and then closed. A road supplemental file could be read as needed.&lt;br /&gt;
&lt;br /&gt;
==Cubic Splines==&lt;br /&gt;
The nodes in the directed graph are of class Waypoint. A Waypoint may contain more information than just its location. In the implementation as of August 2020, Waypoints are connected by straight lines, which produces discontinuities where they join. In the original design, Waypoints were connected by cubic splines (Hermite Curves; see James Foley et al. &amp;quot;Introduction to Computer Graphics&amp;quot; for a good summary). Cubics are infinitely differentiable and are widely used to fit smooth curves. The main practical difference between a line segment and a cubic is that the line is specified by its two endpoints, but the Hermite curve also requires the tangents (directions) at the endpoints. The cubic connecting two intersections will be different if one is required to approach from the west or from the south; the line segment would be identical.&lt;br /&gt;
Bezier curves are similar to Hermite curves. Both have four control points. The Bezier curve has two control points not on the curve that are used to shape it. There is a simple matrix transformation relating the Bezier and Hermite curves.&lt;br /&gt;
&lt;br /&gt;
==Latitude and Longitude==&lt;br /&gt;
Global positions on the earth are given in spherical coordinates: &lt;br /&gt;
* Latitude - angle between the north (90) and south (-90) poles&lt;br /&gt;
* Longitude - angle east or west of Greenwich.&lt;br /&gt;
* Radius of the earth (meters)&lt;br /&gt;
&lt;br /&gt;
Since the Elcano system is designed to operate in a small area, it is not concerned about great circle routes for intercontinental distances. Instead it makes the approximation that the earth is locally flat. It sets an origin for the area in which it operates, and sets up a coordinate system (x,y) where positive x is distance east of the origin and positive y is distance north. Distances are internally stored in mm, and can be easily displayed in meters.&lt;br /&gt;
The distance represented by one degree of longitude varies from 111 km at the equator to 0 at the poles. The size of a degree of longitude depends on the cosine of the latitude.&lt;br /&gt;
&lt;br /&gt;
Given a (latitude, longitude) its map position as (east_mm, north_mm) is given by&lt;br /&gt;
&lt;br /&gt;
north_mm = (latitude - latitude_of_map_origin) * earth_radius_mm&lt;br /&gt;
&lt;br /&gt;
east_mm =  (longitude - longitude_of_map_origin) * cos(latitude_of_map_origin) *  earth_radius_mm&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=363</id>
		<title>Mapping System</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=363"/>
		<updated>2020-08-06T19:16:40Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Sensor Hub has a low-definition digital map of its operating area. That map is a directed graph of intersections. The files system on the SD card is organized at the original PC MS-DOS system: file names of up to 8 characters, a dot, and an extension of up to three characters.&lt;br /&gt;
&lt;br /&gt;
==Master File==&lt;br /&gt;
The master file is named MAP_DEFS.TXT&lt;br /&gt;
It may look like this:&lt;br /&gt;
&lt;br /&gt;
﻿47.758949, -122.190746, UWB_CAMP.TXT&lt;br /&gt;
&lt;br /&gt;
47.6213  , -122.3509  , SEATTCEN.TXT&lt;br /&gt;
&lt;br /&gt;
47.662   , -122.115   , MARYMOOE.TXT&lt;br /&gt;
&lt;br /&gt;
47.660   , -122.185   , BRIDLETR.TXT&lt;br /&gt;
&lt;br /&gt;
47.760854, -122.190033, UWB_SCCR.TXT&lt;br /&gt;
&lt;br /&gt;
49, 8, CARLA.TXT&lt;br /&gt;
&lt;br /&gt;
The first two numbers are the latitude and longitude of the origin of the map file. The third item is the name of the file.&lt;br /&gt;
When the robot powers up, it will acquire a GPS fix for its present position. It will find the closest latitude and longitude to its position and load that file.&lt;br /&gt;
&lt;br /&gt;
==Local Maps==&lt;br /&gt;
&lt;br /&gt;
For instance, the first few entries of MARYMOOE.TXT are&lt;br /&gt;
&lt;br /&gt;
  -775855,  -78948, 1 ,  END,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -598367,   16679, 0 ,   2 ,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -426121,  137882, 3 ,   17,   19,  END,  1, 1, 1, 1&lt;br /&gt;
  -345240,  149001, 4 ,   18,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -216431,  154561, 18,   15,    5,  END,  1, 1, 1, 1&lt;br /&gt;
  -34449,   174576, 4 ,   6 ,   14,  END,  1, 1, 1, 1&lt;br /&gt;
  89118,    116792, 5 ,   7 ,   13,  END,  1, 1, 1, 1&lt;br /&gt;
  148281,   165680, 6 ,   8 ,   12,  END,  1, 1, 1, 1&lt;br /&gt;
&lt;br /&gt;
[[File:Marymoor.PNG]]&lt;br /&gt;
&lt;br /&gt;
Each line corresponds to one of the numbered intersections (nodes) in the figure, starting at 0 and increasing by 1. The fist number is the distance north from the origin in millimeters (or distance south for a negative number). The second number is the distance east in mm if positive or distance west if negative.&lt;br /&gt;
The third, forth, fifth and sixth numbers are the nodes connected to the present node, or &amp;quot;END&amp;quot; if none. An intersection of more than four ways can be handled by introducing a helper node at the same location.&lt;br /&gt;
&lt;br /&gt;
Distances are given in mm so that they can be stored in a 32-bit integer and will not overflow until the distance is over 2147 km. Arithmetic in integers is much faster than floating point, especially on micro-controllers that do not have hardware floating point. &lt;br /&gt;
&lt;br /&gt;
The last four numbers are the relative costs of the paths linking the nodes.  Path planning is done with A*, which makes the assumption that the distance between nodes is Euclidean. If this is not the case, due to road curvature or speed restriction, the multiplier should be modified.&lt;br /&gt;
&lt;br /&gt;
The vehicle will find a path that goes from node to node until it reaches the destination that was entered. To do so, it finds the closest road (where roads are the lines connecting nodes and takes the shortest path to that road. It then follows the road network from node to node until it gets close to the destination. If the destination is not on a road, the vehicle will follow a path to the origin that is perpendicular to the nearest road.&lt;br /&gt;
&lt;br /&gt;
The map should be laid out to give preferred robot paths that do not contain any fixed obstacles. Nodes should be provided to approximate road curvature.&lt;br /&gt;
&lt;br /&gt;
==Enhanced Mapping==&lt;br /&gt;
This basic map structure should be augmented by a secondary file that describes the road. This supplemental file may include road curvature, number of lanes, lane width, lane markings, and speed.&lt;br /&gt;
&lt;br /&gt;
The SD card has a simple files system where only one file can be open at a time. After MAP_DEFS.TXT is read, that file is closed, and the file for the directed graph is read into memory and then closed. A road supplemental file could be read as needed.&lt;br /&gt;
&lt;br /&gt;
==Cubic Splines==&lt;br /&gt;
The nodes in the directed graph are of class Waypoint. A Waypoint may contain more information than just its location. In the implementation as of August 2020, Waypoints are connected by straight lines, which produces discontinuities where they join. In the original design, Waypoints were connected by cubic splines (Hermite Curves; see James Foley et al. &amp;quot;Introduction to Computer Graphics&amp;quot; for a good summary). Cubics are infinitely differentiable and are widely used to fit smooth curves. The main practical difference between a line segment and a cubic is that the line is specified by its two endpoints, but the Hermite curve also requires the tangents (directions) at the endpoints. The cubic connecting two intersections will be different if one is required to approach from the west or from the east; the line segment would be identical.&lt;br /&gt;
Bezier curves are similar to Hermite curves. Both have four control points. The Bezier curve has two control points not on the curve that are used to shape it. There is a simple matrix transformation relating the Bezier and Hermite curves.&lt;br /&gt;
&lt;br /&gt;
==Latitude and Longitude==&lt;br /&gt;
Global positions on the earth are given in spherical coordinates: &lt;br /&gt;
* Latitude - angle between the north (90) and south (-90) poles&lt;br /&gt;
* Longitude - angle east or west of Greenwich.&lt;br /&gt;
* Radius of the earth (meters)&lt;br /&gt;
&lt;br /&gt;
Since the Elcano system is designed to operate in a small area, it is not concerned about great circle routes for intercontinental distances. Instead it makes the approximation that the earth is locally flat. It sets an origin for the area in which it operates, and sets up a coordinate system (x,y) where positive x is distance east of the origin and positive y is distance north. Distances are internally stored in mm, and can be easily displayed in meters.&lt;br /&gt;
The distance represented by one degree of longitude varies from 111 km at the equator to 0 at the poles. The size of a degree of longitude depends on the cosine of the latitude.&lt;br /&gt;
&lt;br /&gt;
Given a (latitude, longitude) its map position as (east_mm, north_mm) is given by&lt;br /&gt;
&lt;br /&gt;
north_mm = (latitude - latitude_of_map_origin) * earth_radius_mm&lt;br /&gt;
&lt;br /&gt;
east_mm =  (longitude - longitude_of_map_origin) * cos(latitude_of_map_origin) *  earth_radius_mm&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=362</id>
		<title>Mapping System</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=362"/>
		<updated>2020-08-05T00:25:35Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Sensor Hub has a low-definition digital map of its operating area. That map is a directed graph of intersections. The files system on the SD card is organized at the original PC MS-DOS system: file names of up to 8 characters, a dot, and an extension of up to three characters.&lt;br /&gt;
&lt;br /&gt;
The master files is named MAP_DEFS.TXT&lt;br /&gt;
It may look like this:&lt;br /&gt;
&lt;br /&gt;
﻿47.758949, -122.190746, UWB_CAMP.TXT&lt;br /&gt;
&lt;br /&gt;
47.6213  , -122.3509  , SEATTCEN.TXT&lt;br /&gt;
&lt;br /&gt;
47.662   , -122.115   , MARYMOOE.TXT&lt;br /&gt;
&lt;br /&gt;
47.660   , -122.185   , BRIDLETR.TXT&lt;br /&gt;
&lt;br /&gt;
47.760854, -122.190033, UWB_SCCR.TXT&lt;br /&gt;
&lt;br /&gt;
49, 8, CARLA.TXT&lt;br /&gt;
&lt;br /&gt;
The first two numbers are the latitude and longitude of the origin of the map file. The third item is the name of the file.&lt;br /&gt;
When the robot powers up, it will acquire a GPS fix for its present position. It will find the closest latitude and longitude to its position and load that file.&lt;br /&gt;
&lt;br /&gt;
For instance, the first few entries of MARYMOOE.TXT are&lt;br /&gt;
&lt;br /&gt;
  -775855,  -78948, 1 ,  END,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -598367,   16679, 0 ,   2 ,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -426121,  137882, 3 ,   17,   19,  END,  1, 1, 1, 1&lt;br /&gt;
  -345240,  149001, 4 ,   18,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -216431,  154561, 18,   15,    5,  END,  1, 1, 1, 1&lt;br /&gt;
  -34449,   174576, 4 ,   6 ,   14,  END,  1, 1, 1, 1&lt;br /&gt;
  89118,    116792, 5 ,   7 ,   13,  END,  1, 1, 1, 1&lt;br /&gt;
  148281,   165680, 6 ,   8 ,   12,  END,  1, 1, 1, 1&lt;br /&gt;
&lt;br /&gt;
[[File:Marymoor.PNG]]&lt;br /&gt;
&lt;br /&gt;
Each line corresponds to one of the numbered intersections (nodes) in the figure, starting at 0 and increasing by 1. The fist number is the distance north from the origin in millimeters (or distance south for a negative number). The second number is the distance east in mm if positive or distance west if negative.&lt;br /&gt;
The third, forth, fifth and sixth numbers are the nodes connected to the present node, or &amp;quot;END&amp;quot; if none. An intersection of more than four ways can be handled by introducing a helper node at the same location.&lt;br /&gt;
&lt;br /&gt;
Distances are given in mm so that they can be stored in a 32-bit integer and will not overflow until the distance is over 1000 km. Arithmetic in integers is much faster than floating point, especially on micro-controllers that do not have hardware floating point.&lt;br /&gt;
&lt;br /&gt;
The last four numbers are the relative costs of the paths linking the nodes.  Path planning is done with A*, which makes the assumption that the distance between nodes is Euclidean. If this is not the case, due to road curvature or speed restriction, the multiplier should be modified.&lt;br /&gt;
&lt;br /&gt;
The vehicle will find a path that goes from node to node until it reaches the destination that was entered. To do so, it finds the closest road (where roads are the lines connecting nodes and takes the shortest path to that road. It then follows the road network from node to node until it gets close to the destination. If the destination is not on a road, the vehicle will follow a path to the origin that is perpendicular to the nearest road.&lt;br /&gt;
&lt;br /&gt;
The map should be laid out to give preferred robot paths that do not contain any fixed obstacles. Nodes should be provided to approximate road curvature.&lt;br /&gt;
&lt;br /&gt;
This basic map structure should be augmented by a secondary file that describes the road. This supplemental file may include road curvature, number of lanes, lane width, lane markings, and speed.&lt;br /&gt;
&lt;br /&gt;
The SD card has a simple files system where only one file can be open at a time. After MAP_DEFS.TXT is read, that file is closed, and the file for the directed graph is read into memory and then closed. A road supplemental file could be read as needed.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=361</id>
		<title>Mapping System</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=361"/>
		<updated>2020-08-05T00:19:31Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Sensor Hub has a low-definition digital map of its operating area. That map is a directed graph of intersections. The files system on the SD card is organized at the original PC MS-DOS system: file names of up to 8 characters, a dot, and an extension of up to three characters.&lt;br /&gt;
&lt;br /&gt;
The master files is named MAP_DEFS.TXT&lt;br /&gt;
It may look like this:&lt;br /&gt;
&lt;br /&gt;
﻿47.758949, -122.190746, UWB_CAMP.TXT&lt;br /&gt;
&lt;br /&gt;
47.6213  , -122.3509  , SEATTCEN.TXT&lt;br /&gt;
&lt;br /&gt;
47.662   , -122.115   , MARYMOOE.TXT&lt;br /&gt;
&lt;br /&gt;
47.660   , -122.185   , BRIDLETR.TXT&lt;br /&gt;
&lt;br /&gt;
47.760854, -122.190033, UWB_SCCR.TXT&lt;br /&gt;
&lt;br /&gt;
49, 8, CARLA.TXT&lt;br /&gt;
&lt;br /&gt;
The first two numbers are the latitude and longitude of the origin of the map file. The third item is the name of the file.&lt;br /&gt;
When the robot powers up, it will acquire a GPS fix for its present position. It will find the closest latitude and longitude to its position and load that file.&lt;br /&gt;
&lt;br /&gt;
For instance, the first few entries of MARYMOOE.TXT are&lt;br /&gt;
&lt;br /&gt;
  -775855,  -78948, 1 ,  END,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -598367,   16679, 0 ,   2 ,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -426121,  137882, 3 ,   17,   19,  END,  1, 1, 1, 1&lt;br /&gt;
  -345240,  149001, 4 ,   18,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -216431,  154561, 18,   15,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -34449,   174576, 4 ,   6 ,   14,  END,  1, 1, 1, 1&lt;br /&gt;
  89118,    116792, 5 ,   7 ,   13,  END,  1, 1, 1, 1&lt;br /&gt;
  148281,   165680, 6 ,   8 ,   12,  END,  1, 1, 1, 1&lt;br /&gt;
&lt;br /&gt;
[[File:Marymoor.png]]&lt;br /&gt;
&lt;br /&gt;
Each line corresponds to one of the numbered intersections (nodes) in the figure, starting at 0 and increasing by 1. The fist number is the distance north from the origin in millimeters (or distance south for a negative number). The second number is the distance east in mm if positive or distance west if negative.&lt;br /&gt;
The third, forth, fifth and sixth numbers are the nodes connected to the present node, or &amp;quot;END&amp;quot; if none. An intersection of more than four ways can be handled by introducing a helper node at the same location.&lt;br /&gt;
&lt;br /&gt;
Distances are given in mm so that they can be stored in a 32-bit integer and will not overflow until the distance is over 1000 km. Arithmetic in integers is much faster than floating point, especially on micro-controllers that do not have hardware floating point.&lt;br /&gt;
&lt;br /&gt;
The last four numbers are the relative costs of the paths linking the nodes.  Path planning is done with A*, which makes the assumption that the distance between nodes is Euclidean. If this is not the case, due to road curvature or speed restriction, the multiplier should be modified.&lt;br /&gt;
&lt;br /&gt;
The vehicle will find a path that goes from node to node until it reaches the destination that was entered. To do so, it finds the closest road (where roads are the lines connecting nodes and takes the shortest path to that road. It then follows the road network from node to node until it gets close to the destination. If the destination is not on a road, the vehicle will follow a path to the origin that is perpendicular to the nearest road.&lt;br /&gt;
&lt;br /&gt;
The map should be laid out to give preferred robot paths that do not contain any fixed obstacles. Nodes should be provided to approximate road curvature.&lt;br /&gt;
&lt;br /&gt;
This basic map structure should be augmented by a secondary file that describes the road. This supplemental file may include road curvature, number of lanes, lane width, lane markings, and speed.&lt;br /&gt;
&lt;br /&gt;
The SD card has a simple files system where only one file can be open at a time. After MAP_DEFS.TXT is read, that file is closed, and the file for the directed graph is read into memory and then closed. A road supplemental file could be read as needed.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:Marymoor.PNG&amp;diff=360</id>
		<title>File:Marymoor.PNG</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:Marymoor.PNG&amp;diff=360"/>
		<updated>2020-08-05T00:17:04Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Marymoor Park, Redmond, WA&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Marymoor Park, Redmond, WA&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=359</id>
		<title>Mapping System</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=359"/>
		<updated>2020-08-05T00:08:57Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Sensor Hub has a low-definition digital map of its operating area. That map is a directed graph of intersections. The files system on the SD card is organized at the original PC MS-DOS system: file names of up to 8 characters, a dot, and an extension of up to three characters.&lt;br /&gt;
&lt;br /&gt;
The master files is named MAP_DEFS.TXT&lt;br /&gt;
It may look like this:&lt;br /&gt;
&lt;br /&gt;
﻿47.758949, -122.190746, UWB_CAMP.TXT&lt;br /&gt;
&lt;br /&gt;
47.6213  , -122.3509  , SEATTCEN.TXT&lt;br /&gt;
&lt;br /&gt;
47.662   , -122.115   , MARYMOOE.TXT&lt;br /&gt;
&lt;br /&gt;
47.660   , -122.185   , BRIDLETR.TXT&lt;br /&gt;
&lt;br /&gt;
47.760854, -122.190033, UWB_SCCR.TXT&lt;br /&gt;
&lt;br /&gt;
49, 8, CARLA.TXT&lt;br /&gt;
&lt;br /&gt;
The first two numbers are the latitude and longitude of the origin of the map file. The third item is the name of the file.&lt;br /&gt;
When the robot powers up, it will acquire a GPS fix for its present position. It will find the closest latitude and longitude to its position and load that file.&lt;br /&gt;
&lt;br /&gt;
For instance, the first few entries of MARYMOOE.TXT are&lt;br /&gt;
&lt;br /&gt;
  -775855,  -78948, 1 ,  END,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -598367,   16679, 0 ,   2 ,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -426121,  137882, 3 ,   17,   19,  END,  1, 1, 1, 1&lt;br /&gt;
  -345240,  149001, 4 ,   18,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -216431,  154561, 18,   15,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -34449,   174576, 4 ,   6 ,   14,  END,  1, 1, 1, 1&lt;br /&gt;
  89118,    116792, 5 ,   7 ,   13,  END,  1, 1, 1, 1&lt;br /&gt;
  148281,   165680, 6 ,   8 ,   12,  END,  1, 1, 1, 1&lt;br /&gt;
&lt;br /&gt;
Each line corresponds to one of the numbered intersections (nodes) in the figure, starting at 0 and increasing by 1. The fist number is the distance north from the origin in millimeters (or distance south for a negative number). The second number is the distance east in mm if positive or distance west if negative.&lt;br /&gt;
The third, forth, fifth and sixth numbers are the nodes connected to the present node, or &amp;quot;END&amp;quot; if none. An intersection of more than four ways can be handled by introducing a helper node at the same location.&lt;br /&gt;
&lt;br /&gt;
Distances are given in mm so that they can be stored in a 32-bit integer and will not overflow until the distance is over 1000 km. Arithmetic in integers is much faster than floating point, especially on micro-controllers that do not have hardware floating point.&lt;br /&gt;
&lt;br /&gt;
The last four numbers are the relative costs of the paths linking the nodes.  Path planning is done with A*, which makes the assumption that the distance between nodes is Euclidean. If this is not the case, due to road curvature or speed restriction, the multiplier should be modified.&lt;br /&gt;
&lt;br /&gt;
The vehicle will find a path that goes from node to node until it reaches the destination that was entered. To do so, it finds the closest road (where roads are the lines connecting nodes and takes the shortest path to that road. It then follows the road network from node to node until it gets close to the destination. If the destination is not on a road, the vehicle will follow a path to the origin that is perpendicular to the nearest road.&lt;br /&gt;
&lt;br /&gt;
The map should be laid out to give preferred robot paths that do not contain any fixed obstacles. Nodes should be provided to approximate road curvature.&lt;br /&gt;
&lt;br /&gt;
This basic map structure should be augmented by a secondary file that describes the road. This supplemental file may include road curvature, number of lanes, lane width, lane markings, and speed.&lt;br /&gt;
&lt;br /&gt;
The SD card has a simple files system where only one file can be open at a time. After MAP_DEFS.TXT is read, that file is closed, and the file for the directed graph is read into memory and then closed. A road supplemental file could be read as needed.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=358</id>
		<title>Mapping System</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=358"/>
		<updated>2020-08-05T00:01:50Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Sensor Hub has a low-definition digital map of its operating area. That map is a directed graph of intersections. The files system on the SD card is organized at the original PC MS-DOS system: file names of up to 8 characters, a dot, and an extension of up to three characters.&lt;br /&gt;
&lt;br /&gt;
The master files is named MAP_DEFS.TXT&lt;br /&gt;
It may look like this:&lt;br /&gt;
&lt;br /&gt;
﻿47.758949, -122.190746, UWB_CAMP.TXT&lt;br /&gt;
&lt;br /&gt;
47.6213  , -122.3509  , SEATTCEN.TXT&lt;br /&gt;
&lt;br /&gt;
47.662   , -122.115   , MARYMOOE.TXT&lt;br /&gt;
&lt;br /&gt;
47.660   , -122.185   , BRIDLETR.TXT&lt;br /&gt;
&lt;br /&gt;
47.760854, -122.190033, UWB_SCCR.TXT&lt;br /&gt;
&lt;br /&gt;
49, 8, CARLA.TXT&lt;br /&gt;
&lt;br /&gt;
The first two numbers are the latitude and longitude of the origin of the map file. The third item is the name of the file.&lt;br /&gt;
When the robot powers up, it will acquire a GPS fix for its present position. It will find the closest latitude and longitude to its position and load that file.&lt;br /&gt;
&lt;br /&gt;
For instance, the first few entries of MARYMOOE.TXT are&lt;br /&gt;
&lt;br /&gt;
  -775855,  -78948, 1 ,  END,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -598367,   16679, 0 ,   2 ,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -426121,  137882, 3 ,   17,   19,  END,  1, 1, 1, 1&lt;br /&gt;
  -345240,  149001, 4 ,   18,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -216431,  154561, 18,   15,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -34449,   174576, 4 ,   6 ,   14,  END,  1, 1, 1, 1&lt;br /&gt;
  89118,    116792, 5 ,   7 ,   13,  END,  1, 1, 1, 1&lt;br /&gt;
  148281,   165680, 6 ,   8 ,   12,  END,  1, 1, 1, 1&lt;br /&gt;
&lt;br /&gt;
Each line corresponds to one of the numbered intersections (nodes) in the figure, starting at 0 and increasing by 1. The fist number is the distance north from the origin in millimeters (or distance south for a negative number). The second number is the distance east in mm if positive or distance west if negative.&lt;br /&gt;
The third, forth, fifth and sixth numbers are the nodes connected to the present node, or &amp;quot;END&amp;quot; if none. An intersection of more than four ways can be handled by introducing a helper node at the same location.&lt;br /&gt;
&lt;br /&gt;
The last four numbers are the relative costs of the paths linking the nodes.  Path planning is done with A*, which makes the assumption that the distance between nodes is Euclidean. If this is not the case, due to road curvature or speed restriction, the multiplier should be modified.&lt;br /&gt;
&lt;br /&gt;
The vehicle will find a path that goes from node to node until it reaches the destination that was entered. To do so, it finds the closest road (where roads are the lines connecting nodes and takes the shortest path to that road. It then follows the road network from node to node until it gets close to the destination. If the destination is not on a road, the vehicle will follow a path to the origin that is perpendicular to the nearest road.&lt;br /&gt;
&lt;br /&gt;
The map should be laid out to give preferred robot paths that do not contain any fixed obstacles. Nodes should be provided to approximate road curvature.&lt;br /&gt;
&lt;br /&gt;
This basic map structure should be augmented by a secondary file that describes the road. This supplemental file may include road curvature, number of lanes, lane width, lane markings, and speed.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=357</id>
		<title>Mapping System</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Mapping_System&amp;diff=357"/>
		<updated>2020-08-04T23:50:19Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Created page with &amp;quot;The Sensor Hub has a low-definition digital map of its operating area. That map is a directed graph of intersections. The files system on the SD card is organized at the origi...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Sensor Hub has a low-definition digital map of its operating area. That map is a directed graph of intersections. The files system on the SD card is organized at the original PC MS-DOS system: file names of up to 8 characters, a dot, and an extension of up to three characters.&lt;br /&gt;
&lt;br /&gt;
The master files is named MAP_DEFS.TXT&lt;br /&gt;
It may look like this:&lt;br /&gt;
&lt;br /&gt;
﻿47.758949, -122.190746, UWB_CAMP.TXT&lt;br /&gt;
&lt;br /&gt;
47.6213  , -122.3509  , SEATTCEN.TXT&lt;br /&gt;
&lt;br /&gt;
47.662   , -122.115   , MARYMOOE.TXT&lt;br /&gt;
&lt;br /&gt;
47.660   , -122.185   , BRIDLETR.TXT&lt;br /&gt;
&lt;br /&gt;
47.760854, -122.190033, UWB_SCCR.TXT&lt;br /&gt;
&lt;br /&gt;
49, 8, CARLA.TXT&lt;br /&gt;
&lt;br /&gt;
The first two numbers are the latitude and longitude of the origin of the map file. The third item is the name of the file.&lt;br /&gt;
When the robot powers up, it will acquire a GPS fix for its present position. It will find the closest latitude and longitude to its position and load that file.&lt;br /&gt;
&lt;br /&gt;
For instance, the first few entries of MARYMOOE.TXT are&lt;br /&gt;
&lt;br /&gt;
  -775855,  -78948, 1 ,  END,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -598367,   16679, 0 ,   2 ,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -426121,  137882, 3 ,   17,   19,  END,  1, 1, 1, 1&lt;br /&gt;
  -345240,  149001, 4 ,   18,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -216431,  154561, 18,   15,  END,  END,  1, 1, 1, 1&lt;br /&gt;
  -34449,   174576, 4 ,   6 ,   14,  END,  1, 1, 1, 1&lt;br /&gt;
  89118,    116792, 5 ,   7 ,   13,  END,  1, 1, 1, 1&lt;br /&gt;
  148281,   165680, 6 ,   8 ,   12,  END,  1, 1, 1, 1&lt;br /&gt;
&lt;br /&gt;
Each line corresponds to one of the numbered intersections (nodes) in the figure, starting at 0 and increasing by 1. The fist number is the distance north from the origin in millimeters (or distance south for a negative number). The second number is the distance east in mm if positive or distance west if negative.&lt;br /&gt;
The third, forth, fifth and sixth numbers are the nodes connected to the present node, or &amp;quot;END&amp;quot; if none. An intersection of more than four ways can be handled by introducing a helper node at the same location.&lt;br /&gt;
&lt;br /&gt;
The last four numbers are the relative costs of the paths linking the nodes.  Path planning is done with A*, which makes the assumption that the distance between nodes is Euclidean. If this is not the case, due to road curvature or speed restriction, the multiplier should be modified.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=High_Level&amp;diff=356</id>
		<title>High Level</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=High_Level&amp;diff=356"/>
		<updated>2020-08-04T23:17:40Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The High Level system has been renamed &amp;quot;Sensor Hub&amp;quot;. Documentation in divided into the software and hardware.&lt;br /&gt;
&lt;br /&gt;
==[[HighLevelSWv3]]==&lt;br /&gt;
==[[HighLevelHWv3]]==&lt;br /&gt;
[[File:HighLevel.JPG|1000px]]&lt;br /&gt;
&lt;br /&gt;
==[[Mapping System]]==&lt;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Simulator&amp;diff=342</id>
		<title>Simulator</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Simulator&amp;diff=342"/>
		<updated>2020-07-14T04:35:13Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Elcano Carla Simulation External Specification =&lt;br /&gt;
&lt;br /&gt;
CARLA &amp;lt;http://carla.org/&amp;gt; is an open-source driving simulator. During 2019-20 students develop3e a  go-between circuit board to transfer data between CARLA simulation and the sensor slots of the Elcano hardware. The CARLA software allows users to emulate trike parameters under controlled conditions within a virtual world, providing an efficient system for testing sensor behavior, design implementation, and benchmarking overall vehicle progress. The CARLA software can simulate a variety of road conditions such as traffic patterns, inclines, and weather as well as provide users control over vehicle parameters including weight, engine power, and aerodynamic properties.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
An Arduino Due serves as a router to transfer data from vehicle systems to CARLA under a variety of test conditions, enabling the software to replicate responses and return sensor data to be reevaluated for accuracy. The CARLA Micro-AV Bridge includes the Router, Sensor Hub and Drive-by-wire Arduinos. It permits testing the Elcano trike software, including camera, sonar, throttle, steering and brake systems. Simulation allows users to immediately see the results of adjustments to vehicle parameters and highlight physical aspects of the trike within the virtual environment. This project enables users to efficiently implement improvements and track the immediate effects of design changes without spending the time and resources it would take to transport or operate the trike in real world test scenarios. It enables developers to improve the software without needing to invest in a vehicle.&lt;br /&gt;
&lt;br /&gt;
[[File:Architecture_CAN_Sim_7_7_20.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Purpose: ==&lt;br /&gt;
The following is a generalized list of the desired functionality of the simulator.&lt;br /&gt;
* Simulate data for all sensors associated with Elcano Trike.&lt;br /&gt;
* Simulate Elcano behavior to throttle, brake, and steering.&lt;br /&gt;
* Have low and high-level boards function normally with the simulated sensor data without knowing data is being simulated.&lt;br /&gt;
* Allow low and high-level board interaction to be tested.&lt;br /&gt;
* Allow autonomous driving to be tested.&lt;br /&gt;
&lt;br /&gt;
== Components: ==&lt;br /&gt;
''' Simulation:''' &lt;br /&gt;
Code to be executed by a computer that has access to a Carla server, either locally, or through a network.  Controls all objects in Carla simulation.  Retrieves sensor data from Carla, and sends router board.  Also retrieves actuation instructions from the router board and sends to Carla.&lt;br /&gt;
&lt;br /&gt;
'''Sensor Hub [aka High Level] Processor''' &lt;br /&gt;
The same code is used for the virtual or physical vehicle, sending and receiving messages over the CAN Bus. The CARLA Bridge replaces sensor data that would normally come from instruments.&lt;br /&gt;
&lt;br /&gt;
'''Drive-by-wire [aks C2 LowLevel] Processor''' &lt;br /&gt;
Current Elcano Drive-by-wirel code. Actuator data is routed to CARLA.&lt;br /&gt;
&lt;br /&gt;
'''Router Board:''' &lt;br /&gt;
Code is executed on the Arduino Due that functions as the router board.  Routes commands from Drive-by-wire to Carla via Python scripts.  Also routes sensor data from Carla to Sensor Hub processor.&lt;br /&gt;
&lt;br /&gt;
[[File:RouterBoard2020A.jpg|800px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:RouterBoard2020B.jpg|800px|]]&lt;br /&gt;
&lt;br /&gt;
==  Current Functionality of Simulation: ==&lt;br /&gt;
At the end our Autumn 2019 Capstone, we were able to deliver a demo that demonstrated communication between all components; high-level board (Arduino Due), low-level board (Arduino Mega 2560) with shield running low level code, router board (Arduino Due), and the instance of Carla.  The instructions on how to reproduce the demo will be given later in this document. The primary roadblock that prevented further development into this project was the state of the CAN system of the Elcano trike (particularly the transceiver board which seems to have a flawed design).  These are the current features of the simulator.&lt;br /&gt;
* Implementation of USB serial communication between router board and computer running simulator.py.  Both entities (Computer and ArduinoDue) can send and receive data through USB connection.&lt;br /&gt;
* Implementation of a cyclometer.  Router board can receive the current speed of the simulated vehicle in Carla and convert it into an interrupt-based cyclometer pulse, based on the wheel dimension of the Elcano.  Also considers the random error of cyclometer present on the Elcano trike.  This can be debugged with the built-in LED on the router board.&lt;br /&gt;
* Implementation of NMEA GPS sensor.  Carla is able the output NMEA GPS data to the router board 10 times per second, effectively simulating the GPS sensor on the high-level board.  Router board is successfully able to output it to UART serial which is how it is transmitted to the high-level board.&lt;br /&gt;
* Implementation of timing structure.  Computer running simulator.py waits for data to be interpreted from the router board while the router board executes its update 10 times per second.  This is the desired speed for both sensor data and actuation data to be updated.&lt;br /&gt;
* Implementation of vehicle control updaters through throttle, brake, and steering data.  The computer running simulator.py can take desired throttle, brake, and steering and convert them into corresponding commands for Carla using Carla API. These commands move the vehicle within Carla.  This is the primarily what the demo shows.&lt;br /&gt;
&lt;br /&gt;
== Demo Guide (How to Set-Up) ==&lt;br /&gt;
The following is a guide to set up the Elcano simulator.&lt;br /&gt;
&lt;br /&gt;
===''' Materials '''===&lt;br /&gt;
* 1 Assembled Elcano Simulator Printed Circuit Board (PCB)&lt;br /&gt;
* 2 Arduino Due&lt;br /&gt;
* 1 Arduino Mega 2560&lt;br /&gt;
* 1 Box (200 x 150 x 70 mm)&lt;br /&gt;
* 2 Voltage Level Converter (included w/Simulator PCB)&lt;br /&gt;
* 1 SD Card (w/map files)&lt;br /&gt;
* 1 USB AB Cable (for Arduino Mega)&lt;br /&gt;
* 1 USB Micro Cable (for Arduino Due)&lt;br /&gt;
* 1 computer capable of running Carla&lt;br /&gt;
&lt;br /&gt;
===''' Pre-installation '''===&lt;br /&gt;
Use the following instructions to install the required software to run the simulation.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' Python '''''&amp;lt;/u&amp;gt;&lt;br /&gt;
#* Install Python 3 (if not installed already)&lt;br /&gt;
#::-experiments used version 3.7.6&lt;br /&gt;
#* In a terminal, move to .\Simulation\&lt;br /&gt;
#* Run the command “pip3 install -r requirements.txt” to have pip install all the required python libraries for the simulator&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' CARLA '''''&amp;lt;/u&amp;gt;&lt;br /&gt;
#*Download [https://carla.org/2020/03/09/release-0.9.8/ CARLA (0.9.8)]&lt;br /&gt;
#*CARLA requirements:&amp;lt;br /&amp;gt;[[File:Carla_Requirements.jpg|500px|]]&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' Arduino Libraries '''''&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;Download these Arduino libraries prior to running the simulation:&lt;br /&gt;
#* [https://github.com/Seeed-Studio/CAN_BUS_Shield CAN_BUS_SHIELD by Seeed-Studio]&lt;br /&gt;
#* [https://github.com/br3ttb/Arduino-PID-Library PID by Brett Beauregard]&lt;br /&gt;
#* [https://github.com/NicoHood/PinChangeInterrupt Pin Change Interrupt by Nico Hood]&lt;br /&gt;
#* [https://github.com/SweBarre/MCP48x2 MCP48x2 DAC by Jonas Forsberg]&lt;br /&gt;
#* [https://github.com/ivanseidel/DueTimer Arduino Due Timer Interrupts by Ivan Seidel]&lt;br /&gt;
#* Previous version of [https://github.com/collin80/due_can Arduino Due CAN Bus library] is used but the necessary files are included within the repository.&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' Elcano Repositories '''''&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;The Elcano repositories are needed to run the simulation:&lt;br /&gt;
#*[https://github.com/elcano/HighLevel High Level]&lt;br /&gt;
#*[https://github.com/elcano/Simulator Simulator (Router Board &amp;amp; Simulator Script)]&lt;br /&gt;
#*[https://github.com/elcano/Drive-by-wire Drive-by-wire (Low Level)]&lt;br /&gt;
===''' Run Simulation '''===&lt;br /&gt;
Once all the requirements are installed, use the following instructions to run the simulation. &lt;br /&gt;
&amp;lt;br /&amp;gt;[[File:Router_PCB_Connections.jpg|500px]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;'''''Step 1: Program all Arduinos'''''&lt;br /&gt;
#Upload &amp;lt;b&amp;gt;router_board_v1.ino&amp;lt;/b&amp;gt; to the router Arduino Due programming port &lt;br /&gt;
#Upload &amp;lt;b&amp;gt;High_Level.ino&amp;lt;/b&amp;gt; to the high level Arduino Due programming port&lt;br /&gt;
#Upload &amp;lt;b&amp;gt;Drive_By_Wire.ino&amp;lt;/b&amp;gt; to the low level Arduino Mega 2560&lt;br /&gt;
'''''Step 2: Run CARLA'''''&lt;br /&gt;
#Open a command prompt (type cmd in the windows search box)&lt;br /&gt;
#Go to the directory where CARLA is installed (CARLAUE4.exe)&lt;br /&gt;
#:&amp;lt;code&amp;gt;cd C:\Users\bobross\Documents\ElcanoInstaller\CARLA\WindowsNoEditor&amp;lt;/code&amp;gt;&lt;br /&gt;
#::-You may have it saved to a different directory&lt;br /&gt;
#From the CARLA directory, type:&lt;br /&gt;
#:&amp;lt;code&amp;gt;CARLAUE4.exe&amp;lt;/code&amp;gt;&lt;br /&gt;
#:Or, to run in low resolution mode:&lt;br /&gt;
#:&amp;lt;code&amp;gt;CARLAUE4.exe -ResX=720 -ResY=480 -quality-level=Low&amp;lt;/code&amp;gt;&lt;br /&gt;
'''''Step 3: Run Simulation'''''&lt;br /&gt;
#Connect your PC to the native port on the Router Board Due &lt;br /&gt;
#Open a command prompt (type cmd in the windows search box)&lt;br /&gt;
#Go to the Simulation directory &lt;br /&gt;
#:&amp;lt;code&amp;gt;cd C:\Users\bobross\Documents\Simulator\Simulation&amp;lt;/code&amp;gt;&lt;br /&gt;
#::-You may have it saved to a different directory&lt;br /&gt;
#From Simulation directory, start the Simulator UI &lt;br /&gt;
#:&amp;lt;code&amp;gt;.\Simulation\start.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
#By default, the Simulator UI will populate local running CARLA settings&lt;br /&gt;
#*For control via the router board, leave mode as Auto&lt;br /&gt;
#*To control via manual keyboard input, change mode to Manual.&lt;br /&gt;
#*If running a network-based CARLA server, enter IP and Port of CARLA into the respective boxes. (i.e. 192.168.1.1, 2010)&lt;br /&gt;
#Click &amp;quot;Connect to CARLA&amp;quot;&lt;br /&gt;
#*If Auto mode, it will pop up a selection of COM devices, select routerboard native port COM to begin and press go. &lt;br /&gt;
#*If Manual mode, client will start with keyboard controls (WASD)&lt;br /&gt;
#Observe behavior in simulator.  &lt;br /&gt;
#If car gets stuck, kill current simulator.py process and restart.&lt;br /&gt;
===''' Debug/Logging '''===&lt;br /&gt;
*High Level uses the Programming Port to display debug messages over serial monitor&lt;br /&gt;
*Router Board uses the Programming Port to display debug messages over serial monitor&lt;br /&gt;
&lt;br /&gt;
== Out of Scope Functionality Tested/Implemented ==&lt;br /&gt;
* Our project required us to delve into pieces of code within the Elcano project outside of our scope.  Understanding of how sensors are read by the high and low-level boards is necessary for the simulation of the sensors.  We were able to fix some issues regarding the CAN communication between the high and low-level boards.  The modified low-level code was not pushed to the main low-level code folder in the repository on Github, however, it is included within the simulator documentation.  The following were implemented.&lt;br /&gt;
* Unification of the proposed CAN message structure and the actual CAN message processing on the low-level code for CAN messages with ID 0x350 (High-level drive instructions).  These are CAN messages the high-level will send to the low level to facilitate autonomy.&lt;br /&gt;
* Fixing the DAC output voltage by using the MCP48x2 library by Jonas Forsberg.&lt;br /&gt;
== To Do (Software): ==&lt;br /&gt;
''' High Priority: '''&lt;br /&gt;
* Simulate gyro sensor&lt;br /&gt;
* Simulate accelerometer/magnetometer sensor.&lt;br /&gt;
* Simulate wheel angle sensor.&lt;br /&gt;
* Implement steering actuation when low-level CAN processing of steering command is fixed.&lt;br /&gt;
* Initialize CAN with high-level board code and incorporate in demo instead of separate CAN transceiver.&lt;br /&gt;
''' Medium Priority: '''&lt;br /&gt;
* Simulate ScanseSweep.&lt;br /&gt;
* Implement receiver board when board is fully fixed.&lt;br /&gt;
* Incorporate Elcano trike physics to simulated vehicle.&lt;br /&gt;
''' Low Priority '''&lt;br /&gt;
* Simulate camera sensor.&lt;br /&gt;
== Bugs Within Simulator ==&lt;br /&gt;
* Occasionally the simulator and router board will desync and the NMEA GPS messages received by the router board will be faulty.  This is usually followed by a crash of simulator.py.  If not, simply press Ctrl^C and restart simulator.py.&lt;br /&gt;
* If simulator.py unexpectedly terminates, the created actors and sensors in Carla will not be properly destroyed.  This usually does not cause problems for the simulation but proper termination in the future would be safer.  For now if it is causing problems simply restart Carla.&lt;br /&gt;
* Carla will never stop outputting sensor data even if asked to stop.  This is a bug with Carla and not in our scope.&lt;br /&gt;
* Most malfunctions can be temporarily fixed by restarting the simulator.py instance.&lt;br /&gt;
== Other Elcano Bugs Found ==&lt;br /&gt;
* While we were able to fix the code for the low-level CAN interpretation of the throttle and brake commands from high-level CAN messages, the PWM steering response was not fully tested.  We were unable to get the low-level board to output the correct PWM for the sent CAN messages and this needs more testing.&lt;br /&gt;
* The receiver board cannot get CAN to initialize.  Voltage testing confirmed that the CAN components (MCP2515 and MCP 2550) are receiving the correct operating voltages (5v).  Also, multiple CAN libraries besides the suggested Seeed Studio library were tested with no success (SparkFun CAN library was one of the tested libraries).  Possible problem is incompatibility between the 5v CAN components and the 3.3V SAMD21 board.  Another possible problem is design flaw of pcb.&lt;br /&gt;
* Low-level processing of CAN messages for ID 0x350 is faulty.  Bit shifting and produced output do not match the CAN guidelines on the wiki.  This was fixed in the low-level code included in the simulator folder but not pushed to the Elcano Github repository.&lt;br /&gt;
== Additional Notes ==&lt;br /&gt;
* Currently, the order that you output data from the router board to the computer running simulator.py is non-trivial.  Data is interpreted based on the order which it is received.&lt;br /&gt;
* Carla sensor listening was flawed at the time this was made; .stop() would not stop the sensor from executing its attached function at each tick of Carla.  Therefore speed was implemented without the use of sensors, and instead uses a command that accesses the speed only when needed.  This is the suggested method until sensors are fixed.  Certain sensors such as NMEA GPS, however, are only implementable using Carla sensors.  Additional information can be found on Carla Documentation.&lt;br /&gt;
* In PowerShell, in CarlaUE4 path, run Carla as: ***Start-Process CarlaUE4 -ArgumentList “—quality-level=Low”*** to lower gpu load.&lt;br /&gt;
* Headless mode can be enabled for complete removal of graphics rendering, however, visual debugging is extremely useful.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Simulator&amp;diff=341</id>
		<title>Simulator</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Simulator&amp;diff=341"/>
		<updated>2020-07-14T04:14:57Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Elcano Carla Simulation External Specification =&lt;br /&gt;
&lt;br /&gt;
CARLA &amp;lt;http://carla.org/&amp;gt; is an open-source driving simulator. During Q4 2019 we will be developing a  go-between circuit board to transfer data between CARLA simulation and the sensor slots of the Elcano hardware. The CARLA software allows users to emulate trike parameters under controlled conditions within a virtual world, providing an efficient system for testing sensor behavior, design implementation, and benchmarking overall vehicle progression. The CARLA software can simulate a variety of road conditions such as traffic patterns, inclines, and weather as well as provide users control over vehicle parameters including weight, engine power, and aerodynamic properties.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A go-between circuit board will transfer data from vehicle systems to CARLA under a variety of test conditions, enabling the software to replicate responses and return sensor data to be reevaluated for accuracy. Connecting the simulation software to components on both the high and low level boards of the Elcano trike including lidar, sonar, throttle, and brake systems, will allow users to immediately see the results of adjustments to vehicle parameters and highlight physical aspects of the trike within the virtual simulation. This project will enable users to efficiently implement improvements and track the immediate effects of design changes without spending the time and resources it would take to transport or operate the trike in real world test scenarios. It enables developers to improve the software without needing to invest in a vehicle.&lt;br /&gt;
&lt;br /&gt;
[[File:Architecture_CAN_Sim_7_7_20.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Purpose: ==&lt;br /&gt;
The following is a generalized list of the desired functionality of the simulator.&lt;br /&gt;
* Simulate data for all sensors associated with Elcano Trike.&lt;br /&gt;
* Simulate Elcano behavior to throttle, brake, and steering.&lt;br /&gt;
* Have low and high-level boards function normally with the simulated sensor data without knowing data is being simulated.&lt;br /&gt;
* Allow low and high-level board interaction to be tested.&lt;br /&gt;
* Allow autonomous driving to be tested.&lt;br /&gt;
&lt;br /&gt;
== Components: ==&lt;br /&gt;
''' Simulation:''' &lt;br /&gt;
Code to be executed by a computer that has access to a Carla server, either locally, or through a network.  Controls all objects in Carla simulation.  Retrieves sensor data from Carla, and sends router board.  Also retrieves actuation instructions from the router board and sends to Carla.&lt;br /&gt;
&lt;br /&gt;
'''High Level CAN Demo''' &lt;br /&gt;
Simple demo code for high-level board that sends drive CAN messages repeatedly to the CAN Bus.&lt;br /&gt;
&lt;br /&gt;
'''Elcano C2 LowLevel''' &lt;br /&gt;
Current Elcano low-level code with minor adjustments.  Adjustments discussed in detail later in doc.&lt;br /&gt;
&lt;br /&gt;
'''Router Board:''' &lt;br /&gt;
Code to be executed on the Arduino Due that functions as the router board.  Routes drive commands from low-level to Carla.  Also routes sensor data from Carla to high/low-level boards.&lt;br /&gt;
&lt;br /&gt;
[[File:RouterBoard2020A.jpg|800px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:RouterBoard2020B.jpg|800px|]]&lt;br /&gt;
&lt;br /&gt;
==  Current Functionality of Simulation: ==&lt;br /&gt;
At the end our Autumn 2019 Capstone, we were able to deliver a demo that demonstrated communication between all components; high-level board (Arduino Due), low-level board (Arduino Mega 2560) with shield running low level code, router board (Arduino Due), and the instance of Carla.  The instructions on how to reproduce the demo will be given later in this document. The primary roadblock that prevented further development into this project was the state of the CAN system of the Elcano trike (particularly the transceiver board which seems to have a flawed design).  These are the current features of the simulator.&lt;br /&gt;
* Implementation of USB serial communication between router board and computer running simulator.py.  Both entities (Computer and ArduinoDue) can send and receive data through USB connection.&lt;br /&gt;
* Implementation of a cyclometer.  Router board can receive the current speed of the simulated vehicle in Carla and convert it into an interrupt-based cyclometer pulse, based on the wheel dimension of the Elcano.  Also considers the random error of cyclometer present on the Elcano trike.  This can be debugged with the built-in LED on the router board.&lt;br /&gt;
* Implementation of NMEA GPS sensor.  Carla is able the output NMEA GPS data to the router board 10 times per second, effectively simulating the GPS sensor on the high-level board.  Router board is successfully able to output it to UART serial which is how it is transmitted to the high-level board.&lt;br /&gt;
* Implementation of timing structure.  Computer running simulator.py waits for data to be interpreted from the router board while the router board executes its update 10 times per second.  This is the desired speed for both sensor data and actuation data to be updated.&lt;br /&gt;
* Implementation of vehicle control updaters through throttle, brake, and steering data.  The computer running simulator.py can take desired throttle, brake, and steering and convert them into corresponding commands for Carla using Carla API. These commands move the vehicle within Carla.  This is the primarily what the demo shows.&lt;br /&gt;
&lt;br /&gt;
== Demo Guide (How to Set-Up) ==&lt;br /&gt;
The following is a guide to set up the Elcano simulator.&lt;br /&gt;
&lt;br /&gt;
===''' Materials '''===&lt;br /&gt;
* 1 Assembled Elcano Simulator Printed Circuit Board (PCB)&lt;br /&gt;
* 2 Arduino Due&lt;br /&gt;
* 1 Arduino Mega 2560&lt;br /&gt;
* 1 Box (200 x 150 x 70 mm)&lt;br /&gt;
* 2 Voltage Level Converter (included w/Simulator PCB)&lt;br /&gt;
* 1 SD Card (w/map files)&lt;br /&gt;
* 1 USB AB Cable (for Arduino Mega)&lt;br /&gt;
* 1 USB Micro Cable (for Arduino Due)&lt;br /&gt;
* 1 computer capable of running Carla&lt;br /&gt;
&lt;br /&gt;
===''' Pre-installation '''===&lt;br /&gt;
Use the following instructions to install the required software to run the simulation.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' Python '''''&amp;lt;/u&amp;gt;&lt;br /&gt;
#* Install Python 3 (if not installed already)&lt;br /&gt;
#::-experiments used version 3.7.6&lt;br /&gt;
#* In a terminal, move to .\Simulation\&lt;br /&gt;
#* Run the command “pip3 install -r requirements.txt” to have pip install all the required python libraries for the simulator&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' CARLA '''''&amp;lt;/u&amp;gt;&lt;br /&gt;
#*Download [https://carla.org/2020/03/09/release-0.9.8/ CARLA (0.9.8)]&lt;br /&gt;
#*CARLA requirements:&amp;lt;br /&amp;gt;[[File:Carla_Requirements.jpg|500px|]]&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' Arduino Libraries '''''&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;Download these Arduino libraries prior to running the simulation:&lt;br /&gt;
#* [https://github.com/Seeed-Studio/CAN_BUS_Shield CAN_BUS_SHIELD by Seeed-Studio]&lt;br /&gt;
#* [https://github.com/br3ttb/Arduino-PID-Library PID by Brett Beauregard]&lt;br /&gt;
#* [https://github.com/NicoHood/PinChangeInterrupt Pin Change Interrupt by Nico Hood]&lt;br /&gt;
#* [https://github.com/SweBarre/MCP48x2 MCP48x2 DAC by Jonas Forsberg]&lt;br /&gt;
#* [https://github.com/ivanseidel/DueTimer Arduino Due Timer Interrupts by Ivan Seidel]&lt;br /&gt;
#* Previous version of [https://github.com/collin80/due_can Arduino Due CAN Bus library] is used but the necessary files are included within the repository.&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' Elcano Repositories '''''&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;The Elcano repositories are needed to run the simulation:&lt;br /&gt;
#*[https://github.com/elcano/HighLevel High Level]&lt;br /&gt;
#*[https://github.com/elcano/Simulator Simulator (Router Board &amp;amp; Simulator Script)]&lt;br /&gt;
#*[https://github.com/elcano/Drive-by-wire Drive-by-wire (Low Level)]&lt;br /&gt;
===''' Run Simulation '''===&lt;br /&gt;
Once all the requirements are installed, use the following instructions to run the simulation. &lt;br /&gt;
&amp;lt;br /&amp;gt;[[File:Router_PCB_Connections.jpg|500px]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;'''''Step 1: Program all Arduinos'''''&lt;br /&gt;
#Upload &amp;lt;b&amp;gt;router_board_v1.ino&amp;lt;/b&amp;gt; to the router Arduino Due programming port &lt;br /&gt;
#Upload &amp;lt;b&amp;gt;High_Level.ino&amp;lt;/b&amp;gt; to the high level Arduino Due programming port&lt;br /&gt;
#Upload &amp;lt;b&amp;gt;Drive_By_Wire.ino&amp;lt;/b&amp;gt; to the low level Arduino Mega 2560&lt;br /&gt;
'''''Step 2: Run CARLA'''''&lt;br /&gt;
#Open a command prompt (type cmd in the windows search box)&lt;br /&gt;
#Go to the directory where CARLA is installed (CARLAUE4.exe)&lt;br /&gt;
#:&amp;lt;code&amp;gt;cd C:\Users\bobross\Documents\ElcanoInstaller\CARLA\WindowsNoEditor&amp;lt;/code&amp;gt;&lt;br /&gt;
#::-You may have it saved to a different directory&lt;br /&gt;
#From the CARLA directory, type:&lt;br /&gt;
#:&amp;lt;code&amp;gt;CARLAUE4.exe&amp;lt;/code&amp;gt;&lt;br /&gt;
#:Or, to run in low resolution mode:&lt;br /&gt;
#:&amp;lt;code&amp;gt;CARLAUE4.exe -ResX=720 -ResY=480 -quality-level=Low&amp;lt;/code&amp;gt;&lt;br /&gt;
'''''Step 3: Run Simulation'''''&lt;br /&gt;
#Connect your PC to the native port on the Router Board Due &lt;br /&gt;
#Open a command prompt (type cmd in the windows search box)&lt;br /&gt;
#Go to the Simulation directory &lt;br /&gt;
#:&amp;lt;code&amp;gt;cd C:\Users\bobross\Documents\Simulator\Simulation&amp;lt;/code&amp;gt;&lt;br /&gt;
#::-You may have it saved to a different directory&lt;br /&gt;
#From Simulation directory, start the Simulator UI &lt;br /&gt;
#:&amp;lt;code&amp;gt;.\Simulation\start.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
#By default, the Simulator UI will populate local running CARLA settings&lt;br /&gt;
#*For control via the router board, leave mode as Auto&lt;br /&gt;
#*To control via manual keyboard input, change mode to Manual.&lt;br /&gt;
#*If running a network-based CARLA server, enter IP and Port of CARLA into the respective boxes. (i.e. 192.168.1.1, 2010)&lt;br /&gt;
#Click &amp;quot;Connect to CARLA&amp;quot;&lt;br /&gt;
#*If Auto mode, it will pop up a selection of COM devices, select routerboard native port COM to begin and press go. &lt;br /&gt;
#*If Manual mode, client will start with keyboard controls (WASD)&lt;br /&gt;
#Observe behavior in simulator.  &lt;br /&gt;
#If car gets stuck, kill current simulator.py process and restart.&lt;br /&gt;
===''' Debug/Logging '''===&lt;br /&gt;
*High Level uses the Programming Port to display debug messages over serial monitor&lt;br /&gt;
*Router Board uses the Programming Port to display debug messages over serial monitor&lt;br /&gt;
&lt;br /&gt;
== Out of Scope Functionality Tested/Implemented ==&lt;br /&gt;
* Our project required us to delve into pieces of code within the Elcano project outside of our scope.  Understanding of how sensors are read by the high and low-level boards is necessary for the simulation of the sensors.  We were able to fix some issues regarding the CAN communication between the high and low-level boards.  The modified low-level code was not pushed to the main low-level code folder in the repository on Github, however, it is included within the simulator documentation.  The following were implemented.&lt;br /&gt;
* Unification of the proposed CAN message structure and the actual CAN message processing on the low-level code for CAN messages with ID 0x350 (High-level drive instructions).  These are CAN messages the high-level will send to the low level to facilitate autonomy.&lt;br /&gt;
* Fixing the DAC output voltage by using the MCP48x2 library by Jonas Forsberg.&lt;br /&gt;
== To Do (Software): ==&lt;br /&gt;
''' High Priority: '''&lt;br /&gt;
* Simulate gyro sensor&lt;br /&gt;
* Simulate accelerometer/magnetometer sensor.&lt;br /&gt;
* Simulate wheel angle sensor.&lt;br /&gt;
* Implement steering actuation when low-level CAN processing of steering command is fixed.&lt;br /&gt;
* Initialize CAN with high-level board code and incorporate in demo instead of separate CAN transceiver.&lt;br /&gt;
''' Medium Priority: '''&lt;br /&gt;
* Simulate ScanseSweep.&lt;br /&gt;
* Implement receiver board when board is fully fixed.&lt;br /&gt;
* Incorporate Elcano trike physics to simulated vehicle.&lt;br /&gt;
''' Low Priority '''&lt;br /&gt;
* Simulate camera sensor.&lt;br /&gt;
== Bugs Within Simulator ==&lt;br /&gt;
* Occasionally the simulator and router board will desync and the NMEA GPS messages received by the router board will be faulty.  This is usually followed by a crash of simulator.py.  If not, simply press Ctrl^C and restart simulator.py.&lt;br /&gt;
* If simulator.py unexpectedly terminates, the created actors and sensors in Carla will not be properly destroyed.  This usually does not cause problems for the simulation but proper termination in the future would be safer.  For now if it is causing problems simply restart Carla.&lt;br /&gt;
* Carla will never stop outputting sensor data even if asked to stop.  This is a bug with Carla and not in our scope.&lt;br /&gt;
* Most malfunctions can be temporarily fixed by restarting the simulator.py instance.&lt;br /&gt;
== Other Elcano Bugs Found ==&lt;br /&gt;
* While we were able to fix the code for the low-level CAN interpretation of the throttle and brake commands from high-level CAN messages, the PWM steering response was not fully tested.  We were unable to get the low-level board to output the correct PWM for the sent CAN messages and this needs more testing.&lt;br /&gt;
* The receiver board cannot get CAN to initialize.  Voltage testing confirmed that the CAN components (MCP2515 and MCP 2550) are receiving the correct operating voltages (5v).  Also, multiple CAN libraries besides the suggested Seeed Studio library were tested with no success (SparkFun CAN library was one of the tested libraries).  Possible problem is incompatibility between the 5v CAN components and the 3.3V SAMD21 board.  Another possible problem is design flaw of pcb.&lt;br /&gt;
* Low-level processing of CAN messages for ID 0x350 is faulty.  Bit shifting and produced output do not match the CAN guidelines on the wiki.  This was fixed in the low-level code included in the simulator folder but not pushed to the Elcano Github repository.&lt;br /&gt;
== Additional Notes ==&lt;br /&gt;
* Currently, the order that you output data from the router board to the computer running simulator.py is non-trivial.  Data is interpreted based on the order which it is received.&lt;br /&gt;
* Carla sensor listening was flawed at the time this was made; .stop() would not stop the sensor from executing its attached function at each tick of Carla.  Therefore speed was implemented without the use of sensors, and instead uses a command that accesses the speed only when needed.  This is the suggested method until sensors are fixed.  Certain sensors such as NMEA GPS, however, are only implementable using Carla sensors.  Additional information can be found on Carla Documentation.&lt;br /&gt;
* In PowerShell, in CarlaUE4 path, run Carla as: ***Start-Process CarlaUE4 -ArgumentList “—quality-level=Low”*** to lower gpu load.&lt;br /&gt;
* Headless mode can be enabled for complete removal of graphics rendering, however, visual debugging is extremely useful.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:Architecture_CAN_Sim_7_7_20.png&amp;diff=340</id>
		<title>File:Architecture CAN Sim 7 7 20.png</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:Architecture_CAN_Sim_7_7_20.png&amp;diff=340"/>
		<updated>2020-07-14T04:13:07Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Revised simulator diagram; omits sensors.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Revised simulator diagram; omits sensors.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Simulator&amp;diff=339</id>
		<title>Simulator</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Simulator&amp;diff=339"/>
		<updated>2020-07-14T04:10:45Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Elcano Carla Simulation External Specification =&lt;br /&gt;
&lt;br /&gt;
CARLA &amp;lt;http://carla.org/&amp;gt; is an open-source driving simulator. During Q4 2019 we will be developing a  go-between circuit board to transfer data between CARLA simulation and the sensor slots of the Elcano hardware. The CARLA software allows users to emulate trike parameters under controlled conditions within a virtual world, providing an efficient system for testing sensor behavior, design implementation, and benchmarking overall vehicle progression. The CARLA software can simulate a variety of road conditions such as traffic patterns, inclines, and weather as well as provide users control over vehicle parameters including weight, engine power, and aerodynamic properties.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A go-between circuit board will transfer data from vehicle systems to CARLA under a variety of test conditions, enabling the software to replicate responses and return sensor data to be reevaluated for accuracy. Connecting the simulation software to components on both the high and low level boards of the Elcano trike including lidar, sonar, throttle, and brake systems, will allow users to immediately see the results of adjustments to vehicle parameters and highlight physical aspects of the trike within the virtual simulation. This project will enable users to efficiently implement improvements and track the immediate effects of design changes without spending the time and resources it would take to transport or operate the trike in real world test scenarios. It enables developers to improve the software without needing to invest in a vehicle.&lt;br /&gt;
&lt;br /&gt;
[[File:Simulator_Block_Diagram_V2.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Purpose: ==&lt;br /&gt;
The following is a generalized list of the desired functionality of the simulator.&lt;br /&gt;
* Simulate data for all sensors associated with Elcano Trike.&lt;br /&gt;
* Simulate Elcano behavior to throttle, brake, and steering.&lt;br /&gt;
* Have low and high-level boards function normally with the simulated sensor data without knowing data is being simulated.&lt;br /&gt;
* Allow low and high-level board interaction to be tested.&lt;br /&gt;
* Allow autonomous driving to be tested.&lt;br /&gt;
&lt;br /&gt;
== Components: ==&lt;br /&gt;
''' Simulation:''' &lt;br /&gt;
Code to be executed by a computer that has access to a Carla server, either locally, or through a network.  Controls all objects in Carla simulation.  Retrieves sensor data from Carla, and sends router board.  Also retrieves actuation instructions from the router board and sends to Carla.&lt;br /&gt;
&lt;br /&gt;
'''High Level CAN Demo''' &lt;br /&gt;
Simple demo code for high-level board that sends drive CAN messages repeatedly to the CAN Bus.&lt;br /&gt;
&lt;br /&gt;
'''Elcano C2 LowLevel''' &lt;br /&gt;
Current Elcano low-level code with minor adjustments.  Adjustments discussed in detail later in doc.&lt;br /&gt;
&lt;br /&gt;
'''Router Board:''' &lt;br /&gt;
Code to be executed on the Arduino Due that functions as the router board.  Routes drive commands from low-level to Carla.  Also routes sensor data from Carla to high/low-level boards.&lt;br /&gt;
&lt;br /&gt;
[[File:RouterBoard2020A.jpg|800px|]]&lt;br /&gt;
&lt;br /&gt;
[[File:RouterBoard2020B.jpg|800px|]]&lt;br /&gt;
&lt;br /&gt;
==  Current Functionality of Simulation: ==&lt;br /&gt;
At the end our Autumn 2019 Capstone, we were able to deliver a demo that demonstrated communication between all components; high-level board (Arduino Due), low-level board (Arduino Mega 2560) with shield running low level code, router board (Arduino Due), and the instance of Carla.  The instructions on how to reproduce the demo will be given later in this document. The primary roadblock that prevented further development into this project was the state of the CAN system of the Elcano trike (particularly the transceiver board which seems to have a flawed design).  These are the current features of the simulator.&lt;br /&gt;
* Implementation of USB serial communication between router board and computer running simulator.py.  Both entities (Computer and ArduinoDue) can send and receive data through USB connection.&lt;br /&gt;
* Implementation of a cyclometer.  Router board can receive the current speed of the simulated vehicle in Carla and convert it into an interrupt-based cyclometer pulse, based on the wheel dimension of the Elcano.  Also considers the random error of cyclometer present on the Elcano trike.  This can be debugged with the built-in LED on the router board.&lt;br /&gt;
* Implementation of NMEA GPS sensor.  Carla is able the output NMEA GPS data to the router board 10 times per second, effectively simulating the GPS sensor on the high-level board.  Router board is successfully able to output it to UART serial which is how it is transmitted to the high-level board.&lt;br /&gt;
* Implementation of timing structure.  Computer running simulator.py waits for data to be interpreted from the router board while the router board executes its update 10 times per second.  This is the desired speed for both sensor data and actuation data to be updated.&lt;br /&gt;
* Implementation of vehicle control updaters through throttle, brake, and steering data.  The computer running simulator.py can take desired throttle, brake, and steering and convert them into corresponding commands for Carla using Carla API. These commands move the vehicle within Carla.  This is the primarily what the demo shows.&lt;br /&gt;
&lt;br /&gt;
== Demo Guide (How to Set-Up) ==&lt;br /&gt;
The following is a guide to set up the Elcano simulator.&lt;br /&gt;
&lt;br /&gt;
===''' Materials '''===&lt;br /&gt;
* 1 Assembled Elcano Simulator Printed Circuit Board (PCB)&lt;br /&gt;
* 2 Arduino Due&lt;br /&gt;
* 1 Arduino Mega 2560&lt;br /&gt;
* 1 Box (200 x 150 x 70 mm)&lt;br /&gt;
* 2 Voltage Level Converter (included w/Simulator PCB)&lt;br /&gt;
* 1 SD Card (w/map files)&lt;br /&gt;
* 1 USB AB Cable (for Arduino Mega)&lt;br /&gt;
* 1 USB Micro Cable (for Arduino Due)&lt;br /&gt;
* 1 computer capable of running Carla&lt;br /&gt;
&lt;br /&gt;
===''' Pre-installation '''===&lt;br /&gt;
Use the following instructions to install the required software to run the simulation.&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' Python '''''&amp;lt;/u&amp;gt;&lt;br /&gt;
#* Install Python 3 (if not installed already)&lt;br /&gt;
#::-experiments used version 3.7.6&lt;br /&gt;
#* In a terminal, move to .\Simulation\&lt;br /&gt;
#* Run the command “pip3 install -r requirements.txt” to have pip install all the required python libraries for the simulator&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' CARLA '''''&amp;lt;/u&amp;gt;&lt;br /&gt;
#*Download [https://carla.org/2020/03/09/release-0.9.8/ CARLA (0.9.8)]&lt;br /&gt;
#*CARLA requirements:&amp;lt;br /&amp;gt;[[File:Carla_Requirements.jpg|500px|]]&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' Arduino Libraries '''''&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;Download these Arduino libraries prior to running the simulation:&lt;br /&gt;
#* [https://github.com/Seeed-Studio/CAN_BUS_Shield CAN_BUS_SHIELD by Seeed-Studio]&lt;br /&gt;
#* [https://github.com/br3ttb/Arduino-PID-Library PID by Brett Beauregard]&lt;br /&gt;
#* [https://github.com/NicoHood/PinChangeInterrupt Pin Change Interrupt by Nico Hood]&lt;br /&gt;
#* [https://github.com/SweBarre/MCP48x2 MCP48x2 DAC by Jonas Forsberg]&lt;br /&gt;
#* [https://github.com/ivanseidel/DueTimer Arduino Due Timer Interrupts by Ivan Seidel]&lt;br /&gt;
#* Previous version of [https://github.com/collin80/due_can Arduino Due CAN Bus library] is used but the necessary files are included within the repository.&lt;br /&gt;
#&amp;lt;u&amp;gt;''''' Elcano Repositories '''''&amp;lt;/u&amp;gt;&amp;lt;br /&amp;gt;The Elcano repositories are needed to run the simulation:&lt;br /&gt;
#*[https://github.com/elcano/HighLevel High Level]&lt;br /&gt;
#*[https://github.com/elcano/Simulator Simulator (Router Board &amp;amp; Simulator Script)]&lt;br /&gt;
#*[https://github.com/elcano/Drive-by-wire Drive-by-wire (Low Level)]&lt;br /&gt;
===''' Run Simulation '''===&lt;br /&gt;
Once all the requirements are installed, use the following instructions to run the simulation. &lt;br /&gt;
&amp;lt;br /&amp;gt;[[File:Router_PCB_Connections.jpg|500px]]&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;'''''Step 1: Program all Arduinos'''''&lt;br /&gt;
#Upload &amp;lt;b&amp;gt;router_board_v1.ino&amp;lt;/b&amp;gt; to the router Arduino Due programming port &lt;br /&gt;
#Upload &amp;lt;b&amp;gt;High_Level.ino&amp;lt;/b&amp;gt; to the high level Arduino Due programming port&lt;br /&gt;
#Upload &amp;lt;b&amp;gt;Drive_By_Wire.ino&amp;lt;/b&amp;gt; to the low level Arduino Mega 2560&lt;br /&gt;
'''''Step 2: Run CARLA'''''&lt;br /&gt;
#Open a command prompt (type cmd in the windows search box)&lt;br /&gt;
#Go to the directory where CARLA is installed (CARLAUE4.exe)&lt;br /&gt;
#:&amp;lt;code&amp;gt;cd C:\Users\bobross\Documents\ElcanoInstaller\CARLA\WindowsNoEditor&amp;lt;/code&amp;gt;&lt;br /&gt;
#::-You may have it saved to a different directory&lt;br /&gt;
#From the CARLA directory, type:&lt;br /&gt;
#:&amp;lt;code&amp;gt;CARLAUE4.exe&amp;lt;/code&amp;gt;&lt;br /&gt;
#:Or, to run in low resolution mode:&lt;br /&gt;
#:&amp;lt;code&amp;gt;CARLAUE4.exe -ResX=720 -ResY=480 -quality-level=Low&amp;lt;/code&amp;gt;&lt;br /&gt;
'''''Step 3: Run Simulation'''''&lt;br /&gt;
#Connect your PC to the native port on the Router Board Due &lt;br /&gt;
#Open a command prompt (type cmd in the windows search box)&lt;br /&gt;
#Go to the Simulation directory &lt;br /&gt;
#:&amp;lt;code&amp;gt;cd C:\Users\bobross\Documents\Simulator\Simulation&amp;lt;/code&amp;gt;&lt;br /&gt;
#::-You may have it saved to a different directory&lt;br /&gt;
#From Simulation directory, start the Simulator UI &lt;br /&gt;
#:&amp;lt;code&amp;gt;.\Simulation\start.bat&amp;lt;/code&amp;gt;&lt;br /&gt;
#By default, the Simulator UI will populate local running CARLA settings&lt;br /&gt;
#*For control via the router board, leave mode as Auto&lt;br /&gt;
#*To control via manual keyboard input, change mode to Manual.&lt;br /&gt;
#*If running a network-based CARLA server, enter IP and Port of CARLA into the respective boxes. (i.e. 192.168.1.1, 2010)&lt;br /&gt;
#Click &amp;quot;Connect to CARLA&amp;quot;&lt;br /&gt;
#*If Auto mode, it will pop up a selection of COM devices, select routerboard native port COM to begin and press go. &lt;br /&gt;
#*If Manual mode, client will start with keyboard controls (WASD)&lt;br /&gt;
#Observe behavior in simulator.  &lt;br /&gt;
#If car gets stuck, kill current simulator.py process and restart.&lt;br /&gt;
===''' Debug/Logging '''===&lt;br /&gt;
*High Level uses the Programming Port to display debug messages over serial monitor&lt;br /&gt;
*Router Board uses the Programming Port to display debug messages over serial monitor&lt;br /&gt;
&lt;br /&gt;
== Out of Scope Functionality Tested/Implemented ==&lt;br /&gt;
* Our project required us to delve into pieces of code within the Elcano project outside of our scope.  Understanding of how sensors are read by the high and low-level boards is necessary for the simulation of the sensors.  We were able to fix some issues regarding the CAN communication between the high and low-level boards.  The modified low-level code was not pushed to the main low-level code folder in the repository on Github, however, it is included within the simulator documentation.  The following were implemented.&lt;br /&gt;
* Unification of the proposed CAN message structure and the actual CAN message processing on the low-level code for CAN messages with ID 0x350 (High-level drive instructions).  These are CAN messages the high-level will send to the low level to facilitate autonomy.&lt;br /&gt;
* Fixing the DAC output voltage by using the MCP48x2 library by Jonas Forsberg.&lt;br /&gt;
== To Do (Software): ==&lt;br /&gt;
''' High Priority: '''&lt;br /&gt;
* Simulate gyro sensor&lt;br /&gt;
* Simulate accelerometer/magnetometer sensor.&lt;br /&gt;
* Simulate wheel angle sensor.&lt;br /&gt;
* Implement steering actuation when low-level CAN processing of steering command is fixed.&lt;br /&gt;
* Initialize CAN with high-level board code and incorporate in demo instead of separate CAN transceiver.&lt;br /&gt;
''' Medium Priority: '''&lt;br /&gt;
* Simulate ScanseSweep.&lt;br /&gt;
* Implement receiver board when board is fully fixed.&lt;br /&gt;
* Incorporate Elcano trike physics to simulated vehicle.&lt;br /&gt;
''' Low Priority '''&lt;br /&gt;
* Simulate camera sensor.&lt;br /&gt;
== Bugs Within Simulator ==&lt;br /&gt;
* Occasionally the simulator and router board will desync and the NMEA GPS messages received by the router board will be faulty.  This is usually followed by a crash of simulator.py.  If not, simply press Ctrl^C and restart simulator.py.&lt;br /&gt;
* If simulator.py unexpectedly terminates, the created actors and sensors in Carla will not be properly destroyed.  This usually does not cause problems for the simulation but proper termination in the future would be safer.  For now if it is causing problems simply restart Carla.&lt;br /&gt;
* Carla will never stop outputting sensor data even if asked to stop.  This is a bug with Carla and not in our scope.&lt;br /&gt;
* Most malfunctions can be temporarily fixed by restarting the simulator.py instance.&lt;br /&gt;
== Other Elcano Bugs Found ==&lt;br /&gt;
* While we were able to fix the code for the low-level CAN interpretation of the throttle and brake commands from high-level CAN messages, the PWM steering response was not fully tested.  We were unable to get the low-level board to output the correct PWM for the sent CAN messages and this needs more testing.&lt;br /&gt;
* The receiver board cannot get CAN to initialize.  Voltage testing confirmed that the CAN components (MCP2515 and MCP 2550) are receiving the correct operating voltages (5v).  Also, multiple CAN libraries besides the suggested Seeed Studio library were tested with no success (SparkFun CAN library was one of the tested libraries).  Possible problem is incompatibility between the 5v CAN components and the 3.3V SAMD21 board.  Another possible problem is design flaw of pcb.&lt;br /&gt;
* Low-level processing of CAN messages for ID 0x350 is faulty.  Bit shifting and produced output do not match the CAN guidelines on the wiki.  This was fixed in the low-level code included in the simulator folder but not pushed to the Elcano Github repository.&lt;br /&gt;
== Additional Notes ==&lt;br /&gt;
* Currently, the order that you output data from the router board to the computer running simulator.py is non-trivial.  Data is interpreted based on the order which it is received.&lt;br /&gt;
* Carla sensor listening was flawed at the time this was made; .stop() would not stop the sensor from executing its attached function at each tick of Carla.  Therefore speed was implemented without the use of sensors, and instead uses a command that accesses the speed only when needed.  This is the suggested method until sensors are fixed.  Certain sensors such as NMEA GPS, however, are only implementable using Carla sensors.  Additional information can be found on Carla Documentation.&lt;br /&gt;
* In PowerShell, in CarlaUE4 path, run Carla as: ***Start-Process CarlaUE4 -ArgumentList “—quality-level=Low”*** to lower gpu load.&lt;br /&gt;
* Headless mode can be enabled for complete removal of graphics rendering, however, visual debugging is extremely useful.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:Architecture_CAN.png&amp;diff=338</id>
		<title>File:Architecture CAN.png</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:Architecture_CAN.png&amp;diff=338"/>
		<updated>2020-07-14T03:40:28Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Tfolsom uploaded a new version of File:Architecture CAN.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
System Architecture connected by CAN bus&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:Architecture_CAN.png&amp;diff=337</id>
		<title>File:Architecture CAN.png</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:Architecture_CAN.png&amp;diff=337"/>
		<updated>2020-07-14T03:32:26Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Tfolsom uploaded a new version of File:Architecture CAN.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
System Architecture connected by CAN bus&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Camera&amp;diff=336</id>
		<title>Camera</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Camera&amp;diff=336"/>
		<updated>2020-06-25T22:42:46Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
= Camera Sensor =&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
Elcano system uses a Pi Cam version 2 camera designed to connect to the Raspberry Pi CSI camera port. The Raspberry Pi connected to the camera is the vision processor in the Elcano system and communicates with other processors and boards using CAN bus. We use https://copperhilltech.com/pican-2-can-bus-interface-for-raspberry-pi/ The Pi Cam mounts on the front of the Elcano trike and software on the Raspberry Pi performs visual functions like lane detection and cone detection.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
=== Visual Traffic Cone Ranging  ===&lt;br /&gt;
&lt;br /&gt;
The Camera sensor is an essential part of optical object detection and ranging. In order to know the distance to an object like a traffic cone, traffic cone detection software running on a Raspberry Pi can identify the outline of a traffic cone and determine distance of the cone using the cone outline's height in the image. It is possible to know the range to an object of known height using the camera's known characteristics.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|*Camera Model*||*Focal length (mm)*||*Pixel dimensions (um)*&lt;br /&gt;
|-&lt;br /&gt;
|Pi Cam v1.x||3.5||1.4 x 1.4&lt;br /&gt;
|-&lt;br /&gt;
|Pi Cam v2.x||3.0||1.12 x 1.12&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''These are values provided in Pi Cam documentation. These are designed dimensions and may not be accurate from camera to camera.''&lt;br /&gt;
&lt;br /&gt;
The vision processor is a Raspberry PI, and the camera is the Pi camera.&lt;br /&gt;
Raspberry Pi v1.x camera has focal length of 3.6 mm and pixel size of 1.4 x 1.4 um. Cone height is 0.46 m. If cone height in image is N pixels, then by similar triangles,&lt;br /&gt;
3.6 mm / (N * 0.0014 mm)  = range / 0.46 m.&lt;br /&gt;
&lt;br /&gt;
range = 3.6 * 0.46 m / (N * 0.0014)&lt;br /&gt;
&lt;br /&gt;
=== Visual Traffic Cone Angle ===&lt;br /&gt;
&lt;br /&gt;
Calculating angle relies on similar principles as calculating range. Before converting horizontal or vertical position into angle, we have to know the camera's real focal length and pixel size. From this we can use trigonometry to calculate degrees per pixel.&lt;br /&gt;
&lt;br /&gt;
Optional: first estimate degrees per pixel by dividing the horizontal field of view (often available in the device's documentation) by the camera's horizontal pixel count:&lt;br /&gt;
&lt;br /&gt;
Degrees / pixel = (horizontal field of view) / (horizontal pixel count)&lt;br /&gt;
&lt;br /&gt;
Example: 62.2 degrees / 3280 pixels = 0.0190 degrees per pixel, equivalent to 52.7 pixels per degree.&lt;br /&gt;
&lt;br /&gt;
Now calculate the degrees per pixel using the focal length, pixel size, and data from the range calculations described in &amp;quot;Visual Traffic Cone Ranging&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
Tan(degrees) = (Object height in meters) / (Object range in meters)&lt;br /&gt;
&lt;br /&gt;
Degrees = Tanh( height / range)&lt;br /&gt;
&lt;br /&gt;
Pixels = (focal length * height) / (pixel size * range)&lt;br /&gt;
&lt;br /&gt;
Degrees / pixel = Degrees / pixel&lt;br /&gt;
&lt;br /&gt;
Compare your calculated deg / px to the estimated deg / px. The numbers should be similar but will not be the same unless your image is corrected for lens distortion.&lt;br /&gt;
&lt;br /&gt;
To find the horizontal degree offset of an object using its center point, first find the object's offset from center:&lt;br /&gt;
&lt;br /&gt;
Horizontal offset in pixels= (object horizontal center in image) - (image width / 2)&lt;br /&gt;
&lt;br /&gt;
Horizontal offset in degrees = (Horizontal Offset) * (degrees / pixel)   &lt;br /&gt;
&lt;br /&gt;
The horizontal offset in degrees will be positive when the object is right of center and negative when the object is left of center. &lt;br /&gt;
&lt;br /&gt;
==== Experimentally finding focal length and pixel size ====&lt;br /&gt;
&lt;br /&gt;
Pi Cam and other similar products have designed focal length and pixel size dimensions in their respective specification sheets. These documented numbers are nominal (official) values that may be different from real (actual) values. If these nominal values are used in range calculations, the returned range values can be bigger or smaller than in reality. To correct for this, we can calculate a camera's ratio of focal length to pixel size using a formula derived from the similar triangles ratios.&lt;br /&gt;
&lt;br /&gt;
The ratio of a Camera's focal length to its pixel size is part of the similar triangles formula:&lt;br /&gt;
&lt;br /&gt;
focal_length / (N * pixel_size)  = range / 0.46 m&lt;br /&gt;
&lt;br /&gt;
We can characterize the ratio of focal length to pixel size by taking a picture of a traffic cone (or other object of known height) at a known distance. Using the known distance, height, and number of pixels in our calibration image, we can calculate focal length and pixel size as a ratio:&lt;br /&gt;
&lt;br /&gt;
focal_length / pixel_size = N * range / 0.46 m&lt;br /&gt;
&lt;br /&gt;
A camera with a focal length of 3.5mm and pixel size of 1.4um has a focal_length / pixel_size of 2500. This is unit-less because we divide meters by meters. We used the method described above to determine an actual Pi Cam version 1.x camera had a focal_length / pixel_size ratio of ~1900, equal to a 1.4um pixel size and 2.7mm focal length. This real value allows accurate range calculations with a specific camera and does not transfer to other hardware of the same version.&lt;br /&gt;
&lt;br /&gt;
=== Expected world coordinates ===&lt;br /&gt;
&lt;br /&gt;
The C6 Arduino communicates with the Raspberry Pi over serial lines. The Arduino sends the expected world coordinate position of the cone in the format &lt;br /&gt;
&lt;br /&gt;
G {n Num} {p EPosMeters,NPosMeters} {b Deg}&lt;br /&gt;
&lt;br /&gt;
and the current position of the trike as &lt;br /&gt;
&lt;br /&gt;
S {p EPosMeters,NPosMeters} {b Deg}&lt;br /&gt;
&lt;br /&gt;
The Pi returns the position of the cone as&lt;br /&gt;
&lt;br /&gt;
G {n Num} {p EPosMeters,NPosMeters} {b Deg} {r Probability}&lt;br /&gt;
&lt;br /&gt;
These formats are documented in GitHub  under Documentation / SerialCmd.html.&lt;br /&gt;
&lt;br /&gt;
The Pi needs to translate world coordinates to pixel coordinates (and back) using the 3D matrix transformations given in Computer Graphics: Principles and Practice  (2nd ed. Foley, Van Dam, Feiner, Hughes; or 3rd ed. Hughes et al.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Main.TylerCFolsom - 2017-06-16&lt;br /&gt;
&lt;br /&gt;
ALSO &amp;gt; [[VisionPage]]&lt;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[ActuatorPage]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=High_Level&amp;diff=335</id>
		<title>High Level</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=High_Level&amp;diff=335"/>
		<updated>2020-06-08T21:03:17Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The High Level system has been renamed &amp;quot;Sensor Hub&amp;quot;. Documentation in divided into the software and hardware.&lt;br /&gt;
&lt;br /&gt;
==[[HighLevelSWv3]]==&lt;br /&gt;
==[[HighLevelHWv3]]==&lt;br /&gt;
[[File:HighLevel.JPG|1000px]]&lt;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Low_Level&amp;diff=334</id>
		<title>Low Level</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Low_Level&amp;diff=334"/>
		<updated>2020-06-08T21:00:00Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&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) is a daughter board (shield) for an Arduino Mega microcontroller. It has been renamed &amp;quot;Drive-By-Wire&amp;quot;. It implements drive-by-wire, turning a trike into a CAN-bus based vehicle compatible with commercial self-driving equipment. The LLB communicates over the CAN bus with  the higher-level autonomous system or manual control from the receiver system. It directly manages the actuators: the throttle to the motor, the turning servo, and the brakes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Motion directives are received on a CAN bus interface, processed, and articulated.&lt;br /&gt;
* System status (turn angle, wheel linear velocity) is reported back to CAN bus.&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): Interface to E-bike controller&lt;br /&gt;
*** Analog voltage (approximately 0v to 4v) output to hub motor throttle&lt;br /&gt;
*** Digital outputs for activating reverse and regenerative braking.&lt;br /&gt;
*** PWM output for PWM-operated braking (no longer used)&lt;br /&gt;
*** Analog inputs for hall sensor feedback from motor controllers supporting this feature. These inputs are NOT 5V 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;
&lt;br /&gt;
DETAILS &amp;gt; [[DB15M]]&lt;br /&gt;
&lt;br /&gt;
** Steering Header (RJ45): &lt;br /&gt;
*** Two sets of pins to support analog potentiometers (5v, signal input, ground) giving angle of front wheels&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;
*** Two relay outputs to solenoids: on/off and 12/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 accepts 12V, and its USB port may be connected to a typical USB power supply. The 12V is provided by a DC-DC converter from the main battery (36 to 50V).&lt;br /&gt;
&lt;br /&gt;
==Image: [[File:LowLevel.JPG|1000px]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[High Level]]&lt;br /&gt;
&lt;br /&gt;
=LowLevel v2.1 PCB =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Functionality: ==&lt;br /&gt;
&lt;br /&gt;
* Version 2.1 used UART serial connections to other boards instead of the CAN bus. 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;
&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. (Digital urn sensors were never implemented.)&lt;br /&gt;
** X4 (ODO): Cyclometer (reed switch) input jack.    Board layout was incorrect. This signal needs to be jumpered to Arduino pin D2.&lt;br /&gt;
** JP9 (8 pin): Joystick analog input signals. &lt;br /&gt;
** JP12 (3 pin): Pulse output signal to steer.  &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 used to interface the RC receiver.&lt;br /&gt;
** Adds one CANbus interface on a DE-9F socket. For legacy compatibility UART serial is be available on this interface as well.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=LowLevel v1.0 PCB =&lt;br /&gt;
&lt;br /&gt;
* The first version of the LLB was called MegaShieldDB. It had similar functionality, but different connectors. It had five DB connectors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[High Level]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=333</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=333"/>
		<updated>2020-06-08T20:57:34Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &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 (aka Drive-By_Wire) 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 (aka Sensor Hub) 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;
== [[ Simulator]] ==&lt;br /&gt;
Using Open-source CARLA platform with a go-between board allows simulation.&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;
== Software development procedures ==&lt;br /&gt;
&lt;br /&gt;
=== [[Software repositories]] ===&lt;br /&gt;
What's in each of our GitHub repositories.&lt;br /&gt;
&lt;br /&gt;
=== [[Arduino software]] ===&lt;br /&gt;
Getting started; references; development tools. Dealing with libraries and different parameters for each vehicle.&lt;br /&gt;
&lt;br /&gt;
=== [[Using Git and GitHub]] ===&lt;br /&gt;
Practices for maintaining code and source files on Elcano Project's GitHub repositories.&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>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=ElcanoSerial&amp;diff=325</id>
		<title>ElcanoSerial</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=ElcanoSerial&amp;diff=325"/>
		<updated>2020-05-29T18:13:59Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== OBSOLETE ==&lt;br /&gt;
&lt;br /&gt;
UART Serial communication has been replaced by CAN bus serial communication.&lt;br /&gt;
&lt;br /&gt;
Tyler Folsom  May 30, 2020&lt;br /&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>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Odometer&amp;diff=317</id>
		<title>Odometer</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Odometer&amp;diff=317"/>
		<updated>2020-05-28T00:05:00Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Created page with &amp;quot;There is odometer hardware on both the Drive-By-Wire board and on the High Level board. Normally the speed and odometer will be computed on the Drive-By-Wire board and passed...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is odometer hardware on both the Drive-By-Wire board and on the High Level board. Normally the speed and odometer will be computed on the Drive-By-Wire board and passed to the HighLevel board as a CAM message. However, there is the capability for either board to process the signal and compute speed and distance traveled.&lt;br /&gt;
The odometer sensor is a reed switch positioned so that it detects a magnet attached to a spoke of the vehicle. The magnet opens and closes a switch once per revolution. The hardware on the circuit board has a pull-up resistor that converts the open/closed switch to a high or low voltage. This signal is input to an interrupt pin of the Arduino. There is an edge transition that occurs once per wheel revolution. This signal triggers an interrupt that logs the time of the signal. Speed is computed from the time that it takes to make one wheel revolution.&lt;br /&gt;
This is the same system used on a standard bicycle cyclometer. The odometer is constructed from a cyclometer pick-up where the wire has been cut and soldered to a barrel plug connecting to the circuit board. Most trike have two speedometers. One goes to a standard human readable cyclometer, and the other goes to an Arduino. They should be calibrated to give the same reading. Cyclometers are calibrated based on wheel diameter or circumference.&lt;br /&gt;
When computing speed, thee should be a reasonable limit on how fast the trike can go. Any signal edge that would make it too fast is a glitch and should be rejected.&lt;br /&gt;
The instrument is incapable of telling whether the trike has stopped or is just moving slowly. It should time-out to zero speed instead of staying at the last measured speed forever. It may help to extrapolate slowing speeds and set speed to zero at the right time.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=277</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=277"/>
		<updated>2019-11-10T02:07:37Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* Current System */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Historic Systems =&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;
== 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;
= Current System =&lt;br /&gt;
&lt;br /&gt;
== CAN Bus and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RC transceiver board can be built five different ways:&lt;br /&gt;
&lt;br /&gt;
* Transmitter using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Receiver using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Transmitter using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using 5 or 6 channel radio control (RC)&lt;br /&gt;
&lt;br /&gt;
When configured as a receiver it is mounted on the vehicle and communicates drive commands over CAN bus. &lt;br /&gt;
&lt;br /&gt;
CAN is documented on [[Communication]]&lt;br /&gt;
&lt;br /&gt;
As a transmitter, it is packaged in a remote box with joysticks and switches. Functions and pins are explained in TranceiverPins_1_6.docx on https://github.com/elcano/Transceiver/tree/master/Transceiver%20Documents.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The processor is an Arduino ARM SAMD21 mini dev board, which requires some special steps to install. These are detailed on https://learn.sparkfun.com/tutorials/samd21-minidev-breakout-hookup-guide/setting-up-arduino &lt;br /&gt;
&lt;br /&gt;
Reset 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;
== Setting up SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
Follow the instructions on https://learn.sparkfun.com/tutorials/samd21-minidev-breakout-hookup-guide/setting-up-arduino&lt;br /&gt;
&lt;br /&gt;
Tools &amp;gt; Board &amp;gt; Boards Manager … Then find an entry for Arduino SAMD Boards (32-bits ARM Cortex-M0+). Select it, and install.&lt;br /&gt;
&lt;br /&gt;
Next, open your Arduino preferences (File &amp;gt; Preferences). Then find the Additional Board Manager URLs text box, and paste the below link in:&lt;br /&gt;
&lt;br /&gt;
https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json&lt;br /&gt;
&lt;br /&gt;
Then hit &amp;quot;OK&amp;quot;, and travel back to the Board Manager menu. Find a new entry for SparkFun SAMD Boards.&lt;br /&gt;
Once the board is installed, you should see new entries in your Tools &amp;gt; Board list. Select SparkFun SAMD21 Mini Breakout.&lt;br /&gt;
&lt;br /&gt;
Next step is to find the needed files.&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;RH_RF69.h&amp;gt;        // External; documented at &lt;br /&gt;
http://www.airspayce.com/mikem/arduino/RadioHead/classRH__RF69.html&lt;br /&gt;
&lt;br /&gt;
Download the file from http://www.airspayce.com/mikem/arduino/RadioHead/RadioHead-1.97.zip&lt;br /&gt;
&lt;br /&gt;
Follow https://www.arduino.cc/en/Guide/Libraries to add the library. From Sketch &amp;gt; Include Libraries select Add Zip Library and navigate to the right file. You should then see RadioHead in the list of included libraries.&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;mcp_can_dfs.h&amp;gt;    // &amp;lt;---- Import from another library: Seed-Studio/CAN-BUS-Shield&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;mcp_can.h&amp;gt;        //       (install Library from Arduino, search for &amp;quot;Can-Bus-Shield&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Download zip from&lt;br /&gt;
&lt;br /&gt;
https://github.com/Seeed-Studio/CAN_BUS_Shield&lt;br /&gt;
&lt;br /&gt;
From Sketch &amp;gt; Include Libraries select Add Zip Library and navigate to the right file. You should see CAN_BUS-Shield-master in the Include Libraries.&lt;br /&gt;
&lt;br /&gt;
== 5- and 6-channel RC Controller ==&lt;br /&gt;
&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;
&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;
&lt;br /&gt;
&lt;br /&gt;
NEXT . [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Board_Diagrams&amp;diff=276</id>
		<title>Board Diagrams</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Board_Diagrams&amp;diff=276"/>
		<updated>2019-11-09T05:30:40Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Board Schematics =&lt;br /&gt;
&lt;br /&gt;
== Low Level Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[LowLevelBoard]]&lt;br /&gt;
&lt;br /&gt;
* Photo &amp;gt; [[Low Level]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files: https://github.com/elcano/elcano/tree/master/Electronics/Low%20Level%20v3 &lt;br /&gt;
&lt;br /&gt;
* Should be migrated to: https://github.com/elcano/LowLevel/Electronics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:LowLevelV3.1_A.png]]&lt;br /&gt;
[[File:LowLevelV3.1_B.png]]&lt;br /&gt;
[[File:LowLevelV3.1_C.png]]&lt;br /&gt;
[[File:LowLevelV3.1_brd.png]]&lt;br /&gt;
&lt;br /&gt;
== High Level Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[HighLevelHWv3]]&lt;br /&gt;
&lt;br /&gt;
* Photo &amp;gt; [[High Level]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files:  https://github.com/elcano/elcano/tree/master/Electronics/High%20Level &lt;br /&gt;
&lt;br /&gt;
* Should be migrated to:  https://github.com/elcano/HighLevel/Electronics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:High-Level PCB v3.0.png]]&lt;br /&gt;
[[File:High-Level PCB v3.0_brd.png]]&lt;br /&gt;
&lt;br /&gt;
== Sonar Array Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation and photo &amp;gt; [[Sonar]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files on https://github.com/elcano/Sonar/tree/master/Electronics &lt;br /&gt;
&lt;br /&gt;
[[File:SonarBoardV2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:SonarBoardV2 brd.png]]&lt;br /&gt;
&lt;br /&gt;
== Scanse Sweep Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation  &amp;gt; [[Lidar]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files coming to https://github.com/elcano/Sweep&lt;br /&gt;
&lt;br /&gt;
[[File:ScanseSweep.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:ScanseSweep_Brd.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transceiver Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[RemoteControl]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files:  https://github.com/elcano/Transceiver &lt;br /&gt;
&lt;br /&gt;
[[File:Transceiver.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Transceiver Brd.png]]&lt;br /&gt;
&lt;br /&gt;
Bill of Materials: Transceiver_BoM.xlxs on https://github.com/elcano/Transceiver/tree/master/Electronics&lt;br /&gt;
&lt;br /&gt;
== PowerOn Board ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Documentation and photo &amp;gt; [[Power System]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files:  https://github.com/elcano/elcano/tree/master/Electronics &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOn.png]]&lt;br /&gt;
&lt;br /&gt;
Cuts and jumpers to just use Kelly power-on circuit and DC-DC converters&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOnOnly.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOn_brd.png]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:ScanseSweep_Brd.png&amp;diff=275</id>
		<title>File:ScanseSweep Brd.png</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:ScanseSweep_Brd.png&amp;diff=275"/>
		<updated>2019-11-09T05:19:30Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Board layout for Scanse Sweep interface board.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Board layout for Scanse Sweep interface board.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:ScanseSweep.png&amp;diff=274</id>
		<title>File:ScanseSweep.png</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:ScanseSweep.png&amp;diff=274"/>
		<updated>2019-11-09T05:18:36Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Schematic for Scanse Sweep interface board.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Schematic for Scanse Sweep interface board.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Board_Diagrams&amp;diff=273</id>
		<title>Board Diagrams</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Board_Diagrams&amp;diff=273"/>
		<updated>2019-11-09T05:08:56Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* Transceiver Board */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Board Schematics =&lt;br /&gt;
&lt;br /&gt;
== Low Level Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[LowLevelBoard]]&lt;br /&gt;
&lt;br /&gt;
* Photo &amp;gt; [[Low Level]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files: https://github.com/elcano/elcano/tree/master/Electronics/Low%20Level%20v3 &lt;br /&gt;
&lt;br /&gt;
* Should be migrated to: https://github.com/elcano/LowLevel/Electronics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:LowLevelV3.1_A.png]]&lt;br /&gt;
[[File:LowLevelV3.1_B.png]]&lt;br /&gt;
[[File:LowLevelV3.1_C.png]]&lt;br /&gt;
[[File:LowLevelV3.1_brd.png]]&lt;br /&gt;
&lt;br /&gt;
== High Level Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[HighLevelHWv3]]&lt;br /&gt;
&lt;br /&gt;
* Photo &amp;gt; [[High Level]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files:  https://github.com/elcano/elcano/tree/master/Electronics/High%20Level &lt;br /&gt;
&lt;br /&gt;
* Should be migrated to:  https://github.com/elcano/HighLevel/Electronics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:High-Level PCB v3.0.png]]&lt;br /&gt;
[[File:High-Level PCB v3.0_brd.png]]&lt;br /&gt;
&lt;br /&gt;
== Sonar Array Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation and photo &amp;gt; [[Sonar]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files on https://github.com/elcano/Sonar/tree/master/Electronics &lt;br /&gt;
&lt;br /&gt;
[[File:SonarBoardV2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:SonarBoardV2_brd.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transceiver Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[RemoteControl]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files:  https://github.com/elcano/Transceiver &lt;br /&gt;
&lt;br /&gt;
[[File:Transceiver.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Transceiver Brd.png]]&lt;br /&gt;
&lt;br /&gt;
Bill of Materials: Transceiver_BoM.xlxs on https://github.com/elcano/Transceiver/tree/master/Electronics&lt;br /&gt;
&lt;br /&gt;
== PowerOn Board ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Documentation and photo &amp;gt; [[Power System]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files:  https://github.com/elcano/elcano/tree/master/Electronics &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOn.png]]&lt;br /&gt;
&lt;br /&gt;
Cuts and jumpers to just use Kelly power-on circuit and DC-DC converters&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOnOnly.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOn_brd.png]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=272</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=272"/>
		<updated>2019-11-09T05:03:43Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* CAN Bus and SAMD21 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Historic Systems =&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;
== 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;
= Current System =&lt;br /&gt;
&lt;br /&gt;
== CAN Bus and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RC transceiver board can be built five different ways:&lt;br /&gt;
&lt;br /&gt;
* Transmitter using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Receiver using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Transmitter using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using 5 or 6 channel radio control (RC)&lt;br /&gt;
&lt;br /&gt;
When configured as a receiver it is mounted on the vehicle and communicates drive commands over CAN bus. &lt;br /&gt;
&lt;br /&gt;
CAN is documented on [[Communication]]&lt;br /&gt;
&lt;br /&gt;
As a transmitter, it is packaged in a remote box with joysticks and switches. Functions and pins are explained in TranceiverPins_1_6.docx on https://github.com/elcano/Transceiver/tree/master/Transceiver%20Documents.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The processor is an Arduino ARM SAMD21 mini dev board, which requires some special steps to install. These are detailed on https://learn.sparkfun.com/tutorials/samd21-minidev-breakout-hookup-guide/setting-up-arduino &lt;br /&gt;
&lt;br /&gt;
Reset 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;
== 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;
&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;
&lt;br /&gt;
&lt;br /&gt;
NEXT . [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=271</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=271"/>
		<updated>2019-11-09T05:02:54Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* CAN Bus and SAMD21 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Historic Systems =&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;
== 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;
= Current System =&lt;br /&gt;
&lt;br /&gt;
== CAN Bus and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RC transceiver board can be built five different ways:&lt;br /&gt;
&lt;br /&gt;
* Transmitter using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Receiver using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Transmitter using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using 5 or 6 channel radio control (RC)&lt;br /&gt;
&lt;br /&gt;
When configured as a receiver it is mounted on the vehicle and communicates drive commands over CAN bus. &lt;br /&gt;
&lt;br /&gt;
CAN is documented on [[Communication]]&lt;br /&gt;
&lt;br /&gt;
As a transmitter, it is packaged in a remote box with joysticks and switches. Functions and pins are explained in TranceiverPins_1_6.docx on https://github.com/elcano/Transceiver/tree/master/Transceiver Documents.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The processor is an Arduino ARM SAMD21 mini dev board, which requires some special steps to install. These are detailed on https://learn.sparkfun.com/tutorials/samd21-minidev-breakout-hookup-guide/setting-up-arduino &lt;br /&gt;
&lt;br /&gt;
Reset 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;
== 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;
&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;
&lt;br /&gt;
&lt;br /&gt;
NEXT . [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Board_Diagrams&amp;diff=270</id>
		<title>Board Diagrams</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Board_Diagrams&amp;diff=270"/>
		<updated>2019-11-08T23:20:42Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Board Schematics =&lt;br /&gt;
&lt;br /&gt;
== Low Level Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[LowLevelBoard]]&lt;br /&gt;
&lt;br /&gt;
* Photo &amp;gt; [[Low Level]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files: https://github.com/elcano/elcano/tree/master/Electronics/Low%20Level%20v3 &lt;br /&gt;
&lt;br /&gt;
* Should be migrated to: https://github.com/elcano/LowLevel/Electronics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:LowLevelV3.1_A.png]]&lt;br /&gt;
[[File:LowLevelV3.1_B.png]]&lt;br /&gt;
[[File:LowLevelV3.1_C.png]]&lt;br /&gt;
[[File:LowLevelV3.1_brd.png]]&lt;br /&gt;
&lt;br /&gt;
== High Level Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[HighLevelHWv3]]&lt;br /&gt;
&lt;br /&gt;
* Photo &amp;gt; [[High Level]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files:  https://github.com/elcano/elcano/tree/master/Electronics/High%20Level &lt;br /&gt;
&lt;br /&gt;
* Should be migrated to:  https://github.com/elcano/HighLevel/Electronics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:High-Level PCB v3.0.png]]&lt;br /&gt;
[[File:High-Level PCB v3.0_brd.png]]&lt;br /&gt;
&lt;br /&gt;
== Sonar Array Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation and photo &amp;gt; [[Sonar]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files on https://github.com/elcano/Sonar/tree/master/Electronics &lt;br /&gt;
&lt;br /&gt;
[[File:SonarBoardV2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:SonarBoardV2_brd.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transceiver Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[RemoteControl]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files:  https://github.com/elcano/Transceiver &lt;br /&gt;
&lt;br /&gt;
[[File:Transceiver.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Transceiver Brd.png]]&lt;br /&gt;
&lt;br /&gt;
== PowerOn Board ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Documentation and photo &amp;gt; [[Power System]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files:  https://github.com/elcano/elcano/tree/master/Electronics &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOn.png]]&lt;br /&gt;
&lt;br /&gt;
Cuts and jumpers to just use Kelly power-on circuit and DC-DC converters&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOnOnly.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOn_brd.png]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:Transceiver_Brd.png&amp;diff=269</id>
		<title>File:Transceiver Brd.png</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:Transceiver_Brd.png&amp;diff=269"/>
		<updated>2019-11-08T23:15:40Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Graphic of Transceiver board layout.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Graphic of Transceiver board layout.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=File:Transceiver.png&amp;diff=268</id>
		<title>File:Transceiver.png</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=File:Transceiver.png&amp;diff=268"/>
		<updated>2019-11-08T22:53:05Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Graphic of transceiver schematic.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Graphic of transceiver schematic.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=267</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=267"/>
		<updated>2019-11-08T22:40:28Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Historic Systems =&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;
== 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;
= Current System =&lt;br /&gt;
&lt;br /&gt;
== CAN Bus and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RC transceiver board can be built five different ways:&lt;br /&gt;
&lt;br /&gt;
* Transmitter using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Receiver using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Transmitter using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using 5 or 6 channel radio control (RC)&lt;br /&gt;
&lt;br /&gt;
When configured as a receiver it is mounted on the vehicle and communicates drive commands over CAN bus. &lt;br /&gt;
&lt;br /&gt;
CAN is documented on . [[Communication]]&lt;br /&gt;
&lt;br /&gt;
As a transmitter, it is packaged in a remote box with joysticks and switches. Functions and pins are explained in TranceiverPins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The processor is an Arduino ARM SAMD21 mini dev board, which requires some special steps to install. These are detailed on https://learn.sparkfun.com/tutorials/samd21-minidev-breakout-hookup-guide/setting-up-arduino &lt;br /&gt;
&lt;br /&gt;
Reset 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;
== 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;
&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;
&lt;br /&gt;
&lt;br /&gt;
NEXT . [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=266</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=266"/>
		<updated>2019-11-08T22:35:33Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* CAN Bus and SAMD21 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Historic Systems =&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;
== 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;
= Current System =&lt;br /&gt;
&lt;br /&gt;
== CAN Bus and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RC transceiver board can be built five different ways:&lt;br /&gt;
&lt;br /&gt;
* Transmitter using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Receiver using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Transmitter using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using 5 or 6 channel radio control (RC)&lt;br /&gt;
&lt;br /&gt;
When configured as a receiver it is mounted on the vehicle and communicates drive commands over CAN bus. [[Elcano CAN Commands]]&lt;br /&gt;
&lt;br /&gt;
As a transmitter, it is packaged in a remote box with joysticks and switches. Functions and pins are explained in TranceiverPins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The processor is an Arduino ARM SAMD21 mini dev board, which requires some special steps to install. These are detailed on https://learn.sparkfun.com/tutorials/samd21-minidev-breakout-hookup-guide/setting-up-arduino &lt;br /&gt;
&lt;br /&gt;
Reset 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;
== 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;
&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;
&lt;br /&gt;
&lt;br /&gt;
NEXT . [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=265</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=265"/>
		<updated>2019-11-08T22:25:10Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* CAN Bus and SAMD21 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Historic Systems =&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;
== 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;
= Current System =&lt;br /&gt;
&lt;br /&gt;
== CAN Bus and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RC transceiver board can be built five different ways:&lt;br /&gt;
&lt;br /&gt;
* Transmitter using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Receiver using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Transmitter using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using radio (RFM69HCW)&lt;br /&gt;
&lt;br /&gt;
* Receiver using 5 or 6 channel radio control (RC)&lt;br /&gt;
&lt;br /&gt;
When configured as a receiver it is mounted on the vehicle and communicates drive commands over CAN bus.&lt;br /&gt;
As a transmitter, it is packaged in a remote box with joysticks and switches. Functions and pins are explained in TranceiverPins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The processor is an Arduino ARM SAMD21 mini dev board, which requires some special steps to install. These are detailed on https://learn.sparkfun.com/tutorials/samd21-minidev-breakout-hookup-guide/setting-up-arduino &lt;br /&gt;
&lt;br /&gt;
Reset 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;
== 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;
&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;
&lt;br /&gt;
&lt;br /&gt;
NEXT . [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=264</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=264"/>
		<updated>2019-11-08T22:23:14Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* Elcano Remote Control */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Historic Systems =&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;
== 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;
= Current System =&lt;br /&gt;
&lt;br /&gt;
== CAN Bus and SAMD21 ==&lt;br /&gt;
&lt;br /&gt;
The RC transceiver board can be built five different ways:&lt;br /&gt;
&lt;br /&gt;
* Transmitter using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Receiver using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Transmitter using radio&lt;br /&gt;
&lt;br /&gt;
* Receiver using radio&lt;br /&gt;
&lt;br /&gt;
* Receiver using radio control (RC)&lt;br /&gt;
&lt;br /&gt;
When configured as a receiver it is mounted on the vehicle and communicates drive commands over CAN bus.&lt;br /&gt;
As a transmitter, it is packaged in a remote box with joysticks and switches. Functions and pins are explained in TranceiverPins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The processor is an Arduino ARM SAMD21 mini dev board, which requires some special steps to install. These are detailed on https://learn.sparkfun.com/tutorials/samd21-minidev-breakout-hookup-guide/setting-up-arduino &lt;br /&gt;
&lt;br /&gt;
Reset 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;
== 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;
&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;
&lt;br /&gt;
&lt;br /&gt;
NEXT . [[SensorsPage]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=263</id>
		<title>RemoteControl</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=RemoteControl&amp;diff=263"/>
		<updated>2019-11-08T21:42:15Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* 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 can be built five different ways:&lt;br /&gt;
&lt;br /&gt;
* Transmitter using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Receiver using Bluetooth&lt;br /&gt;
&lt;br /&gt;
* Transmitter using radio&lt;br /&gt;
&lt;br /&gt;
* Receiver using radio&lt;br /&gt;
&lt;br /&gt;
* Receiver using radio control (RC)&lt;br /&gt;
&lt;br /&gt;
When configured as a receiver it is mounted on the vehicle and communicates drive commands over CAN bus.&lt;br /&gt;
As a transmitter, it is packaged in a remote box with joysticks and switches. Functions and pins are explained in TranceiverPins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The processor is an Arduino ARM SAMD21 mini dev board, which requires some special steps to install. These are detailed on https://learn.sparkfun.com/tutorials/samd21-minidev-breakout-hookup-guide/setting-up-arduino &lt;br /&gt;
&lt;br /&gt;
Reset 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>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=245</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=245"/>
		<updated>2019-10-02T23:31:40Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &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;
== [[ Simulator]] ==&lt;br /&gt;
Using Open-source CARLA platform with a go-between board allows simulation.&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;
==[[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>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Using_Git_and_GitHub&amp;diff=244</id>
		<title>Using Git and GitHub</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Using_Git_and_GitHub&amp;diff=244"/>
		<updated>2019-10-02T23:30:16Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Created page with &amp;quot;The Elcano repositories are on https://github.com/elcano There is a separate repository for each microprocessor: * LowLevel: Drive by wire * HighLevel: Localization, mapping a...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Elcano repositories are on https://github.com/elcano&lt;br /&gt;
There is a separate repository for each microprocessor:&lt;br /&gt;
* LowLevel: Drive by wire&lt;br /&gt;
* HighLevel: Localization, mapping and path planning&lt;br /&gt;
* Transceiver: Remote control transmitter and receiver&lt;br /&gt;
* Sonar: Obstacle detection from ultra-sound&lt;br /&gt;
* Sweep: Obstacle detection by laser&lt;br /&gt;
* QDED: Raspberry Pi Vision based on quadrature disambiguation edge detection&lt;br /&gt;
* General: for items that are shared between processors.&lt;br /&gt;
&lt;br /&gt;
In the past, all code was in the single repository Elcano/Elcano. That repository has been archived. Any useful files from it should be copied to the appropriate repository.&lt;br /&gt;
Working with Git&lt;br /&gt;
&lt;br /&gt;
See the tutorial: https://product.hubspot.com/blog/git-and-github-tutorial-for-beginners&lt;br /&gt;
&lt;br /&gt;
Typically, you will start with an Elcano repository, and then fork it to your own repository. For instance, fork Elcano/Transceiver to Jane/Transceiver. Both of these repositories live in the cloud. You would then download Jane/Transceiver to your PC. You can do a lot of work in that repository on your PC. When you have code on your PC that has been tested, the next st ep is to upload it.&lt;br /&gt;
Suppose that on your PC you have updated the file xmit/ RadioControl_rf69/ RadioControl_rf69.ino.&lt;br /&gt;
You need to get into a bash shell window on your PC, and use cd to make xmit the current directory.&lt;br /&gt;
&lt;br /&gt;
git status   // should show nothing changed&lt;br /&gt;
&lt;br /&gt;
git add RadioControl_rf69/ RadioControl_rf69.ino&lt;br /&gt;
&lt;br /&gt;
git commit -m “Removed a delay statement that blocked while waiting for an ack”&lt;br /&gt;
&lt;br /&gt;
Be sure to make your messages reflect what you did for this particular fix. Git supports small incremental changes, and make it possible to roll then back if needed. Please do not wait until the end of the quarter to dump all your changes into the main repository. &lt;br /&gt;
&lt;br /&gt;
git push origin master&lt;br /&gt;
&lt;br /&gt;
This command assumes that you have set origin to the URL for xmit and master to the URL for Jane/Transceiver. It puts your new code into your repository on the cloud.&lt;br /&gt;
&lt;br /&gt;
The next stage is to make a pull request. You are asking to have your code made part of the official Elcano/Transceiver. You are not allowed to directly push to Elcano repositories. If your pull request is accepted, your code becomes part of the Elcano project. A pull request is made from a web browser on Elcano/Transceiver, or whatever repository you are working with.&lt;br /&gt;
&lt;br /&gt;
=== Settings.h ===&lt;br /&gt;
This file is required by most processors, but is not kept in any repository. It is meant to include individual vehicle features. All the rest of the code should be written to be portable across a wide variety of vehicles. Specific attributes of a trike (such as wheel diameter, turning radius, etc.) should be kept in a settings.h file for that vehicle. The file SettingsTemplate.h is kept in the General repository. This file should be used to set up an individual setting.h file.&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=243</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=243"/>
		<updated>2019-10-02T23:25:19Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /*  Using Git and GitHub */&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;
== [[ Simulator]] ==&lt;br /&gt;
Using Open-source CARLA platform with a go-between board allows simulation.&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;
The Elcano repositories are on https://github.com/elcano&lt;br /&gt;
There is a separate repository for each microprocessor:&lt;br /&gt;
•	LowLevel: Drive by wire&lt;br /&gt;
•	HighLevel: Localization, mapping and path planning&lt;br /&gt;
•	Transceiver: Remote control transmitter and receiver&lt;br /&gt;
•	Sonar: Obstacle detection from ultra-sound&lt;br /&gt;
•	Sweep: Obstacle detection by laser&lt;br /&gt;
•	QDED: Raspberry Pi Vision based on quadrature disambiguation edge detection&lt;br /&gt;
•	General: for items that are shared between processors.&lt;br /&gt;
In the past, all code was in the single repository Elcano/Elcano. That repository has been archived. Any useful files from it should be copied to the appropriate repository.&lt;br /&gt;
Working with Git&lt;br /&gt;
See the tutorial: https://product.hubspot.com/blog/git-and-github-tutorial-for-beginners&lt;br /&gt;
Typically, you will start with an Elcano repository, and then fork it to your own repository. For instance, fork Elcano/Transceiver to Jane/Transceiver. Both of these repositories live in the cloud. You would then download Jane/Transceiver to your PC. You can do a lot of work in that repository on your PC. When you have code on your PC that has been tested, the next st ep is to upload it.&lt;br /&gt;
Suppose that on your PC you have updated the file xmit/ RadioControl_rf69/ RadioControl_rf69.ino.&lt;br /&gt;
You need to get into a bash shell window on your PC, and use cd to make xmit the current directory.&lt;br /&gt;
git status   // should show nothing changed&lt;br /&gt;
git add RadioControl_rf69/ RadioControl_rf69.ino&lt;br /&gt;
git commit -m “Removed a delay statement that blocked while waiting for an ack”&lt;br /&gt;
Be sure to make your messages reflect what you did for this particular fix. Git supports small incremental changes, and make it possible to roll then back if needed. Please do not wait until the end of the quarter to dump all your changes into the main repository. &lt;br /&gt;
git push origin master&lt;br /&gt;
This command assumes that you have set origin to the URL for xmit and master to the URL for Jane/Transceiver. It puts your new code into your repository on the cloud.&lt;br /&gt;
The next stage is to make a pull request. You are asking to have your code made part of the official Elcano/Transceiver. You are not allowed to directly push to Elcano repositories. If your pull request is accepted, your code becomes part of the Elcano project. A pull request is made from a web browser on Elcano/Transceiver, or whatever repository you are working with.&lt;br /&gt;
&lt;br /&gt;
=== Settings.h ===&lt;br /&gt;
This file is required by most processors, but is not kept in any repository. It is meant to include individual vehicle features. All the rest of the code should be written to be portable across a wide variety of vehicles. Specific attributes of a trike (such as wheel diameter, turning radius, etc.) should be kept in a settings.h file for that vehicle. The file SettingsTemplate.h is kept in the General repository. This file should be used to set up an individual setting.h file.&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>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Low_Level&amp;diff=240</id>
		<title>Low Level</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Low_Level&amp;diff=240"/>
		<updated>2019-08-13T04:07:44Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: 5V safe (not 36V safe)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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) is a daughter board (shield) for an Arduino Mega microcontroller. It implements drive-by-wire, turning a trike into a CAN-bus based vehicle compatible with commercial self-driving equipment. The LLB communicates over the CAN bus with  the higher-level autonomous system or manual control from the receiver system. It directly manages the actuators: the throttle to the motor, the turning servo, and the brakes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Motion directives are received on a CAN bus interface, processed, and articulated.&lt;br /&gt;
* System status (turn angle, wheel linear velocity) is reported back to CAN bus.&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): Interface to E-bike controller&lt;br /&gt;
*** Analog voltage (approximately 0v to 4v) output to hub motor throttle&lt;br /&gt;
*** Digital outputs for activating reverse and regenerative braking.&lt;br /&gt;
*** PWM output for PWM-operated braking (no longer used)&lt;br /&gt;
*** Analog inputs for hall sensor feedback from motor controllers supporting this feature. These inputs are NOT 5V 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;
&lt;br /&gt;
DETAILS &amp;gt; [[DB15M]]&lt;br /&gt;
&lt;br /&gt;
** Steering Header (RJ45): &lt;br /&gt;
*** Two sets of pins to support analog potentiometers (5v, signal input, ground) giving angle of front wheels&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;
*** Two relay outputs to solenoids: on/off and 12/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 accepts 12V, and its USB port may be connected to a typical USB power supply. The 12V is provided by a DC-DC converter from the main battery (36 to 50V).&lt;br /&gt;
&lt;br /&gt;
==Image: [[File:LowLevel.JPG|1000px]] ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[High Level]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=LowLevel v2.1 PCB =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Functionality: ==&lt;br /&gt;
&lt;br /&gt;
* Version 2.1 used UART serial connections to other boards instead of the CAN bus. 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;
&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. (Digital urn sensors were never implemented.)&lt;br /&gt;
** X4 (ODO): Cyclometer (reed switch) input jack.    Board layout was incorrect. This signal needs to be jumpered to Arduino pin D2.&lt;br /&gt;
** JP9 (8 pin): Joystick analog input signals. &lt;br /&gt;
** JP12 (3 pin): Pulse output signal to steer.  &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 used to interface the RC receiver.&lt;br /&gt;
** Adds one CANbus interface on a DE-9F socket. For legacy compatibility UART serial is be available on this interface as well.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=LowLevel v1.0 PCB =&lt;br /&gt;
&lt;br /&gt;
* The first version of the LLB was called MegaShieldDB. It had similar functionality, but different connectors. It had five DB connectors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[High Level]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Simulator&amp;diff=239</id>
		<title>Simulator</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Simulator&amp;diff=239"/>
		<updated>2019-08-03T21:22:12Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Elcano Carla Simulation External Specification =&lt;br /&gt;
&lt;br /&gt;
CARLA &amp;lt;http://carla.org/&amp;gt; is an open-source driving simulator. During Q4 2019 we will be developing a  go-between circuit board to transfer data between CARLA simulation and the sensor slots of the Elcano hardware. The CARLA software allows users to emulate trike parameters under controlled conditions within a virtual world, providing an efficient system for testing sensor behavior, design implementation, and benchmarking overall vehicle progression. The CARLA software can simulate a variety of road conditions such as traffic patterns, inclines, and weather as well as provide users control over vehicle parameters including weight, engine power, and aerodynamic properties.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A go-between circuit board will transfer data from vehicle systems to CARLA under a variety of test conditions, enabling the software to replicate responses and return sensor data to be reevaluated for accuracy. Connecting the simulation software to components on both the high and low level boards of the Elcano trike including lidar, sonar, throttle, and brake systems, will allow users to immediately see the results of adjustments to vehicle parameters and highlight physical aspects of the trike within the virtual simulation. This project will enable users to efficiently implement improvements and track the immediate effects of design changes without spending the time and resources it would take to transport or operate the trike in real world test scenarios. It enables developers to improve the software without needing to invest in a vehicle.&lt;br /&gt;
&lt;br /&gt;
[[File:Full_Block_Diagram.JPG|1000px]]&lt;br /&gt;
&lt;br /&gt;
== How to Set-up ==&lt;br /&gt;
&lt;br /&gt;
The components involved in the simulation of the Elcano trike vehicle will be a computer running an instance of CARLA along with our framework and any additional user scripts along with a go-between board to direct data from the trike system to CARLA and back. The flow of data between components can be seen in the project block diagram. The following is an overview of the simulation equipment and necessary connections to be made.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Hardware''' &lt;br /&gt;
* A computer with a mid level graphics card and a display monitor.&lt;br /&gt;
* The computer should have the latest stable version of CARLA installed and be able to run it at an acceptable level of performance.&lt;br /&gt;
* The computer should have Elcano test framework installed.&lt;br /&gt;
* Parallel cable&lt;br /&gt;
* Go-between board (Type of board TBD)&lt;br /&gt;
* Elcano circuit boards.&lt;br /&gt;
* Wires.&lt;br /&gt;
&lt;br /&gt;
'''Software''' &lt;br /&gt;
* CARLA Simulator&lt;br /&gt;
* Framework to manage the trike model along with manipulating and transporting data between the board and the simulator.&lt;br /&gt;
* User scripts defining whatever conditions will be added to the simulation&lt;br /&gt;
* Standard Elcano software runs on microcontrollers.&lt;br /&gt;
&lt;br /&gt;
== CARLA User Guide ==&lt;br /&gt;
&lt;br /&gt;
* Connect the USB port on the computer to the one on the go-between board&lt;br /&gt;
&lt;br /&gt;
* Wire the go-between board to the CAN bus and whatever sensors you would like to replace with simulation input&lt;br /&gt;
&lt;br /&gt;
* Attach the output from the low level board to the go-between board&lt;br /&gt;
&lt;br /&gt;
* Run CARLAUE4.exe to spawn a new instance of the CARLA Simulator&lt;br /&gt;
&lt;br /&gt;
* (Optional) open trike.py and under the line “##TRIKE ATTRIBUTES” adjust or add any of the attributes in the CARLA Trike Model on the wiki to the object    assigned to the “trikeControl” object&lt;br /&gt;
&lt;br /&gt;
* Open a new command window&lt;br /&gt;
&lt;br /&gt;
* Run framework.py &lt;br /&gt;
&lt;br /&gt;
* Follow the prompt to insert the trike into the simulation&lt;br /&gt;
&lt;br /&gt;
* (Optional) Provide a logging file that will contain the output sensor data from the simulation&lt;br /&gt;
&lt;br /&gt;
* The trike will now await actuating control inputs from the parallel port while outputting the sensor data along the same port as well as to the log file if enabled&lt;br /&gt;
&lt;br /&gt;
* Open a new command window and run whatever CARLA scripts you would like to test the trike with for example “dynamic_weather.py” included in the CARLA        examples will enable different dynamic weather patterns at random within the simulation&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=214</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=214"/>
		<updated>2019-07-23T19:15:37Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &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;
== [[ Simulator]] ==&lt;br /&gt;
Using Open-source CARLA platform with a go-between board allows simulation.&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>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Communication&amp;diff=213</id>
		<title>Communication</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Communication&amp;diff=213"/>
		<updated>2019-07-12T19:43:26Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Added introduction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Elcano CAN Commands==&lt;br /&gt;
&lt;br /&gt;
=== Introduction ===&lt;br /&gt;
&lt;br /&gt;
Controller Area Network (CAN) is a standard introduced by Bosch in the 1980s. It is widely used to link automotive microprocessors and is required on all cars sold in North America and Europe. Physically there are four wires: Ground, 12V, CanHi and CanLo. A dominant bit has a significant difference between CanHi and CanLo; for a recessive bit the two lines are essentially the same. The interesting parts of a CAN packet are given in the table. The message ID is 11 bits, with low numbers getting priority. A CAN packet contains 0 to 8 bytes of data. The size of a CAN packet is larger, since CAN has significant error detection capability. CAN is a host-less network with most of the work done in hardware.&lt;br /&gt;
&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>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=ActuatorPage&amp;diff=205</id>
		<title>ActuatorPage</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=ActuatorPage&amp;diff=205"/>
		<updated>2019-07-10T16:04:49Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* Rotary servos */&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;
# 4 inch or 6&amp;quot; linear steering servo (Catrikes) or rotary servo (ELF)&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;
== Drive System ==&lt;br /&gt;
&lt;br /&gt;
The Catrikes have no pedaling or chain. The vehicle is powered by a hub motor.&lt;br /&gt;
&lt;br /&gt;
The ELF has two chains. One is driven by pedaling and the other by an electric motor. Both chains have freewheels, so they do not interfere with each other.&lt;br /&gt;
&lt;br /&gt;
The electric motor is powered by an e-bike controller. The ELF uses a Kelly controller. The Catrikes are scheduled to be upgraded to the same controller:  https://www.kellycontroller.com/shop/kbs-e/&lt;br /&gt;
&lt;br /&gt;
The e-bike controller converts the main voltage (36 or 48V) from DC to three phase to power the motor. The power can draw 25 or 30 Amp and is potentially lethal. Interface to the e-bike controller is an analog signal from the low-level board that gives the throttle.&lt;br /&gt;
&lt;br /&gt;
The Kelly e-bike controller has some additional functionality that has not yet been used:&lt;br /&gt;
&lt;br /&gt;
-- There are phase signals from the hub motor that offer finer speed and position control since the signal occurs about 20 times per wheel revolution instead of the current once per revolution.&lt;br /&gt;
&lt;br /&gt;
-- It is possible to do regenerative braking.&lt;br /&gt;
&lt;br /&gt;
-- The controller supports driving the wheel in reverse.&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. More details on [[SteeringSensor]].&lt;br /&gt;
&lt;br /&gt;
=== Linear servos ===&lt;br /&gt;
&lt;br /&gt;
The linear steering servo on the Catrikes https://www.servocity.com/hdls-6-2-12v  has 25 lb. thrust with  6&amp;quot; throw. In the past we have used 4&amp;quot; throw. A more suitable part may be https://www.servocity.com/motors-actuators/linear-actuators/heavy-duty-linear-actuators. The servo is powered by a pulse signal. The actuator would be powered by a relay to give it either +12V or -12V and use angle feedback to stop motion. Using the actuator requires hardware and software changes.&lt;br /&gt;
&lt;br /&gt;
The steering servo or 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. &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;
=== Servo Problems ===&lt;br /&gt;
&lt;br /&gt;
It is important to note that under certain circumstances the servo can critically damage itself. It is a $300 part and we have had ten of them fail. Most of the failed servos were used for braking; this poor performance was the motivation for changing to the solenoid braking system. It appears that the servo 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. The low-level firmware (early 2019) has been adapted to perform this, with an optional external relay board.&lt;br /&gt;
&lt;br /&gt;
Ben Rockhold (December 2018) wrote: &lt;br /&gt;
&lt;br /&gt;
So, worth noting that the linear actuators claim a duty cycle of 25%. I’ve just identified the driver chip, which has a duty cycle of 20% at 2A — with no thermal shutdown or safety. If you use the actuator continuously, it will just die. The driver is the Toshiba TB6612FNG, available from digikey.com TB6612FNG,C,8,EL Toshiba Semiconductor and Storage | Integrated Circuits (ICs) | DigiKeyMotor Driver Power MOSFET Parallel 24-SSOP&lt;br /&gt;
&lt;br /&gt;
Thinking about this some more; once we’re using a PID we can use the deltas — cap them to prevent long distance moves, and add them to an accumulator to keep track of total distance commanded. If the accumulator fills, we enter an error state and can’t steer. Then reduce the accumulator at a fixed rate, so that steering availability returns over time … or, probably easier… we could just use a different motor driver. Wire the driver to the DC motor in the servo that failed, and use the external feedback instead of the potentiometer inside the actuator. &lt;br /&gt;
&lt;br /&gt;
=== Rotary servos ===&lt;br /&gt;
&lt;br /&gt;
The ELF uses a i00600 Torxis rotary servo.&lt;br /&gt;
&lt;br /&gt;
https://www.pololu.com/product/1390&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 height 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;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[Board Diagrams]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=ActuatorPage&amp;diff=204</id>
		<title>ActuatorPage</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=ActuatorPage&amp;diff=204"/>
		<updated>2019-07-10T15:53:00Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* Drive System */&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;
# 4 inch or 6&amp;quot; linear steering servo (Catrikes) or rotary servo (ELF)&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;
== Drive System ==&lt;br /&gt;
&lt;br /&gt;
The Catrikes have no pedaling or chain. The vehicle is powered by a hub motor.&lt;br /&gt;
&lt;br /&gt;
The ELF has two chains. One is driven by pedaling and the other by an electric motor. Both chains have freewheels, so they do not interfere with each other.&lt;br /&gt;
&lt;br /&gt;
The electric motor is powered by an e-bike controller. The ELF uses a Kelly controller. The Catrikes are scheduled to be upgraded to the same controller:  https://www.kellycontroller.com/shop/kbs-e/&lt;br /&gt;
&lt;br /&gt;
The e-bike controller converts the main voltage (36 or 48V) from DC to three phase to power the motor. The power can draw 25 or 30 Amp and is potentially lethal. Interface to the e-bike controller is an analog signal from the low-level board that gives the throttle.&lt;br /&gt;
&lt;br /&gt;
The Kelly e-bike controller has some additional functionality that has not yet been used:&lt;br /&gt;
&lt;br /&gt;
-- There are phase signals from the hub motor that offer finer speed and position control since the signal occurs about 20 times per wheel revolution instead of the current once per revolution.&lt;br /&gt;
&lt;br /&gt;
-- It is possible to do regenerative braking.&lt;br /&gt;
&lt;br /&gt;
-- The controller supports driving the wheel in reverse.&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. More details on [[SteeringSensor]].&lt;br /&gt;
&lt;br /&gt;
=== Linear servos ===&lt;br /&gt;
&lt;br /&gt;
The linear steering servo on the Catrikes https://www.servocity.com/hdls-6-2-12v  has 25 lb. thrust with  6&amp;quot; throw. In the past we have used 4&amp;quot; throw. A more suitable part may be https://www.servocity.com/motors-actuators/linear-actuators/heavy-duty-linear-actuators. The servo is powered by a pulse signal. The actuator would be powered by a relay to give it either +12V or -12V and use angle feedback to stop motion. Using the actuator requires hardware and software changes.&lt;br /&gt;
&lt;br /&gt;
The steering servo or 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. &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;
=== Servo Problems ===&lt;br /&gt;
&lt;br /&gt;
It is important to note that under certain circumstances the servo can critically damage itself. It is a $300 part and we have had ten of them fail. Most of the failed servos were used for braking; this poor performance was the motivation for changing to the solenoid braking system. It appears that the servo 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. The low-level firmware (early 2019) has been adapted to perform this, with an optional external relay board.&lt;br /&gt;
&lt;br /&gt;
Ben Rockhold (December 2018) wrote: &lt;br /&gt;
&lt;br /&gt;
So, worth noting that the linear actuators claim a duty cycle of 25%. I’ve just identified the driver chip, which has a duty cycle of 20% at 2A — with no thermal shutdown or safety. If you use the actuator continuously, it will just die. The driver is the Toshiba TB6612FNG, available from digikey.com TB6612FNG,C,8,EL Toshiba Semiconductor and Storage | Integrated Circuits (ICs) | DigiKeyMotor Driver Power MOSFET Parallel 24-SSOP&lt;br /&gt;
&lt;br /&gt;
Thinking about this some more; once we’re using a PID we can use the deltas — cap them to prevent long distance moves, and add them to an accumulator to keep track of total distance commanded. If the accumulator fills, we enter an error state and can’t steer. Then reduce the accumulator at a fixed rate, so that steering availability returns over time … or, probably easier… we could just use a different motor driver. Wire the driver to the DC motor in the servo that failed, and use the external feedback instead of the potentiometer inside the actuator. &lt;br /&gt;
&lt;br /&gt;
=== Rotary servos ===&lt;br /&gt;
&lt;br /&gt;
The ELF uses a rotary actuator.&lt;br /&gt;
&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 height 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;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[Board Diagrams]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=ActuatorPage&amp;diff=203</id>
		<title>ActuatorPage</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=ActuatorPage&amp;diff=203"/>
		<updated>2019-07-10T15:35:31Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Added Ben's information on steering servos.&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;
# 4 inch or 6&amp;quot; linear steering servo (Catrikes) or rotary servo (ELF)&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;
== Drive System ==&lt;br /&gt;
&lt;br /&gt;
The Catrikes have no pedaling or chain. The vehicle is powered by a hub motor.&lt;br /&gt;
&lt;br /&gt;
The ELF has two chains. One is driven by pedaling and the other by an electric motor. Both chains have freewheels, so they do not interfere with each other.&lt;br /&gt;
&lt;br /&gt;
The electric motor is powered by an e-bike controller.&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. More details on [[SteeringSensor]].&lt;br /&gt;
&lt;br /&gt;
=== Linear servos ===&lt;br /&gt;
&lt;br /&gt;
The linear steering servo on the Catrikes https://www.servocity.com/hdls-6-2-12v  has 25 lb. thrust with  6&amp;quot; throw. In the past we have used 4&amp;quot; throw. A more suitable part may be https://www.servocity.com/motors-actuators/linear-actuators/heavy-duty-linear-actuators. The servo is powered by a pulse signal. The actuator would be powered by a relay to give it either +12V or -12V and use angle feedback to stop motion. Using the actuator requires hardware and software changes.&lt;br /&gt;
&lt;br /&gt;
The steering servo or 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. &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;
=== Servo Problems ===&lt;br /&gt;
&lt;br /&gt;
It is important to note that under certain circumstances the servo can critically damage itself. It is a $300 part and we have had ten of them fail. Most of the failed servos were used for braking; this poor performance was the motivation for changing to the solenoid braking system. It appears that the servo 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. The low-level firmware (early 2019) has been adapted to perform this, with an optional external relay board.&lt;br /&gt;
&lt;br /&gt;
Ben Rockhold (December 2018) wrote: &lt;br /&gt;
&lt;br /&gt;
So, worth noting that the linear actuators claim a duty cycle of 25%. I’ve just identified the driver chip, which has a duty cycle of 20% at 2A — with no thermal shutdown or safety. If you use the actuator continuously, it will just die. The driver is the Toshiba TB6612FNG, available from digikey.com TB6612FNG,C,8,EL Toshiba Semiconductor and Storage | Integrated Circuits (ICs) | DigiKeyMotor Driver Power MOSFET Parallel 24-SSOP&lt;br /&gt;
&lt;br /&gt;
Thinking about this some more; once we’re using a PID we can use the deltas — cap them to prevent long distance moves, and add them to an accumulator to keep track of total distance commanded. If the accumulator fills, we enter an error state and can’t steer. Then reduce the accumulator at a fixed rate, so that steering availability returns over time … or, probably easier… we could just use a different motor driver. Wire the driver to the DC motor in the servo that failed, and use the external feedback instead of the potentiometer inside the actuator. &lt;br /&gt;
&lt;br /&gt;
=== Rotary servos ===&lt;br /&gt;
&lt;br /&gt;
The ELF uses a rotary actuator.&lt;br /&gt;
&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 height 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;br /&gt;
&lt;br /&gt;
NEXT &amp;gt; [[Board Diagrams]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=202</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=202"/>
		<updated>2019-07-10T14:52:05Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* Steering */&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;
== [[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>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=201</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Main_Page&amp;diff=201"/>
		<updated>2019-07-10T14:51:04Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: /* SensorsPage */&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;
== [[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;
=== [[Steering]] ===&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>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Board_Diagrams&amp;diff=190</id>
		<title>Board Diagrams</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Board_Diagrams&amp;diff=190"/>
		<updated>2019-07-02T00:22:25Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: Added links to CAD files on GitHub.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Board Schematics =&lt;br /&gt;
&lt;br /&gt;
== Low Level Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[LowLevelBoard]]&lt;br /&gt;
&lt;br /&gt;
* Photo &amp;gt; [[Low Level]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files: https://github.com/elcano/elcano/tree/master/Electronics/Low%20Level%20v3 &lt;br /&gt;
&lt;br /&gt;
* Should be migrated to: https://github.com/elcano/LowLevel/Electronics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:LowLevelV3.1_A.png]]&lt;br /&gt;
[[File:LowLevelV3.1_B.png]]&lt;br /&gt;
[[File:LowLevelV3.1_C.png]]&lt;br /&gt;
[[File:LowLevelV3.1_brd.png]]&lt;br /&gt;
&lt;br /&gt;
== High Level Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[HighLevelHWv3]]&lt;br /&gt;
&lt;br /&gt;
* Photo &amp;gt; [[High Level]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files:  https://github.com/elcano/elcano/tree/master/Electronics/High%20Level &lt;br /&gt;
&lt;br /&gt;
* Should be migrated to:  https://github.com/elcano/HighLevel/Electronics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:High-Level PCB v3.0.png]]&lt;br /&gt;
[[File:High-Level PCB v3.0_brd.png]]&lt;br /&gt;
&lt;br /&gt;
== Sonar Array Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation and photo &amp;gt; [[Sonar]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files on https://github.com/elcano/Sonar/tree/master/Electronics &lt;br /&gt;
&lt;br /&gt;
[[File:SonarBoardV2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:SonarBoardV2_brd.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transceiver Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[RemoteControl]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files coming soon to:  https://github.com/elcano/Transceiver &lt;br /&gt;
&lt;br /&gt;
== PowerOn Board ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Documentation and photo &amp;gt; [[Power System]]&lt;br /&gt;
&lt;br /&gt;
* Eagle CAD files:  https://github.com/elcano/elcano/tree/master/Electronics &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOn.png]]&lt;br /&gt;
&lt;br /&gt;
Cuts and jumpers to just use Kelly power-on circuit and DC-DC converters&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOnOnly.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOn_brd.png]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
	<entry>
		<id>https://www.elcanoproject.org/wiki/index.php?title=Board_Diagrams&amp;diff=189</id>
		<title>Board Diagrams</title>
		<link rel="alternate" type="text/html" href="https://www.elcanoproject.org/wiki/index.php?title=Board_Diagrams&amp;diff=189"/>
		<updated>2019-07-01T23:57:38Z</updated>

		<summary type="html">&lt;p&gt;Tfolsom: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Board Schematics =&lt;br /&gt;
&lt;br /&gt;
== Low Level Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[LowLevelBoard]]&lt;br /&gt;
&lt;br /&gt;
* Photo &amp;gt; [[Low Level]]&lt;br /&gt;
&lt;br /&gt;
[[File:LowLevelV3.1_A.png]]&lt;br /&gt;
[[File:LowLevelV3.1_B.png]]&lt;br /&gt;
[[File:LowLevelV3.1_C.png]]&lt;br /&gt;
[[File:LowLevelV3.1_brd.png]]&lt;br /&gt;
&lt;br /&gt;
== High Level Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[HighLevelHWv3]]&lt;br /&gt;
&lt;br /&gt;
* Photo &amp;gt; [[High Level]]&lt;br /&gt;
&lt;br /&gt;
[[File:High-Level PCB v3.0.png]]&lt;br /&gt;
[[File:High-Level PCB v3.0_brd.png]]&lt;br /&gt;
&lt;br /&gt;
== Sonar Array Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[Sonar]]&lt;br /&gt;
&lt;br /&gt;
CAD files on https://github.com/elcano/Sonar/tree/master/Electronics &lt;br /&gt;
&lt;br /&gt;
[[File:SonarBoardV2.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:SonarBoardV2_brd.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Transceiver Board ==&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[RemoteControl]]&lt;br /&gt;
&lt;br /&gt;
== PowerOn Board ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Documentation &amp;gt; [[Power System]]&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOn.png]]&lt;br /&gt;
&lt;br /&gt;
Cuts and jumpers to just use Kelly power-on circuit and DC-DC converters&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOnOnly.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:PowerOn_brd.png]]&lt;/div&gt;</summary>
		<author><name>Tfolsom</name></author>
		
	</entry>
</feed>