<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0UCR3k5fCp7ImA9WhBaEUU.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452</id><updated>2013-05-21T20:21:06.724-06:00</updated><category term="logging" /><category term="arm" /><category term="microrobot" /><category term="tubes" /><category term="laser" /><category term="sonar" /><category term="control" /><category term="logic analyzer" /><category term="oscilloscope" /><category term="firefighting" /><category term="tools" /><category term="display" /><category term="books" /><category term="SPICE" /><category term="encoders" /><category term="low power" /><category term="line-follower" /><category term="SPI" /><category term="Pyoony" /><category term="basic stamp" /><category term="pwm" /><category term="edward isaac bot" /><category term="applescript" /><category term="test" /><category term="audio" /><category term="obstacle avoidance" /><category term="prototyping" /><category term="Arduino" /><category term="sensors" /><category term="motor control" /><category term="hexapod" /><category term="sketchbook" /><category term="JeeNode" /><category term="power supply" /><category term="RaspberryPi" /><category term="transistor" /><category term="orangutan" /><category term="Pokey" /><category term="PCB fabrication" /><category term="Squeaky" /><category term="beam robotics" /><category term="Android" /><category term="SMT" /><category term="systems engineering" /><category term="linux" /><category term="driver" /><category term="MCU" /><category term="serial" /><category term="Eagle" /><category term="navigation" /><category term="walker" /><category term="vision" /><category term="speech synthesis" /><category term="Propeller" /><category term="drivetrain" /><category term="tips and tricks" /><category term="sparky" /><category term="Spunky" /><category term="store" /><category term="mac os x" /><category term="dsPIC" /><category term="PCB layout" /><category term="i2c" /><category term="servo" /><category term="remote control" /><category term="source" /><category term="Wiimote" /><category term="bluetooth" /><category term="mbed" /><category term="wireless" /><category term="software" /><category term="tgimboej" /><category term="gyro" /><category term="GPS" /><category term="human robot interaction" /><category term="FIRST" /><category term="RS-232" /><category term="MSP430" /><category term="actuators" /><category term="avr" /><category term="Sparkfun AVC" /><title>Bot Thoughts</title><subtitle type="html">A blog of robotics, electronics, mechanics, programming, and engineering. &lt;br&gt;Pictures, source code, circuit diagrams, ideas, thoughts, drawings, sketches and real-life goofups.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.bot-thoughts.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>346</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/BotThoughts" /><feedburner:info uri="botthoughts" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>39.607386</geo:lat><geo:long>-104.958057</geo:long><logo>http://www.bot-thoughts.com/favicon.ico</logo><feedburner:emailServiceId>BotThoughts</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;CEcNRXkzcSp7ImA9WhBaEUo.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-4953027663989209975</id><published>2013-05-21T15:34:00.004-06:00</published><updated>2013-05-21T15:34:54.789-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-21T15:34:54.789-06:00</app:edited><title>Data Bus Baseboard on Tindie</title><content type="html">Data Bus mbed baseboards are now&amp;nbsp;&lt;a href="https://www.tindie.com/products/bot_thoughts/autonomous-rover-baseboard-for-mbed/"&gt;available on Tindie as a fundraiser&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
I figured there may be a few others who want to experiment with their own algorithms on a powerful 96MHz ARM processor and want a head start on building their 2014 AVC ground vehicle entry.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-IYfdEbaK4Kc/UZvoLVtngSI/AAAAAAAAI7Q/XVEJbVpLK5g/s1600/DataBusBaseboard.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-IYfdEbaK4Kc/UZvoLVtngSI/AAAAAAAAI7Q/XVEJbVpLK5g/s1600/DataBusBaseboard.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;Now you can build your own autonomous rover!&lt;br /&gt;
&lt;br /&gt;
Features&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Three UART ports, one 3.3V, two 5V, series resistor protection&lt;/li&gt;
&lt;li&gt;Five I2C ports, all 3.3V&lt;/li&gt;
&lt;li&gt;ESC and steering Servo connector&lt;/li&gt;
&lt;li&gt;Dual wheel encoder port&lt;/li&gt;
&lt;li&gt;Onboard 5V regulator powered by ESC 6V BEC powers 5V UARTs&lt;/li&gt;
&lt;li&gt;Separate mbed supply rail to keep noise out of your GPS.&lt;/li&gt;
&lt;li&gt;Filtering / bypass caps&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Just get an mbed, load it up with my code (&amp;nbsp;and here), add an L3G4200D gyro, Venus or uBlox GPS, wheel encoders.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://code.google.com/p/bot-thoughts-ugv/"&gt;Data Bus source code repository&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://mbed.org/users/shimniok/code/AVC_2012/"&gt;AVC2012 code on mbed.org&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=GhrUm40b0JI:QOr6FJxfPJo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=GhrUm40b0JI:QOr6FJxfPJo:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=GhrUm40b0JI:QOr6FJxfPJo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=GhrUm40b0JI:QOr6FJxfPJo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=GhrUm40b0JI:QOr6FJxfPJo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=GhrUm40b0JI:QOr6FJxfPJo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/GhrUm40b0JI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/4953027663989209975/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/05/data-bus-baseboard-on-tindie.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4953027663989209975?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4953027663989209975?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/GhrUm40b0JI/data-bus-baseboard-on-tindie.html" title="Data Bus Baseboard on Tindie" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-IYfdEbaK4Kc/UZvoLVtngSI/AAAAAAAAI7Q/XVEJbVpLK5g/s72-c/DataBusBaseboard.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/05/data-bus-baseboard-on-tindie.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYMSHoyeyp7ImA9WhBbGEw.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-3870567928940013585</id><published>2013-05-17T12:00:00.000-06:00</published><updated>2013-05-17T12:59:49.493-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-17T12:59:49.493-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sparkfun AVC" /><category scheme="http://www.blogger.com/atom/ns#" term="GPS" /><title>Noise and the 3DR uBlox LEA-6 GPS</title><content type="html">&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-bPIuyLcWIQI/UZZl3h7kfXI/AAAAAAAAI6o/qM0sM5t_F6M/s1600/Photo+May+17%252C+8+32+32+AM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-bPIuyLcWIQI/UZZl3h7kfXI/AAAAAAAAI6o/qM0sM5t_F6M/s400/Photo+May+17%252C+8+32+32+AM.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;3DR uBlox LEA-6 GPS + secret sauce&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
I'm evaluating a 3DR uBlox LEA-6 GPS for use on Data Bus to either replace or supplement its current module, the Venus 638FLPX.&lt;br /&gt;
&lt;br /&gt;
At first the GPS could not obtain a fix. Here's how I brought the GPS from no fix to a 10-satellite fix. From my basement!&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Wayne H (2012 and 2013 AVC competitor) put together sample code and wrote an evaluation on &lt;a href="https://sites.google.com/site/wayneholder/self-driving-car---part/evaluating-the-3dr-ublox-lea-6-gps"&gt;his website&lt;/a&gt;. I ported his code from Arduino to mbed (&lt;a href="http://mbed.org/users/shimniok/code/ublox_demo/"&gt;http://mbed.org/users/shimniok/code/ublox_demo/&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
The code works great, but I and immediately ran into problems with RF interference. The GPS could not get a fix.&lt;br /&gt;
&lt;br /&gt;
Even taking it outside, it would lose fix going under a tree or in the garage. By contrast my Venus can get a 8-9 satellite lock in my basement with ease. Indoors, basements, garages, all a cakewalk for modern highly sensitive GPS receivers. Like the uBlox. So what gives?&lt;br /&gt;
&lt;br /&gt;
Experimentation revealed that the GPS would work fine directly off an FTDI breakout board, and would also work fine when connected to my Arduino Pro. Anytime it was powered off Data Bus' mbed baseboard, no joy.&lt;br /&gt;
&lt;br /&gt;
In fact, I could power it off the baseboard without the mbed plugged in and it would work. The mbed was the source of some type of interference.&lt;br /&gt;
&lt;br /&gt;
I tried various combinations of...&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;RC-filtering the power supply on the baseboard and GPS end&lt;/li&gt;
&lt;li&gt;Ferrite bead on both, then only one power line.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;470uF bypass cap on the baseboard&lt;/li&gt;
&lt;li&gt;power GPS off the second regulator supply line&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Then I built a 5V linear regulator using one of my &lt;a href="https://www.tindie.com/products/bot_thoughts/eezee-power/"&gt;eeZee Power&lt;/a&gt; boards and a 5V NCP1117 chip I had laying around.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-x0Yo9-UhuTA/UZZlwORNhOI/AAAAAAAAI6g/Fzqj-0OP54U/s1600/Photo+May+17%252C+8+31+52+AM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-x0Yo9-UhuTA/UZZlwORNhOI/AAAAAAAAI6g/Fzqj-0OP54U/s400/Photo+May+17%252C+8+31+52+AM.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Purple eeZee Power board with 5V regulator&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
I discovered that the GPS would work with the mbed plugged in, provided the GPS TX/RX lines weren't connected to the mbed!&lt;br /&gt;
&lt;br /&gt;
A trip to Radio Shack scored some RF snap choke cores (p/n 273-0069) around which I wrapped the GPS TX line several times. That did the trick.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-l_p2jQm2ds0/UZZlxg3Y45I/AAAAAAAAI6c/XwgBf4CVeIw/s1600/Photo+May+17%252C+8+32+26+AM_v1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="273" src="http://2.bp.blogspot.com/-l_p2jQm2ds0/UZZlxg3Y45I/AAAAAAAAI6c/XwgBf4CVeIw/s400/Photo+May+17%252C+8+32+26+AM_v1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Eight wraps around a choke for RX and TX&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
My old trick of using a square of metal as a ground plane also improved reception and at one point I was tracking 10 satellites. In the basement!&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;NAV-STATUS: gpsFix = 3, dgpsFix&lt;br /&gt;NAV-POSLLH: lon = -104.9330273, lat = 39.5976185, vAcc = 2964 mm, hAcc = 2015 mm&lt;br /&gt;NAV-SOL:&amp;nbsp;&amp;nbsp;&amp;nbsp; week = 1740, gpsFix = , pDOP = 1.6, pAcc = 359 cm, &lt;span style="color: red;"&gt;numSV = 10&lt;/span&gt;&lt;br /&gt;NAV-SVINFO: channels = 16&lt;br /&gt;&amp;nbsp; id =&amp;nbsp;&amp;nbsp; 3 (30) ******&lt;br /&gt;&amp;nbsp; id =&amp;nbsp;&amp;nbsp; 4 ( 0) &lt;br /&gt;&amp;nbsp; id =&amp;nbsp;&amp;nbsp; 6 (23) ****&lt;br /&gt;&amp;nbsp; id =&amp;nbsp;&amp;nbsp; 7 (28) *****&lt;br /&gt;&amp;nbsp; id =&amp;nbsp; 10 (17) ***&lt;br /&gt;&amp;nbsp; id =&amp;nbsp; 13 (37) *******&lt;br /&gt;&amp;nbsp; id =&amp;nbsp; 16 (25) *****&lt;br /&gt;&amp;nbsp; id =&amp;nbsp; 20 (40) ********&lt;br /&gt;&amp;nbsp; id =&amp;nbsp; 23 (40) ********&lt;br /&gt;&amp;nbsp; id =&amp;nbsp; 27 ( 0) &lt;br /&gt;&amp;nbsp; id =&amp;nbsp; 30 (20) ****&lt;br /&gt;&amp;nbsp; id =&amp;nbsp; 31 (19) ***&lt;br /&gt;&amp;nbsp; id =&amp;nbsp; 32 (31) ******&lt;br /&gt;&amp;nbsp; id = 133 (27) *****&lt;br /&gt;&amp;nbsp; id = 134 ( 0) &lt;br /&gt;&amp;nbsp; id = 138 (30) ******&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Not that it's pulling in 10 sats all the time. It's getting 8 almost always, and once I was up to 11.&lt;br /&gt;
&lt;br /&gt;
Clearly the chokes and dedicated linear power supply helped. I don't know why I didn't see these problems with the Venus board.&lt;br /&gt;
&lt;br /&gt;
But if you're trying to get a 3DR uBlox (or really any GPS) working and noise is a factor, now you know what to do.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=usjiPo6b0bs:GP2gSFY0Zm4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=usjiPo6b0bs:GP2gSFY0Zm4:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=usjiPo6b0bs:GP2gSFY0Zm4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=usjiPo6b0bs:GP2gSFY0Zm4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=usjiPo6b0bs:GP2gSFY0Zm4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=usjiPo6b0bs:GP2gSFY0Zm4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/usjiPo6b0bs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/3870567928940013585/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/05/noise-and-3dr-ublox-lea-6-gps.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/3870567928940013585?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/3870567928940013585?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/usjiPo6b0bs/noise-and-3dr-ublox-lea-6-gps.html" title="Noise and the 3DR uBlox LEA-6 GPS" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-bPIuyLcWIQI/UZZl3h7kfXI/AAAAAAAAI6o/qM0sM5t_F6M/s72-c/Photo+May+17%252C+8+32+32+AM.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/05/noise-and-3dr-ublox-lea-6-gps.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMERHw9eSp7ImA9WhBbFUg.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-6463037470278198147</id><published>2013-05-14T12:00:00.000-06:00</published><updated>2013-05-14T12:00:05.261-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-14T12:00:05.261-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sparkfun AVC" /><title>Ramp Jump Breaks Data Bus</title><content type="html">I built a ramp very similar to the one for the 2013 AVC so I could get a sense of how the robot will handle the jumps.&lt;br /&gt;
&lt;br /&gt;
Unfortunately I stripped out one of the plastic idler gears doing a high speed jump. I've got a metal set on order to arrive Friday.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-QBx6D08xf88/UZGgRPBdzMI/AAAAAAAAI5E/7bynfxcgyP4/s1600/Photo+May+13,+7+11+28+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-QBx6D08xf88/UZGgRPBdzMI/AAAAAAAAI5E/7bynfxcgyP4/s400/Photo+May+13,+7+11+28+PM.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Can you see the stripped teeth on the small idler gear?&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
I was hoping to test my revised path following algorithm. That'll have to wait until I replace the gear set. More on the path following algorithm soon.&lt;br /&gt;
&lt;br /&gt;
Just under four weeks left.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=ZskXvh0IZco:BsZ99XOtHdI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=ZskXvh0IZco:BsZ99XOtHdI:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=ZskXvh0IZco:BsZ99XOtHdI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=ZskXvh0IZco:BsZ99XOtHdI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=ZskXvh0IZco:BsZ99XOtHdI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=ZskXvh0IZco:BsZ99XOtHdI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/ZskXvh0IZco" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/6463037470278198147/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/05/ramp-jump-breaks-data-bus.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/6463037470278198147?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/6463037470278198147?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/ZskXvh0IZco/ramp-jump-breaks-data-bus.html" title="Ramp Jump Breaks Data Bus" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-QBx6D08xf88/UZGgRPBdzMI/AAAAAAAAI5E/7bynfxcgyP4/s72-c/Photo+May+13,+7+11+28+PM.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/05/ramp-jump-breaks-data-bus.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMEQHs9eSp7ImA9WhBbEU0.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-7784658942089945081</id><published>2013-05-09T07:00:00.000-06:00</published><updated>2013-05-09T07:00:01.561-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-09T07:00:01.561-06:00</app:edited><title>Reverse Engineering GM ECMs</title><content type="html">This is the tale of how I wrote a Perl disassembler for the Motorola 6801 CPU to learn how the fuel injection computer that I installed onto my Jeep works.&lt;br /&gt;
&lt;br /&gt;
Almost 200 pages of source code and data create code to run late-80's GM fuel injected engines. DIYers retrieved machine code, disassembled it, and reverse engineered code and hundreds of parameters 15 years ago.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://www.dropbox.com/s/u1gd4r7oydcw6o8/42%20Hack.pdf"&gt;Complete ASDZ Source for 1227747 (pdf)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ezEAdzLaSqY/UYpRHA9DboI/AAAAAAAAIzU/qMZZ9Fbh-NI/s1600/Photo+May+08,+12+06+37+AM.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="236" src="http://2.bp.blogspot.com/-ezEAdzLaSqY/UYpRHA9DboI/AAAAAAAAIzU/qMZZ9Fbh-NI/s320/Photo+May+08,+12+06+37+AM.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Inside a 1227747 GM ECM&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Fuel injection computers interface with fuel pump relays, fuel injectors, ignition modules, coolant, throttle, oxygen, and pressure sensors. They employ complex algorithms to properly meter fuel under myriad engine and environmental conditions.&lt;br /&gt;
&lt;br /&gt;
Only recently has my &lt;a href="http://tc.wagoneer.org/2013/05/tbi-tuning-spark.html"&gt;1986 Jeep Grand Wagoneer&lt;/a&gt; benefited from this technology when I &lt;a href="http://tc.wagoneer.org/search/label/TBI"&gt;retrofit&lt;/a&gt; an 80's GM 1227747 ECM, throttle body, and all the fixin's. While I use nice GUI software to tune the parameters, I wanted to peer into the code that is executed on a 1MHz Motorola 6800-family CPUs with a paucity of memory.&lt;br /&gt;
&lt;br /&gt;
On a whim I decided to write a disassembler in Perl with all the features that were lacking from other offerings. Plus, writing one is a great way to learn about a CPU.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://code.google.com/p/bot-thoughts-blog/source/browse/#svn%2Ftrunk%2FTBI"&gt;Source code repository&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
CPUs in the 6800 family are simple. They have two accumulator registers (A, B) and one index register (X) as well as a stack pointer (SP), and program counter (PC). A status, or condition code register (CCR) stores the status results of computation: carry, zero, overflow, and so on. The &lt;a href="http://en.wikipedia.org/wiki/MOS_Technology_6502"&gt;MOS 6502&lt;/a&gt; (Apple //e) and related &lt;a href="http://en.wikipedia.org/wiki/MOS_Technology_6510"&gt;MOS 6510&lt;/a&gt; (Commodore 64) are even simpler, designed as a low cost alternative by some of the same engineers.&lt;br /&gt;
&lt;h2&gt;
MC6800 Assembly&lt;/h2&gt;
Here's some assembly language from the GM ECM.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;"&gt;LDX #$D4D9 ; O2 SENS VOLTAGE BIAS FOR COLD OP'S TBL&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;"&gt;LDAA $00E3 ; START UP COOL&lt;br /&gt;COMA&lt;br /&gt;JSR $FB36 ; 2d LK UP, WITH UPPER LIMIT&lt;br /&gt;STAA $0055 ; SAVE o2 SENSOR VOLTAGE BIAS RESULT&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
In the example above,&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The mnemonic LDX loads the operand, the value 0xD4D9, indicated by the # prefix, into the index register X.&lt;/li&gt;
&lt;li&gt;Then, mnemonic LDAA loads the A accumulator with a value stored in memory location 0x00E3.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;COMA performs a binary complement on register A.&lt;/li&gt;
&lt;li&gt;JSR jumps to subroutine at location 0xFB36 in memory. After it returns, the result returned in the A register is stored to memory location 0x0055.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Mnemonics &lt;/h3&gt;
Assembly mnemonics represent simple instructions for the CPU to carry out. Operands like #$D4D9, $00E3, $FB36, and $0055 are addresses or values used by the instruction. They specify the addressing mode of the instruction.&lt;br /&gt;
&lt;h3&gt;
Addressing Modes&lt;/h3&gt;
The 6800 family instructions can have Immediate Mode (value) operands like #$D4D9, Direct Mode operands referring to the first 256 bytes in memory like $0055, Extended Mode operands that can reference any memory such as $FB36, and Index Mode operands which use the X register as a memory pointer, indicated by ",X" in assembly language. There's also relative addressing used for branch/jump operations. The operand specifies a relative address, positive or negative, to jump to. Inherent mode has no operand; the registers involved are implied, such as ABX, add B to X.&lt;br /&gt;
&lt;h2&gt;
Writing a Disassembler&lt;/h2&gt;
&lt;h3&gt;
Assembling&lt;/h3&gt;
When assembly language is assembled into machine code, the mnemonic and addressing mode determine the opcode to use. A given mnemonic has an associated opcode for each addressing mode. For example, ADDA is a mnemonic which can have immediate, direct, index, and extended addressing modes:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;ADDA #$04 becomes opcode 8B, operand 04&lt;/li&gt;
&lt;li&gt;ADDA $0004 becomes opcode 9B, operand 04&lt;/li&gt;
&lt;li&gt;ADDA $04,X becomes opcode AB, operand 04&lt;/li&gt;
&lt;li&gt;ADDA $4004 becomes opcode BB, operands 40 04&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Disassembly&lt;/h3&gt;
Disassembly is the process of converting machine code into assembly language. With the 6800 series, any given opcode may have up to 2 additional bytes for operands. A 6801/3 instruction set reference (&lt;a href="http://www.lucidtechnologies.info/6803_instr.pdf"&gt;pdf&lt;/a&gt;) provides information on how many bytes per opcode and what addressing mode is involved.&lt;br /&gt;
&lt;br /&gt;
So when disassembling 8B 04, one translates 8B to mnemonic ADDA, then expects a single byte afterwards, which is formatted as #$nn in this case #$04. To simplify this process and keep the code simple, I use a hashtable generated from a configuration file that lists all the opcodes and their mnemonics, number of bytes, and addressing mode. Here's an excerpt:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;"&gt;###################################&lt;br /&gt;# Accumulator and Memory operations&lt;br /&gt;###################################&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;"&gt;# Add to A&lt;br /&gt;8B,2,adda,immed&lt;br /&gt;9B,2,adda,direct&lt;br /&gt;AB,2,adda,index&lt;br /&gt;BB,3,adda,extend &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Formatting operand output is based entirely on the number of bytes and the addressing mode. For example, 8-bit immediate mode format is #$NN and 16-bit is #$NNNN.&lt;br /&gt;
&lt;h3&gt;
Relative Addressing&lt;/h3&gt;
A little extra challenge is provided by the relative addressing mode used by jump/branch instructions. The operand is a signed 8-bit integer representing the number of addresses before or after the address of the operand. The variable $a1 is read in as a signed value, then the absolute address is calculated:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: small;"&gt;my $calcAddr = $addr + 2 + $a1;&lt;/span&gt;&lt;br /&gt;
&lt;h3&gt;
Labels&lt;/h3&gt;
I wanted to automatically generate labels, which are assembly langauge conveniences that identify addresses and can be used by jump and branch instructions making code much easier to read and maintain. Here's &lt;a href="http://rosettacode.org/wiki/Loops/Infinite#6800_Assembly"&gt;an example from rosettacode.org&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="text highlighted_source"&gt;outeee   =   $e1d1      ROM: console putchar routine
        .or  $0f00
;-----------------------------------------------------;
main    ldx  #string    Point to the string
        bra  puts         and print it
outs    jsr  outeee     Emit a as ascii
        inx             Advance the string pointer
puts    ldaa ,x         Load a string character
        bne  outs       Print it if non-null
        bra  main       else restart
;=====================================================;
string  .as  "SPAM",#13,#10,#0
        .en&lt;/pre&gt;
&lt;br /&gt;
Without labels, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bra puts&lt;/span&gt; would be replaced by a relative value. Same with &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bne outs&lt;/span&gt; and &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;bra main&lt;/span&gt;.&amp;nbsp; Likewise, &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;jsr outeee&lt;/span&gt; would be replaced with &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;jsr $e1d1&lt;/span&gt; which is harder to understand.&lt;br /&gt;
&lt;br /&gt;
To generate labels, I disassembled the code in two passes. The first pass identifies address references. The second pass converts opcodes and operands into assembly, while replacing raw address references ($e1d1) with labels (LE1D1), and prefixing referenced addresses with labels. Like this:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bmi&amp;nbsp;&amp;nbsp; _Ld62c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldab&amp;nbsp; D05&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; andb&amp;nbsp; #$80&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; aba&amp;nbsp;&amp;nbsp; &lt;br /&gt;_Ld62c: ldab&amp;nbsp; D10&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
As you probably noticed, I also converted direct mode references to labels of the form DNN.&lt;br /&gt;
&lt;h3&gt;
Variables&lt;/h3&gt;
The first several hundred bytes of GM ECM binary file is filled with parameters. Rather than using generic labels, my disassembler reads a list of addresses and label (variable) names. Here's an excerpt of the config file:&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;d290,TPS_FiltCoef1,FILT COEF TPS&lt;br /&gt;d291,TPS_FiltCoef2,FILT COEF TPS&lt;br /&gt;d292,DiffTPSforPE,DIFF TPS REQ FOR PWR ENRICH WHILE IN PE&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;d293,IAC_BPW,usec ADDED TO BPW WHILE IAC IS OPENING&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
So, for example, any reference to $0D293 is converted to IAC_BPW, the Idle Air Control Base Pulse Width. I did this for all the addresses referenced in the bin itself. It makes the code more readable. &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldaa&amp;nbsp; IAC_BPW ; ADDED TO BPW WHILE IAC IS OPENING&lt;br /&gt;_Ld79f: adda&amp;nbsp; D52&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; BPW,LSB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bcs&amp;nbsp;&amp;nbsp; _Ld7a7&amp;nbsp; ; BR IF NO OVERFLOW&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adda&amp;nbsp; D53&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; BPW,MSB&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bcc&amp;nbsp;&amp;nbsp; _Ld7a9&amp;nbsp; ; BR IF NO OVERFLOW&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
There are commented disassembly files out there. Adding those comments (as above) to my disassembly using descriptive variable names should reduce the time it takes me to understand the code.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=O9ja7JczyUw:zbgHQyL5irU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=O9ja7JczyUw:zbgHQyL5irU:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=O9ja7JczyUw:zbgHQyL5irU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=O9ja7JczyUw:zbgHQyL5irU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=O9ja7JczyUw:zbgHQyL5irU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=O9ja7JczyUw:zbgHQyL5irU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/O9ja7JczyUw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/7784658942089945081/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/05/reverse-engineering-gm-ecms.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/7784658942089945081?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/7784658942089945081?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/O9ja7JczyUw/reverse-engineering-gm-ecms.html" title="Reverse Engineering GM ECMs" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-ezEAdzLaSqY/UYpRHA9DboI/AAAAAAAAIzU/qMZZ9Fbh-NI/s72-c/Photo+May+08,+12+06+37+AM.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/05/reverse-engineering-gm-ecms.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4ASHszfyp7ImA9WhBbEEk.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-3017503291838966289</id><published>2013-05-08T15:35:00.003-06:00</published><updated>2013-05-08T15:35:49.587-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-08T15:35:49.587-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sparkfun AVC" /><title>2013 Sparkfun AVC Entry Video</title><content type="html">Here's a demo of Data Bus driving itself around in the rain outside my house. Sparkfun requires a demo submitted before the May 8 deadline. I actually submitted it on the afternoon of May 8, so I hope I'm not too late.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/XpXHZAzcLgk" width="560"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
Data Bus is configured to travel slowly, around 6 m/s, between four waypoints outside my house. I ran it a few times and it seemed to traverse approximately the same route each time.&lt;br /&gt;
&lt;br /&gt;
With only a month left, I guess I can stop procrastinating, now. I'd like to at least get a sense of how accurately I can control its path and make a few improvements before June 8.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=8QChc33WBzc:ziSCmdrEDAQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=8QChc33WBzc:ziSCmdrEDAQ:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=8QChc33WBzc:ziSCmdrEDAQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=8QChc33WBzc:ziSCmdrEDAQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=8QChc33WBzc:ziSCmdrEDAQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=8QChc33WBzc:ziSCmdrEDAQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/8QChc33WBzc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/3017503291838966289/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/05/2013-sparkfun-avc-entry-video.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/3017503291838966289?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/3017503291838966289?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/8QChc33WBzc/2013-sparkfun-avc-entry-video.html" title="2013 Sparkfun AVC Entry Video" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/XpXHZAzcLgk/default.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/05/2013-sparkfun-avc-entry-video.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YAQXw-fSp7ImA9WhBUFE8.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-7938455009322009691</id><published>2013-05-01T10:19:00.000-06:00</published><updated>2013-05-01T10:19:00.255-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-01T10:19:00.255-06:00</app:edited><title>Taking Time Off</title><content type="html">I am taking time off posting for the next couple weeks due to personal reasons. Last week I was too focused on &lt;a href="http://tc.wagoneer.org/2013/04/tbi-test-drive-and-super-chief.html"&gt;fuel injection tuning for my Jeep&lt;/a&gt; to work on robotics or write articles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=O-T2IiKqN4U:4cuR92w_9e4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=O-T2IiKqN4U:4cuR92w_9e4:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=O-T2IiKqN4U:4cuR92w_9e4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=O-T2IiKqN4U:4cuR92w_9e4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=O-T2IiKqN4U:4cuR92w_9e4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=O-T2IiKqN4U:4cuR92w_9e4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/O-T2IiKqN4U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/7938455009322009691/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/05/taking-time-off.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/7938455009322009691?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/7938455009322009691?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/O-T2IiKqN4U/taking-time-off.html" title="Taking Time Off" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/05/taking-time-off.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MEQHk6cSp7ImA9WhBWF00.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-6277666899030371215</id><published>2013-04-11T11:30:00.000-06:00</published><updated>2013-04-11T11:30:01.719-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-11T11:30:01.719-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sparkfun AVC" /><title>AVC 2013 Course</title><content type="html">&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-D9USZQO10PU/UWWZwmQ1QZI/AAAAAAAAIj4/rlpKoHaX2nQ/s1600/AVC2013_Course_Apr10_v1.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="222" src="http://3.bp.blogspot.com/-D9USZQO10PU/UWWZwmQ1QZI/AAAAAAAAIj4/rlpKoHaX2nQ/s400/AVC2013_Course_Apr10_v1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Sparkfun 2013 Course (from &lt;a href="http://avc.sparkfun.com/"&gt;avc.sparkfun.com&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Unlike previous years, the &lt;a href="http://avc.sparkfun.com/"&gt;2013 Sparkfun Autonomous Vehicle Competition&lt;/a&gt; course is fixed through all three runs and the dimensions are, more or less, provided. However,  after drawing a SketchUp model of the course, I am taking the dimensions with a grain of salt. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;
Reconstructing The Course&lt;/h2&gt;
&lt;br /&gt;
I started with a Google Earth screenshot of the area and scaled to better than 0.5% accuracy. I drew in the legs of the course, the barrels, start line, ramp, and hoop. This is what I got.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-LmbXMjnnS-Q/UWWYKdoRksI/AAAAAAAAIjw/yvraMoPUxVE/s1600/AVC2013_scale_top.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="347" src="http://1.bp.blogspot.com/-LmbXMjnnS-Q/UWWYKdoRksI/AAAAAAAAIjw/yvraMoPUxVE/s400/AVC2013_scale_top.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;My model in SketchUp. North is &lt;u&gt;&lt;i&gt;not&lt;/i&gt;&lt;/u&gt; up.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
It's not entirely clear if the first, top leg is actually 160' but the median is about that length according to Google Earth. Also, beware that the course is not aligned to north.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-hByJ0VeTE38/UWWkkFVNfSI/AAAAAAAAIkI/_-lyS8fxvu8/s1600/AVC2013_blank_0.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="301" src="http://4.bp.blogspot.com/-hByJ0VeTE38/UWWkkFVNfSI/AAAAAAAAIkI/_-lyS8fxvu8/s400/AVC2013_blank_0.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;North is up in this picture from Google Earth&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
I was able to tweak the angles and lengths of the remaining 3 legs to arrive at 180', 160', and 165' respectively. In my version the distances to the curb don't match those of Sparkfun. The bottom is off by 5', the right side by 2'. I'm not sure why. Scaling accuracy would account for only 1' in 200'.&lt;br /&gt;
&lt;br /&gt;
The Sparkfun drawing isn't visually accurate as you can see. It just gives the dimensions but even then it's hard to reconstruct from the data given. I intend to approximate the course during practice and on race day, take my own measurements and hope for the best.&lt;br /&gt;
&lt;h2&gt;
3D Rendering&lt;/h2&gt;
&lt;br /&gt;
It's helpful to see some of the obstacles in 3 dimensions where you can rotate your view and so forth. The barrels look a bit less scary:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-nbdDcd_Bs58/UWWl4w2w7FI/AAAAAAAAIkQ/vDb019qYaSU/s1600/AVC2013_barrels.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://2.bp.blogspot.com/-nbdDcd_Bs58/UWWl4w2w7FI/AAAAAAAAIkQ/vDb019qYaSU/s400/AVC2013_barrels.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Here's the hoop:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/--0U1Cj97Vbk/UWWYGFTIrpI/AAAAAAAAIjg/GkmwRt8RBS4/s1600/AVC2013_hoop.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="251" src="http://2.bp.blogspot.com/--0U1Cj97Vbk/UWWYGFTIrpI/AAAAAAAAIjg/GkmwRt8RBS4/s400/AVC2013_hoop.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The ramp looks more scary. It's tiny. It's right after the 3rd turn. Your robot has to finish the jump then merge left to avoid the curb.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-EdrctYud3NQ/UWWYG4EOuXI/AAAAAAAAIjo/_Iy-kYDs2xw/s1600/AVC2013_ramp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="177" src="http://1.bp.blogspot.com/-EdrctYud3NQ/UWWYG4EOuXI/AAAAAAAAIjo/_Iy-kYDs2xw/s400/AVC2013_ramp.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Here's the SketchUp file:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://www.dropbox.com/s/5001oc2v3nqj4l0/AVC2013.skp"&gt;AVC2013.skp&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you tweak it or get a better result, let me know.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=_xJC0_JFOvY:FEDmePcfKlo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=_xJC0_JFOvY:FEDmePcfKlo:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=_xJC0_JFOvY:FEDmePcfKlo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=_xJC0_JFOvY:FEDmePcfKlo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=_xJC0_JFOvY:FEDmePcfKlo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=_xJC0_JFOvY:FEDmePcfKlo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/_xJC0_JFOvY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/6277666899030371215/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/04/avc-2013-course.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/6277666899030371215?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/6277666899030371215?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/_xJC0_JFOvY/avc-2013-course.html" title="AVC 2013 Course" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-D9USZQO10PU/UWWZwmQ1QZI/AAAAAAAAIj4/rlpKoHaX2nQ/s72-c/AVC2013_Course_Apr10_v1.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/04/avc-2013-course.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YDSXc9eip7ImA9WhBWEU8.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-4417509522229441787</id><published>2013-04-04T06:00:00.000-06:00</published><updated>2013-04-04T19:26:18.962-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-04T19:26:18.962-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RaspberryPi" /><title>Raspberry Pi Telepresence Rover</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-HgMmwHfGfMc/UVyqtVoAXmI/AAAAAAAAIdw/uYogXhdB0Ik/s1600/IMG_8168_v1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="313" src="http://3.bp.blogspot.com/-HgMmwHfGfMc/UVyqtVoAXmI/AAAAAAAAIdw/uYogXhdB0Ik/s400/IMG_8168_v1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Introducing my yet-unnamed Raspberry Pi telepresence rover. Everything the rover does is controlled directly by the RPi with no add-on microcontrollers.&lt;br /&gt;
&lt;br /&gt;
The setup is simple using existing tools for motor control and streaming video. Here's the skinny on how I built it.
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;h2&gt;
Overview&lt;/h2&gt;
The rover consists of a Raspberry Pi in an enclosure sitting on top of a tracked chassis. Low voltage motor controlles are driven by the RPi GPIO pins controlled by REST services called from a control webpage via JQuery.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-9YBUzufzw34/UVyygFbA3KI/AAAAAAAAIfg/5rD77o7gmx4/s1600/Dragon1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-9YBUzufzw34/UVyygFbA3KI/AAAAAAAAIfg/5rD77o7gmx4/s400/Dragon1.png" width="340" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;One of our cats, Dragon, was quite curious&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
A web cam provides visual feedback using mjpg-streamer visible on the control webpage. The rover runs off of a 3600mAH NiMH battery feeding into a switched 5V regulator board. The RPi uses a wifi dongle for LAN communication.&lt;br /&gt;
&lt;br /&gt;
As for the details, let's start from the bottom and work our way up.&lt;br /&gt;
&lt;h2&gt;
Chassis, motors, and motor control&lt;/h2&gt;
The chassis is built around the &lt;a href="http://www.pololu.com/catalog/product/1416"&gt;Pololu 30T track kit&lt;/a&gt; that I picked up on sale a couple years ago. It comes with tracks, a pair of idler wheels and a pair of drive wheels.&lt;br /&gt;
&lt;br /&gt;
I added another pair of &lt;a href="http://www.pololu.com/catalog/product/1411"&gt;Pololu idler wheels&lt;/a&gt; and mounted the idlers on short sections of aluminum L stock. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-UWlVZFoLUzI/UVyrQ28DYII/AAAAAAAAIeA/Fl5b0kDQ9gQ/s1600/2013-01-17+22.16.31.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-UWlVZFoLUzI/UVyrQ28DYII/AAAAAAAAIeA/Fl5b0kDQ9gQ/s400/2013-01-17+22.16.31.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The drive wheels are mounted onto &lt;a href="http://www.pololu.com/catalog/product/2368"&gt;150:1 Pololu gear motors &lt;/a&gt;which in turn are 
mounted to the top of the L stock with motor mount &lt;a href="http://www.pololu.com/catalog/product/989"&gt;brackets&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-i34YEYFuoRY/UVyrXrEJgnI/AAAAAAAAIeI/YCQaxgHq1_E/s1600/2013-01-17+22.16.45.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-i34YEYFuoRY/UVyrXrEJgnI/AAAAAAAAIeI/YCQaxgHq1_E/s400/2013-01-17+22.16.45.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I assembled each side independently, then cut a Lexan (polycarbonate) base. I found a new technique for easily bending/breaking polycarbonate: wood carving tools. I carved a groove in the plastic, then bent it in a vise for a clean break.&lt;br /&gt;
&lt;br /&gt;
Each aluminum L channel is mounted to the Lexan base with long #10 screws and nuts. Extra nuts are used to raise the base above the motors.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-ikrBj5VcfWk/UVyrwzJAIyI/AAAAAAAAIeo/fo64id9ZuiE/s1600/2013-01-22+11.47.01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-ikrBj5VcfWk/UVyrwzJAIyI/AAAAAAAAIeo/fo64id9ZuiE/s400/2013-01-22+11.47.01.jpg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The RPi enclosure mounting holes are used to attach it to the base. Holes are drilled in the base to permit removing the top cover of the RPi without unmounting the case from the chassis.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-2tn7ITg9cKg/UVysV86NO5I/AAAAAAAAIfQ/mVIl0RcmeTY/s1600/2013-01-23+09.53.06.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-2tn7ITg9cKg/UVysV86NO5I/AAAAAAAAIfQ/mVIl0RcmeTY/s400/2013-01-23+09.53.06.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Wires were installed on the motors prior to installation. Those wires are in turn connected to a &lt;a href="http://www.pololu.com/catalog/product/2135"&gt;Pololu DRV8835 dual motor driver&lt;/a&gt; board.&lt;br /&gt;
&lt;br /&gt;
This board handles all the tough stuff about driving motors. All you have to do is send it a 3.3V signal on two pins for each motor.&lt;br /&gt;
&lt;h2&gt;
Controlling IO&lt;/h2&gt;
I'm using &lt;a href="http://code.google.com/p/webiopi/"&gt;webiopi&lt;/a&gt; and its built-in REST services to control PWM on the four motor GPIO pins from the main web page.&lt;br /&gt;
&lt;br /&gt;
The control page includes &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;webiopi.js&lt;/span&gt; and then uses JQuery to make function calls to set PWM parameters on the GPIO pins whenever a control button is clicked.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe src="http://pastebin.com/embed_iframe.php?i=5tys5za5" style="border: none; width: 100%;"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
The DRV8835 uses a mode pin and four PWM pins. Details on how to use the board are found on the &lt;a href="http://www.pololu.com/catalog/product/2135"&gt;product page&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The control page is crude for now. It has 9 buttons. In the center is stop. Spin left and right are found to the left and right. Forward is top center, reverse is bottom center.&amp;nbsp; In the corners are buttons that enable only one track, in either forward and reverse.&lt;br /&gt;
&lt;br /&gt;
I'd previously experimented with variable speed, and fine control over turning but ran into issues with latency and had some bugs in the JQuery. I simplified the interface until I can work out something better that is also iPhone compatible.&lt;br /&gt;
&lt;h2&gt;
Streaming Video&lt;/h2&gt;
Streaming video originates from a Microsoft LifeCam &lt;a href="http://www.bot-thoughts.com/2013/01/lifecam-hd-6000-autofocus-fix-raspberry.html"&gt;HD-6000 with it's annoying, unnecessary autofocus disabled&lt;/a&gt;. The web streaming is made possible with MJPG-streamer. It runs its own web server on the RPi.&lt;br /&gt;
&lt;br /&gt;
My control page simply includes an IMG tag:&amp;nbsp; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;lt;img id="streamimage" src="http://192.168.0.4:8080/?action=stream" /&amp;gt;&lt;/span&gt; to display the streaming image.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-zs5iKreIwio/UV0RSa7zW7I/AAAAAAAAIfw/gt5kJ7epPlI/s1600/Dragon2_v1.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="301" src="http://3.bp.blogspot.com/-zs5iKreIwio/UV0RSa7zW7I/AAAAAAAAIfw/gt5kJ7epPlI/s400/Dragon2_v1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Screen capture from today's cat observation mission&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
The camera is mounted with double-sided tape to a section of aluminum bar stock I bent into an L shape. That in turn is mounted to the RPi enclosure.&lt;br /&gt;
&lt;h2&gt;
Raspberry Pi Setup&lt;/h2&gt;
The RPi runs a standard Raspbian Wheezy distro. An EDIMAX USB wifi dongle provides connectivity and is configured with a &lt;a href="http://www.bot-thoughts.com/2013/01/raspberry-pi-wifi-static-ip.html"&gt;static IP address&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The RPi is enclosed in an injection-molded plastic case from &lt;a href="http://shop.cyntech.co.uk/products/raspberry-pi-enclosure"&gt;Cyntech&lt;/a&gt; which I consider to be one of the prettiest, nicest-looking plastic cases made for the Pi.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-VmvUHYd47Eg/UVyr-i8KoKI/AAAAAAAAIe4/-PjB7O3Iru0/s1600/2013-01-23+09.33.40.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-VmvUHYd47Eg/UVyr-i8KoKI/AAAAAAAAIe4/-PjB7O3Iru0/s320/2013-01-23+09.33.40.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;
You can find them on eBay or MCM Electronics, and probably other sources, too.&lt;br /&gt;
&lt;h2&gt;
Battery, Power Supply&lt;/h2&gt;
The robot runs off a Reedy Wolfpack 3600mAH NiMH battery.&lt;br /&gt;
&lt;br /&gt;
Why antiquated battery technology? Because I happen to have an automatic NiMH charger that I plan to hack into a docking station. Drive the robot up to it and charging begins.&lt;br /&gt;
&lt;br /&gt;
The NiMH pack voltage is fed into a &lt;a href="http://www.pololu.com/catalog/product/2110"&gt;Pololu Step-Down Voltage Regulator D15V35F5S3&lt;/a&gt; the same switching voltage regulator powering the electronics on &lt;a href="http://www.bot-thoughts.com/p/robot-mag-data-bus.html"&gt;Data Bus&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I used a section of aluminum bar stock mounted underneath the Lexan base longitudinally with a gap between the bar stock and the base so that I can use velcro straps to secure the battery.&lt;br /&gt;
&lt;br /&gt;
The messy wiring in the picture at the beginning of the article has since been tidied up considerably. &lt;br /&gt;
&lt;h2&gt;
Source&lt;/h2&gt;
Full source is on the Bot Thoughts Google Code Repository, &lt;a href="https://code.google.com/p/bot-thoughts-blog/source/browse/#svn%2Ftrunk%2FRPiTeleRover"&gt;here&lt;/a&gt; &lt;br /&gt;
&lt;h2&gt;
Future Plans&lt;/h2&gt;
In addition the docking station I'd like to add servo pan/tilt for the camera, and battery meter circuitry so the RPi can display power statistics on the control page.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/mWnHtdndTVY/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/mWnHtdndTVY?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/mWnHtdndTVY?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=5gsf6CmzQ-M:NAqnZ00sT1Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=5gsf6CmzQ-M:NAqnZ00sT1Q:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=5gsf6CmzQ-M:NAqnZ00sT1Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=5gsf6CmzQ-M:NAqnZ00sT1Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=5gsf6CmzQ-M:NAqnZ00sT1Q:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=5gsf6CmzQ-M:NAqnZ00sT1Q:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/5gsf6CmzQ-M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/4417509522229441787/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/04/raspberry-pi-telepresence-rover.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4417509522229441787?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4417509522229441787?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/5gsf6CmzQ-M/raspberry-pi-telepresence-rover.html" title="Raspberry Pi Telepresence Rover" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-HgMmwHfGfMc/UVyqtVoAXmI/AAAAAAAAIdw/uYogXhdB0Ik/s72-c/IMG_8168_v1.JPG" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/04/raspberry-pi-telepresence-rover.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEERnk9eSp7ImA9WhBXGU0.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-8911569952201541218</id><published>2013-04-02T07:00:00.000-06:00</published><updated>2013-04-02T07:00:07.761-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-02T07:00:07.761-06:00</app:edited><title>Thanks, Subscribers!</title><content type="html">This is long overdue, but thanks, readers!&lt;br /&gt;
&lt;br /&gt;
I really appreciate you and I hope you find stuff on my blog helpful, entertaining, amusing or of value in some fashion. Maybe this is corny but you make blogging a really rewarding experience.&lt;br /&gt;
&lt;br /&gt;
Several months ago, Bot Thoughts finally broke the 300 subscriber mark. Sweet! It's taken me awhile to announce that. So long, in fact, that the blog is now closing in on the 400 subscriber mark. Wow.&lt;br /&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=EepXTchmPS8:h_VATelN39I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=EepXTchmPS8:h_VATelN39I:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=EepXTchmPS8:h_VATelN39I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=EepXTchmPS8:h_VATelN39I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=EepXTchmPS8:h_VATelN39I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=EepXTchmPS8:h_VATelN39I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/EepXTchmPS8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/8911569952201541218/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/04/thanks-subscribers.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/8911569952201541218?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/8911569952201541218?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/EepXTchmPS8/thanks-subscribers.html" title="Thanks, Subscribers!" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/04/thanks-subscribers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcHQnc9eCp7ImA9WhBXFUo.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-3063498005135427073</id><published>2013-03-29T07:00:00.000-06:00</published><updated>2013-03-29T10:03:53.960-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-29T10:03:53.960-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sensors" /><title>Sharp IR Ranger Noise</title><content type="html">Time to look at supply and signal noise on the Sharp IR I2C adapters I'm working on.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-dwvAsw8mWKI/USZZXlKf2sI/AAAAAAAAH9g/vUVrlJVnGwA/s1600/IMG_8216.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="255" src="http://4.bp.blogspot.com/-dwvAsw8mWKI/USZZXlKf2sI/AAAAAAAAH9g/vUVrlJVnGwA/s320/IMG_8216.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
You often read how noisy these sensors are. Now you can see it for yourself.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;The second revision of my board incorporates a 10uF tantalum bypass capacitor on the ranger supply, a 4.7uF tantalum on the ADC supply, and has an anti-alias RC filter feeding the ADC and features improved PCB layout.&lt;br /&gt;
&lt;h2&gt;
ADC Measured Noise&lt;/h2&gt;
First, I looked at the noise read by the ADC for each of the two board revisions to see if I'd made any improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-8G40y2n_WPY/UVWiRach06I/AAAAAAAAIbs/6qPJMQffdqg/s1600/iri2c_noise.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="312" src="http://2.bp.blogspot.com/-8G40y2n_WPY/UVWiRach06I/AAAAAAAAIbs/6qPJMQffdqg/s400/iri2c_noise.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Apparently not. Both the Rev 0.1 and 0.2 boards have a similarly high level of noise. Disappointing.&lt;br /&gt;
&lt;br /&gt;
Before looking at board design and ADC noise further, I decided to look at the ranger itself.&lt;br /&gt;
&lt;br /&gt;
For my tests I used a 150cm GP2Y0A02YK (&lt;a href="http://sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0a02_e.pdf"&gt;datasheet pdf&lt;/a&gt;). The board is hooked up to the ranger via 1.5cm lengths of wire. The board is powered through 5cm long supply wires connected to a breadboard. The breadboard is in turn powered from USB (eeZee Power) with 100uF tantalum bypass capacitor.&lt;br /&gt;
&lt;h2&gt;
Sharp IR Noise&lt;/h2&gt;
Despite a 10uF tantalum bypass capacitor very close to the ranger's supply connector, the oscilloscope shows supply voltage dips on the order of 0.1V at 200Hz measured at the ranger connctor.&lt;br /&gt;
These dips almost certainly correspond to current draw from the ranger's infrared LED.&lt;br /&gt;
&lt;br /&gt;
Why 200Hz? So the ranger can bandwidth filter on that frequency to eliminate interference from other sources, most likely. Much as an IR remote typically runs around 40kHz.  These rangers do work outside in sunlight, after all. &lt;br /&gt;
&lt;br /&gt;
Pulses of 20mV occur on the signal line at the same times as the power supply dips suggesting that whatever internally generates the analog voltage is affected by the power supply.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-wC9L-RLZPLk/UVMPTHc_ZgI/AAAAAAAAIa4/w8aAE2gYtdg/s1600/IMG_8249_v1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="356" src="http://4.bp.blogspot.com/-wC9L-RLZPLk/UVMPTHc_ZgI/AAAAAAAAIa4/w8aAE2gYtdg/s400/IMG_8249_v1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Next I tried adding a 10 ohm resistor in series with a 10uF capacitor in parallel. This should isolate the ranger noise from any upstream circuitry.&lt;br /&gt;
&lt;br /&gt;
The power supply waveform changed to a typical RC charge/discharge curve and the maximum swing increased to 1.2Vp-p.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-OGKThFtd0DY/UVMPbNtFTII/AAAAAAAAIbA/uUd_UTyJdsQ/s1600/IMG_8254_v1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="356" src="http://3.bp.blogspot.com/-OGKThFtd0DY/UVMPbNtFTII/AAAAAAAAIbA/uUd_UTyJdsQ/s400/IMG_8254_v1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Or rather, the lowest voltage was lower than before as you can see by looking at the scope grid. That makes sense with the series resistor in play. I would expect to see (but didn't check) that the other side of the resistor shows attenuated noise.&lt;br /&gt;
&lt;br /&gt;
Something I didn't notice at first was the intermittent nature of the 200Hz pulsetrain.&amp;nbsp; Here I'm using a 10uF bypass cap across the signal and a 100uF bypass across the supply. No series resistor.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-glMJ8mrAJOE/UVMbwxSzl9I/AAAAAAAAIbY/_FwUyUjSYCk/s1600/IMG_8277_v1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="366" src="http://1.bp.blogspot.com/-glMJ8mrAJOE/UVMbwxSzl9I/AAAAAAAAIbY/_FwUyUjSYCk/s400/IMG_8277_v1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
The datasheet indicates the sensor samples at approximately 
40ms intervals which matches my scope measurements of 8 divisions at 5ms/div. The ranger runs the LED for a
 period, then stops and generates a new output voltage.&lt;br /&gt;
&lt;br /&gt;
You can see the output voltage changing in sync with the LED off period, below. (Sorry for the blurriness; I was handholding the camera with a slow shutter to capture the whole trace).&lt;br /&gt;
&lt;br /&gt;
The top trace is the supply voltage (with a slightly different filtering configuration) while the bottom trace, the output voltage, shows the voltage jumps in the LED off periods.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-QJsTlFX4yBE/UVWmV7DCDVI/AAAAAAAAIcA/oEh7Z_91Sws/s1600/IMG_8293_v1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="350" src="http://3.bp.blogspot.com/-QJsTlFX4yBE/UVWmV7DCDVI/AAAAAAAAIcA/oEh7Z_91Sws/s400/IMG_8293_v1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Both channels are set to AC coupling so I could see small noise on top of big DC signal. In that mode, as you might expect with a large capacitor inserted in series with the signal, you still see abrupt (high frequency) changes in DC voltage, but the trace deflection decays over time, as in the left side of the bottom trace. &lt;br /&gt;
&lt;h2&gt;
Good Enough?&lt;/h2&gt;
I'm still working out the noise problem, just how much is tolerable, and eventually how to get good performance out of the ADC.&lt;br /&gt;
&lt;br /&gt;
I've gotten the signal noise down to 5mV with a 10uF electrolytic bypass capacitor, and a 10 ohm / 100uF RC on the supply. But I'm just messing around at this point to get a feel for things.&lt;br /&gt;
&lt;br /&gt;
Is 5mV of noise too much? By my calculations, the required voltage sensitivity of the GP2Y0A02YK at 140-150cm is about 2.6-3.0mV / cm.&lt;br /&gt;
&lt;br /&gt;
To calculate the required sensitivity, I estimated data points from the datasheet and did a curve fit in Libre Calc.&lt;br /&gt;
&lt;br /&gt;
So 5mV could be too much. Additional filtering could be done in software, with the ADC running at least 2 times the noise frequency per the &lt;a href="http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem"&gt;Nyquist-Shannon sampling theorem&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Software filtering should be able to reduce the noise further. Whether through simple averaging, or by implementing a &lt;a href="http://www.dspguide.com/ch19.htm"&gt;digital notch filter&lt;/a&gt;.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=Gu2J7mu8TSg:aWINrU1UFmc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=Gu2J7mu8TSg:aWINrU1UFmc:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=Gu2J7mu8TSg:aWINrU1UFmc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=Gu2J7mu8TSg:aWINrU1UFmc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=Gu2J7mu8TSg:aWINrU1UFmc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=Gu2J7mu8TSg:aWINrU1UFmc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/Gu2J7mu8TSg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/3063498005135427073/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/03/sharp-ir-noise.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/3063498005135427073?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/3063498005135427073?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/Gu2J7mu8TSg/sharp-ir-noise.html" title="Sharp IR Ranger Noise" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-dwvAsw8mWKI/USZZXlKf2sI/AAAAAAAAH9g/vUVrlJVnGwA/s72-c/IMG_8216.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/03/sharp-ir-noise.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EMQXwyfSp7ImA9WhBXE0w.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-4230250184990679448</id><published>2013-03-26T07:00:00.000-06:00</published><updated>2013-03-26T09:28:00.295-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-26T09:28:00.295-06:00</app:edited><title>Tindie Items in Stock</title><content type="html">&lt;br /&gt;
The gamut of breadboarding goodies are back in stock at the &lt;a href="https://tindie.com/shops/bot_thoughts/"&gt;Bot Thoughts Store&lt;/a&gt; on #&lt;a href="http://www.tindie.com/"&gt;tindie&lt;/a&gt;:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tindie.com/shops/bot_thoughts/eezee-microsd-breakout-4/"&gt;MicroSD Breakout for 'duino breadboarding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tindie.com/shops/bot_thoughts/eezee-tiny-breakout-programming-board-kit/"&gt;ATtiny Breakout (8-pin AVR)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tindie.com/shops/bot_thoughts/eezee-attiny244484-breakout/"&gt;ATtiny 24/44/84 Breakout (14-pin AVR)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tindie.com/shops/bot_thoughts/eezee-attiny2313-target-board/"&gt;ATtiny2313/4313 Breakout (20-pin AVR)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tindie.com/shops/bot_thoughts/eezee-propeller/"&gt;Parallax Propeller Breakout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tindie.com/shops/bot_thoughts/2pk-eezee-arduino-crystal-16mhz/"&gt;16MHz Crystal board for 'duino breadboarding&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=bN6ZA8mEtng:SFAUlgk_e7s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=bN6ZA8mEtng:SFAUlgk_e7s:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=bN6ZA8mEtng:SFAUlgk_e7s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=bN6ZA8mEtng:SFAUlgk_e7s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=bN6ZA8mEtng:SFAUlgk_e7s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=bN6ZA8mEtng:SFAUlgk_e7s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/bN6ZA8mEtng" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/4230250184990679448/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/03/tindie-items-in-stock.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4230250184990679448?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4230250184990679448?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/bN6ZA8mEtng/tindie-items-in-stock.html" title="Tindie Items in Stock" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/03/tindie-items-in-stock.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4HSXwyeip7ImA9WhBXFUs.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-1856832118094212027</id><published>2013-03-19T07:00:00.000-06:00</published><updated>2013-03-29T08:38:58.292-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-29T08:38:58.292-06:00</app:edited><title>How do you organize your cables?</title><content type="html">I don't and am soliciting your wise advice. Here's my mess of cables.&lt;br /&gt;
&lt;br /&gt;
How do you organize yours? What containers, retainers, thingamajigs do you use to maintain order?&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-kPotEhuZM80/USfmpgY2z1I/AAAAAAAAH9w/0hHGS8xLbaM/s1600/Photo+Feb+22,+2+33+46+PM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-kPotEhuZM80/USfmpgY2z1I/AAAAAAAAH9w/0hHGS8xLbaM/s400/Photo+Feb+22,+2+33+46+PM.jpg" width="300" /&gt; &lt;/a&gt;&lt;/div&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-kPotEhuZM80/USfmpgY2z1I/AAAAAAAAH9w/0hHGS8xLbaM/s1600/Photo+Feb+22,+2+33+46+PM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-a8qdZHc1TEM/USfmqCzR1II/AAAAAAAAH94/hDt82jv0QJ4/s1600/Photo+Feb+22,+2+33+52+PM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-a8qdZHc1TEM/USfmqCzR1II/AAAAAAAAH94/hDt82jv0QJ4/s320/Photo+Feb+22,+2+33+52+PM.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-zCk0AaUrIkc/USfmq33pKhI/AAAAAAAAH98/BvtiY6xo9nE/s1600/Photo+Feb+22,+2+34+12+PM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-zCk0AaUrIkc/USfmq33pKhI/AAAAAAAAH98/BvtiY6xo9nE/s400/Photo+Feb+22,+2+34+12+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=Rn9XT84m3FE:_dDBcXOstKQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=Rn9XT84m3FE:_dDBcXOstKQ:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=Rn9XT84m3FE:_dDBcXOstKQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=Rn9XT84m3FE:_dDBcXOstKQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=Rn9XT84m3FE:_dDBcXOstKQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=Rn9XT84m3FE:_dDBcXOstKQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/Rn9XT84m3FE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/1856832118094212027/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/03/how-do-you-organize-your-cables.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/1856832118094212027?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/1856832118094212027?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/Rn9XT84m3FE/how-do-you-organize-your-cables.html" title="How do you organize your cables?" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-kPotEhuZM80/USfmpgY2z1I/AAAAAAAAH9w/0hHGS8xLbaM/s72-c/Photo+Feb+22,+2+33+46+PM.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/03/how-do-you-organize-your-cables.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECQHcyeSp7ImA9WhBQE0g.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-3418185068300838371</id><published>2013-03-15T07:00:00.000-06:00</published><updated>2013-03-15T08:44:21.991-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-15T08:44:21.991-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software" /><title>MRP App for Makers</title><content type="html">When done, MakerMRP will help me track parts inventory, &lt;a href="http://en.wikipedia.org/wiki/Bill_of_materials"&gt;BOM&lt;/a&gt;s, product inventory and sales for all boards I've been building and selling on &lt;a href="https://tindie.com/shops/bot_thoughts/"&gt;Tindie&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
After
 using LibreOffice Calc to try to keep track of nine products each with a
 dozen parts, I committed myself to spending 20+ hours writing a 
LAMP/AJAX/jQuery application from scratch while learning more about each
 on the fly.&lt;br /&gt;
&lt;br /&gt;
Writing the app isn't about saving time. It's not motivated by laziness.&lt;br /&gt;
&lt;br /&gt;
The
 mother of invention is an extreme, gut-wrenching, violent hatred of 
mind-numbing, boring, busy-work and the willingness to do nearly 
anything to avoid it.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;
Functionality&lt;/h2&gt;
It's still a work 
in progress, but the tool is intended to manage the flow of parts 
ordering and of product building and selling.&lt;br /&gt;
&lt;h3&gt;
Products&lt;/h3&gt;
We start with a list of products. Products can be added, edited, and deleted. And each has an associated BOM.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-NpvFJLJB1nE/UUHspG_SLqI/AAAAAAAAIFw/GYgeXATvAgM/s1600/MakerMRP_Products.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="323" src="http://4.bp.blogspot.com/-NpvFJLJB1nE/UUHspG_SLqI/AAAAAAAAIFw/GYgeXATvAgM/s400/MakerMRP_Products.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;
Parts&lt;/h3&gt;
Before you can have a BOM you need to be able to track parts. Each part can be added and deleted and each field can be edited.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-wl_s2pJbBgE/UUHsokr88RI/AAAAAAAAIFo/ZBnwGii5j_s/s1600/MakerMRP_Parts.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="118" src="http://4.bp.blogspot.com/-wl_s2pJbBgE/UUHsokr88RI/AAAAAAAAIFo/ZBnwGii5j_s/s400/MakerMRP_Parts.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;
BOM&lt;/h3&gt;
Once you have the parts and products, you can add or delete parts to/from the BOM, or edit quantities.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-MK2OK4ZYYvA/UUHsnjmb2ZI/AAAAAAAAIFY/fAVk-M6yipI/s1600/MakerMRP_bom.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="291" src="http://2.bp.blogspot.com/-MK2OK4ZYYvA/UUHsnjmb2ZI/AAAAAAAAIFY/fAVk-M6yipI/s400/MakerMRP_bom.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;
Inventories&lt;/h3&gt;
With
 each product, it's BOM, and lists of parts defined, the tool can keep 
track of inventories and orders for each product and part.&lt;br /&gt;
&lt;br /&gt;
Let's
 say I want to build 3 more eeZee Propeller boards. I click the "needed"
 button on the Products page. The tool subtracts the correct number from
 the parts inventory. If I don't have enough parts, it keeps track of 
how many more to order.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-NpvFJLJB1nE/UUHspG_SLqI/AAAAAAAAIFw/GYgeXATvAgM/s1600/MakerMRP_Products.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="323" src="http://4.bp.blogspot.com/-NpvFJLJB1nE/UUHspG_SLqI/AAAAAAAAIFw/GYgeXATvAgM/s400/MakerMRP_Products.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span id="goog_1995743393"&gt;&lt;/span&gt;&lt;span id="goog_1995743394"&gt;&lt;/span&gt;&lt;br /&gt;
Let's
 say I've run out of 5MHz crystals and need 3 to fulfill the needed 
number of products. The Parts list will show 3 in the needed column for 
the crystal.&lt;br /&gt;
&lt;br /&gt;
I order them and click the ordered button on 
the Parts page.&amp;nbsp; Now the need count is 0 but the ordered count 
increments by 3. When those parts arrive I click the received button and
 ordered goes to 0 and inventory increases by 3.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-YqV_gTUmCRI/UUHsnwcZBeI/AAAAAAAAIFg/i8APdh5fDto/s1600/MakerMRP_inline_edit.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://1.bp.blogspot.com/-YqV_gTUmCRI/UUHsnwcZBeI/AAAAAAAAIFg/i8APdh5fDto/s400/MakerMRP_inline_edit.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3&gt;
Building and Selling&lt;/h3&gt;
If
 I then build those 3 boards, I click the built button on the Products 
page and the needed count goes to 0, the inventory count goes to 3. Then
 I sell one, and I click the sold button. Inventory changes to 2 and 
sold increments 1. &lt;br /&gt;
&lt;h2&gt;
Coding Approach&lt;/h2&gt;
You have probably noticed that this is a table-based, data-driven application.&lt;br /&gt;
&lt;br /&gt;
Being
 relatively new to jQuery, inexperienced with PHP, and a newb at mysql, I
 opted to write this from scratch rather than using convenient tools 
like &lt;a href="http://www.trirand.com/blog/"&gt;jqGrid&lt;/a&gt; or &lt;a href="http://www.jeasyui.com/documentation/datagrid.php"&gt;jQuery EasyUI DataGrid&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I focused on getting core functionality working first, then refactoring and generalizing, and refining.&lt;br /&gt;
&lt;h3&gt;
Core Functionality&lt;/h3&gt;
I started by following a tutorial, &lt;a href="http://css-tricks.com/app-from-scratch-1-design/"&gt;Creating a Web App from Scratch&lt;/a&gt; in 8 parts. It was a good start and I had something working pretty quickly.&lt;br /&gt;
&lt;br /&gt;
The solution consisted of several php classes for database access, and several php pages for displaying the data in tables.&lt;br /&gt;
&lt;br /&gt;
I used &lt;a href="http://dev.mysql.com/downloads/workbench/"&gt;MySQL Workbench&lt;/a&gt; to do the database design and sync it with my database.&lt;br /&gt;
&lt;h3&gt;
Refactoring and Generalizing&lt;/h3&gt;
The tutorial above has two flaws.&lt;br /&gt;
&lt;h4&gt;
Don't Repeat Yourself &lt;/h4&gt;
First, the database-related code is duplicated across every php class. That breaks, in my view, the &lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;Don't Repeat Yourself &lt;/a&gt;principle. Updating code means more opportunities to make mistakes. Keeping code in sync is harder. Fixing bugs is harder.&lt;br /&gt;
&lt;br /&gt;
I refactored the code to use a single class for all data retrieval. The next step might be to use polymorphism to &lt;a href="http://en.wikipedia.org/wiki/Encapsulation_%28object-oriented_programming%29"&gt;encapsulate&lt;/a&gt; the details of getting data out of each of the tables. For example the Parts table is a type of Data table, but specifies the columns specific to Parts.&lt;br /&gt;
&lt;h4&gt;
Cohesion&lt;/h4&gt;
The
 second, far worse problem, was that the class code was a mix of html output and database input. It's better to keep 
your presentation layer (html, etc) code separate from your database 
tier code. The two concerns are logically separate. Mixing them means that you have to dig into the guts to change the way the application looks.&lt;br /&gt;
&lt;br /&gt;
I pulled all the html php out of the classes when refactoring them into a single data class. All the presentation stuff lives in presentation php code.&lt;br /&gt;
&lt;h4&gt;
Generalizing&lt;/h4&gt;
As mentioned, I created a general solution for data-retrieval by refactoring several nearly identical classes into one Data class.&lt;br /&gt;
&lt;br /&gt;
I also found myself duplicating code in the presentation tier. Instead of looping through rows of data and having code for every single column, I created a php function to print out each row driven by data from the database and metadata in a variable.&lt;br /&gt;
&lt;br /&gt;
The metadata is stored in each presentation page (parts.php, products.php, etc.). Now instead of large, complex, duplicated table code, I have one line: &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;row($metadata, $data);&lt;/span&gt; that displays all the rows for the table along with whatever editing, buttons, etc., that I need.&lt;br /&gt;
&lt;br /&gt;
But it's not perfect yet. I'm duplicating this metadata across multiple display pages. Worse the list of columns is supplied separately when instantiating the Data class and again in the metadata variable, breaking the DRY principle.&lt;br /&gt;
&lt;br /&gt;
I'm moving towards creating the entire table from a single module driven by a single source of data and metadata. And while we're at it, I could reduce to a single php page that prints out any of the display tables at will. I might not if it turns out to be too complicated versus having several very small php pages.&lt;br /&gt;
&lt;h4&gt;
Complex Data Relationships&lt;/h4&gt;
Just doing tables is easy. Where it gets hard is when you have data in one table that references another table. Each part can have a type. The name of that type comes out of the Types table. My code generalizes that problem.&lt;br /&gt;
&lt;br /&gt;
As another example, a BOM entry corresponds to a single part and a single product. I've also generalized that problem.&lt;br /&gt;
&lt;br /&gt;
Also, particular part appears multiple times in a Product's BOM. That's similar to the two scenarios above. I'll create a general solution for this problem next.&lt;br /&gt;
&lt;h3&gt;
Inline Editing&lt;/h3&gt;
&lt;br /&gt;
I like applications that require few clicks and which flow easily alongside the real life activities they are meant to support. I don't want to have to visit a separate page to edit a record in a table, so inline editing was a must.&lt;br /&gt;
&lt;br /&gt;
I tried jEditable and a couple other approaches, but decided it would be more beneficial to learn how to do this from scratch than it would be to use some particular package.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-YqV_gTUmCRI/UUHsnwcZBeI/AAAAAAAAIFg/i8APdh5fDto/s1600/MakerMRP_inline_edit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="161" src="http://1.bp.blogspot.com/-YqV_gTUmCRI/UUHsnwcZBeI/AAAAAAAAIFg/i8APdh5fDto/s400/MakerMRP_inline_edit.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
At the same time I'm using the metadata described above to define a few types of editable data: text that can be clicked on to edit, buttons to move numbers around, and pulldowns to select from existing lists, like selecting a part to add to a BOM or selecting a part's type and subtype (the Subtypes page is shown below for giggles).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-xI3kZ9D0clI/UUHspfHznoI/AAAAAAAAIF4/L2-kN0QOOJk/s1600/MakerMRP_Subtypes.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="371" src="http://3.bp.blogspot.com/-xI3kZ9D0clI/UUHspfHznoI/AAAAAAAAIF4/L2-kN0QOOJk/s400/MakerMRP_Subtypes.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I followed a similar path of refactoring and generalization ending up with a single jQuery script that will handle all the various application events. It's not done but the UI functionality is all in place and the events are captured.&lt;br /&gt;
&lt;h2&gt;
CSS&lt;/h2&gt;
&lt;br /&gt;
Meanwhile I've been brushing up on my CSS. As much as possible, I've tried to keep the look and feel, placement, sizes, menus, buttons, and other things like that in the styles.css file.&lt;br /&gt;
&lt;br /&gt;
The table's rounded grey borders, the left float placement of &lt;a href="http://www.suburban-glory.com/blog?page=140"&gt;image buttons&lt;/a&gt; set up as &lt;a href="http://www.w3schools.com/css/css_image_sprites.asp"&gt;sprites&lt;/a&gt;, the navigation menu, the title, all this is handled in CSS.&lt;br /&gt;
&lt;br /&gt;
All unknown to the application, without which, the tables would show up as default with standard form buttons, etc. And in fact I coded without much CSS set up at first to force myself from inserting look-and-feel in the php.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-lOEE7e6j4CU/UUIYGjF4A4I/AAAAAAAAIGQ/gb2onm-M86Q/s1600/MakerMRP_nocss.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-lOEE7e6j4CU/UUIYGjF4A4I/AAAAAAAAIGQ/gb2onm-M86Q/s1600/MakerMRP_nocss.png" /&gt;&lt;/a&gt;&lt;/div&gt;
Incidentally, I've done all this on my Linux Mint environment. After my outburst, followed by a nice vacation and some rest, my outlook greatly improved and I've been in the Linux environment for the last 3 weeks straight.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=sR5oFHSa9qo:rRI4OT_2xbY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=sR5oFHSa9qo:rRI4OT_2xbY:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=sR5oFHSa9qo:rRI4OT_2xbY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=sR5oFHSa9qo:rRI4OT_2xbY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=sR5oFHSa9qo:rRI4OT_2xbY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=sR5oFHSa9qo:rRI4OT_2xbY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/sR5oFHSa9qo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/3418185068300838371/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/03/mrp-app-for-makers.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/3418185068300838371?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/3418185068300838371?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/sR5oFHSa9qo/mrp-app-for-makers.html" title="MRP App for Makers" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-NpvFJLJB1nE/UUHspG_SLqI/AAAAAAAAIFw/GYgeXATvAgM/s72-c/MakerMRP_Products.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/03/mrp-app-for-makers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QERnYyfCp7ImA9WhBQE00.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-1617517516288034527</id><published>2013-03-14T17:55:00.001-06:00</published><updated>2013-03-14T17:55:07.894-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-14T17:55:07.894-06:00</app:edited><title>AVC 2013: Rules, Walkthrough</title><content type="html">Sparkfun posted the rules and course walkthrough for the 2013 Sparkfun AVC.&lt;br /&gt;
&lt;br /&gt;
https://avc.sparkfun.com/&lt;br /&gt;
&lt;br /&gt;
For us ground vehicle folks the rules are rather different and it really changes up the strategy.&lt;br /&gt;
&lt;br /&gt;
If you finish the course you get 300 points from which your time in seconds is subtracted. You get 25 points for every corner you pass.&lt;br /&gt;
&lt;br /&gt;
Two bonuses are possible, the hoop from last year earning 50 points and a jump ramp for another 50 points.&lt;br /&gt;
&lt;br /&gt;
Finally, &lt;i&gt;every run&lt;/i&gt; counts towards your final score.&lt;br /&gt;
&lt;br /&gt;
Speed is no longer king. Consistency, accuracy, and precision are.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=r1paM1vTT5Y:Ta5hkrHJR8s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=r1paM1vTT5Y:Ta5hkrHJR8s:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=r1paM1vTT5Y:Ta5hkrHJR8s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=r1paM1vTT5Y:Ta5hkrHJR8s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=r1paM1vTT5Y:Ta5hkrHJR8s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=r1paM1vTT5Y:Ta5hkrHJR8s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/r1paM1vTT5Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/1617517516288034527/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/03/avc-2013-rules-walkthrough.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/1617517516288034527?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/1617517516288034527?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/r1paM1vTT5Y/avc-2013-rules-walkthrough.html" title="AVC 2013: Rules, Walkthrough" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/03/avc-2013-rules-walkthrough.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAFSHs8fSp7ImA9WhBRGEk.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-5610265628311124038</id><published>2013-03-09T08:58:00.001-07:00</published><updated>2013-03-09T08:58:39.575-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-09T08:58:39.575-07:00</app:edited><title>Propeller VGA Breakout Kit</title><content type="html">My Propeller VGA kit is $4.75 with 2 days left to order on Tindie. Generate VGA signals with your Propeller with software from the &lt;a href="http://obex.parallax.com/"&gt;OBEX&lt;/a&gt;. &lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://s3.amazonaws.com/tindie_prod/products/626/IMG_8225.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="268" src="https://s3.amazonaws.com/tindie_prod/products/626/IMG_8225.JPG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Propeller VGA breakout kit (prototype)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=r9p-30DqljU:aeKXSjOQbdk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=r9p-30DqljU:aeKXSjOQbdk:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=r9p-30DqljU:aeKXSjOQbdk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=r9p-30DqljU:aeKXSjOQbdk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=r9p-30DqljU:aeKXSjOQbdk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=r9p-30DqljU:aeKXSjOQbdk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/r9p-30DqljU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/5610265628311124038/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/03/propeller-vga-breakout-kit.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/5610265628311124038?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/5610265628311124038?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/r9p-30DqljU/propeller-vga-breakout-kit.html" title="Propeller VGA Breakout Kit" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/03/propeller-vga-breakout-kit.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UASHY_eip7ImA9WhBRFUU.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-8930983312659061182</id><published>2013-03-05T07:00:00.000-07:00</published><updated>2013-03-06T08:54:09.842-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-06T08:54:09.842-07:00</app:edited><title>Furby Disassembly: Part 1</title><content type="html">&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-BXmiP7aomis/UTDYEHoAfAI/AAAAAAAAH_w/zu2ESNEt0oM/s1600/Photo+Feb+24%252C+3+05+47+PM.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-BXmiP7aomis/UTDYEHoAfAI/AAAAAAAAH_w/zu2ESNEt0oM/s400/Photo+Feb+24%252C+3+05+47+PM.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;"Cookie Muffin, Too"&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Faced with a malfunctioning $8 Goodwill Furby, I set about non-destructive disassembly of my daughter's new sick pet, inspired by the dramatic skinning of a Furby by Becky at Adafruit.&lt;br /&gt;
&lt;br /&gt;
I was also inspired by Doc McStuffins.&lt;br /&gt;
&lt;br /&gt;
And yes, I was secretly happy the Furby wasn't working; I confess having had thoughts of disassembly the moment after I saw the price tag.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Don't worry. No Furbys were harmed in the making of this blog post.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
The Furby was making odd chattering noises, strange light fluctuations in the eyes, and shutting off unexpectedly. For awhile the eyes and beak weren't moving in time with speech. New batteries helped a little but this was a sick little fella.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-SavRxs0MyMg/UTDYphnQk8I/AAAAAAAAIAU/ytE52858BTQ/s1600/Photo+Feb+24%252C+4+13+22+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-SavRxs0MyMg/UTDYphnQk8I/AAAAAAAAIAU/ytE52858BTQ/s400/Photo+Feb+24%252C+4+13+22+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="st"&gt;He's got lifeless eyes, black eyes&lt;i&gt;&lt;/i&gt;, like a doll's eyes.&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;
Removing the Fur&lt;/h2&gt;
&lt;br /&gt;
First step is to remove the battery cover and remove batteries. That's easy enough. Then remove the screws around the battery tray that hold a retaining clip which keeps the bottom end of the fur in place.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-HvFIT2gIyUw/UTDY5Cf6bgI/AAAAAAAAIAo/5BHg5yBzHSs/s1600/Photo+Feb+24%252C+4+16+21+PM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/-HvFIT2gIyUw/UTDY5Cf6bgI/AAAAAAAAIAo/5BHg5yBzHSs/s400/Photo+Feb+24%252C+4+16+21+PM.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Next, start peeling back the fur. Near the tail you'll find a loop attached to a hook. Remove that.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-3uzDrtv-iys/UTDYxDQSkOI/AAAAAAAAIAg/BgCvcclhwPI/s1600/Photo+Feb+24%252C+4+15+43+PM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-3uzDrtv-iys/UTDYxDQSkOI/AAAAAAAAIAg/BgCvcclhwPI/s400/Photo+Feb+24%252C+4+15+43+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Now peel up the fur. It is clipped in two spots at the back, around the ears and around the face with locking plastic tabs.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-PRKuRn3Ie-k/UTDZLF9cZcI/AAAAAAAAIBA/N2vOCqrDvnk/s1600/Photo+Feb+24%252C+4+21+18+PM.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-PRKuRn3Ie-k/UTDZLF9cZcI/AAAAAAAAIBA/N2vOCqrDvnk/s400/Photo+Feb+24%252C+4+21+18+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Locking tab shown with small slot below for unlocking.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
In most cases, wherever there's a clip, there's a slot below it so that you can insert a small screwdriver and push up on the locking tab and pull out the clip.&lt;br /&gt;
&lt;br /&gt;
At the front, after removing two screws holding the fur to the body, insert screwdriver to unlock the tabs, unplug the red wire, and pull the fur up.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-9AoGk_Y-qjM/UTDZXSpfi-I/AAAAAAAAIBQ/SgVOdP2V0g8/s1600/Photo+Feb+24%252C+4+21+56+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-9AoGk_Y-qjM/UTDZXSpfi-I/AAAAAAAAIBQ/SgVOdP2V0g8/s400/Photo+Feb+24%252C+4+21+56+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Two screws and two clips in front below face.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-eTVkpgTqXgw/UTDZdI9JWHI/AAAAAAAAIBY/bvj3yAroDCE/s1600/Photo+Feb+24%252C+4+25+39+PM.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-eTVkpgTqXgw/UTDZdI9JWHI/AAAAAAAAIBY/bvj3yAroDCE/s400/Photo+Feb+24%252C+4+25+39+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Remove the red tickle sensor wire.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Now pull up the fur to each ear, for which there are two more clips. You'll need to remove the ears first. They are held in by internal clips so you may have to pry, twist, etc. to get them off.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-S7m5Zr8U75Y/UTDZwaRUf5I/AAAAAAAAIBw/jWyqvO_6nnk/s1600/Photo+Feb+24%252C+4+28+46+PM.jpg" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-S7m5Zr8U75Y/UTDZwaRUf5I/AAAAAAAAIBw/jWyqvO_6nnk/s400/Photo+Feb+24%252C+4+28+46+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Remove ear clip with screwdriver in small slot&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
One ear of the furby popped right off, the other took more work and came off in two pieces, the actual ear first, which came loose from a glued-in retaining clip (still attached, below).&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-mc7zGEub3q0/UTDaDGgJbNI/AAAAAAAAICI/sx5Fa7gcbAY/s1600/Photo+Feb+24%252C+4+56+48+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-mc7zGEub3q0/UTDaDGgJbNI/AAAAAAAAICI/sx5Fa7gcbAY/s400/Photo+Feb+24%252C+4+56+48+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Ear pulled loose from retaining mechanism&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Now, insert screw driver and remove the ear clips. The right top clip can sort of slide out in front of the ear if that's easier.&lt;br /&gt;
&lt;br /&gt;
Remove two white plastic covers that go over the ear nubs (shown below).&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-dM-JNicyIxw/UTDaSReAn0I/AAAAAAAAICY/j9G0cu-54ak/s1600/Photo+Feb+24%252C+4+59+13+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-dM-JNicyIxw/UTDaSReAn0I/AAAAAAAAICY/j9G0cu-54ak/s400/Photo+Feb+24%252C+4+59+13+PM.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Ear nubs, white ear cover things. Right ear came off in two pieces. &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
The fur is clipped in two spots at each side of the face. Again with the screwdriver to pry the locking tabs out of the way, slide out the clips.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ev3glAf_Kbk/UTDZEMpJeSI/AAAAAAAAIA4/okERzRCngL4/s1600/Photo+Feb+24%252C+4+21+05+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-ev3glAf_Kbk/UTDZEMpJeSI/AAAAAAAAIA4/okERzRCngL4/s400/Photo+Feb+24%252C+4+21+05+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Clip at side of face&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
There are two more clips at the top above the face.&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-QVcvn7RApj8/UTDaM6eXUdI/AAAAAAAAICQ/r9tSoS_WeWA/s1600/Photo+Feb+24%252C+4+59+07+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-QVcvn7RApj8/UTDaM6eXUdI/AAAAAAAAICQ/r9tSoS_WeWA/s400/Photo+Feb+24%252C+4+59+07+PM.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Clips at top of face, clips/ring for ears shown.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-By_hrb9fA8A/UTDaejwk_sI/AAAAAAAAICo/QKwTu1cjCgs/s1600/Photo+Feb+24%252C+4+59+50+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/-By_hrb9fA8A/UTDaejwk_sI/AAAAAAAAICo/QKwTu1cjCgs/s400/Photo+Feb+24%252C+4+59+50+PM.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;One top clip removed&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
You are now left with this fascinating and in no way disturbing sight. You might as well put the batteries back in so it can talk to you in this state. Fun.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-eTVkpgTqXgw/UTDZdI9JWHI/AAAAAAAAIBY/bvj3yAroDCE/s1600/Photo+Feb+24%252C+4+25+39+PM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-X1ZOfr_RIVc/UTDaqVkOW9I/AAAAAAAAIC4/izCiK4Fkru8/s1600/Photo+Feb+24%252C+5+00+25+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-X1ZOfr_RIVc/UTDaqVkOW9I/AAAAAAAAIC4/izCiK4Fkru8/s400/Photo+Feb+24%252C+5+00+25+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Skinned Furby&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;
Removing the Back Cover &lt;/h2&gt;
Four phillips screws hold the back cover on the Furby. You will probably have to cut through some tape to get to them all. There are two at the bottom on each side, and two at the top near the face clips.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-mj3hl_Zo70Q/UTDZir3IdvI/AAAAAAAAIBg/jsJuOV9VlYE/s1600/Photo+Feb+24%252C+4+26+25+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-mj3hl_Zo70Q/UTDZir3IdvI/AAAAAAAAIBg/jsJuOV9VlYE/s400/Photo+Feb+24%252C+4+26+25+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Right bottom screw&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TVnfsndWrII/UTDZpew2HTI/AAAAAAAAIBo/IFq9ZRgEi8w/s1600/Photo+Feb+24%252C+4+26+41+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-TVnfsndWrII/UTDZpew2HTI/AAAAAAAAIBo/IFq9ZRgEi8w/s400/Photo+Feb+24%252C+4+26+41+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Left bottom screw&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-dM-JNicyIxw/UTDaSReAn0I/AAAAAAAAICY/j9G0cu-54ak/s1600/Photo+Feb+24%252C+4+59+13+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-dM-JNicyIxw/UTDaSReAn0I/AAAAAAAAICY/j9G0cu-54ak/s400/Photo+Feb+24%252C+4+59+13+PM.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Top screws between ears and sliver sensor&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Before you remove the back cover, you have to peel back the silver sensors on each side. As you have no doubt guessed, the Furby uses these to detect if you're petting its head 
or holding him or whatever.&lt;br /&gt;
&lt;br /&gt;
It's affixed with good old fashioned clear 
tape. Peel it up with something sharp. You can always re-affix the sensor with packing tape.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-SS48QhZl8ac/UTDawowee-I/AAAAAAAAIDA/T_uUpYJOteg/s1600/Photo+Feb+24%252C+5+01+28+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-SS48QhZl8ac/UTDawowee-I/AAAAAAAAIDA/T_uUpYJOteg/s400/Photo+Feb+24%252C+5+01+28+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Right side sensor, peeled back.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Peel back the left sensor past the white speaker grille, further than shown below.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-kqJCtAjU_k0/UTDa2pOXMYI/AAAAAAAAIDI/rxohfAU_CpQ/s1600/Photo+Feb+24%252C+5+01+34+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-kqJCtAjU_k0/UTDa2pOXMYI/AAAAAAAAIDI/rxohfAU_CpQ/s400/Photo+Feb+24%252C+5+01+34+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Left side sensor, peel back further than this.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Now you can remove the back cover.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-hy8vcgQZjNI/UTDa8uRg0EI/AAAAAAAAIDQ/MrPgMiBCLIg/s1600/Photo+Feb+24%252C+5+02+46+PM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-hy8vcgQZjNI/UTDa8uRg0EI/AAAAAAAAIDQ/MrPgMiBCLIg/s320/Photo+Feb+24%252C+5+02+46+PM.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Inside there's an optical encoder board for the eyelids using a Schmitt trigger inverter, plugs for the speaker, and other goodies that I didn't really explore further.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-HKBK9WWo4eA/UTDbCYnQVUI/AAAAAAAAIDY/J-AzorwjgJc/s1600/Photo+Feb+24%252C+5+03+54+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-HKBK9WWo4eA/UTDbCYnQVUI/AAAAAAAAIDY/J-AzorwjgJc/s400/Photo+Feb+24%252C+5+03+54+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Inside the back cover&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-xIx_C52Pjok/UTDbTZgHNfI/AAAAAAAAIDw/O-PyUmQ8Bog/s400/Photo+Feb+24%252C+5+15+40+PM.jpg" style="margin-left: auto; margin-right: auto;" width="300" /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Optical encoder for the eyelids. Try running the Furby in this state...&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-osVorlpcWT4/UTDbNkqJK_I/AAAAAAAAIDo/LBCwT3-76FM/s1600/Photo+Feb+24%252C+5+12+17+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-osVorlpcWT4/UTDbNkqJK_I/AAAAAAAAIDo/LBCwT3-76FM/s400/Photo+Feb+24%252C+5+12+17+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Speaker connector and... I'll find out later.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-WHhml6LY0GU/UTDbZRZzKyI/AAAAAAAAID4/eYH6f7odZzQ/s1600/Photo+Feb+24%252C+5+16+44+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-WHhml6LY0GU/UTDbZRZzKyI/AAAAAAAAID4/eYH6f7odZzQ/s400/Photo+Feb+24%252C+5+16+44+PM.jpg" width="300" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;I'll find that out later, too.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
I'll post more details when I disassemble further. I thought I had the Furby working again but after putting it all back together... I was wrong.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=9L3td_Upx7w:TGfbodzEJ5w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=9L3td_Upx7w:TGfbodzEJ5w:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=9L3td_Upx7w:TGfbodzEJ5w:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=9L3td_Upx7w:TGfbodzEJ5w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=9L3td_Upx7w:TGfbodzEJ5w:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=9L3td_Upx7w:TGfbodzEJ5w:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/9L3td_Upx7w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/8930983312659061182/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/03/furby-disassembly-part-1.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/8930983312659061182?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/8930983312659061182?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/9L3td_Upx7w/furby-disassembly-part-1.html" title="Furby Disassembly: Part 1" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-BXmiP7aomis/UTDYEHoAfAI/AAAAAAAAH_w/zu2ESNEt0oM/s72-c/Photo+Feb+24%252C+3+05+47+PM.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/03/furby-disassembly-part-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cFSX0-eyp7ImA9WhBREUg.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-586810576625918543</id><published>2013-03-01T07:00:00.000-07:00</published><updated>2013-03-01T08:16:58.353-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-01T08:16:58.353-07:00</app:edited><title>Graphic LCDs for Data Bus</title><content type="html">Graphic LCDs are excellent debugging tools. &lt;a href="http://www.digole.com/index.php?productID=535"&gt;Digole offers an I2C adapter&lt;/a&gt; with Arduino library that I've &lt;a href="http://mbed.org/users/shimniok/code/DigoleSerialDisp/docs/tip/"&gt;ported to mbed&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-f4IaDqcnlXs/T5nK3gCgecI/AAAAAAAAExU/ZzNcGi5mOg0/s1600/IMG_7183.JPG" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="266" src="http://4.bp.blogspot.com/-f4IaDqcnlXs/T5nK3gCgecI/AAAAAAAAExU/ZzNcGi5mOg0/s400/IMG_7183.JPG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;128x64 Graphic LCD on Data Bus displays GPS, battery, etc.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;The &lt;a href="https://www.sparkfun.com/products/9351"&gt;128x64 module I used&lt;/a&gt; on Data Bus was indispensable last year. It graphically displays battery voltage, GPS fix quality, and also displays IR ranger information. No ground station required.&lt;br /&gt;
&lt;br /&gt;
With limited serial ports and a desire for XBee (or something) wireless, I wanted to run the LCD off the I2C bus. &lt;a href="http://www.digole.com/"&gt;Digole's&lt;/a&gt; universal backpack supports serial, I2C, and SPI, selectable with a solder jumper. The solution is fully-wrought with good documentation and Arduino demo and library code.&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xeLNQhgPotQ/US_jRluw3nI/AAAAAAAAH_U/tcA-5KDWQAg/s1600/Photo+Feb+28,+4+03+58+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="238" src="http://1.bp.blogspot.com/-xeLNQhgPotQ/US_jRluw3nI/AAAAAAAAH_U/tcA-5KDWQAg/s320/Photo+Feb+28,+4+03+58+PM.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;My Digole backpack on a giant LCD&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
After responsive customer support helped me fix a manufacturing defect on my own (wrong resistor installed in a voltage divider), I2C worked. For the time being I wrote the mbed library to speak only I2C. It uses Arduino print routines. &lt;br /&gt;
&lt;br /&gt;
The backpack supports common graphic LCDs. Digole also sells OLED
 backpacks that use the same library. Since the LCDs I have are so heavy
 I may switch to an OLED instead.&lt;br /&gt;
&lt;br /&gt;
While experimenting, I found something odd. When I held the backpack and LCD just so, it would operate stably, when I didn't I'd see junk characters or other misbehavior. Apparently my thumb was acting as a pull up resistor for a pin pad marked NC. A 10k resistor replaced my thumb with the same effect.&lt;br /&gt;
&lt;br /&gt;
If this is a KS0108-driven LCD (the eBay seller didn't specify), the NC pin would correspond to Chip Select 2 (CS2). Perhaps the backpack simply shouldn't be configured for KS0108. I'll edit this if I find out more later but for now it works reliably and I can get busy porting Data Bus code to use the new LCD.&lt;br /&gt;
&lt;h2&gt;
Data Bus Software Design&lt;/h2&gt;
To that end, I am working to decouple display details from the main code, an inevitable side effect of scrambling to get a robot done for a competition.&lt;br /&gt;
&lt;br /&gt;
Main routines should not know how to draw boxes and bar graphs, locate cursors and print data. Nor should it care whether the output device is a Digole or Sparkfun backpack, or even if it's a 128x64 Graphic or 16x2 text display.&lt;br /&gt;
&lt;br /&gt;
I'm shooting for a more flexible solution that supports any number of output devices interchangeably. By the same token, I also want the same kind of flexibility for sensors and input. Why?&lt;br /&gt;
&lt;br /&gt;
My dream is to make a hackable, flexible autopilot software and hardware for other hobbyists. I don't want hardware lock-in like I see in some 3d autopilot solutions; I want hackability and flexibility. Run whatever sensors, outputs and ground stations you want and reuse or write code modules accordingly.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=869dSc62bqM:72VdJuqTIT4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=869dSc62bqM:72VdJuqTIT4:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=869dSc62bqM:72VdJuqTIT4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=869dSc62bqM:72VdJuqTIT4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=869dSc62bqM:72VdJuqTIT4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=869dSc62bqM:72VdJuqTIT4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/869dSc62bqM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/586810576625918543/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/03/graphic-lcds-for-data-bus.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/586810576625918543?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/586810576625918543?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/869dSc62bqM/graphic-lcds-for-data-bus.html" title="Graphic LCDs for Data Bus" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-f4IaDqcnlXs/T5nK3gCgecI/AAAAAAAAExU/ZzNcGi5mOg0/s72-c/IMG_7183.JPG" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/03/graphic-lcds-for-data-bus.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAEQ3Y9fip7ImA9WhBREEs.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-4820231167005831171</id><published>2013-02-28T08:01:00.002-07:00</published><updated>2013-02-28T08:01:42.866-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-28T08:01:42.866-07:00</app:edited><title>2013 Sparkfun AVC location announced!</title><content type="html">&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Zs3nTRH6_5Y/T90R69Xh4uI/AAAAAAAAFgE/liJxiAPPARs/s1600/9E159A52-DB8E-4C7F-8003-4D5B836154D3.JPG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/-Zs3nTRH6_5Y/T90R69Xh4uI/AAAAAAAAFgE/liJxiAPPARs/s200/9E159A52-DB8E-4C7F-8003-4D5B836154D3.JPG" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Barrels of doom. 2012.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Sparkfun announced the location of the 2013 AVC on their Google Plus page:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
Ladies and Gentlemen, start your engines! We have now nailed down the 
location for the 2013 SparkFun Autonomous Vehicle Competition - it will 
take place on June 8th, 2013 at the Boulder Reservoir. We are still 
hammering out some final details (including entrant and spectator 
signups) which will be forthcoming, but save the date! We hope to see 
you there!&lt;/blockquote&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=WGqfb6rwom4:HgmbB06utEw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=WGqfb6rwom4:HgmbB06utEw:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=WGqfb6rwom4:HgmbB06utEw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=WGqfb6rwom4:HgmbB06utEw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=WGqfb6rwom4:HgmbB06utEw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=WGqfb6rwom4:HgmbB06utEw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/WGqfb6rwom4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/4820231167005831171/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/02/2013-sparkfun-avc-location-announced.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4820231167005831171?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4820231167005831171?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/WGqfb6rwom4/2013-sparkfun-avc-location-announced.html" title="2013 Sparkfun AVC location announced!" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-Zs3nTRH6_5Y/T90R69Xh4uI/AAAAAAAAFgE/liJxiAPPARs/s72-c/9E159A52-DB8E-4C7F-8003-4D5B836154D3.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/02/2013-sparkfun-avc-location-announced.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YFRHw8fCp7ImA9WhBSGUw.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-4231471971590377097</id><published>2013-02-26T07:00:00.000-07:00</published><updated>2013-02-26T14:45:15.274-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-26T14:45:15.274-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="arm" /><category scheme="http://www.blogger.com/atom/ns#" term="mbed" /><title>mbed sdk is open source</title><content type="html">&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://mbed.org/media/uploads/simon/mbed-sdk-open-source.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="104" src="https://mbed.org/media/uploads/simon/mbed-sdk-open-source.png" width="200" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;from &lt;a href="http://mbed.org/"&gt;mbed.org&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
The mbed team &lt;a href="https://mbed.org/blog/entry/mbed-SDK-is-now-Open-Source/"&gt;announced&lt;/a&gt; a few days ago that their &lt;a href="http://mbed.org/handbook/mbed-SDK"&gt;SDK&lt;/a&gt;, that is, the new mbed library, is open source.&lt;br /&gt;
&lt;br /&gt;
I'm sure more than a few folks had some reservations about such a previously closed system.&lt;br /&gt;
&lt;br /&gt;
For me, it'll be very educational with great examples on how to implement the mbed library of which I'm quite fond on LPC. They have extensive &lt;a href="http://mbed.org/handbook/mbed-library-internals"&gt;internals documentation&lt;/a&gt; posted up. I've scanned through it and I think it'll make a fascinating read.&lt;br /&gt;
&lt;br /&gt;
It will likely open the door for porting to other Cortex M chips and platforms as well. Think LPC1769, STM32F4, Stellaris, etc.&lt;br /&gt;
&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=DLO-meNOerw:WbICRgquez4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=DLO-meNOerw:WbICRgquez4:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=DLO-meNOerw:WbICRgquez4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=DLO-meNOerw:WbICRgquez4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=DLO-meNOerw:WbICRgquez4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=DLO-meNOerw:WbICRgquez4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/DLO-meNOerw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/4231471971590377097/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/02/mbed-sdk-is-open-source.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4231471971590377097?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4231471971590377097?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/DLO-meNOerw/mbed-sdk-is-open-source.html" title="mbed sdk is open source" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/02/mbed-sdk-is-open-source.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EFQHg8cCp7ImA9WhBSFUk.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-736545049511248741</id><published>2013-02-22T07:00:00.000-07:00</published><updated>2013-02-22T07:00:11.678-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-22T07:00:11.678-07:00</app:edited><title>AVC 2013, Sharp IR I2C</title><content type="html">My AVC 2013 preparations have begun.&lt;br /&gt;
&lt;br /&gt;
I have a list of improvements planned for my rover Data Bus to make it faster, more precise and accurate. I'll soon add the convenience of telemetry and FPV.&lt;br /&gt;
&lt;br /&gt;
Some changes are small but quite helpful.&amp;nbsp;One such improvement is to I2C-ify my Sharp IR Rangers.&lt;br /&gt;
&lt;div&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Last year, Data Bus used a Sharp IR ranger as a last-minute, last-resort device to curtail violent curb encounters during testing.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Yh5p1sYoPa4/T9JuH4elEVI/AAAAAAAAH9k/cocvEpUQcn8/s1600/Photo+Jun+08%252C+3+21+58+PM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-Yh5p1sYoPa4/T9JuH4elEVI/AAAAAAAAH9k/cocvEpUQcn8/s400/Photo+Jun+08%252C+3+21+58+PM.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;My beautiful electronics layout, ruined by...this.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
Lacking free ADC ports on the mbed required the addition of a butt-ugly protoboard Arduino to translate analog ranger signals to I2C. I will be replacing it with something like this. Prettier, no?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-dwvAsw8mWKI/USZZXlKf2sI/AAAAAAAAH9g/vUVrlJVnGwA/s823/IMG_8216.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="318" src="http://3.bp.blogspot.com/-dwvAsw8mWKI/USZZXlKf2sI/AAAAAAAAH9g/vUVrlJVnGwA/s400/IMG_8216.JPG" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Early prototype for my Sharp IR Ranger I2C Adapter&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
It's a tiny, general purpose board that will adapt &lt;u&gt;any&lt;/u&gt;&amp;nbsp;Sharp ranger to digital I2C. Or any analog sensor, in fact, with the performance advantages of a dedicated, 188.9kSPS ADC near the analog sensor. The board includes the recommended 10uF decoupling capacitor for the ranger. A single I2C bus can host 9 of the devices, each with a unique address.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
It's built around the Texas Instruments ADC&lt;b&gt;xx&lt;/b&gt;1C021 single supply I2C ADC where &lt;b&gt;xx&lt;/b&gt; is the bit resolution, 08, 10, and 12. The chip costs under $4 in single quantities. (More info:&amp;nbsp;&lt;a href="http://www.ti.com/product/adc081c021"&gt;ADC081C021&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.ti.com/product/adc101c021"&gt;ADC101C021&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.ti.com/product/adc121c021"&gt;ADC121C021&lt;/a&gt;)&lt;/div&gt;
&lt;h2&gt;
Resolution&lt;/h2&gt;
&lt;div&gt;
Resolution is a challenge. The Sharp GP2D12 analog signal range is about 2V with supply voltage of 5V according to the datasheet (&lt;a href="http://www.sharpsma.com/webfm_send/1203"&gt;pdf&lt;/a&gt;). A&amp;nbsp;single supply, single-ended ADC running at the same 5V as the ranger, therefore, loses more than 1 bit of resolution. &amp;nbsp;So, how many bits of ADC resolution is needed?&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-sNZneqNkAGk/UC6DbcCGdBI/AAAAAAAAHDg/XIXqRZunigE/s1600/IR710.csv+-+OpenOffice.org+Calc+8172012+114551+AM.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="302" src="http://1.bp.blogspot.com/-sNZneqNkAGk/UC6DbcCGdBI/AAAAAAAAHDg/XIXqRZunigE/s400/IR710.csv+-+OpenOffice.org+Calc+8172012+114551+AM.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;This plot shows the non-linear Range (cm) vs LSB &lt;br /&gt;
relationship for the big 5m sensor&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
In the GP2D12 datasheet, there's a plot of voltage versus distance. ADC resolution is more important for longer distances as you can kind of tell from the plot above.&amp;nbsp;Close in, 10-30cm, the sensor sensitivity is 110mV/cm&amp;nbsp;and at long range, 50-80cm, it is 6.67mV/cm.&lt;br /&gt;
&lt;br /&gt;
A 5V 8-bit ADC has a resolution of&amp;nbsp;19.5mv/LSB, almost 3cm/LSB at long range. Better is a 10-bit ADC with a&amp;nbsp;4.88mV/LSB or 0.73cm minimum resolution. Best is a 12-bit with 1.22mV/LSB or 0.18cm resolution. I'll probably be able to get away with a 10-bit ADC.&lt;br /&gt;
&lt;br /&gt;
I don't know what the Sharp sensors' resolution is in mV. I've looked at sensor output on an oscilloscope and it is not purely analog because it changes in small steps.&lt;/div&gt;
&lt;h2&gt;
Layout&lt;/h2&gt;
&lt;div&gt;
As a part of this project, I spent some time learning about mixed signal PCB layout and ground planes. One of the best resources I read was this Maxim paper,&amp;nbsp;&lt;a href="http://www.maximintegrated.com/app-notes/index.mvp/id/5450"&gt;Successful PCB Grounding with Mixed-Signal Chips - Follow the Path of Least Impedance&lt;/a&gt;.&amp;nbsp;The ADC's datasheet also provides good information about layout and PCB design.&lt;br /&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The gist is that low frequency signals follow the shortest path on their return to ground, while high frequency signals (say around 100kHz and up) return to ground under the corresponding signal trace because the signal current reduces impedance on the adjacent ground plane. In short, signals follow the path of least impedance. Shocking, I know.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
My next set of prototype boards implement the Maxim paper's suggestions. I'll test noise performance and also attempt to answer some questions I have about the best way to use a ratiometric ADC on a noisy digital sensor like the Sharp. If you have a 10uF bypass capacitor on the Sharp supply, should the ADC also feed off that point? I think so but we'll see how much it matters.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
Incidentally, I don't need to go to all this trouble for a curb sensor.&amp;nbsp;I plan to make this board available to other hobbyists and I want it to work well.&lt;br /&gt;
&lt;br /&gt;
Here are some more papers:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Analog Devices AN-202 (&lt;a href="http://www.gmee.deit.univpm.it/biblioteca/sala_tecnica/scaffale_dispositivi/instr_amp/AN-202.pdf"&gt;pdf&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Elmac paper, "The ground plane: Lord of the Board", (&lt;a href="http://www.elmac.co.uk/pdfs/Lord_of_the_board.pdf"&gt;pdf&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=xl6imEsgIZk:V6rbX-7cYDM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=xl6imEsgIZk:V6rbX-7cYDM:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=xl6imEsgIZk:V6rbX-7cYDM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=xl6imEsgIZk:V6rbX-7cYDM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=xl6imEsgIZk:V6rbX-7cYDM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=xl6imEsgIZk:V6rbX-7cYDM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/xl6imEsgIZk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/736545049511248741/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/02/avc-2013-sharp-ir-i2c.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/736545049511248741?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/736545049511248741?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/xl6imEsgIZk/avc-2013-sharp-ir-i2c.html" title="AVC 2013, Sharp IR I2C" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-Yh5p1sYoPa4/T9JuH4elEVI/AAAAAAAAH9k/cocvEpUQcn8/s72-c/Photo+Jun+08%252C+3+21+58+PM.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/02/avc-2013-sharp-ir-i2c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8AQnYyeyp7ImA9WhBTGE0.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-4875380663202350237</id><published>2013-02-13T17:14:00.000-07:00</published><updated>2013-02-13T17:14:03.893-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-13T17:14:03.893-07:00</app:edited><title>Stuff I'm up to and Tindie</title><content type="html">First, I'm very honored that Bot Thoughts blog has been selected as one of the &lt;a href="http://www.electricalengineeringschools.org/engineer-resources/"&gt;Top 100 Resources for Electrical Engineers&lt;/a&gt;.&amp;nbsp;&lt;div&gt;
&lt;h2&gt;
Stuff I'm Up To&lt;/h2&gt;
&lt;div&gt;
As usual, I have a number of irons in the fire.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In prep for the &lt;a href="http://www.sparkfun.com/news/947"&gt;2013 AVC&lt;/a&gt;, I plan to add an Xbee radio to &lt;a href="http://www.bot-thoughts.com/p/robot-mag-data-bus.html"&gt;Data Bus&lt;/a&gt;, my autonomous rover, to implement remote telemetry and control. I must first free up a serial port on the &lt;a href="http://mbed.org/"&gt;mbed&lt;/a&gt;. I bought an I2C-based &lt;a href="http://www.digole.com/index.php?productID=535"&gt;Digole LCD adapter&lt;/a&gt; to replace the rover's invaluable serial LCD.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I discovered and repaired an mistake (the wrong 0603 resistor was installed) and now it works with I2C on the mbed. I'm currently porting the company-supplied Arduino Library to mbed while learning more about C++ inheritance and virtual member functions.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I'm redesigning the Data Bus &lt;a href="http://www.bot-thoughts.com/2012/05/avc-brain-transplant-and-updates.html"&gt;baseboard&lt;/a&gt;. It will be pro-fabbed after home-etching the first few iterations. It'll either be mbed- or LPCXpresso-based. Next version will get an onboard ARM, either LPC1769 or STM32.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
My &lt;a href="http://www.bot-thoughts.com/2013/01/raspberry-pi-wifi-static-ip.html"&gt;Raspberry Pi&lt;/a&gt;&amp;nbsp;&lt;a href="http://www.bot-thoughts.com/2013/01/lifecam-hd-6000-autofocus-fix-raspberry.html"&gt;telepresence&lt;/a&gt;&amp;nbsp;rover is done. Or, at least the initial phase. I'll share more about that soon and document enhancements as I go, too.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;div&gt;
I'm also starting to gear up for STM32F4 development. I'm planning a machine-vision system based on the Toshiba&amp;nbsp;tcm8230md camera. Some of the STM32 series have camera peripherals that should work with the this Toshiba 640x480 color camera.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If a little ATmega8 at ~17MHz can run the AVRcam to track multiple colored objects, then a 168MHz STM32 with far more memory and the benefits of DMA should be able to do a lot more.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
On a related note I've been working on &lt;a href="http://www.bot-thoughts.com/2013/01/generating-clock-signal-with-dspic33f.html"&gt;interfacing&lt;/a&gt; a Game Boy camera (Mitsubishi M64282FP) with a &lt;a href="http://www.bot-thoughts.com/2012/12/getting-started-with-dspic33f.html"&gt;dsPIC33F&lt;/a&gt; and digging into assembly on that MCU. It's really quite fun. It's on hold for a little while but I'll get back to it soon.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The mailbox notification project, &lt;a href="http://www.bot-thoughts.com/2013/01/getting-started-with-jeenode-v6.html"&gt;using&lt;/a&gt; &lt;a href="http://www.bot-thoughts.com/2013/02/jeenode-aa-power-board.html"&gt;JeeNodes&lt;/a&gt;, is on the back burner but not forgotten.&lt;/div&gt;
&lt;h2&gt;
Tindie&lt;/h2&gt;
&lt;div&gt;
The &lt;a href="https://tindie.com/shops/bot_thoughts/eezee-propeller/"&gt;eeZee Propeller&lt;/a&gt; is back in stock on the &lt;a href="https://tindie.com/shops/bot_thoughts/"&gt;Bot Thoughts Store&lt;/a&gt;&amp;nbsp;and the &lt;a href="https://tindie.com/shops/bot_thoughts/eezee-attiny244484-breakout/"&gt;ATtiny24/44/84 Board&lt;/a&gt; should be soon. Same for the &lt;a href="https://tindie.com/shops/bot_thoughts/eezee-attiny2313-target-board/"&gt;ATtiny2313/4313&lt;/a&gt; boards. My &lt;a href="https://tindie.com/shops/bot_thoughts/eezee-power/"&gt;eeZee Power&lt;/a&gt;&amp;nbsp;usb&amp;nbsp;breadboard power module is funded and then some. Cool.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The fundraiser &lt;a href="https://tindie.com/shops/bot_thoughts/eezee-microsd-breakout-4/"&gt;microSD boards&lt;/a&gt; will be delivered in the next few weeks, populated, and sent to supporters.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I'm also working on a a couple new products: a Sharp IR Ranger I2C adapter and a VGA breakout adapter for Propeller.&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=rl8wYkmMVHA:JQXdbqtGGtw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=rl8wYkmMVHA:JQXdbqtGGtw:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=rl8wYkmMVHA:JQXdbqtGGtw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=rl8wYkmMVHA:JQXdbqtGGtw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=rl8wYkmMVHA:JQXdbqtGGtw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=rl8wYkmMVHA:JQXdbqtGGtw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/rl8wYkmMVHA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/4875380663202350237/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/02/stuff-im-up-to-and-tindie.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4875380663202350237?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4875380663202350237?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/rl8wYkmMVHA/stuff-im-up-to-and-tindie.html" title="Stuff I'm up to and Tindie" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/02/stuff-im-up-to-and-tindie.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQHSH46fip7ImA9WhBTF0Q.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-7168894300636233085</id><published>2013-02-11T07:00:00.000-07:00</published><updated>2013-02-13T16:32:19.016-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-13T16:32:19.016-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><title>Migrating to Linux: Day 7</title><content type="html">That does it. I give up.&lt;br /&gt;
&lt;br /&gt;
I'm writing this within Windows Vista.&lt;br /&gt;
&lt;br /&gt;
When you spend two &lt;i&gt;hours&lt;/i&gt;&amp;nbsp;trying to get any kind of stupid serial terminal emulator working, and wind up not getting any of them working, something is not right.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;Background: I'd installed Mint-14 to compile an AVR gcc toolchain. That went fine. Installing ARM gcc with m4 hard float support was frustrating due to numerous package dependencies and stlink issues. Eagle install, cake. LTSpice under Wine, no prob. Printing? Took awhile to find the right driver. The hours just seemed to fly away.&lt;br /&gt;
&lt;br /&gt;
Working with the new Serial/I2C/SPI LCD for Data Bus brought about the last straw. I wanted to take a few minutes to test the LCD. Fire up a serial terminal, connect Bus Pirate, check some things, then move on to porting the library to mbed. About that serial terminal...&lt;br /&gt;
&lt;br /&gt;
Many forums recommend minicom as the go to serial terminal program. Really? I remember using that awkward relic in the early 90's. CTRL-A Z is &lt;i&gt;not&lt;/i&gt;&amp;nbsp;a&amp;nbsp;convenient key sequence. And heck, it didn't even work with my Bus Pirate anyway. Then I tried and ran into all sorts of issues with running a terminal emulator under Wine and even VirtualBox.&lt;br /&gt;
&lt;br /&gt;
This should have been a five minute deal. Find, install, run, get on with testing my Digole serial LCD adapter. And it was a five minute deal, right after I booted into Vista.&lt;br /&gt;
&lt;br /&gt;
I said it before and I'll say it again. Linux is &lt;i&gt;really&lt;/i&gt; fast. In the time it takes to get something working in Windows you can try hundreds of times to get the same thing working in Linux. And still fail.&lt;br /&gt;
&lt;br /&gt;
Now, where'd I put my Win 7 x64 Ultimate disc...?&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=FMkl_Fidk8g:AwvHmbmzDUQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=FMkl_Fidk8g:AwvHmbmzDUQ:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=FMkl_Fidk8g:AwvHmbmzDUQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=FMkl_Fidk8g:AwvHmbmzDUQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=FMkl_Fidk8g:AwvHmbmzDUQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=FMkl_Fidk8g:AwvHmbmzDUQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/FMkl_Fidk8g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/7168894300636233085/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/02/migrating-to-linux-day-7.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/7168894300636233085?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/7168894300636233085?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/FMkl_Fidk8g/migrating-to-linux-day-7.html" title="Migrating to Linux: Day 7" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/02/migrating-to-linux-day-7.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cNQng5eip7ImA9WhBTFEg.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-1879140913325612285</id><published>2013-02-09T16:04:00.002-07:00</published><updated>2013-02-09T16:04:53.622-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-09T16:04:53.622-07:00</app:edited><title>Migrating to Linux, Day 6</title><content type="html">&lt;h2&gt;
Flashing STM32F4 Discovery&lt;/h2&gt;
I almost gave up. Trying to flash my STM32F4 Discovery has been a nightmare. The &lt;a href="https://github.com/texane/stlink"&gt;stlink&lt;/a&gt; code I found didn't seem to work reliably for me. At long last I discovered OpenOCD does work. Then realized that it was mass-erasing the chip before flashing. Trying that with stlink works better. But I'd rather erase only what's needed. So, still struggling but at least there's hope of developing on STM32 on Linux.&lt;br /&gt;
&lt;h2&gt;
Time Machine&lt;/h2&gt;
Meanwhile I discovered something that would be painful to do in Windows (I think), emulating a TimeCapsule. Using netatalk 2.2 (apt-get install netatalk) I followed &lt;a href="http://kremalicious.com/ubuntu-as-mac-file-server-and-time-machine-volume/"&gt;this guide&lt;/a&gt;&amp;nbsp;but ignore the bit on Avahi and use the tm option on your volume.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
The network backup disk does not support the required AFP features&lt;/h3&gt;
&lt;br /&gt;
After attempting to backup on OS X Lion or later, you get the "does not support the required AFP features" error. You may find in your Mac's /var/log/system.log that your Time Machine volume doesn't support TM Lock stealing.&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Make sure you're running netatalk 2.2 or higher which supports the required AFP 3.3&lt;/li&gt;
&lt;li&gt;If it's enabled, disable the afpd service in avahi by removing /etc/avahi/services/afpd.service (whatever it may be called) so that netatalk can advertise the volume; restart avahi-daemon.&lt;/li&gt;
&lt;li&gt;Add tm to the options in AppleVolumes.default and restart netatalk&lt;/li&gt;
&lt;li&gt;Unmount /Volumes/TimeMachine (or whatever the volume is called) on your Mac or it won't see the changes you made on Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=IsDa5zgOrAY:_0GeD6L86xs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=IsDa5zgOrAY:_0GeD6L86xs:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=IsDa5zgOrAY:_0GeD6L86xs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=IsDa5zgOrAY:_0GeD6L86xs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=IsDa5zgOrAY:_0GeD6L86xs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=IsDa5zgOrAY:_0GeD6L86xs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/IsDa5zgOrAY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/1879140913325612285/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/02/migrating-to-linux-day-6.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/1879140913325612285?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/1879140913325612285?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/IsDa5zgOrAY/migrating-to-linux-day-6.html" title="Migrating to Linux, Day 6" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/02/migrating-to-linux-day-6.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04ERnYyfyp7ImA9WhBTFU8.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-4160760366985753355</id><published>2013-02-08T07:00:00.000-07:00</published><updated>2013-02-10T11:45:07.897-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-10T11:45:07.897-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JeeNode" /><title>JeeNode AA Power Board</title><content type="html">I'm using &lt;a href="http://shop.moderndevice.com/products/jeenode-kit"&gt;JeeNodes&lt;/a&gt; for a project to notify me when the mail has arrived. You know, like packages containing electronics goodies.&lt;br /&gt;
&lt;br /&gt;
With &lt;a href="http://www.bot-thoughts.com/2013/01/getting-started-with-jeenode-v6.html"&gt;basic communications working&lt;/a&gt;&amp;nbsp;in the lab, it's time to prepare the mailbox JeeNode to run off a battery. &amp;nbsp;I bought a &lt;a href="http://jeelabs.net/projects/hardware/wiki/AA_Power_Board"&gt;AA Power Board&lt;/a&gt; from &lt;a href="http://shop.moderndevice.com/products/jeelabs-aa-power-board"&gt;Modern Device&lt;/a&gt;&amp;nbsp;and installed it. The Power Board powers a JeeNode at 3.3V by boosting a single AA battery voltage using an &lt;a href="http://cds.linear.com/docs/Datasheet/3525fb.pdf"&gt;LTC3523&lt;/a&gt; boost regulator.&lt;br /&gt;
&lt;br /&gt;
The design is very clever, offering many ways to connect the power board to your existing JeeNode. I chose to put it on the bottom side. Here's how.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
First, break off 8 pins of the included, extra-long breakaway header and install into the JeeNode so the short side with the plastic is on the top and the long side goes through the board.. This will be the main connection and physical support for the AA board.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-9ROtBgWlpTo/UPZGnwU3JQI/AAAAAAAAH48/SC1viF6nE30/s1600/IMG_8161.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://3.bp.blogspot.com/-9ROtBgWlpTo/UPZGnwU3JQI/AAAAAAAAH48/SC1viF6nE30/s400/IMG_8161.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Next, break off one pin and install it in the SS pad, again with the plastic and short end of the header on the top and the long side going through the board. Do the same for the I0 pad. These two pads are outboard of the SPI header pads which are located between P1 and P4 right next to the RFM12B module.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://jeelabs.org/wp-content/uploads/2011/04/dsc_2492.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="189" src="http://jeelabs.org/wp-content/uploads/2011/04/dsc_2492.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Now, solder on the battery holders on your AA Power Board. You can put them in a position to use a AA, AAA, or CR2. Finally, slide the power board on over the long side pin headers making sure the bottom side battery holders don't contact anything, then solder into place. The power board is now supported by 8 pins at one end and two at the other. Nice and sturdy.&lt;br /&gt;
&lt;br /&gt;
Configure the Power Board to output 3.3V by soldering the&amp;nbsp;+3V solder jumper. Another solder jumper labeled BCHK permits the battery positive voltage to be routed to Arduino analog pins A4 or A5 (note that one cannot do this and also use I2C). In code, use analogRead() to determine if the battery voltage is dipping too low.&lt;br /&gt;
&lt;br /&gt;
After connecting everything and installing a AA, I connected the other JeeNode to my PC and lo and behold, the battery powered JeeNode was transmitting properly.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;OKG 5 97 0&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;-&amp;gt; ack&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;OKG 5 97 0&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;-&amp;gt; ack&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;OKG 5 97 0&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Courier New, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;-&amp;gt; ack&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
It feels good to make some progress again. The next step is to refine the code on both nodes. I'll tell you about the completed physical sensor at a later date.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=KdN_Mpm8TIg:eKBswtNbNB4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=KdN_Mpm8TIg:eKBswtNbNB4:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=KdN_Mpm8TIg:eKBswtNbNB4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=KdN_Mpm8TIg:eKBswtNbNB4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=KdN_Mpm8TIg:eKBswtNbNB4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=KdN_Mpm8TIg:eKBswtNbNB4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/KdN_Mpm8TIg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/4160760366985753355/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/02/jeenode-aa-power-board.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4160760366985753355?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/4160760366985753355?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/KdN_Mpm8TIg/jeenode-aa-power-board.html" title="JeeNode AA Power Board" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-9ROtBgWlpTo/UPZGnwU3JQI/AAAAAAAAH48/SC1viF6nE30/s72-c/IMG_8161.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/02/jeenode-aa-power-board.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYEQno7fCp7ImA9WhBTEEU.&quot;"><id>tag:blogger.com,1999:blog-5983110881018172452.post-1025786764549969454</id><published>2013-02-05T07:00:00.000-07:00</published><updated>2013-02-05T10:08:23.404-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T10:08:23.404-07:00</app:edited><title>Migrating to Linux, Day 2</title><content type="html">I finally got fed up with Vista and decided to &lt;a href="http://www.bot-thoughts.com/2012/11/windows-os-x-linux-for-roboticist.html"&gt;switch over&lt;/a&gt; to Linux Mint 14 as my primary OS...&lt;br /&gt;
&lt;br /&gt;
...with the intent of never going back.&lt;br /&gt;
&lt;br /&gt;
Will I survive?&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
Ok, I haven't given up Windows entirely. Wine and VirtualBox are in play. Both look promising. Also, I've mounted my Win NTFS partition read/write. (Ha, you kids have it easy now! Why, back in my day...)&lt;br /&gt;
&lt;br /&gt;
The cause of my switch? WinAVR is 3 years out of date and doesn't support the ATtiny84A of which I just bought 3 to test my&amp;nbsp;&lt;a href="https://tindie.com/shops/bot_thoughts/eezee-attiny244484-breakout/"&gt;ATtiny24/44/84 target board&lt;/a&gt;. In frustration I built the entire AVR toolchain from scratch on Mint following&amp;nbsp;&lt;a href="http://www.ladyada.net/learn/avr/setup-unix.html"&gt;Lady Ada's tutorial&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
My first pain was the awful, &lt;a href="https://wiki.archlinux.org/index.php/Mouse_acceleration"&gt;too-twitchy mouse&lt;/a&gt;. Got that fixed with some xinput/xset magic.&lt;br /&gt;
&lt;br /&gt;
Losing Picasa sucks. Either &lt;a href="http://www.digikam.org/"&gt;digiKam&lt;/a&gt; will have to do or it's Picasa in Wine (as Google originally shipped it for Linux). I wished I could see what pictures I've uploaded to Picasaweb.&lt;br /&gt;
&lt;br /&gt;
LTSpice works great in Wine. Eagle is fast but with a niggling key binding issue.&lt;br /&gt;
&lt;br /&gt;
Chrome, GIMP, no problem. &amp;nbsp;I want Notepad++ back.&lt;br /&gt;
&lt;br /&gt;
I'd just fallen in love with TortoiseSVN... thankfully, &lt;a href="http://www.rabbitvcs.org/"&gt;RabbitVCS&lt;/a&gt; works very similarly. Although Mint/Nemo isn't officially supported, it works a-ok with a little trickery.&lt;br /&gt;
&lt;br /&gt;
Probably my biggest regret/pain is having just paid for Carbonite. That was the one thing holding me back from Linux and the one thing tempting me to go back to Windows. I hate to waste that money.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=qDuyWyk1SkE:mDPQYKzH8d4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=qDuyWyk1SkE:mDPQYKzH8d4:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=qDuyWyk1SkE:mDPQYKzH8d4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=qDuyWyk1SkE:mDPQYKzH8d4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/BotThoughts?a=qDuyWyk1SkE:mDPQYKzH8d4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/BotThoughts?i=qDuyWyk1SkE:mDPQYKzH8d4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/BotThoughts/~4/qDuyWyk1SkE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.bot-thoughts.com/feeds/1025786764549969454/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.bot-thoughts.com/2013/02/migrating-to-linux-day-2.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/1025786764549969454?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5983110881018172452/posts/default/1025786764549969454?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/BotThoughts/~3/qDuyWyk1SkE/migrating-to-linux-day-2.html" title="Migrating to Linux, Day 2" /><author><name>Michael Shimniok</name><uri>https://plus.google.com/115347434150281915132</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-Mzm7WRmNIH0/AAAAAAAAAAI/AAAAAAAAAAA/Jr8qFYHy_VE/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://www.bot-thoughts.com/2013/02/migrating-to-linux-day-2.html</feedburner:origLink></entry></feed>
