tag:blogger.com,1999:blog-157675832024-03-13T02:18:59.210-04:00WyoInnovationJustinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.comBlogger96125tag:blogger.com,1999:blog-15767583.post-50912424842396332062011-04-19T19:10:00.002-04:002011-07-14T17:23:35.134-04:00Moved to wyolum.comHey, thanks for reading the wyoinnovation blog! If you want to now what we are up to know, go to http://wyolum.com.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://wyolum.com/blog/wp-content/themes/default/images/logo3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="103" src="http://wyolum.com/blog/wp-content/themes/default/images/logo3.png" width="320" /></a></div><br />
<br />
Hope to see you there!Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-45927348132082115472011-03-19T10:58:00.000-04:002011-03-19T10:58:03.623-04:00Wise Clock 3 Arrives!!Can't wait to see what pithy quotes come out of my new clock!<br />
<br />
<a href="http://timewitharduino.blogspot.com/2011/01/introducing-wise-clock-3.html">http://timewitharduino.blogspot.com/2011/01/introducing-wise-clock-3.html</a><br />
<br />
Look for assembly notes and pictures soon.Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-13982510067994171852011-02-15T19:23:00.000-05:002011-02-15T19:23:08.937-05:00Open Source Hardware Logo V3<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgki9Y0OYlqbjhNYrAUk8tLI17r2esR7ObcHtBUp1LRqghyphenhyphenwVu1dF7VkHz9K18U5C5qEwjFMucEenbBuNquoE_NwpxpZ_fHP9Q81u8ljc_T6VY_1O4eo2pQlFltkWsUFqVPhASNMA/s1600/OSHW_v3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgki9Y0OYlqbjhNYrAUk8tLI17r2esR7ObcHtBUp1LRqghyphenhyphenwVu1dF7VkHz9K18U5C5qEwjFMucEenbBuNquoE_NwpxpZ_fHP9Q81u8ljc_T6VY_1O4eo2pQlFltkWsUFqVPhASNMA/s1600/OSHW_v3.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD1x4Ol9OFobWJ71H0qP5uaINATFSdfXciP00Nc8vABEkISJnvsZzuoX-sZRv-3ZzDjeqr1i5G_bWjFm-hjpu26nGomOdf-oAyEfQ0AZa0FQfoN3SYH0eEMVdU3Qex4SYEhp2kSQ/s1600/OSHW_v3_med.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD1x4Ol9OFobWJ71H0qP5uaINATFSdfXciP00Nc8vABEkISJnvsZzuoX-sZRv-3ZzDjeqr1i5G_bWjFm-hjpu26nGomOdf-oAyEfQ0AZa0FQfoN3SYH0eEMVdU3Qex4SYEhp2kSQ/s1600/OSHW_v3_med.png" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3wmalqmRJUWJrTDL4sxVkcnw5giqBO3ugfL8dHuFERo37Y86ExC1eMQ673ZBStzhUKMHIip4B4YqXcg7TMRQvn09TszJvDce-7rhi8FhlGwBAaJAUBvW8Rz20jgi_yWqHJ5U5xw/s1600/OSHW_v3_small.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3wmalqmRJUWJrTDL4sxVkcnw5giqBO3ugfL8dHuFERo37Y86ExC1eMQ673ZBStzhUKMHIip4B4YqXcg7TMRQvn09TszJvDce-7rhi8FhlGwBAaJAUBvW8Rz20jgi_yWqHJ5U5xw/s1600/OSHW_v3_small.png" /></a></div>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-32679123436078428572011-02-15T07:53:00.000-05:002011-02-15T07:53:56.841-05:00OSHW Logo V2Simplified the circuit board. Font is Liberation Sans Bold. Designed in Inkscape on Ubuntu.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjK5u2GqctYvktj6ToP8d5-MjfAgs_W2cibqZhOPhIePvVKhwQMp_5mHGjJNKI5_3MXy-G7411uBAD00K4JxAZRIFABZAH-58sAMAawu04C9urg8BgYvscr2_NfL-wWgAoAti-kA/s1600/OSHW_v2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="370" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjK5u2GqctYvktj6ToP8d5-MjfAgs_W2cibqZhOPhIePvVKhwQMp_5mHGjJNKI5_3MXy-G7411uBAD00K4JxAZRIFABZAH-58sAMAawu04C9urg8BgYvscr2_NfL-wWgAoAti-kA/s400/OSHW_v2.png" width="400" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRg_1LF_1a42hUhq0SfEKZiJSdEScAoV7F0Bs-05HGlVQpv9jh25WHgg8n0sh23Vh12ce3dsyhgTigHVZ-zo0uWpc4C63UPVv7BVsfYa1qnYCtOrwKR-JYv8oB31QKM3VAUG3png/s1600/OSHW_v2_small.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRg_1LF_1a42hUhq0SfEKZiJSdEScAoV7F0Bs-05HGlVQpv9jh25WHgg8n0sh23Vh12ce3dsyhgTigHVZ-zo0uWpc4C63UPVv7BVsfYa1qnYCtOrwKR-JYv8oB31QKM3VAUG3png/s1600/OSHW_v2_small.png" /></a></div>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com1tag:blogger.com,1999:blog-15767583.post-33093323750563402542011-02-14T21:58:00.000-05:002011-02-14T21:58:40.312-05:00Open Source Hardware Logo<div class="separator" style="clear: both; text-align: left;">This is a concept logo for Open Source Hardware. Let me know what you think.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">J</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXNvm4itXAT38FbxTtqJYheu51L2LqVy-k1Xng4kIjtGSeUK9mNath0YZaT7BryCx9_o_T3bs_bztjPAWDHD5IGjAO-E3X4nZI3a6eOboAtezutFDj9Ymu9v2QJLDUEyDfF3_STA/s1600/OSHW.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXNvm4itXAT38FbxTtqJYheu51L2LqVy-k1Xng4kIjtGSeUK9mNath0YZaT7BryCx9_o_T3bs_bztjPAWDHD5IGjAO-E3X4nZI3a6eOboAtezutFDj9Ymu9v2QJLDUEyDfF3_STA/s320/OSHW.png" width="320" /></a></div>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-8089948150942101892010-12-11T09:21:00.000-05:002010-12-11T09:21:46.060-05:00ClockTHREE Matrix Complete!<object height="385" width="480"><param name="movie" value="http://www.youtube.com/v/SACx7i-bRGs?fs=1&hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/SACx7i-bRGs?fs=1&hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-7566705154860157082010-11-22T21:58:00.002-05:002010-11-22T22:03:42.226-05:00ClockTHREE is Kickstarter "Project of the Day!"<div class="separator" style="clear: both; text-align: justify;">Suck on that, cool ipod watch thingy!</div><div class="separator" style="clear: both; text-align: justify;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-6DWpHro4ss8jARqJJqsCcdAECWLm-4icFbTvjXwv5FYFalMz9BPj18gH2P3_mshmTzWqIzeI8iqLhGePlY_pFuHIrT3ix6eUE8eXP-bFJm5s3amiz5KMSZ-dSEqz86ou5NStHg/s1600/KS_Project_of_the_day_cropped.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="454" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-6DWpHro4ss8jARqJJqsCcdAECWLm-4icFbTvjXwv5FYFalMz9BPj18gH2P3_mshmTzWqIzeI8iqLhGePlY_pFuHIrT3ix6eUE8eXP-bFJm5s3amiz5KMSZ-dSEqz86ou5NStHg/s640/KS_Project_of_the_day_cropped.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: justify;"><br />
</div><div class="separator" style="clear: both; text-align: left;"></div>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-69564891468451247672010-11-19T08:13:00.000-05:002010-11-19T08:13:19.186-05:00Mini Word Clock Available Online!<div class="separator" style="clear: both; text-align: center;"><a href="https://www.synthetos.com/webstore/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/4/9/4984649403_e6701e6f98_z.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="427" src="https://www.synthetos.com/webstore/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/4/9/4984649403_e6701e6f98_z.jpg" width="640" /></a></div>Remember <a href="http://wyoinnovation.blogspot.com/2010/05/anool-receives-aldens-minature.html">Alden's tiny word clock</a>? Well he and Riley have taken that project to the next level by offering 100 of <a href="https://www.synthetos.com/webstore/index.php/assembled-electronics/word-clock.html">these clocks</a> online for $59! The production version looks great with a clear back panel. Besides its handsome appearance, this is the most affordable word clock available. Congrats to Alden and Riley!<br />
<br />
Alden is a contributor author to Make Magazine and a founding member of HacDC.Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-17013142505306981742010-11-16T09:19:00.003-05:002010-11-22T22:06:07.995-05:00Kickstarter projected launched!Alright all you silent readers, now I need your help.<br />
Anool has fixed the design files and we are ready to do another board run. Want one? Sign up at Kickstarter.com. Don't want one,but want to see us succeed anyway? Then please tell a friend.<br />
<br />
<a href="http://www.kickstarter.com/projects/252714519/clockthree">http://www.kickstarter.com/projects/252714519/clockthree</a><br />
<br />
Thanks!<br />
Justin<br />
<br />
<iframe frameborder="0" height="410px" src="http://www.kickstarter.com/projects/252714519/clockthree/widget/video.html" width="480px"></iframe><br />
<br />
Don't miss this super cool ipod watch thingy either!<br />
<iframe frameborder="0" height="380px" src="http://www.kickstarter.com/projects/1104350651/tiktok-lunatik-multi-touch-watch-kits/widget/card.html" width="220px"></iframe>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com2tag:blogger.com,1999:blog-15767583.post-33447978913291381552010-11-06T18:04:00.000-04:002010-11-06T18:04:25.301-04:00Square Pegs<div class="separator" style="clear: both; text-align: left;">NNNnnoooooooooo!</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;">How do you fit a square peg into a round hole?</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzz5yxgPaO2zbN6UcBghY09iD0PZ3Z1zbAKEdIpfZnRTTaHF36PQ9BY4KIbsApN-oo-5Yd8460MBq-AA0Nv8SIsia0AZgptdIymI2SmgNm08cQ6FaRXJRCcKGirr12M7I8-NdfVQ/s1600/SquarePegs1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="447" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzz5yxgPaO2zbN6UcBghY09iD0PZ3Z1zbAKEdIpfZnRTTaHF36PQ9BY4KIbsApN-oo-5Yd8460MBq-AA0Nv8SIsia0AZgptdIymI2SmgNm08cQ6FaRXJRCcKGirr12M7I8-NdfVQ/s640/SquarePegs1.JPG" width="640" /></a></div><br />
The set of holes on the right has been drilled out to accommodate the square leads of the LED. Compare those to the set of holes on the left which are the original size.<br />
<br />
Anool is drilling out one board (over 700 holes) and we are getting the rest drilled at the factory (thousands of holes). The only problem is that we loose the connect through the board and will need to solder on both sides. Hope Anool can get a board built up this week and test the rest of the circuitry!<br />
<br />
Rev two anyone?Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-74656934851885109792010-11-05T17:48:00.002-04:002010-11-05T18:06:30.988-04:00ClockZWEI<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUyBzQmQe76SWSnVvQXZVQ_TjfnPsJRGRctlNVUiS-F9AbL1c8Fbd8pyOgK8fcZtLbaMulmpf03cXGZWkrB2nlFEcgH7-l9JDx1c-wWH87977D5YTuZ4v4P8NE1bRjgNxvLBK1_w/s1600/ScreenshotDeutsch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUyBzQmQe76SWSnVvQXZVQ_TjfnPsJRGRctlNVUiS-F9AbL1c8Fbd8pyOgK8fcZtLbaMulmpf03cXGZWkrB2nlFEcgH7-l9JDx1c-wWH87977D5YTuZ4v4P8NE1bRjgNxvLBK1_w/s640/ScreenshotDeutsch.png" width="640" /></a></div><br />
I wanted to see how difficult it would be to add another language. German! Now for some cool graphical effects. Not too difficult, but we need a real German to tweak it for us, volunteers? Code available <a href="http://code.google.com/p/clocktwo/source/browse/#svn/trunk">here</a>.Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com1tag:blogger.com,1999:blog-15767583.post-36715570609029077882010-10-31T18:41:00.004-04:002010-11-02T16:58:04.068-04:00And now something new from the Overkill Department ...This clock reads the NMEA message from the GPS and sends it over to the 7-segment serial display.<br /><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidG0hisUZPQ5VtXLxOvKTytvZ-5AWrkLPHBCbJhZzgOMxdi4la96MfxuJJEFZaTX4prSBxFJ5XzxyiN64VL7NVWWjZjdOZFTG4bjzKIHu7EQZTn9BBO6t9grYXjHroZz2j5z718w/s1600/IMG_20101031_183049.jpg" imageanchor="1"><img height="478" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidG0hisUZPQ5VtXLxOvKTytvZ-5AWrkLPHBCbJhZzgOMxdi4la96MfxuJJEFZaTX4prSBxFJ5XzxyiN64VL7NVWWjZjdOZFTG4bjzKIHu7EQZTn9BBO6t9grYXjHroZz2j5z718w/s640/IMG_20101031_183049.jpg" width="640" border="0" /></a></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left"><br /></div><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: left">This is just a simple application to experiment with GPS and serial display. The stack-up consists of a <a href="http://www.sparkfun.com/commerce/product_info.php?products_id=465">GPS module</a>, a <a href="http://www.sparkfun.com/commerce/product_info.php?products_id=9487">GPS shield</a>, a <a href="http://www.liquidware.com/shop/show/DTX/DoubleTall+ExtenderShield">double-tall ExtenderShield</a>, and <a href="http://www.sparkfun.com/commerce/product_info.php?products_id=9766">7-segment serial display</a>. In the photo, the flash washed out the LEDs, but this display is really bright (with digital dimmer options, too). The setup worked better than I expected. The GPS even got a location fix from my basement. This was one of the few projects where everything worked pretty much the first time, and only took about an hour. </div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left"><br /></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left">... I'm thinking this would probably not be a good project to ship over seas right about now.</div>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-3333809415936862662010-10-28T21:19:00.006-04:002010-11-02T16:06:48.916-04:00ClockTWO SimulatorThe <a href="http://wyoinnovation.blogspot.com/2010/10/its-about-time-clocktwo.html">ClockTWO</a> boards should be completed in Mumbai today. Then it will take another couple of weeks to get a few sent here. In the meantime I've started working on the code.<br /><br />This <a href="http://clocktwo.googlecode.com/svn/trunk/ClockTWO.py">Python simulation</a> with <a href="https://docs.google.com/leaf?id=0B7IyXLWdZyNWNjhiZGIxMGUtNmU5Yi00YzI5LTllZDgtYmQ0ZTU0MmRiYzMz&hl=en">py2exe executable</a> (to use: unzip, double-click dist/ClockTWO.exe) implements the same data structure that ClockTWO uses, so I can see if I am getting all the bits manipulated as I expect.<br /><br />Controls to set the time:<br />s -- forward one second<br />S -- backward one second<br />m -- forward one minute<br />M -- backward one minute<br /><div style="MARGIN: 0px">f -- forward five minutes</div><div style="MARGIN: 0px">F -- backward five minutes</div><div style="MARGIN: 0px">h -- forward one hour</div><div style="MARGIN: 0px">H -- backward one hour</div><div style="MARGIN: 0px"><br /></div><div style="MARGIN: 0px">The I, M, and D buttons emulate the hardware buttons. I moves forward one minute, D move back one minute, and M changes the color.</div><br />Please download, test, and provide feedback.<br /><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrQreU7DNQvFV5bvyDQlZQgG5ZQ66LizlMKVKlJypKtU691QZ0ROKpfZWM3AhndcO3LQD6MH6gWXkdQ1FTJs__5cMb1ZIipV3ijFW8aDsbU2nc-HgDXkQ6vEN7SrsxSwMI6_x3Dg/s1600/ClockTWOSim.png" imageanchor="1"><img height="460" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrQreU7DNQvFV5bvyDQlZQgG5ZQ66LizlMKVKlJypKtU691QZ0ROKpfZWM3AhndcO3LQD6MH6gWXkdQ1FTJs__5cMb1ZIipV3ijFW8aDsbU2nc-HgDXkQ6vEN7SrsxSwMI6_x3Dg/s640/ClockTWOSim.png" width="640" border="0" /></a></div>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com3tag:blogger.com,1999:blog-15767583.post-38986874573770464942010-10-22T09:59:00.003-04:002010-11-02T16:27:32.215-04:00First Road TestThe pitch tracking worked well. It was obvious that some yaw and roll tracking will be necessary. The lights come on when the rider looks around. Also sensitivity could be improved.<br /><br />To that effect, Nat Dyck (college roommate) and I built up a Lego swing for the SharkFin. The swing allows the SharkFin to rotate while keeping the accelerometer at the center of rotation. Thus, the pitch measurement from the Accel. should be uncorrupted by the motion.<br /><br />The second picture is a long exposure to show the center of rotation. It is not spinning nearly as fast as it looks.<br /><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWaajyN63rpew7zgivziaz5UHqHPCiWTuqzMq3r_Z18I00Q0yk5QUcC-oJphTf2Ockg68qP9b_ZVQqPbcqiI6zuvtONba-jLqMhbACaWFkl-aVDr8-XOJK7YI61-D0pH6oqxAYdg/s1600/IMG_20101022_094118.jpg" imageanchor="1"><img height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWaajyN63rpew7zgivziaz5UHqHPCiWTuqzMq3r_Z18I00Q0yk5QUcC-oJphTf2Ockg68qP9b_ZVQqPbcqiI6zuvtONba-jLqMhbACaWFkl-aVDr8-XOJK7YI61-D0pH6oqxAYdg/s400/IMG_20101022_094118.jpg" width="298" border="0" /></a></div><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFFc6yUaKGw_opfcqRumn59t-Kg_rQrqO4g9QKJKD7rLbv51Bz1hHK3jY0q-4y3PYlEJuH_r0phSOq5C1V4pcGycDarbaPWCHfiiWBOh0q5TQpLRgwr1sXNBUDhwKa9L5u3aLJAg/s1600/IMG_20101022_093837.jpg" imageanchor="1"><img height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFFc6yUaKGw_opfcqRumn59t-Kg_rQrqO4g9QKJKD7rLbv51Bz1hHK3jY0q-4y3PYlEJuH_r0phSOq5C1V4pcGycDarbaPWCHfiiWBOh0q5TQpLRgwr1sXNBUDhwKa9L5u3aLJAg/s400/IMG_20101022_093837.jpg" width="298" border="0" /></a></div>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-40998907347184190082010-10-17T12:48:00.010-04:002010-11-02T17:28:08.695-04:00Gyro Calibration: Done.<div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSaLJ5JY0UOHTp-0OX3NFRnjfjwArfR3-HmqWI5XdHMTJvT1N79c2ynXrGU46qQ5GtBS05TcK5yI4POCwcywmepaVTvQdArt-P3BHLzw_3_tuvtfeyynzNH3WFZDdVtj9M5cy6lw/s1600/IMG_20101016_180607.jpg" imageanchor="1"><img height="478" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSaLJ5JY0UOHTp-0OX3NFRnjfjwArfR3-HmqWI5XdHMTJvT1N79c2ynXrGU46qQ5GtBS05TcK5yI4POCwcywmepaVTvQdArt-P3BHLzw_3_tuvtfeyynzNH3WFZDdVtj9M5cy6lw/s640/IMG_20101016_180607.jpg" width="640" border="0" /></a></div><br />Ok, so it has taken me eight months, but I finally have the <a href="http://wyoinnovation.blogspot.com/2010/03/sharkfin-first-wireless-helmet-mounted.html">SharkFin</a> gyro calibration figured out. This should have been a simple task, but several technical issues combined with summer fun held up this project.<br /><br />Recall that the SharkFin is a wireless helmet mounted inertial brake light for bicyclist. MEMS (read tiny) instruments measure accelerations and rotations to determine if the brakes are being applied and light the rear facing LEDs. Since the <a href="http://www.instructables.com/id/Bar-End-Brake-Light-BEBL/">Bar End Brake Light</a> and <a href="http://wyoinnovation.blogspot.com/2009/03/complete.html">Amy's Brake Light</a> were mounted directly to the bike, tracking the forward direction (against which braking is measured) was fairly simple. But sensors mounted on the helmet make it much more difficult, since the rider is constantly looking around. We (Anool and I) added a gyro, which measures rotational rate, to help keep track of the forward direction as the rider moves his head. We had some issues with our first analog board, but were able to substitute the <a href="http://www.sparkfun.com/commerce/product_info.php?products_id=9623">SparkFun Razor 9DOF</a> sensor board for the troubled sensors.<br /><br />The trouble is that the gyro measurements are affected by temperature (and other things) that are not being measured, which impacts the knowledge of the forward direction enough to either shine the brake lights when no brakes are applied or to not apply the brakes under hard braking: two bad situations.<br /><br />On a bike, light braking is about 1/20 G (where 1G is the amount of acceleration on the surface of the Earth due to gravity). In order for the SharkFin to work, the calibration needs to be accurate down to about 1/100G or about 10 cm / sec^2. This is a sensitive measurement for a dynamic platform. This magnitude of error would be caused by only 1/2 degree error in the pitch estimate.<br /><br />Luckily, the onboard accelerometer can be used as an external rate measurement reference. It is not very accurate for a single measurement, but can be very accurate if averaged over a long period of time. This averaging allows us to continually track and update the gyro parameters and, hopefully, to keep the pitch measurement within that 1/2 degree tolerance mentioned above.<br /><br />And there are other forces that need to be reckoned to meet this requirement. Namely, the centrifugal and tangential forces experienced by the sensors as the head rotates. In an extreme scenario, such as at a Metallica concert, these forces can be as large as a full G. Even in normal cases, they are too large to be ignored. The calibrated gyro measurements can be used to estimate and remove these not-braking accelerations.<br /><br />Initially, I was optimistic that I could find some existing code that could be adapted to this situation, but no dice.<br /><br /><b>Details</b><br /><b>Initial Gyro Cal</b><br />Here, we estimate the gain and bias parameters of the gyro offline. In this case, we assume the gyro parameters are static and estimate them using the accelerometer measurements (which is already well calibrated). The model for the gyro is linear. That means that the conversion of the integer counts <i>c</i> from the analog to digital converter (ADC) into an actual pitch rate is given by<br /><b></b><br />omega = a <i>c</i> + b,<br /><br />where a and b are the unknown parameters we seek. You may be more familiar with the related model:<br />omega = (c - <i>d</i>) <i>f,</i><br />which is the same when <i>f = a</i> and -<i>df</i> = <i>b</i>. But this form has issues with linear estimation because the <i>df</i> term is quatratic. The actual pitch angle is the integral of the pitch rate. Subscripts are used to denote the measurement number: c0 is the first count, pitch0 is the first pitch and so on.<br /><br />For a small amount of time <i>dt</i>, where small means that omega is not changing significantly over this time period, we can approximate the change in pitch as<br /><br />pitch1 - pitch0 = (a<i>c</i>0 + b) <i>dt, </i>or<i><br /></i><br />pitch1 = pitch0 + (a<i>c</i>0 + b) <i>dt.</i><br /><br />Continuing on,<br />pitch2 = pitch1 + (a<i>c</i>1 + b) <i>dt or,</i><br />pitch2 = pitch0 + (a<i>c</i>0 + b) <i>dt + </i>(a<i>c</i>1 + b) <i>dt</i> or<i>,</i><br />pitch2 = pitch0 + a<i> dt</i>(<i>c</i>0 + <i>c</i>1) + b 2 <i>dt.</i><br /><i><br /></i><br />You get the idea:<br />pitchk = pitch0 + a <i>dt</i> (sum(<i>c</i>i) + b <i>dt</i> k.<br /><br />If <i>N</i> measurements are taken, we have a system of <i>N</i> equations but only three unknowns (<i>a, b</i>, and theta0), in other words a very over determined system of equations. (We treat theta0 as an unknown, since the actual first measurement is corrupted and we don't want these errors to impact our estimate of <i>a</i> and <i>b</i>.) A little linear algebra makes this situation more manageable.<br /><br />Let:<br />Pitch be the column vector of all of the pitch measurements taken from the accelerometer,<br /><i>A </i>be the <i>N</i> x 3 matrix with columns cumsum(C * DT), cumsum(DT), ones,<br />and <i>x</i> be the 3-vector [<i>a, b</i>, theta0],<br />C is the vector of gyro ADC counts,<br />DT is the vector of time deltas (<i>dt</i> s) in practice these may not be all equal,<br />ones is the vector of all ones.<br />The product C * DT is taken element wise.<br />Here cumsum is the cumulative sum of a vector. An example makes this clear:<br />cumsum([1, 2, 3, 3, 5]) = [1, 3, 6, 9, 14].<br /><br />With this notation we have the much improved<br />Pitch = <i>Ax.</i><br /><br />This is easily solved using least sqares<br /><br /><i>x</i> = (<i>A</i>^t <i>A</i>)^(-1) <i>A</i>^t Pitch,<br /><br />where ^t is the matrix transpose of the preceding matrix.<br /><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLlc5i9F30yiktXLG4MIYAhaIoJdXdT95TkuS66GKJ5FtwjSJMxc8YL0HozdvWLRHkKd0JKy9WeqwS6wzBLrJDT7x0Z-We0mxKBxVjmSuCI0SG1KLX4Oayn0KpjuMCO4ogMGpPrQ/s1600/initial_cal.png" imageanchor="1"><img height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLlc5i9F30yiktXLG4MIYAhaIoJdXdT95TkuS66GKJ5FtwjSJMxc8YL0HozdvWLRHkKd0JKy9WeqwS6wzBLrJDT7x0Z-We0mxKBxVjmSuCI0SG1KLX4Oayn0KpjuMCO4ogMGpPrQ/s640/initial_cal.png" width="640" border="0" /></a></div>That is it! I collected about 30 seconds worth of data pivoting the unit back and forth in my hand and got a really nice fit. The upper plot shows the pitch measurement for both the accelerometer and the gyro. The lower plot shows the difference between the two measurements. The astute reader might take issue with the large differences up to 10 degrees. This is because the accelerometer also as errors and I can't actually pivot about the gyro as I rotate the unit back and forth with my hands. I will set up a better calibration setup if this turns out to be too bad.<br /><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5x2YTKUC87QZUixXmXRZ-rti6l-J31VVOcEzOt8hrpgkztpjuReRs5L1VrK665AD_BTUf5ni2hhTmVIeYzGofWciLg9CNayflD9U-IziB3K-7NIO1rjEYepFg-SX8oF7Uja84aw/s1600/IMG_20101022_094118.jpg" imageanchor="1"><img height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5x2YTKUC87QZUixXmXRZ-rti6l-J31VVOcEzOt8hrpgkztpjuReRs5L1VrK665AD_BTUf5ni2hhTmVIeYzGofWciLg9CNayflD9U-IziB3K-7NIO1rjEYepFg-SX8oF7Uja84aw/s320/IMG_20101022_094118.jpg" width="239" border="0" /></a><a style="CLEAR: right; FLOAT: right; MARGIN-BOTTOM: 1em; MARGIN-LEFT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijYmXhYnJXxWIH6sB1tp6NNpzHf3Ioj8e7h07OzKl8PT6kgP0eToxgsvnjx92GH94va-sD-od-wQBUESbI4KpnF1zFgJb6FiRcs_x1mB_AlFwgct_0QduIv1QFSC3dtU9TlGxQBA/s1600/IMG_20101022_093837.jpg"><img height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijYmXhYnJXxWIH6sB1tp6NNpzHf3Ioj8e7h07OzKl8PT6kgP0eToxgsvnjx92GH94va-sD-od-wQBUESbI4KpnF1zFgJb6FiRcs_x1mB_AlFwgct_0QduIv1QFSC3dtU9TlGxQBA/s320/IMG_20101022_093837.jpg" width="239" border="0" /></a></div><p>UPDATE 2010-10-22. Nat Dyck, my roommate from college, made me a fancy lego structure to calibrate the gyro. The device allows the SharkFin to spin with the accelerometer at the center of rotation. See road testing.<br /><br /><a style="CLEAR: right; FLOAT: right; MARGIN-BOTTOM: 1em; MARGIN-LEFT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijYmXhYnJXxWIH6sB1tp6NNpzHf3Ioj8e7h07OzKl8PT6kgP0eToxgsvnjx92GH94va-sD-od-wQBUESbI4KpnF1zFgJb6FiRcs_x1mB_AlFwgct_0QduIv1QFSC3dtU9TlGxQBA/s1600/IMG_20101022_093837.jpg" imageanchor="1"></a><b>Doomsday Gyro Cal</b><br />... in which the continual gyro calibration is discussed<b>.</b><br />So the gyro parameters <i>a, </i>and <i>b</i><b> </b>need to be updated on a regular basis. We do this by updating our <i>prior </i>estimate with new information about the gyro parameters. In this case, since we cannot control the rider's head motion, we must accept the measurements that are provided. The rider my look down a lot to check the chain which would provide a great gain measurement <i>a</i>. Or the rider could hold perfectly still and provide a great bias measurement. One thing we to not want to do is to mess up a perfectly good <i>prior</i> gain estimate with new data. </p><p>We only get insight into the gain measurement when the rider is moving his head. If the rider is holding still we get a crappy gain measurement. Either way we get a gain measurement. It could be a good one, a bad one, or anything in between. </p><p>We want to update the prior gain estimate with this new information. Suppose we did something dumb and just averaged our prior gain estimate with the update.<br />gain_new = (gain_prior + gain_est) / 2.<br />If gain_est is bad, we just messed up our prior estimate with junk. If gain_est is really really good, we are messing up our gain_est with gain_prior. We really want a weighted average that balances how good we believe gain_est and gain_prior are.<br />Weighting by the inverse covariance does exactly that.<br /><br />In other words we need to weight the new estimates by our confidence we have in them for each parameter. A great general purpose weighting scheme is to weight each term in the weighted average by its inverse covariance. When in doubt, this is the goto weighting scheme, optimal in several respects.<br /><br />Our initial estimate of <i>x</i> comes with a covariance of that estimate. Provided we know the covariance of the input data (of Pitch in this case). Since the Pitch vector comes from independent accelerometer measurements, take<br /><br />cov[Pitch] = sigma^2 <i>I, </i><br /><br /><i>I</i> being the <i>N</i>x<i>N</i> identity matrix, and sigma the standard deviation of the individual pitch measurements. Then the covariance of our estimate is<br /><br />cov(<i>x</i>) = sigma^2 (<i>A</i>^t <i>A</i>)^-1.<br /><br />This covariance tells us exactly how much we can trust our estimate. If we held very still during the collection period, the gain variance will be very large. The variance comes down the more rate diversity there is over the collection period.<br /><br />So if we have two estimates for <i>x</i> , <i>x</i>1 and <i>x</i>2, along with the associated covariances cov1 and cov2, we can combine them into a single improved esitmate optimally as<br /><br /><i>x</i>_new = (cov1^-1 + cov2^-1)^1 (cov1^-1(<i>x</i>1) + cov2^-1(<i>x</i>2)).<br />So we can keep a running estimate in this way by updated our prior estimate with the new data.<br /><br />The covariance of <i>x</i>_new is already computed:<br />cov(<i>x</i>_new) = (cov1^-1 + cov2^-1)^1.<br /><br />On thing the covariance above does not account for is the amount <i>x</i> changes between estimates. To account for this change we add a covariance term to represent it. This is sometimes referred to as plant noise, so I use the symbol cov_plant for it.<br /><br />In the algorithm that follows, a shortcut has been made for simplicity. Since the Omega measurements are derived from the difference of two pitch measurements, they are not independent. The covariance matrix for Omega is actually tri-diagonal. The increased accuracy however does not justify the increased computational complexity, especially for an algorithm that is intended to run on a micro-controller.<br /><br /><b>Algorithm Doomsday Cal.</b><br />Inputs:<br /><i>x</i>_init -- the initial estimate for <i>x.</i><br />cov_init -- covariance of <i>x</i>_init<br /><i>K</i> -- number of measurement to take between each cal update<br />sigma -- standard deviation of raw pitch measurement from accelometer<br />cov_plant -- un-modeled covariance<br /><br />Outputs:<br /><i>x -- </i>A running estimate of the gyro parameters a and b.<br /></p><div style="FONT-FAMILY: 'Courier New',Courier,monospace"><br /></div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">#initialize</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">last_theta, last_time = measure theta, time</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace"><i>x</i> = <i>x</i>_init</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">cov = cov_init</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace"><br /></div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">while 1: # loop forever (or until doomsday)</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">Omega = []</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">Count = [] </div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">for k in [0..K-1]:</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">measure theta, c, time</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">Omega.append((theta - last_theta) / (time - last_time))</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">Count.append(c)</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">last_theta = theta</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">last_time = time</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace"><i>A</i> = column(Count, ones(K))</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace"><i>x</i>_new = (<i>A</i>^t <i>A</i>)^(-1) <i>A</i>^t Omega</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace">cov_new = sigma^2 (<i>A</i>^t <i>A</i>)^-1</div><div style="FONT-FAMILY: 'Courier New',Courier,monospace"><i>x</i> = (cov^-1 + cov_new^-1)^-1 (cov^-1(<i>x</i>) + cov_new^-1(<i>x</i>_new))</div><span style="font-family:'Courier New',Courier,monospace;">cov = (cov^-1 + cov_new^-1)^-1 + cov_plant</span><br /><br />The gyro gain parameter seems to be very stable. We neither want nor expect this measurement to change much if at all. So in practice, cov_plant and cov_init can be made to prevent large updates to <em>a</em> by making the upper left element of these matrices to be very small implying very accurate prior knowledge of <em>a</em>.<br /><br /><b>Radial and Tangential Accelerations</b><br />These sensors are really good. The idea here is to use the gyro measurements to predict the non-braking accelerations and subtract them from the accerometer measurements before the braking estimate is made. It is really exciting to see this Math in Action, literally. We pose a simple circular model for the head movements and take two derivatives to get the acceleration. Comparing the expected results with actual measurements shows both that the model is right and how accurate these sensors are.<br />The circular model for head movements is:<br /><br /><i>p</i> = <i>r</i>[sin(pitch), cos(pitch)],<br /><br />where <em>r</em> is the radius of rotation, and <i>p</i> is the sensor position in the [Forward, Up] frame or f-u frame for short (no slight intended). One of the difficulties is keeping track of the sensor x-y frame relative to the f-u frame. That is, I guess, the entire problem.<br /><br />The velocity vector is the time derivitive of the position vector. Using the chain rule from Calculus I (since pitch is also a function of time with <i>d</i>pitch / <i>dt</i> = omega) the velocity from head motion alone is computed as.<br /><br /><i>v</i> = <i>r</i>[cos(pitch), -sin(pitch)] omega.<br /><br />Recall that chain rule states that <i>f(u(x))' - f'(u(x)) u'(x).</i> The product rule is<br /><br />[<i>f(x) g(x)</i>]' = f(x) g'(x) + f'(x) g(x)<br /><br />Using the chain rule once again with the product rule and letting omegadot be the time rate of change of omega, the acceleration measurement is<br /><br /><i>a</i> = -<i>p</i> omega^2 + <i>v</i> omegadot / omega.<br />or<br />a = R + T<br /><br />where the radial R and tangential T components of the rotation acceleration are given by<br /><br />R = -<i>p</i> omega^2 and<br />T = <i>v</i> omegadot / omega<br />= <i>r</i>[cos(pitch), -sin(pitch)] omegadot<br />The SharkFin was mounted to a bicycle wheel (see title picture) to confirm no major errors were made in the circular model calculations. A rubber band prevented the wheel from spinning more than 90 degrees. Over the 30 second run, the wheel was spun vigorously back and forth through its range of motion. In the pitcure below, the actual x-y acceleration measurements are transformed into f-u coordinates and compared to these R + T.<br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHwrfa7oC89BlNY6DmSup-cvFbse-xWyXWq-vquPUa4L-Fxm9_-1xZYiF0jK6nSEGO7IKHR1IHW0CCozX-2ASVo2fxJbVQks2Fi9Md3Pci-yqKG3ntAzxt2gIc71SIhDL1ojd2g/s1600/f-u_comparison.png" imageanchor="1"><img height="355" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgHwrfa7oC89BlNY6DmSup-cvFbse-xWyXWq-vquPUa4L-Fxm9_-1xZYiF0jK6nSEGO7IKHR1IHW0CCozX-2ASVo2fxJbVQks2Fi9Md3Pci-yqKG3ntAzxt2gIc71SIhDL1ojd2g/s640/f-u_comparison.png" width="640" border="0" /></a></div>The blue line shows the f-u accelerations in Gs predicted from the gyro measurements. The green line shows the accelerometer measurements rotated into the f-u frame. The acceleration due to gravity, [0, 1] in the f-u frame, has been subtracted out as well. This is not a bad fit considering that the two measurements are completely independent.<br /><br />The next plot shows the accelerations measured in the forward direction. This is the direction we are most concerned with for braking measurements.<br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvIBASA1EMemd-OOuMMHQcLuNSiF1KujBCFpjoQyRGnTcPJ-o5ysRf5JcxU5DWR4Hy6ibBOJRxEN1cwuWL5ytGkR6WPrpL5Vz38-EQhUKAgXIkq8UmzCkHIKNLLqBRp7wFTjVL9g/s1600/breaking.png" imageanchor="1"><img height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvIBASA1EMemd-OOuMMHQcLuNSiF1KujBCFpjoQyRGnTcPJ-o5ysRf5JcxU5DWR4Hy6ibBOJRxEN1cwuWL5ytGkR6WPrpL5Vz38-EQhUKAgXIkq8UmzCkHIKNLLqBRp7wFTjVL9g/s640/breaking.png" width="640" border="0" /></a></div>The top plot shows the predicted and measured forward accelerations, the middle plot shows the difference between the two (the raw braking measurement). The lower shows the smoothed braking measurement. Ideally, since the motion is strictly circular with no braking involved, we would hope to see zero braking. Because of the large radius and vigorous motion, the errors creep up to .1 Gs. This should be much smaller for an actual helmet mount during non-head-banging activities. The upward trend is due to the gyro measurement drifting away from the true pitch measurement. This is dealt with by using the accelerometer measurements as an absolute, if noisy, reference.<br /><br />That's it on gyro calibration. If you made it this far, congratulations. I've spared you the details of all of the mistakes and dead ends I have traversed. I'll save the full braking algorithm for another post.Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com2tag:blogger.com,1999:blog-15767583.post-79468968544082734532010-10-12T22:05:00.003-04:002010-11-02T16:31:47.378-04:00Its about time: ClockTWO!<div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjxUbhPbIRH2ZkAK3LnFCND9Is3xP74nxBAzC5WmuDUhHCidDD5OqaqbvLWi1aP_yoJeMkkpImJWHJj0y6GX34T9E-cgSYFSa9mjw9UEFnPSUIP1EnHdqy9YP7mU3cc5N5k8XlkQ/s1600/clockTWO_faceplate.png" imageanchor="1"><img height="456" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjxUbhPbIRH2ZkAK3LnFCND9Is3xP74nxBAzC5WmuDUhHCidDD5OqaqbvLWi1aP_yoJeMkkpImJWHJj0y6GX34T9E-cgSYFSa9mjw9UEFnPSUIP1EnHdqy9YP7mU3cc5N5k8XlkQ/s640/clockTWO_faceplate.png" width="640" border="0" /></a></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><br /></div>I know you've been asking yourself, why is there no large open-source-hardware RGB LED array available? Anool and I wondered the same thing. You may have seen our earlier clock, the Worduino, based on <a href="http://blog.makezine.com/archive/2010/06/kits_kitmakers_doug_canberras_diy_w.html">Doug Jackson's ever popular Word Clock</a>. This time, we decided to design a general-purpose Arduino based RGB array. The hefty 12 x 9 inch board supports up to 160 individually addressable <a href="http://evilmadscience.com/partsmenu/89-led">RGB LEDs</a> and an additional 32 mono LEDs which will easily accommodate a word clock. Our improved faceplate allows you to program reminders to hydrate with your favorite beverage. Looks like its "beer thirty" again. But, if you put a map transparency in front of it, you got the makings of a <a href="http://www.mapmaker.com/shadowfacts/v65/index.htm">sunclock</a>. Or maybe you just need some colorful scrolling text.<br /><div style="TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCIOYUO5H4HhWe3zE_5wWMwSCVK9WQde8XlvavzGEw4hVcRpGr2AP_RlCFYlegbWPrZcjLE5XLKO6TBswSSSwDLg2-hnYnu51qMZk1pu47pA9hvS_h7Fn0y8XR4zVPiudW-sisuw/s1600/ClockTWO3D.jpg" imageanchor="1"><img height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCIOYUO5H4HhWe3zE_5wWMwSCVK9WQde8XlvavzGEw4hVcRpGr2AP_RlCFYlegbWPrZcjLE5XLKO6TBswSSSwDLg2-hnYnu51qMZk1pu47pA9hvS_h7Fn0y8XR4zVPiudW-sisuw/s640/ClockTWO3D.jpg" width="640" border="0" /></a></div>Those familiar with Evil Mad Science <a href="http://www.evilmadscientist.com/article.php/peggy2">Peggy2 board</a> will recognize the array architecture right away. It was a huge relief to start with a functional design and our hats are off to the the Evil Scientists! In addition to the array we have added a real time clock, light sensor, buzzer, and I2C interfaces for chaining boards horizontally end-to-end. The small squares on the right are pin compatible breakout boards, dubbed rtcBOB, that are pin compatible with the <a href="http://macetech.com/store/index.php?main_page=product_info&cPath=5&products_id=8">Chronodot</a>.<br /><br />Anool did a beautiful job with the layout and routing, painstakingly adding the myriad traces by hand. We ordered 10 boards for our initial run and plan to populate two test boards: one in India and one in the States. If it works like we hope, we will be making it available. If you want to get your hands on one early or have other questions or comments, <a href="mailto:wyojustin@gmail.com">drop us a line</a>. We'd love to hear from you.<br /><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUG1sgfNkBQRz0zpEYu9ASnSNjw8jiOiQneAgDgH91jA0UGhPkujBhklgc1HgANx5oIqmnu7xN8j3rdyFwD5DVy4xJOr2AQoQXVIFQAJV9vVmpQeEJ2tIhclNiFEg_85ZsPx-RLg/s1600/clockTWO_1.png" imageanchor="1"><img height="450" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUG1sgfNkBQRz0zpEYu9ASnSNjw8jiOiQneAgDgH91jA0UGhPkujBhklgc1HgANx5oIqmnu7xN8j3rdyFwD5DVy4xJOr2AQoQXVIFQAJV9vVmpQeEJ2tIhclNiFEg_85ZsPx-RLg/s640/clockTWO_1.png" width="640" border="0" /></a></div>This is an open source hardware project (<a href="http://www.sparkfun.com/commerce/news.php?id=456">whatever that means</a>). We will make all of the design files available when we decide on a (commercial friendly) licence.Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com1tag:blogger.com,1999:blog-15767583.post-90992002615214404242010-10-03T17:00:00.004-04:002010-11-02T16:29:49.077-04:00EMSL Larson Scanner Review<div class="separator" style="CLEAR: both; TEXT-ALIGN: left">UPDATE October 2010. Safety by Prada!</div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEXQcaoQ8nYwClREYTrY8aXX13Vx0luGnTCshiOKCwNPPPydPlcu4m_mzFBYFmM6AjwM6Mt_2iCe0lHQZkvMKOWmGnR0x-AKUSl6wOhOgHcPpEg8pXfJL8mefyPNjhIOJXozvLxg/s1600/IMG_20101031_091743.jpg" imageanchor="1"><img height="478" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEXQcaoQ8nYwClREYTrY8aXX13Vx0luGnTCshiOKCwNPPPydPlcu4m_mzFBYFmM6AjwM6Mt_2iCe0lHQZkvMKOWmGnR0x-AKUSl6wOhOgHcPpEg8pXfJL8mefyPNjhIOJXozvLxg/s640/IMG_20101031_091743.jpg" width="640" border="0" /></a></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left"><br /></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left"><br /></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijfmoz87Uhw0kZThQZ2nTP9isUamqrokKQ8isFd931Qst6K4EyIimu7btcgz0plW6qtb5sEz5I3khnq6p9H0oeMJ6fHTkuBIF4kzCelJi_EJuVCpTVV8XxyGaEMz0WiBikSm4mWg/s1600/IMG_20100926_155242.jpg" imageanchor="1"><img height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijfmoz87Uhw0kZThQZ2nTP9isUamqrokKQ8isFd931Qst6K4EyIimu7btcgz0plW6qtb5sEz5I3khnq6p9H0oeMJ6fHTkuBIF4kzCelJi_EJuVCpTVV8XxyGaEMz0WiBikSm4mWg/s320/IMG_20100926_155242.jpg" width="320" border="0" /></a></div>My 14-year-old daughter put together the <a href="http://evilmadscience.com/tinykitlist/152-scanner">Larson Scanner Kit</a> offered by the Evil Mad Science Laboratories (EMSL). We have put together quite a few soldering kits around here and this one is, simply put, the best "learn-to-solder" kit I've ever come across. There are several reasons for this. First off, the <a href="http://evilmadscience.com/KitInstrux/Larson_150.pdf">instructions</a> are great. Not only are they clear, they leave no uncertainty as to what you need to do at each step, but they are in the form of a <a href="http://evilmadscience.com/KitInstrux/Larson_150.pdf">comic book</a>, the perfect medium for this kit. This keeps the project light and fun.<br /><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtviV0AV-yW_P3Sw5c6_lSN__Og_Rm65L_D61U-RTQlQrvRBqmNTTUCrbqiHAuoN7kfyDtBYFAi69qrCSRkoeyGYtubw9tE37klLD-TsQKACEvo5ovJaFSX7Lek-RO9LKZd2iU5Q/s1600/IMG_20100926_145534.jpg" imageanchor="1"><img height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtviV0AV-yW_P3Sw5c6_lSN__Og_Rm65L_D61U-RTQlQrvRBqmNTTUCrbqiHAuoN7kfyDtBYFAi69qrCSRkoeyGYtubw9tE37klLD-TsQKACEvo5ovJaFSX7Lek-RO9LKZd2iU5Q/s320/IMG_20100926_145534.jpg" width="320" border="0" /></a></div><br />Next, the kit is exactly the right depth. The circuit is simple enough to understood by a novice. It's just a controller, 9 LEDs, 9 current limiting resistors to prevent the LEDs from burning out, and a button. It took her about an hour to complete the kit from start to finish.<br /><br />Which brings me to my next point: it's pretty freaking cool. When she turned it on for the first time, the LEDs began their smooth back and forth scanning. It is smooth because of the dimmer logic in the pre-programmed controller. It was actually a much cooler effect than I had anticipated. The mode button controls the speed of the scan as well as the brightness.<br /><br />Because the project is open source, if she decides to, she can crack open the code and modify the functionality. What about a school logo POV? EMSL has provided the breakout for in circuit programming, serial communication, and two ports for customization.<br /><br />The last salient feature I'd like to mention is the cost. At $13 flat, you can't go wrong.<br /><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFql6Rf9yJL3G2GVz5yfm7IDOJHyzpWGJMB1jsk3GB_oPUqP3_UpZ6sD-BYMorxx7tFuMIye1bl5qC9FtEtUgVOhwqmT2H1ExyU0e8JwZeS4nyc-faETT_V9ovk2Mf5GPLI9Silw/s1600/scannervamp.jpg" imageanchor="1"><img height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFql6Rf9yJL3G2GVz5yfm7IDOJHyzpWGJMB1jsk3GB_oPUqP3_UpZ6sD-BYMorxx7tFuMIye1bl5qC9FtEtUgVOhwqmT2H1ExyU0e8JwZeS4nyc-faETT_V9ovk2Mf5GPLI9Silw/s320/scannervamp.jpg" width="320" border="0" /></a></div>Maybe it's me, but do I detect a hint of Evil Madness?Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com7tag:blogger.com,1999:blog-15767583.post-11244821833455138372010-07-27T21:10:00.004-04:002010-11-02T16:35:00.066-04:00Liquidware Sensors Review<div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQuCMCGWU08MgN0Kbkp1bK0tc56VskYknpfbocPyE08nS34BAe-gHWUdghyphenhyphenkrU1KJGhMSoobdVt7aeM_IMkxGf3rlwyq_QRozaDVvxEPY_g5LjWe8l7ORB0LizXJxsoq3H-nNr1g/s1600/DSC08527.JPG" imageanchor="1"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQuCMCGWU08MgN0Kbkp1bK0tc56VskYknpfbocPyE08nS34BAe-gHWUdghyphenhyphenkrU1KJGhMSoobdVt7aeM_IMkxGf3rlwyq_QRozaDVvxEPY_g5LjWe8l7ORB0LizXJxsoq3H-nNr1g/s320/DSC08527.JPG" border="0" /></a></div><br /><a href="http://www.liquidware.com/">Liquidware</a>, the same folks who brought us the <a href="http://www.oshwbank.org/">Open Source Hardware Bank</a> have come out with a new line of sensor breakout boards that are worth taking a look at, especially if you are into Arduinos. Several factors distinguish the Liquidware boards from the others that are available.<br /><br />They are targeted for Arduino. You can, of course, use them with any suitable micro controller out there, but they make it really quick and easy to get the sensors up and running on Arduino. Each sensor has a cheat sheet divided into three sections: "Learn," that describes the basic principles of the sensor; "Connect," that tells you how to connect the sensor to an Arduino, and "Code," that shows a minimal example of how to read data off the sensor. With these cheats, I was able to get the 3-axis accel and the ambiant light sensor up and running within 5 minutes (and to think that I had been putting this off for a month for lack of time).<br /><br />I think these guys are on the right track here with these sensors. One improvement I might suggest, is to go beyond the basics on the cheat sheet. I think this could be accomplished by shrinking the font a bit and adding a column named "More" or something like that. This column would explain the full funtionality of the device. On the accel for instance, it'd definitely be a plus up to have a table for the G1 and G2 pins that affect the sensitivity of the unit. If done correctly, the new sheet will not frighten beginners, but will be more useful to the pros.<br /><br />I've used a similar <a href="http://www.pololu.com/catalog/product/766">breakout board</a> for the accelerometer (MMA7260QT) from <a href="http://www.pololu.com/">Pololu</a>, which cost about five bucks less. If you go this route, you might need a little more time getting up to speed.<br /><br />Bottom Line:<br />If you are a seasoned pro, of course you will not NEED these hints, but even so, they will probably end up saving you some time getting things going.<br /><br />If your new to electronics, these sensors can increase your chances of success using sophisticated sensors.Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-10088417334827940852010-06-13T10:25:00.007-04:002010-11-02T16:45:32.274-04:00The days of the week (or how to pretend like you are a savant)<span class="Apple-style-span" style="font-family:inherit;">Being able to tell what day of the week a date like October 28, 2012, will fall on seems like an impressive feet of computation. It is actually quite simple if you can memorize a few numbers. </span><br /><span class="Apple-style-span" style="font-family:inherit;"></span><br /><span class="Apple-style-span" style="font-family:inherit;">My younger daughter </span><a href="http://book-lovers-galore.blogspot.com/"><span class="Apple-style-span" style="font-family:inherit;">Elizabeth</span></a><span class="Apple-style-span" style="font-family:inherit;"> and I have made a system whose only mental calculation is the addition of three numbers, all of which are less than seven. The sum of the three numbers indicates the day of the week. Sunday = 0, Monday = 1, and so on up to Saturday = 6. To complete the "savant" effect, say things like "Oh, that one is kinda bumpy so it is a Wednesday," or "Friday, it's blue and cold, definitely a Friday." If you decide to give it a go, be sure to try out my <a href="http://wyoinnovation.blogspot.com/2010/05/days-of-week.html">days of the week quiz program</a> in the previous post to test yourself.</span><br /><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><b><span class="Apple-style-span" style="font-family:inherit;">All of this math</span></b><span class="Apple-style-span" style="font-family:inherit;">, takes place in the group of integers modulo 7, which simply means that we only care about the remainder of the number after dividing by 7. In this group, 8 and 1 are "equivalent" since 1 / 7 = 0 remainder 1, and 8 / 7 = 1 remainder 1. They both have the same remainder of one, after dividing by 7 so they are "equivalent" for our purposes. This boils down to the fact the we care ONLY about the day of the week, not how many weeks have passed or will pass between now and then. So we throw out the quotient and keep the remainder. To indicate that the computations are specific to integers modulo 7, "mod 7" is appended to each line. Here are some example calculations in this arithmetic:</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">0 + 0 = 0 mod 7</span><br /><span class="Apple-style-span" style="font-family:inherit;">1 + 1 = 2 mod 7</span><br /><span class="Apple-style-span" style="font-family:inherit;">4 + 3 = 0 mod 7</span><br /><span class="Apple-style-span" style="font-family:inherit;">6 + 6 = 5 mod 7.</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">Try a few on your own:</span><br /><span class="Apple-style-span" style="font-family:inherit;">3 + 3 = ? mod 7</span><br /><span class="Apple-style-span" style="font-family:inherit;">5 + 2 = ? mod 7</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">Sometimes it is convenient to represent 6 as -1 mod 7. Since they share the same remainder after dividing by 7. With this in mind 6 + 6 = -1 + -1 mod 7 = -2 mod 7. Likewise -2 = 5 mod 7 and so on.</span><br /><div><span class="Apple-style-span" style="font-family:inherit;"><br /></span></div><div><span class="Apple-style-span" style="font-family:inherit;"><b>Each day, month, and year</b> gets assigned an integer modulo 7. For instance in the carefully chosen example above:</span></div><div><span class="Apple-style-span" style="font-family:inherit;">October = > 0</span></div><div><span class="Apple-style-span" style="font-family:inherit;">28 = > 0</span></div><div><span class="Apple-style-span" style="font-family:inherit;">2012 = > 0, </span></div><div><span class="Apple-style-span" style="font-family:inherit;">so October 28, 2012 falls on a Sunday (0 + 0 + 0 = 0 mod 7).</span></div><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">So the arithmetic is simple. The tricky part is memorizing the number assignments for the months and years. Let's make it simple by only considering dates in the current year (2010) and focus on the months and day assignments. The year 2010 gets assigned a 4 (we will talk about why later). </span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><b><span class="Apple-style-span" style="font-family:inherit;">The day assignments</span></b><span class="Apple-style-span" style="font-family:inherit;"> are the easiest: just take the day number modulo 7. The 15th of the month gets a 1 for instance since 15 = 1 mod 7.</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><b><span class="Apple-style-span" style="font-family:inherit;">The month assignments,</span></b><span class="Apple-style-span" style="font-family:inherit;"> in row order are:</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:'Courier New', Courier, monospace;">Jan:0 Feb:3 Mar:3</span><br /><span class="Apple-style-span" style="font-family:'Courier New', Courier, monospace;">Apr:6 May:1 Jun:4 </span><br /><span class="Apple-style-span" style="font-family:'Courier New', Courier, monospace;">Jul:6 Aug:2 Sep:5</span><br /><span class="Apple-style-span" style="font-family:'Courier New', Courier, monospace;">Oct:0 Nov:3 Dec:5</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">or leaving off the month names for compactness:</span><br /><span class="Apple-style-span" style="font-family:inherit;">0 3 3</span><br /><span class="Apple-style-span" style="font-family:inherit;">6 1 4</span><br /><span class="Apple-style-span" style="font-family:inherit;">6 2 4</span><br /><span class="Apple-style-span" style="font-family:inherit;">0 3 5</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">In this system, this block of 12 numbers must be memorized backwards and forwards, by rows and by columns, inside, outside and upside-down. Some months are easier for me to remember than others:</span><br /><span class="Apple-style-span" style="font-family:inherit;">January is a 0 (it starts everything off)</span><br /><span class="Apple-style-span" style="font-family:inherit;">March is a 3 (third month of the year)</span><br /><span class="Apple-style-span" style="font-family:inherit;">May is a 1 (May Day falls on May 1)</span><br /><span class="Apple-style-span" style="font-family:inherit;">October is a 0 (The big O in October looks like a zero).</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">The others just need to be memorized. It's not actually that bad, but if you think of a good mnemonic, let me know.</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">A brief note on how the month assignments are made. January gets assigned a 0 to start things off. This is somewhat an arbitrary choice, but if you change it, you will also have to change the year assignments. Since January has 31 days and 31 = 3 mod 7, the first of Feb is three days of the week offset from the first of January, thus February gets assigned a 3. February has 28 days </span>(exactly 4 weeks) most years so March 1st will fall on the same day as February 1st most years. Thus, we assign a 3 to March. March has 31 days which makes April 3 days offset from March (which was already 3 days offset from January 1st) , so April gets assigned a 6 (3 + 3 = 6 mod 7). Carry this process forward to compute the assignments for the other months.<br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">With this in hand, you can compute any day of the week for the year 2010:</span><br /><span class="Apple-style-span" style="font-family:inherit;">Oct 14, 2010 = > 0 + 0 + 4 = 4 mod 7, a Thursday</span><br /><span class="Apple-style-span" style="font-family:inherit;">Mar 10, 2010 = > 3 + 3 + 4 = 3 mod 7, a Wednesday</span><br /><span class="Apple-style-span" style="font-family:inherit;">July 4, 2010 = > 6 + 4 + 4 = 0 mod 7, a Sunday</span><br /><span class="Apple-style-span" style="font-family:inherit;">...</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><b><span class="Apple-style-span" style="font-family:inherit;">Now to tackle the year assignments.</span></b><span class="Apple-style-span" style="font-family:inherit;"> Be sure to get really fast for the current year before you go any further.</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">For reasons that might become clear later, the year assignment is the day of the week that March 4th falls on. March 4, 2010, happens to be a Thursday, so 2010 is a 4. Using a calendar we get the following assignments for some nearby years:</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><b><span class="Apple-style-span" style="font-family:inherit;">2007 = > 0</span></b><br /><span class="Apple-style-span" style="font-family:inherit;">2008 = > 2</span><br /><span class="Apple-style-span" style="font-family:inherit;">2009 = > 3</span><br /><span class="Apple-style-span" style="font-family:inherit;">2010 = > 4</span><br /><span class="Apple-style-span" style="font-family:inherit;">2011 = > 5</span><br /><b><span class="Apple-style-span" style="font-family:inherit;">2012 <span class="Apple-style-span" style="FONT-WEIGHT: normal">= ></span> 0</span></b><br /><span class="Apple-style-span" style="font-family:inherit;">2013 = > 1</span><br /><span class="Apple-style-span" style="font-family:inherit;">2014 = > 2</span><br /><span class="Apple-style-span" style="font-family:Arial, Helvetica, sans-serif;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">Observe that the years go up by one whenever the year is NOT a leap year. For a leap year the assignments are 2 larger than the previous year. This makes since since 365 = 1 mod 7 for a normal year, and 366 = 2 mod 7 for a leap year. Zero years are thus convenient milestones to anchor the assignments for neighboring years. Elizabeth and I have dubbed a zero assigned year, like 2007, as a </span><b><span class="Apple-style-span" style="font-family:inherit;">zear</span></b><span class="Apple-style-span" style="font-family:inherit;">. </span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">Every 28 years a zear falls on a leap year like 2012. These special years get a special name in this system. When a zear is also a leap year, it is refferred to as a le-zear pronounced "le" as in French with great flourish and accent on the second syllable: le-</span><b><span class="Apple-style-span" style="font-family:inherit;">Zear!</span></b><span class="Apple-style-span" style="font-family:inherit;"> </span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><span class="Apple-style-span" style="font-family:inherit;">Leap years require additional caution (Elizabeth always gets me on this!). If the date of interest is is in January or February of a leap year, subtract 1 from the count. Example:</span><br /><span class="Apple-style-span" style="font-family:inherit;">January 25, 2012 = > 0 + 4 + 0 = 4 mod 7 - 1 = 3 Mod 7, a Wednesday.</span><br /><span class="Apple-style-span" style="font-family:inherit;"><br /></span><br /><b><span class="Apple-style-span" style="font-family:inherit;">Additional hints:</span></b><br /><span class="Apple-style-span" style="font-family:inherit;">Within 100 years of 2000, the year assignments repeat every 28 years so 1970 gets the same assignment as 1998. This pattern is broken by the following fact.</span><br /><span class="Apple-style-span" style="font-family:inherit;">1900 is NOT a leap year. Every one hundred years we skip a leap year, unless the year is divisible by 400.</span><br /><span class="Apple-style-span" style="font-family:Arial, Helvetica, sans-serif;"><br /></span><br /><span class="Apple-style-span" style="font-family:Arial, Helvetica, sans-serif;"><br /></span>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com1tag:blogger.com,1999:blog-15767583.post-8156660162635522562010-05-28T19:32:00.002-04:002010-05-30T14:25:56.955-04:00Days of the week.<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeF8OUHP0aXsBRBq2HHQTqP6KTQ9VhUIaetM90qpgQ79gchzwVIOtK0Rd56OLX48itXz-fPWHEUpyasqj75oCwgfuJbV2_aOhvVbdI23736MxdvxQaDDhJ1gAzGOeT7GYkAkE2Sw/s1600/DOW.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeF8OUHP0aXsBRBq2HHQTqP6KTQ9VhUIaetM90qpgQ79gchzwVIOtK0Rd56OLX48itXz-fPWHEUpyasqj75oCwgfuJbV2_aOhvVbdI23736MxdvxQaDDhJ1gAzGOeT7GYkAkE2Sw/s400/DOW.png" width="400" /></a></div>I while back I wrote a day-of-the-week quiz program. Now for the life of me I can't find it. I re-wrote it. <a href="https://docs.google.com/leaf?id=0B7IyXLWdZyNWMzU5YjA2YzAtYmQ5MS00NGJjLWFhM2EtZDEzN2FmNGUzZjU3&hl=en"> Here it is</a>. Get good at it and amaze your friends.Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com1tag:blogger.com,1999:blog-15767583.post-72082178325549909312010-05-24T06:47:00.001-04:002010-05-25T07:28:46.694-04:00ADXL345 Arduino Driver III found a much more <a href="http://code.google.com/p/adxl345-arduino/">complete driver</a> for this accelerometer thanks to Kevin Stevenard. I updated the code and renamed a few things. The changes were, unfortunately, not backward compatible. I've reposted the modified code <a href="http://code.google.com/p/adxl345driver/">here</a>.<br />
<div><br />
</div><div>Thanks Kevin!</div>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-19268515764089236172010-05-23T15:03:00.003-04:002010-11-02T16:47:52.648-04:00Arduino: undefined reference to `loop'Ok, since this is the second time this has baffled me, I am making a note to myself. It turns out you cannot have a library with the same name as the pde file.<br /><br />This is the example that got me. The Arduino project .pde file is a test of an <a href="http://code.google.com/p/adxl345-arduino/">accelerometer library</a> (Adxl345.cpp, .h). Here is what the directory listing looks like.<br />.../sketchbook/Adxl345/Adxl345.pde<br />.../sketchbook/Adxl345/Adxl345.cpp<br />.../sketchbook/Adxl345/Adxl345.h<br /><br />This yeilds the cryptic error<br />undefined reference to `loop'<br /><br />or sometimes<br />undefined reference to `setup'<br /><br />or both. The fix is to rename the Arduino project as anything other than "Adxl345". Using "Save As" in arduino should do the trick. This is what the listing looks like that works:<br /><br /><div style="MARGIN: 0px">.../sketchbook/Adxl345<span class="Apple-style-span" style="color:red;"><b>_test</b></span>/Adxl345<span class="Apple-style-span" style="color:red;"><b>_test</b></span>.pde</div><div style="MARGIN: 0px">.../sketchbook/Adxl345<span class="Apple-style-span" style="color:red;"><b>_test</b></span>/Adxl345.cpp</div><div style="MARGIN: 0px">.../sketchbook/Adxl345<span class="Apple-style-span" style="color:red;"><b>_test</b></span>/Adxl345.h.</div><div style="MARGIN: 0px"><br /></div><div style="MARGIN: 0px"></div>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com4tag:blogger.com,1999:blog-15767583.post-41417731750993918232010-05-14T13:28:00.001-04:002010-05-15T02:16:49.842-04:00ADXL345 Arduino DriverI wrote a simple <a href="http://code.google.com/p/adxl345driver/downloads/list">driver</a> for the<a href="http://www.sparkfun.com/datasheets/Sensors/Accelerometer/ADXL345.pdf"> ADXL345</a> accelerometer on the<a href="http://www.sparkfun.com/commerce/product_info.php?products_id=9623"> Razor board</a>. The code provides read/write access to the registers on the device and allows you to change the bandwidth of the internal low pass filter. This little chip has an in-depth interface with stream buffering, fall detection, bump detection, double click detection besides autonomous low pass filtering. I have only scratched the surface here.<br />
<br />
A simple test script is located in the examples directory.Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0tag:blogger.com,1999:blog-15767583.post-89038696674762128792010-05-12T21:34:00.004-04:002010-11-02T16:49:07.258-04:00WORDUINO InstructionsAnool has prepared a <a href="http://docs.google.com/fileview?id=0B6WZ7PvuRoXHNjYxMmViNTAtYWI4Ni00MDc5LTkwYmMtYTIxNGM3YjZmMWUy&hl=en">beautiful set of instructions</a> for our WordClock. Unfortunately, there are only 6 copies of the boards so consider yourself lucky if you got a set. If anyone expresses an interest, we may make more of the next edition of WORDUINO. Please let us know if you are interested.<br /><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaRWeQubmmOf_DMOZfoGrZmRXHUyFa5EDt_uDPN6Yc8I_hkk3LXEuxCbb-3i9EOIcXkAf-sdKxzbnvitMeEqymYqH-EsX4MutW5ZM-Jp5_VAyPfgL41oPJQbCvgNHlJH6V8cviNQ/s1600/Screenshot.png" imageanchor="1"><img height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaRWeQubmmOf_DMOZfoGrZmRXHUyFa5EDt_uDPN6Yc8I_hkk3LXEuxCbb-3i9EOIcXkAf-sdKxzbnvitMeEqymYqH-EsX4MutW5ZM-Jp5_VAyPfgL41oPJQbCvgNHlJH6V8cviNQ/s640/Screenshot.png" width="640" border="0" /></a></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4FedcppXaEBgkJ2nj3DrbbEGfnNn6O-ZQ8cXAwwtjGdUbW5w4rDio75QLJQ9xhISqKu7Lo0slBpajXoCjOqCpUjGiyQcXTH51t8muLPeFTLpIymMhfH0JUpu3o-PSsvSGQF0Ymg/s1600/Screenshot.png" imageanchor="1"><img height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4FedcppXaEBgkJ2nj3DrbbEGfnNn6O-ZQ8cXAwwtjGdUbW5w4rDio75QLJQ9xhISqKu7Lo0slBpajXoCjOqCpUjGiyQcXTH51t8muLPeFTLpIymMhfH0JUpu3o-PSsvSGQF0Ymg/s400/Screenshot.png" width="400" border="0" /> </a></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left"><br /></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left">The flexible faceplate lettering has been laser etched.</div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left"><br /></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left"></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4roE2R1lnoH3Twcr4cwWKpOYN1T-Bhk-DALLdfJZ2osEsJ9LCOHaOi7LhF7Z1i97tcLSc1EnF2_tsDcxbN9mpXGNhtxof6FlTM6b4VSS9ZVoly3GR8OkRChPUJdOkSdqohPSrHQ/s1600/flexi_faceplate.jpg" imageanchor="1"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4roE2R1lnoH3Twcr4cwWKpOYN1T-Bhk-DALLdfJZ2osEsJ9LCOHaOi7LhF7Z1i97tcLSc1EnF2_tsDcxbN9mpXGNhtxof6FlTM6b4VSS9ZVoly3GR8OkRChPUJdOkSdqohPSrHQ/s320/flexi_faceplate.jpg" border="0" /> </a></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left"><br /></div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left">This picture shows the laser cut baffles to isolate the light to individual words.</div><div class="separator" style="CLEAR: both; TEXT-ALIGN: left"><br /><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKldQOmQdEiBibT5INaobQPcHO4VfpueKyXv_m7VNG0aYZAgF9UVf3puGlnBdXrH4HuloLYt5nGuC11fAy2SKpfrIt-Ynvgck8EZTx3Lido4ir1_oulVwauP55xvHZgJ03PRW8zw/s1600/baffles.jpg" imageanchor="1"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKldQOmQdEiBibT5INaobQPcHO4VfpueKyXv_m7VNG0aYZAgF9UVf3puGlnBdXrH4HuloLYt5nGuC11fAy2SKpfrIt-Ynvgck8EZTx3Lido4ir1_oulVwauP55xvHZgJ03PRW8zw/s320/baffles.jpg" border="0" /></a></div>Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com2tag:blogger.com,1999:blog-15767583.post-66684050492870230202010-05-08T09:36:00.006-04:002010-11-02T16:50:26.228-04:00SharkFin Sensor Swap -- SFSSI take it back. On the original SharkFin, the analog circuitry was causing a small error in both the gyro and accel measurements. We've since corrected the design, but we didn't want to lay money down on a new set of boards until the concept was proven.<br /><br />Along comes the <a href="http://www.sparkfun.com/commerce/product_info.php?products_id=9623">9 degree of freedom Razor IMU</a> from SparkFun. This $125 bad boy has 3 axes of accel, 3 of gyro and 3 magnetometer, overkill for sure. I got this for experimentation and found out that it fit beautifully on Fin. The holes even lined up. This amazing foresight by Anool, enabled the sensor swap.<br /><br />The 9 dof razor has a ATMEGA328 on board already. I reprogrammed the MEGA on the SharkFin base to be a digital slave dummy. It just listens on the serial port for 3 byte messages which it assigns to the digital ports: PORTB, PORTC, and PORTD. This simple interface could be expanded to also read digital inputs from the slave.<br /><br /><div class="separator" style="CLEAR: both; TEXT-ALIGN: center"><a style="MARGIN-LEFT: 1em; MARGIN-RIGHT: 1em" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUp2IPBIEXH7t6d64zdt3ZIL5DbxqbRv-4EKKRQi4IAsmjpYJ8UnHDKq-zi4X_vSGtAQwnoo11Gx0Ms5pPWLBjFhOKHwBUwXvmanK0bTFv4wxaFDIwuD2OVEDYX2ETRHtrrRW3GQ/s1600/2010-05-02+19.23.20.jpg" imageanchor="1"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUp2IPBIEXH7t6d64zdt3ZIL5DbxqbRv-4EKKRQi4IAsmjpYJ8UnHDKq-zi4X_vSGtAQwnoo11Gx0Ms5pPWLBjFhOKHwBUwXvmanK0bTFv4wxaFDIwuD2OVEDYX2ETRHtrrRW3GQ/s320/2010-05-02+19.23.20.jpg" border="0" /></a></div><br />The <a href="http://www.sparkfun.com/datasheets/Components/SMD/adxl335.pdf">accel datasheet</a> indicates a selectable bandwidth. It is unclear on exactly how this is being accomplished, but if it is effective, this will relieve the huge burden on the processor of low-pass filtering the accel data.<br /><br />The magnetometer offers the possibility of complete head orientation tracking. It is still unclear exactly how to take advantage of this given that there is no true velocity measurement. Ideas are welcome!Justinhttp://www.blogger.com/profile/12909417392199505909noreply@blogger.com0