<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 11 (filtered medium)">
<style>
<!--
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman";}
a:link, span.MsoHyperlink
        {color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:Arial;
        color:windowtext;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
div.Section1
        {page:Section1;}
-->
</style>
</head>
<body lang=EN-US link=blue vlink=purple>
<div class=Section1>
<p class=MsoNormal><font size=2 face=Arial><span style='font-size:10.0pt;
font-family:Arial'>I used a Traxxas E-Max with stiffer springs and replacement
gears to get the lowest ratio possible. The stock motor controller was
not able to provide good control at low speeds so I replaced it with a Parallax
HB-25. The HB-25 is easy to control and just works. Navigation
relies on an encoder to provide distance and a compass to provide
direction. After calculating the robot’s X, Y, and direction, the
perpendicular distance to the current path is calculated. A steering
command is calculated to bring the robot back to the line segment (sort of a P control
that could use an I term). Speed control is also a simple proportional
error feedback control. To mount the encoder I used a short section of
aluminum tubing that was close to a press fit to the short nub of the motor
shaft on the rear of the motor. Loctite was used to make sure the tube
stays on. The external diameter of the tube 1/8” matches a U.S.
Digital encoder. A 100 count per revolution encoder on the motor shaft
results in a high encoder frequency, but the Propeller chip has no problem with
it. The CMPS03 compass is one that I had. It has serious
limitations because it is not tilt compensated. In testing at home it is
also strongly affected by buried pipes. One partial solution would be to mount
the compass higher. Another partial solution would be better software and
a rate gyro. If I have commanded the robot to drive straight and the
compass shows a turn, I should use the information that I am driving
straight. Likewise, if the compass and the rate gyro differ, that
information could be used. One way to combine the three sources of
information would be a Kalman filter, but I don’t understand Kalman
filters that well yet. A simpler approach would be to just ignore the
compass if it differs too much from the turn command or rate gyro. I am
debating what I will replace the CMPS03 with. A tilt compensated compass is
about $300. SparkFun has a 6 axis IMU for $500, but it has no software. Honeywell
has a tilt compensated compass with a rate gyro (price unknown). Of
course the “gold standard” is the MicroStrain sensor that JBot and
Tarzan used. I recently added an XBee board to send logging data to
a PC. Some sort of logging (send via RF or store for post run download)
is essential. The microprocessor used was a Parallax Propeller. I
did all of my programming in Spin. Parallax provided assembly language
objects for floating point math (I may rewrite for integer math if I need more
computing resources), servo control, and reading encoders. A big mistake
was powering the steering servo from regulated 5 volt power. The voltage
drop on short turns caused the sonar sensors to reset and only report 2^16-1
centimeters. That killed my ability to try challenge 3.<o:p></o:p></span></font></p>
</div>
</body>
</html>