<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5416726460697111362</id><updated>2012-02-10T20:08:01.622-08:00</updated><category term='slotcar'/><category term='led'/><category term='brakes'/><category term='android open'/><category term='arduino android conference'/><category term='slot car'/><category term='grammar fewer less'/><title type='text'>Dr. Monk's DIY Electronics Blog</title><subtitle type='html'>Open Source hardware, Arduino, IOIO, General DIY electronic construction, reviews, projects, how-tos and recipes.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>59</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-4166982377316484356</id><published>2012-02-10T07:13:00.000-08:00</published><updated>2012-02-10T09:18:01.723-08:00</updated><title type='text'>Snootlab Zombadge</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;If you want a nice simple board to solder up for fun, or just to learn a bit of soldering, then you might like to consider a &lt;a href="http://www.zombadge.com/" target="_blank"&gt;Zombadge&lt;/a&gt; Kit from &lt;a href="http://shop.snootlab.com/" target="_blank"&gt;Snootlabs&lt;/a&gt;. They are kind of fun!&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/-wHhNnLMO2LA/TzUuAslkQ9I/AAAAAAAAAWM/uAJyxuMTXHE/s1600/DSC_0013.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="347" src="http://2.bp.blogspot.com/-wHhNnLMO2LA/TzUuAslkQ9I/AAAAAAAAAWM/uAJyxuMTXHE/s400/DSC_0013.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;They come as a complete kit, with a lithium cell that fits in a holder on the back.&lt;br /&gt;&lt;br /&gt;The instructions for building the kit are clear and simple, in Snootlab's usual photo-cartoon style. They also tell you how to identify the components.&lt;br /&gt;&lt;br /&gt;For novices, the RGB LED is a little tricky to solder as the leads are close together, so check for solder bridges when you are finished.&lt;br /&gt;&lt;br /&gt;The badge is&amp;nbsp;powered by an ATTiny85 microcontroller fitted in a DIL socket. It has&amp;nbsp;an RGB LED (left) an IR sender and an IR&amp;nbsp;receiver&amp;nbsp;as well as ICSP programming headers.&lt;br /&gt;&lt;br /&gt;The ATTiny comes ready programmed and when you turn the badge on, it cycles the LED through its colors.&lt;br /&gt;&lt;br /&gt;There are some instructions on installing various games on it &lt;a href="https://github.com/Snootlab/Zombadge/blob/master/detective_game/detective_game.txt" target="_blank"&gt;here&lt;/a&gt;. Theses instructions are mostly in French, with an&amp;nbsp;abbreviated&amp;nbsp;version in English, but I had to refer to the French version to try and see what was going on. Better game translation please Snootlabs.&lt;br /&gt;&lt;br /&gt;If you have a number of these badges, you can play some interesting interactive games.&lt;br /&gt;&lt;br /&gt;Sadly I only had one, so I had to make do with a flashing LED.&lt;br /&gt;&lt;br /&gt;The boards are designed to be programmed using an Arduino as an ICSP, and there are instructions for doing this (in English). Unlike the approach of &lt;a href="http://hlt.media.mit.edu/?p=1229" target="_blank"&gt;Hi Low Tech&lt;/a&gt;, you do not use the Arduino IDE to program them, but rather run 'make' files after configuring them for the port to use.&lt;br /&gt;&lt;br /&gt;I wanted to try programming the boards using the Arduino IDE and a USB Tiny ISP as I have with some home made ATTiny boards, but All I could get was:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Binary sketch size: 658 bytes (of a 8192 byte maximum)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;avrdude: initialization failed, rc=-1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Double check connections and try again, or use -F to override&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this check.&lt;/span&gt;&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/-nMIt2k1uDiM/TzU0RWOESWI/AAAAAAAAAWU/iIsEfatjWxo/s1600/DSC_0012.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="294" src="http://3.bp.blogspot.com/-nMIt2k1uDiM/TzU0RWOESWI/AAAAAAAAAWU/iIsEfatjWxo/s320/DSC_0012.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The schematic for the Zombadge is available on the &lt;a href="http://shop.snootlab.com/lang-en/gift/121-zombadge.html" target="_blank"&gt;downloads tab&lt;/a&gt; of the product page.&lt;br /&gt;&lt;br /&gt;I would be interested to see if anyone gets any further with this. I can see some interesting hacks for this gadget, along the lines of TV be Gone!&lt;br /&gt;&lt;br /&gt;Anyway - irrespective of my failed attempts to hack it, this is a nice little gadget!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-4166982377316484356?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/4166982377316484356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=4166982377316484356' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4166982377316484356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4166982377316484356'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2012/02/snootlab-zombadge.html' title='Snootlab Zombadge'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-wHhNnLMO2LA/TzUuAslkQ9I/AAAAAAAAAWM/uAJyxuMTXHE/s72-c/DSC_0013.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-1149866446076740039</id><published>2012-01-31T05:40:00.000-08:00</published><updated>2012-02-06T13:59:11.823-08:00</updated><title type='text'>Arduino Timer Library</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I have developed a simple to use library that gets around a load of problems that arise when you start trying to do much inside 'loop'. It can change pin values or run a callback function. It seems like such an obvious thing that I doubt its original, so I would like to hear of similar projects.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/JChristensen/Timer" target="_blank"&gt;DOWNLOAD&lt;/a&gt;&amp;nbsp;Thanks to Jack Christensen for hosting it and the improvements and version management he has added to it.&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/-8fCu_q71sRQ/TudmPABNVYI/AAAAAAAAAPk/sHeZgdSrOOw/s1600/arduino+sm.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-8fCu_q71sRQ/TudmPABNVYI/AAAAAAAAAPk/sHeZgdSrOOw/s1600/arduino+sm.jpg" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The library does not&amp;nbsp;interfere&amp;nbsp;with the built-in timers, it just uses 'millis' in a crude type of scheduler to decide when something needs doing.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Examples&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The Arduino 'delay' function is both a blessing and a curse. Its great for showing beginners how to make an LED flash. But as soon as you get more complex and start slowing down your 'loop' function &amp;nbsp;you will run into problems.&lt;br /&gt;&lt;br /&gt;A classic example is turning a relay on for 10 minutes. The 'delay'-way looks like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;int pin = 13;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; pinMode(13, OUTPUT);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; digitalWrite(pin, HIGH);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; delay(10 * 60 * 60 * 1000);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; digitalWrite(pin, LOW);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The disadvantage of the delay approach is that nothing else can go on while the 'delay' is&amp;nbsp;happening. You cannot update a display, or check for key presses for example.&lt;br /&gt;&lt;br /&gt;My 'Timer' library version looks like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#include "Timer.h"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Timer t;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;int pin = 13;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; pinMode(pin, OUTPUT);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; t.pulse(pin, 10 * 60 * 1000, HIGH); // 10 minutes &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; t.update();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The 'pulse' method takes arguments of a pin to change, the period to change it for and its initial state.&lt;br /&gt;&lt;br /&gt;The call to t.update() will take a matter of microseconds to run, unless the appropriate period of time has passed.&lt;br /&gt;&lt;br /&gt;Lets look at another example that uses two timer events. One to flash an LED and another that reads A0 and displays the result in the Serial Monitor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#include "Timer.h"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Timer t;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;int pin = 13;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.begin(9600);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; pinMode(pin, OUTPUT);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; t.oscillate(pin, 100, LOW);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; t.every(1000, takeReading);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; t.update();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void takeReading()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println(analogRead(0));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first thing to notice is that we are using a callback function called 'takeReading'. We connect it to the Timer using the 'every' command, which in this case, will call the function every second.&lt;br /&gt;&lt;br /&gt;We have also attached another event to the timer using the method 'oscillate'. This will cause the LED to toggle state every 100 milliseconds.&lt;br /&gt;&lt;br /&gt;Each of the events has an integer ID associated with it, so that you can stop an event, as we do in this example below, which will write to the serial monitor every 2 seconds, flash the LED and after 5 seconds, stop the LED flashing fast, and flash it 5 times slowly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#include "Timer.h"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Timer t;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;int ledEvent;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.begin(9600);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int tickEvent = t.every(2000, doSomething);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.print("2 second tick started id=");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println(tickEvent);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; pinMode(13, OUTPUT);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; ledEvent = t.oscillate(13, 50, HIGH);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.print("LED event started id=");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println(ledEvent);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int afterEvent = t.after(10000, doAfter);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.print("After event started id=");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println(afterEvent);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; t.update();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void doSomething()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.print("2 second tick: millis()=");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println(millis());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void doAfter()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println("stop the led event");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; t.stop(ledEvent);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; t.oscillate(13, 500, HIGH, 5);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can attach up to 10 events to a timer. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Installation&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As with all libraries, unzip &lt;a href="https://sites.google.com/site/programmingarduinobook/downloads/Timer.zip?attredirects=0&amp;amp;d=1" target="_blank"&gt;the file&lt;/a&gt; into the 'libraries' folder in your Arduino directory, which will be in something like 'My Documents\Arduino' on Windows, 'Documents/Arduino' on Mac etc. If this is the first library you have installed, you will need to create a directory there called 'libraries'.&lt;br /&gt;&lt;br /&gt;The library is compatible with both Arduino 1.0 and earlier versions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Reference&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int every(long period, callback)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Run the 'callback' every 'period' milliseconds.&lt;br /&gt;&amp;nbsp;Returns the ID of the timer event.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int every(long period,&amp;nbsp;callback, int repeatCount)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Run the 'callback' every 'period' milliseconds for a total of 'repeatCount' times.&lt;br /&gt;&amp;nbsp;Returns the ID of the timer event.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int after(long duration,&amp;nbsp;callback)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Run the 'callback' once after 'period' milliseconds.&lt;br /&gt;&amp;nbsp;Returns the ID of the timer event.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;int oscillate(int pin, long period, int startingValue)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;Toggle the state of the digital output 'pin' every 'period' milliseconds. The pin's starting value is specified in 'startingValue', which should be HIGH or LOW.&lt;/div&gt;&lt;div&gt;&amp;nbsp;Returns the ID of the timer event.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;int oscillate(int pin, long period, int startingValue, int repeatCount)&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;Toggle the state of the digital output 'pin' every 'period' milliseconds 'repeatCount' times. The pin's starting value is specified in 'startingValue', which should be HIGH or LOW.&lt;/div&gt;&lt;div&gt;&amp;nbsp;Returns the ID of the timer event.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;int pulse(int pin, long period, int startingValue)&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;Toggle the state of the digital output 'pin' just once after 'period' milliseconds. The pin's starting value is specified in 'startingValue', which should be HIGH or LOW.&lt;/div&gt;&lt;div&gt;&amp;nbsp;Returns the ID of the timer event.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;int stop(int id)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Stop the timer event running.&lt;br /&gt;&amp;nbsp;Returns the ID of the timer event.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;int update()&lt;/b&gt;&lt;br /&gt;&amp;nbsp;Must be called from 'loop'. This will service all the events associated with the timer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Conclusion&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Have a go with the library, please let me know what you think.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-1149866446076740039?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/1149866446076740039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=1149866446076740039' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/1149866446076740039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/1149866446076740039'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2012/01/arduino-timer-library.html' title='Arduino Timer Library'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-8fCu_q71sRQ/TudmPABNVYI/AAAAAAAAAPk/sHeZgdSrOOw/s72-c/arduino+sm.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-6656269461716904844</id><published>2012-01-23T08:32:00.000-08:00</published><updated>2012-01-24T02:10:08.096-08:00</updated><title type='text'>A Review of SnootLab's 'Memoire' Arduino Shield</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;SnootLabs were kind enough &amp;nbsp;to send me one of their &lt;a href="http://shop.snootlab.com/lang-en/snootlab-shields/86-memoire.html" target="_blank"&gt;Memoire Shields&lt;/a&gt;. This useful little shield combines an SD card slot with a DS1307 Real Time Clock (RTC). If you haven't come&amp;nbsp;across&amp;nbsp;one before, an RTC is a hardware clock with its own battery back-up, so that when your Arduino gets turned off, it does not forget the time.&lt;br /&gt;&lt;br /&gt;The&amp;nbsp;rationale&amp;nbsp;for combining SD card with a RTC is that you can read temperatures or whatever and write then to the SD card along with the date and time form the RTC.&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/-SNy5ojtTIyw/Tx2CKQmIboI/AAAAAAAAAVc/j9heZ7wVspY/s1600/completed.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="306" src="http://4.bp.blogspot.com/-SNy5ojtTIyw/Tx2CKQmIboI/AAAAAAAAAVc/j9heZ7wVspY/s400/completed.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;This useful card costs about 25 USD in kit form and a bit more ready assembled. I actually enjoy this kind of thing in kit form. It is easy enough to&amp;nbsp;assemble&amp;nbsp;and the instructions are clear and logical. They are found on the 'downloads' tab for the product information and you will also find the schematic and Eagle files there too.&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/-lyeQ-EvSqBg/Tx2DJNsdwHI/AAAAAAAAAVk/XFPUnr6RxWE/s1600/components.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="246" src="http://3.bp.blogspot.com/-lyeQ-EvSqBg/Tx2DJNsdwHI/AAAAAAAAAVk/XFPUnr6RxWE/s320/components.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;One immediately noticeable feature of the board is the prototyping area. Which gives you can solder in your own temperature sensors or whatever else you want to log along with the time.&lt;br /&gt;&lt;br /&gt;Rather than make a logger, I decided to make myself a thick juicy Arduino sandwich and combine it with a &lt;a href="http://www.freetronics.com/products/lcd-keypad-shield" target="_blank"&gt;Freetronics LCD shield&lt;/a&gt;&amp;nbsp;and an Arduino Uno to make a clock. I&amp;nbsp;&lt;a href="http://srmonk.blogspot.com/2011/11/arduino-lcd-shield-review.html" target="_blank"&gt;reviewed&lt;/a&gt;&amp;nbsp;LCD Shields a while back.&lt;br /&gt;&lt;br /&gt;Its a rather expensive and over-engineered clock - but none the less a clock. You set the time by sending a string from the Serial monitor and from then on, it will keep time for you.&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/-BXLGvJn7s2E/Tx2H8NGbAWI/AAAAAAAAAV0/mHreOty2jTM/s1600/project+LR.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-BXLGvJn7s2E/Tx2H8NGbAWI/AAAAAAAAAV0/mHreOty2jTM/s400/project+LR.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The three boards are shown below.&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/-wv9GIyS_9zo/Tx2HjevzNcI/AAAAAAAAAVs/kvVDBkuVI04/s1600/3+boards+LR.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="172" src="http://2.bp.blogspot.com/-wv9GIyS_9zo/Tx2HjevzNcI/AAAAAAAAAVs/kvVDBkuVI04/s320/3+boards+LR.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The Snootlabs shield is placed on the Arduino Uno and then the LCD shield on top of that.&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/-5IGAKykPzYY/Tx2IatXd_YI/AAAAAAAAAV8/YyAs_rnbc3o/s1600/sandwich+LR.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-5IGAKykPzYY/Tx2IatXd_YI/AAAAAAAAAV8/YyAs_rnbc3o/s320/sandwich+LR.jpg" width="283" /&gt;&lt;/a&gt;&lt;/div&gt;The only potential conflict in pin usage between the two shields is for pin D9 that is used for a general purpose LED on the Snootshield. As the LCD shield uses this for LCD Enable, occasional flickering of &amp;nbsp;the LED was not seen as a problem.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;In summary, its a useful shield with good documentation from SnootLabs.&lt;br /&gt;&lt;br /&gt;There are other boards including &lt;a href="http://www.adafruit.com/products/243" target="_blank"&gt;this&lt;/a&gt; from AdaFruit. The AdaFruit version is a similar price and even a similar layout. It does however use a buffer chip for the SD interface, where as the Snootlabs design uses potential dividers to drop the SD card levels.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;Correction: In an earlier version of this post, I stated that the Snootlabs device did not have its own regulator - actually it does. Its a SMD ready soldered onto the bottom of the board.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The code for the example project was adapted from &lt;a href="http://bildr.org/2011/03/ds1307-arduino/" target="_blank"&gt;here&lt;/a&gt;. Its Arduinio 1.0 code.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#include "Wire.h"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#define DS1307_ADDRESS 0x68&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;byte zero = 0x00; //workaround for issue #527&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;LiquidCrystal lcd(8, 9, 4, 5, 6, 7);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.begin();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.begin(9600);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println("Set date sending format: YYMMDD HHMMSS W");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println("Where W = day of week - 1-7");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.begin(16, 2);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print("Clock");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (Serial.available())&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; setTimeFromSerial();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; printDateTime();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; delay(1000);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void setTimeFromSerial()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; byte year = (Serial.read()-'0') * 10 + (Serial.read()-'0');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; byte month = (Serial.read()-'0') * 10 + (Serial.read()-'0');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; byte day = (Serial.read()-'0') * 10 + (Serial.read()-'0');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.read();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; byte hour = (Serial.read()-'0') * 10 + (Serial.read()-'0');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; byte minute = (Serial.read()-'0') * 10 + (Serial.read()-'0');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; byte second = (Serial.read()-'0') * 10 + (Serial.read()-'0');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.read();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; byte weekDay = (Serial.read()-'0');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.beginTransmission(DS1307_ADDRESS);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.write(zero); //stop Oscillator&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.write(decToBcd(second));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.write(decToBcd(minute));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.write(decToBcd(hour));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.write(decToBcd(weekDay));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.write(decToBcd(day));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.write(decToBcd(month));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.write(decToBcd(year));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.write(zero); //start&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.endTransmission();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;byte decToBcd(byte val){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;// Convert normal decimal numbers to binary coded decimal&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; return ( (val/10*16) + (val%10) );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;byte bcdToDec(byte val) &amp;nbsp;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;// Convert binary coded decimal to normal decimal numbers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; return ( (val/16*10) + (val%16) );&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void printDateTime(){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // Reset the register pointer&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.beginTransmission(DS1307_ADDRESS);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.write(zero);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.endTransmission();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Wire.requestFrom(DS1307_ADDRESS, 7);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int second = bcdToDec(Wire.read());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int minute = bcdToDec(Wire.read());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int hour = bcdToDec(Wire.read() &amp;amp; 0b111111); //24 hour time&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int weekDay = bcdToDec(Wire.read()); //0-6 -&amp;gt; sunday - Saturday&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int monthDay = bcdToDec(Wire.read());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int month = bcdToDec(Wire.read());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int year = bcdToDec(Wire.read());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.clear();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.setCursor(0, 0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(hour);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(":");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (minute &amp;lt; 10) lcd.print("0");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(minute);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(":");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (second &amp;lt; 10) lcd.print("0");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(second);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-6656269461716904844?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/6656269461716904844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=6656269461716904844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6656269461716904844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6656269461716904844'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2012/01/snootlabs-memoire-arduino-shield-review.html' title='A Review of SnootLab&apos;s &apos;Memoire&apos; Arduino Shield'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-SNy5ojtTIyw/Tx2CKQmIboI/AAAAAAAAAVc/j9heZ7wVspY/s72-c/completed.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-7271353424398600346</id><published>2012-01-17T08:41:00.000-08:00</published><updated>2012-01-20T00:45:34.261-08:00</updated><title type='text'>DIY Coilgun</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Here is one of the projects from the book '&lt;a href="http://www.dangerouslymad.com/" target="_blank"&gt;15 Dangerously Mad Projects for the Evil Genius&lt;/a&gt;'. You can actually download the chapter in full, free of charge, from &lt;a href="http://www.dangerouslymad.com/sample-chapter" target="_blank"&gt;here&lt;/a&gt;&amp;nbsp;so I will just give an overview of it here.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-0lmR8fPJ7fw/TxWg1N581lI/AAAAAAAAAU8/V-32oJ_hy1k/s1600/F01-01.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://3.bp.blogspot.com/-0lmR8fPJ7fw/TxWg1N581lI/AAAAAAAAAU8/V-32oJ_hy1k/s400/F01-01.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Its pretty simple to make and safe. I kept the voltage low (36V), although it does pack about 100A through the coil in 10mS and it will fire a small section of nail at a maximum of about 30 mph.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="background-color: white;"&gt;&lt;span style="color: red;"&gt;WARNING: BE SENSIBLE! DONT FIRE IT AT ANYONE, INCLUDING YOURSELF.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is the schematic.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-MVWkKeWYL8M/TxWhryIpF1I/AAAAAAAAAVE/hZlGv89wVA0/s1600/cct.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-MVWkKeWYL8M/TxWhryIpF1I/AAAAAAAAAVE/hZlGv89wVA0/s400/cct.jpg" width="335" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And this is how it is wired together.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/--H5WKpIACcI/TxWh2xs5H6I/AAAAAAAAAVM/ElfCnnVk4cg/s1600/wiring.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="80" src="http://4.bp.blogspot.com/--H5WKpIACcI/TxWh2xs5H6I/AAAAAAAAAVM/ElfCnnVk4cg/s400/wiring.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you fancy having a go, be my guest and download the chapter and if you like it, then you might like to try some of the other projects. There is a real mixture. Some like the Trebuchet don't actually involve any electronics at all and three of them use Arduinos.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Projects List&lt;/div&gt;&lt;div&gt;Chapter 01. Coil Gun&lt;/div&gt;&lt;div&gt;Chapter 02. Trebuchet&lt;/div&gt;&lt;div&gt;Chapter 03. Ping Pong Ball Minigun&lt;/div&gt;&lt;div&gt;Chapter 04. Mini Laser Turret&lt;/div&gt;&lt;div&gt;Chapter 05. Balloon-popping Laser Gun&lt;/div&gt;&lt;div&gt;Chapter 06. Laser sight&lt;/div&gt;&lt;div&gt;Chapter 07. Laser Intruder Alarm&lt;/div&gt;&lt;div&gt;Chapter 08. Persistence of Vision **** Arduino&lt;/div&gt;&lt;div&gt;Chapter 09. Covert Radio Bug&lt;/div&gt;&lt;div&gt;Chapter 10. Laser Voice Transmitter&lt;/div&gt;&lt;div&gt;Chapter 11. Flash Bomb&lt;/div&gt;&lt;div&gt;Chapter 12. LED Strobe&lt;/div&gt;&lt;div&gt;Chapter 13. Levitation Machine&amp;nbsp;**** Arduino&lt;/div&gt;&lt;div&gt;Chapter 14. Light Seeking Microbot&lt;/div&gt;&lt;div&gt;Chapter 15. Surveillance Robot&amp;nbsp;**** Arduino&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is also a video on youtube showing the more interesting projects.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object 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/JdZu4nExmJQ/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JdZu4nExmJQ?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/JdZu4nExmJQ?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-7271353424398600346?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/7271353424398600346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=7271353424398600346' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7271353424398600346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7271353424398600346'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2012/01/diy-coilgun.html' title='DIY Coilgun'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-0lmR8fPJ7fw/TxWg1N581lI/AAAAAAAAAU8/V-32oJ_hy1k/s72-c/F01-01.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-4153234839242435770</id><published>2012-01-15T12:26:00.000-08:00</published><updated>2012-01-15T12:26:58.014-08:00</updated><title type='text'>Laser Cutting at FabLab Manchester</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="http://www.fablabmanchester.org/" target="_blank"&gt;Manchester FabLab&lt;/a&gt; allows anyone to go along and use their kit for free on Fridays and Saturdays on condition that we make public what we do. So I paid them a visit on Friday to cut myself a new enclosure for my Arduino Lilypad Binary Clock.&lt;br /&gt;&lt;br /&gt;The clock is one of the projects from my book '&lt;a href="http://www.arduinoevilgenius.com/" target="_blank"&gt;30 Arduino Projects for the Evil Genius&lt;/a&gt;'. Its a binary clock with four red LEDs indicating the hour, six blue LEDs the minute and six green LEDs the second. They all fan out from the Arduino Lilypad. A reed switch is used to advance the clock by holding a magnet close to it.&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/-JShdG2v14KA/TxMbL9S2X_I/AAAAAAAAAUU/9RVvCSYVXSI/s1600/DSC_0001.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-JShdG2v14KA/TxMbL9S2X_I/AAAAAAAAAUU/9RVvCSYVXSI/s400/DSC_0001.jpg" width="243" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Its a little difficult to photograph, so here it is again on a white background. I quite like the effect of the white background and may fit a backing to the acrylic.&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/-OmzWEhai6H8/TxMbXhkf1ZI/AAAAAAAAAUc/YrHuXa5kRH0/s1600/DSC_0006.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-OmzWEhai6H8/TxMbXhkf1ZI/AAAAAAAAAUc/YrHuXa5kRH0/s320/DSC_0006.jpg" width="234" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The clock was formerly housed in a picture frame. Which looked okay, but I thought it should be possible to make something nicer:&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/-B7CCOvIrumg/TxMeI9R2LLI/AAAAAAAAAU0/sNT8Kuhx_XM/s1600/F09-11.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-B7CCOvIrumg/TxMeI9R2LLI/AAAAAAAAAU0/sNT8Kuhx_XM/s320/F09-11.jpg" width="257" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The new enclosure does not really do much enclosing. Its just a sheet of 3mm clear acrylic, cut in the shape below. This allows the LEDs to sit in the channels and allows a space in the center for the Lilypad.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-CMEjfJFIxBg/TxMdLFMJr1I/AAAAAAAAAUk/S2PTxHVQM2U/s1600/clock+face.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-CMEjfJFIxBg/TxMdLFMJr1I/AAAAAAAAAUk/S2PTxHVQM2U/s320/clock+face.png" width="289" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;The PDF for the clock face is available &lt;a href="http://www.arduinoevilgenius.com/" target="_blank"&gt;on the book's website&lt;/a&gt;&amp;nbsp;in the download section.&lt;br /&gt;&lt;br /&gt;The laser cutter is a&amp;nbsp;Epilog Mini 24 Laser Cutter and I wasn't really taxing it much to cut the acrylic.&lt;br /&gt;&lt;br /&gt;As well as a laser cutter, Fab Lab has a 3D printer, a Desktop Milling machine, a Vinyl cutter, a large CNC Router, a vacuum former and well&amp;nbsp;equipped&amp;nbsp;electronic workstations.&lt;br /&gt;&lt;br /&gt;This is all backed up with a knowledgeable and helpful set of staff as well as well as lots of people around happy to help out.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-4153234839242435770?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/4153234839242435770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=4153234839242435770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4153234839242435770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4153234839242435770'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2012/01/laser-cutting-at-fablab-manchester.html' title='Laser Cutting at FabLab Manchester'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-JShdG2v14KA/TxMbL9S2X_I/AAAAAAAAAUU/9RVvCSYVXSI/s72-c/DSC_0001.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-100128546651832895</id><published>2012-01-12T05:22:00.000-08:00</published><updated>2012-01-12T05:22:40.458-08:00</updated><title type='text'>Power Over Ethernet (PoE)</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Power over Ethernet or PoE is one of those things that sound difficult but actually at its simplest is very easy to use and a great way to reduce the number of cables. For all I know, when you get into more advanced PoE it does become scary, but all I wanted to do was to be able to do away with a wall-wart power supply lead for my little Altoids tin project.&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/-gC79kGH_nuU/Tw7X_JmhJwI/AAAAAAAAAT0/JKihR2PhJTM/s1600/DSC_0008.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="232" src="http://4.bp.blogspot.com/-gC79kGH_nuU/Tw7X_JmhJwI/AAAAAAAAAT0/JKihR2PhJTM/s400/DSC_0008.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If you look next to the 'L' of Altoids, you can see the lens of a Luxeon LED poking through. What I have here is a modification of my web morse flasher project described in my &lt;a href="http://srmonk.blogspot.com/2011/12/freetronics-etherten-review.html" target="_blank"&gt;earlier blog&lt;/a&gt; about the EtherTen. The &lt;a href="http://www.freetronics.com/products/etherten" target="_blank"&gt;EtherTen&lt;/a&gt; is a combined Arduino and Ethernet board.&lt;br /&gt;&lt;br /&gt;This project runs the EtherTen as a web server that gives you an interface like this:&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/-ck6pBPISztQ/Tw7ZDgIMOuI/AAAAAAAAAUE/spwJv5RSENs/s1600/Morse+sender.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="219" src="http://1.bp.blogspot.com/-ck6pBPISztQ/Tw7ZDgIMOuI/AAAAAAAAAUE/spwJv5RSENs/s640/Morse+sender.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;And when you press 'Send' it flashes out the message on the LED in &lt;a href="http://en.wikipedia.org/wiki/Morse_code" target="_blank"&gt;Morse code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;By using PoE I could mount my useful messenger device on the wall, with only a single wire coming out of it (the Ethernet cable). This would provide both power and network connection.&lt;br /&gt;&lt;br /&gt;The module I used to accomplish this magic trick is the &lt;a href="http://www.freetronics.com/" target="_blank"&gt;Freetronics&lt;/a&gt;&amp;nbsp;4-Channel &lt;a href="http://www.freetronics.com/products/poe-injector-4ch" target="_blank"&gt;Power-over-Ethernet Midspan Injector&lt;/a&gt;. This device costs about 25USD.&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/-SOzuNy3-2Zk/Tw7X4qBZNJI/AAAAAAAAATU/od1BtqQxQnQ/s1600/DSC_0004.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://2.bp.blogspot.com/-SOzuNy3-2Zk/Tw7X4qBZNJI/AAAAAAAAATU/od1BtqQxQnQ/s400/DSC_0004.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To use it, you insert it between your device and your home hub and plug it into a power adaptor. Hey presto, it then supplied power over the Ethernet cable.&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/-Q0f2ZXKbrGA/Tw7X_85nYRI/AAAAAAAAAT4/FkQa_9Qdl7c/s1600/DSC_0017.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="196" src="http://1.bp.blogspot.com/-Q0f2ZXKbrGA/Tw7X_85nYRI/AAAAAAAAAT4/FkQa_9Qdl7c/s400/DSC_0017.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I used a 12V DC power supply. SO you still need a separate power supply, but at least it and its wire can be kept out of sight.&lt;br /&gt;&lt;br /&gt;You need to insert two jumpers on the EtherTen just behind the RJ45 socket. These are supplied with the EtherTen, but are not connected when shipped. You just bridge the top two connections together and also the bottom two connections.&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/-JkZASKYkMWQ/Tw7cHMzpUJI/AAAAAAAAAUM/1eNBdA5eqxw/s1600/DSC_0009.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://1.bp.blogspot.com/-JkZASKYkMWQ/Tw7cHMzpUJI/AAAAAAAAAUM/1eNBdA5eqxw/s640/DSC_0009.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;Note to UK readers - you can buy Altoids in Tescos.&lt;br /&gt;&lt;br /&gt;I cut bits out of the bottom with a Dremell - lots of sparks - wear glasses - and drilled a hole in the lid for the LED. I also had to cut a bit off the protpshield so that it fitted flat and fully into the EtherTen's sockets.&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/-12V9ea-E7Ro/Tw7X5UqNPnI/AAAAAAAAATc/HuKxENW1sys/s1600/DSC_0005.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-12V9ea-E7Ro/Tw7X5UqNPnI/AAAAAAAAATc/HuKxENW1sys/s320/DSC_0005.jpg" width="310" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I put lots of PVC insulating tape anywhere where electronics might come into contact with metal.&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/-m55thhm_H9E/Tw7X9npkoeI/AAAAAAAAATk/XWnbc5QCzXU/s1600/DSC_0006.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" src="http://4.bp.blogspot.com/-m55thhm_H9E/Tw7X9npkoeI/AAAAAAAAATk/XWnbc5QCzXU/s320/DSC_0006.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The EtherTen fits perfectly into the Altoids box, making a perfect little web server.&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/-_W6Xp5dy0-s/Tw7X-GKIyTI/AAAAAAAAATs/JI8zN1KLYzE/s1600/DSC_0007.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="259" src="http://2.bp.blogspot.com/-_W6Xp5dy0-s/Tw7X-GKIyTI/AAAAAAAAATs/JI8zN1KLYzE/s320/DSC_0007.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;PoE does not have to be difficult or expensive to use. If you are using an Arduino as a web server then this approach could simplfy your wiring - so consider it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;Disclosure: Freetronics gave me the Midspan Injector. I did however have to buy my own mints - and very tasty they were too!&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-100128546651832895?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/100128546651832895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=100128546651832895' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/100128546651832895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/100128546651832895'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2012/01/power-over-ethernet-poe.html' title='Power Over Ethernet (PoE)'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-gC79kGH_nuU/Tw7X_JmhJwI/AAAAAAAAAT0/JKihR2PhJTM/s72-c/DSC_0008.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-5065511070758442835</id><published>2012-01-06T01:54:00.000-08:00</published><updated>2012-01-06T01:54:51.162-08:00</updated><title type='text'>Canine Radio Direction Finder - Part 2</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Its been a long time coming, but my son Matt and I finally finished the radio direction finder project. I described &lt;a href="http://srmonk.blogspot.com/2011/11/canine-radio-direction-finder-part-1.html" target="_blank"&gt;part 1&lt;/a&gt; (the transmitter back in November 2011. This post describes the receiver.&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/-Li-TqrME6O8/Twa-YQvKibI/AAAAAAAAASs/y60N25KcuDs/s1600/DSC_0032.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="156" src="http://3.bp.blogspot.com/-Li-TqrME6O8/Twa-YQvKibI/AAAAAAAAASs/y60N25KcuDs/s200/DSC_0032.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-t0rr4F2vrZM/Twa-gLo72yI/AAAAAAAAAS0/xmF4WPqfZAU/s1600/rx+antenna.jpg" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="213" src="http://4.bp.blogspot.com/-t0rr4F2vrZM/Twa-gLo72yI/AAAAAAAAAS0/xmF4WPqfZAU/s320/rx+antenna.jpg" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The basic idea is that the transmitter sends beeps and you turn the directional antenna until you get maximum signal and that is the direction of the transmitter.&lt;br /&gt;&lt;br /&gt;It doesn't work terribly well. The reason being the antenna is quite sensitive, so even though it is directional, if the transmitter is close then you cant tell which way it is. So it only works in the sweet spot where the transmitter is far enough away for the signal to be smaller when the the antenna is pointing the wrong way but not so far away that you cannot get a signal at all. For us, this range was perhaps 30 to 100 yards.&lt;br /&gt;&lt;br /&gt;What is really needed is some means of varying the gain of the antenna. We ran out of enthusiasm before solving this problem.&lt;br /&gt;&lt;br /&gt;Anyway, it does work after a&amp;nbsp;fashion&amp;nbsp;and its quite fun and cheap to make.&lt;br /&gt;&lt;br /&gt;This is the schematic.&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/-WxGXwOVn57k/TwbAECgeqgI/AAAAAAAAAS8/XX0P2Vxsa70/s1600/rx+cct.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="290" src="http://3.bp.blogspot.com/-WxGXwOVn57k/TwbAECgeqgI/AAAAAAAAAS8/XX0P2Vxsa70/s400/rx+cct.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Its just an audio amplifier that amplifies the signal from the RF module. The module is the other half of the transmitter module and something like &lt;a href="http://cpc.farnell.com/rf-solutions/qam-rx2/module-receiver-am-433mhz/dp/RF00228?crosssellid=RF00228&amp;amp;crosssell=true&amp;amp;in_merch=true&amp;amp;" target="_blank"&gt;this&lt;/a&gt;. Make sure you get an AM module - that matches the frequency of the transmitter.&lt;br /&gt;&lt;br /&gt;If you want to use a speaker, omit R3, but we found headphones better. So in the diagram above the speaker is actually a headphone socket.&lt;br /&gt;&lt;br /&gt;The directional antenn is made from a piece of wood, with lengths of retractable steel ruler attached to it. The design was taken from a posting on an Australian forum that I now cannot find. But I'm sure they wouldn't mind my repeating it here.&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/-HTsg0r38vm8/TwbCQIXr4jI/AAAAAAAAATE/fBug-fqaaVM/s1600/433MHz+Yagi+antenna.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://2.bp.blogspot.com/-HTsg0r38vm8/TwbCQIXr4jI/AAAAAAAAATE/fBug-fqaaVM/s400/433MHz+Yagi+antenna.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;The second element takes the connection to the receiver circuit and this is made with a short length of TV antenna lead.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-8wqAuuwa5_I/TwbCsPpclgI/AAAAAAAAATM/n7ydUPOozCo/s1600/rx+ant+connection.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://1.bp.blogspot.com/-8wqAuuwa5_I/TwbCsPpclgI/AAAAAAAAATM/n7ydUPOozCo/s320/rx+ant+connection.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;You can also see how the strips of ruler are just screwed onto the wood.&lt;br /&gt;&lt;br /&gt;As I mentioned the results were a little&amp;nbsp;disappointing. But then the whole project cost about 20 USD and we had some fun. Especially wandering around the neighbourhood wearing headphones and&amp;nbsp;clutching&amp;nbsp;what looks like a home made TV antenna. This is the kind of situation where it is best to just to cultivate a wild look in the eye and hope people don't bother you or call the police.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-5065511070758442835?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/5065511070758442835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=5065511070758442835' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/5065511070758442835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/5065511070758442835'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2012/01/canine-radio-direction-finder-part-2.html' title='Canine Radio Direction Finder - Part 2'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Li-TqrME6O8/Twa-YQvKibI/AAAAAAAAASs/y60N25KcuDs/s72-c/DSC_0032.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-125867962196448321</id><published>2012-01-01T03:26:00.000-08:00</published><updated>2012-01-01T03:26:26.685-08:00</updated><title type='text'>Arduino Screw Shield Review</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This is a review of the &lt;a href="http://www.freetronics.com/" target="_blank"&gt;Freetronics&lt;/a&gt; Terminal Shield and the &lt;a href="http://shop.snootlab.com/" target="_blank"&gt;SnootLabs&lt;/a&gt; Power Screw Shield.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Introduction&lt;/b&gt;.&lt;br /&gt;The Arduino socket strips are okay for attaching components, but sometimes, when putting together a quick prototype it would be useful to be able to have something more substantial - like a screw terminal.&lt;br /&gt;&lt;br /&gt;These shield boards provide just such a feature.&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/-AYF708mn9Vg/TwA3YbZgISI/AAAAAAAAASM/OQyu3uR-iDc/s1600/shields.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://4.bp.blogspot.com/-AYF708mn9Vg/TwA3YbZgISI/AAAAAAAAASM/OQyu3uR-iDc/s640/shields.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Snootlabs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Freetronics&lt;br /&gt;&lt;br /&gt;The shields are intended for the Arduino Uno and earlier versions of Arduino. They break out all the terminal sockets into screw terminals.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Prices&lt;/b&gt;&lt;br /&gt;The Snootlabs shield costs around 21 USD as a kit and 28 USD fully assembled.&lt;br /&gt;The Freetronics shiled is only available fully assembled and costs around 17 USD&lt;br /&gt;&lt;br /&gt;&lt;b&gt;In Common&lt;/b&gt;&lt;br /&gt;Both boards use straight through headers that mean as well as having screw terminals, you can also fit another shield on top. In both cases, the designers have left enough room to easily access the screw terminals even with a big shield like an LCD shield attached.&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/-c9jIiYT6fnc/TwA5bkxLKvI/AAAAAAAAASY/GCrO4WNlgFM/s1600/with+lcd.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="311" src="http://1.bp.blogspot.com/-c9jIiYT6fnc/TwA5bkxLKvI/AAAAAAAAASY/GCrO4WNlgFM/s320/with+lcd.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Both boards have a reset button.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;SnootLabs Power Screw Shield&lt;/b&gt;&lt;br /&gt;This is the larger and more expensive of the two shields. It has a large prototyping area where you can solder in components. It also has special areas of the board for soldering in a SMD chip and for DIL through hole ICs.&lt;br /&gt;&lt;br /&gt;The other&amp;nbsp;noticeable difference is the power connector. This is the same type of four pin connectors that you used to find on PATA Hard Disks to supply the power.&lt;br /&gt;&lt;br /&gt;Jumpers allow you to&amp;nbsp;configure&amp;nbsp;this socket to either provide the power to the Arduino, or to pass through the Vin 2.1mm socket on the Arduino to the 4 pin socket to provide power to other devices.&lt;br /&gt;&lt;br /&gt;There is also an LED that can either be linked to an IO pin of your choice or to 5V to act as a power-on indicator.&lt;br /&gt;&lt;br /&gt;The Snootlabs website has very good information on this shield, including a photographic style sheet of instructions for constructing the board and a useful datasheet that explains what all the jumpers do without having to start working out whats going on from the schematics.&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/-sz5NRIkFRkk/TwA9H6ii0iI/AAAAAAAAASk/syg9KRapX24/s1600/fact+sheet.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="357" src="http://2.bp.blogspot.com/-sz5NRIkFRkk/TwA9H6ii0iI/AAAAAAAAASk/syg9KRapX24/s400/fact+sheet.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Providing the board in kit form is a nice idea. As well as being cheaper, its a nice easy project for someone new to electronics&amp;nbsp;wanting&amp;nbsp;to practice their soldering.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Freetronics Terminal Shield&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;As with all Freetronics kit. This is a high quality board that is sold fully assembled. Its smaller and cheaper than the Snootlabs shield and does not have a dedicated IC area for SMD or 0.1inch DIL. It does exactly what it says on the tin.&lt;br /&gt;&lt;br /&gt;The board comes with a number of surface mount components already attached to it. This includes three (red, green and blue) LEDs and their&amp;nbsp;current&amp;nbsp;limiting&amp;nbsp;resistors. These are positioned on the back ende of the shield where they are easily visible and can be wired to any of the IO pins.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Both products are good quality and neither will dispoint.&lt;br /&gt;&lt;br /&gt;If you need to use an SMD IC for your project then the dedicated area for this makes the Snootlabs shield a good choice. The same applies if you need all the prototyping area you can get.&lt;br /&gt;&lt;br /&gt;If this is not a consideration then the cheaper Freetronics shield will serve you just fine.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Other Options&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Other screw shields are available of course and if you do not need the prototyping area then something like the WingShield may be of use to you.&amp;nbsp;&lt;a href="http://wingshieldindustries.com/products/screwshield/" target="_blank"&gt;http://wingshieldindustries.com/products/screwshield/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sparkfun and Adafruit both sell shields similar to the Freetronics offering:&amp;nbsp;&lt;a href="http://www.sparkfun.com/products/9729" target="_blank"&gt;http://www.sparkfun.com/products/9729&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://www.adafruit.com/products/196" target="_blank"&gt;http://www.adafruit.com/products/196&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-125867962196448321?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/125867962196448321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=125867962196448321' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/125867962196448321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/125867962196448321'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2012/01/arduino-screw-shield-review.html' title='Arduino Screw Shield Review'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-AYF708mn9Vg/TwA3YbZgISI/AAAAAAAAASM/OQyu3uR-iDc/s72-c/shields.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-4639115668195679914</id><published>2011-12-28T05:24:00.000-08:00</published><updated>2011-12-28T05:26:06.007-08:00</updated><title type='text'>Arduino Oscilloscope Update</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Project 18 in my book &lt;a href="http://www.arduinoevilgenius.com/" target="_blank"&gt;30 Arduino Evil Genius Projects for the Evil Genius&lt;/a&gt;, is a very crude Arduino-based Oscilloscope - well more of an experiment really.&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/-sBvOaTqL_IE/TvsTfuqcFjI/AAAAAAAAARg/Det4xdAJlW0/s1600/F07-04.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://3.bp.blogspot.com/-sBvOaTqL_IE/TvsTfuqcFjI/AAAAAAAAARg/Det4xdAJlW0/s400/F07-04.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;It just reads data from A0, divides it by 4 so it would fit in a byte and then sent it over USB to a&amp;nbsp;receiving&amp;nbsp;program that I wrote in Ruby and Tk.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;// Project 18 - Oscilloscope&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#define CHANNEL_A_PIN 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void setup() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;Serial.begin(115200);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;//Serial.begin(9600);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void loop() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int value = analogRead(CHANNEL_A_PIN);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; value = (value &amp;gt;&amp;gt; 2) &amp;amp; 0xFF;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.print(value, BYTE);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; delayMicroseconds(100);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is the schematic - it just creates a 2.5V reference and AC coupling.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: red;"&gt;Note that there is no overvoltage protection, so understand what you try and measure with it, or you could damage or destroy your Arduino.&lt;/span&gt;&lt;/b&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/-FCYGtDLmNb0/TvsVQtnzVPI/AAAAAAAAARs/G-_RJtJKdXU/s1600/F07-02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://1.bp.blogspot.com/-FCYGtDLmNb0/TvsVQtnzVPI/AAAAAAAAARs/G-_RJtJKdXU/s320/F07-02.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A few people have been having trouble using Tk and Ruby, so I decided to redo the sketch in &lt;a href="http://processing.org/" target="_blank"&gt;Processing&lt;/a&gt;.&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/-l3BGtCz-Dn8/TvsXRdZrvGI/AAAAAAAAAR4/8Tt5PG6auVA/s1600/app.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="http://4.bp.blogspot.com/-l3BGtCz-Dn8/TvsXRdZrvGI/AAAAAAAAAR4/8Tt5PG6auVA/s320/app.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&amp;nbsp;As I said, very crude, but feel free to improve it and make something of it.&lt;br /&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/-9mU7KsZCv-8/TvsXStN4PdI/AAAAAAAAASA/9Hvdhd9kIOU/s1600/processing.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-9mU7KsZCv-8/TvsXStN4PdI/AAAAAAAAASA/9Hvdhd9kIOU/s320/processing.jpg" width="289" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you haven't had a play then do so, its great! If you are used to Arduino, then the IDE will be very familiar to you. Instead of 'setup' and 'loop' you have 'setup' and 'draw'.&lt;br /&gt;&lt;br /&gt;The full processing sketch is listed below and if you just want an executable (mac, Linux and Windows), you can download this from the 'downloads' page on the book's &lt;a href="http://www.arduinoevilgenius.com/" target="_blank"&gt;website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;import processing.serial.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;final int dt = 5;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;final int width = 800;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;final int height = 600;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;final int messageHeight = 30;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Serial myPort;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;int reading;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;int t = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;int a_ = 128;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; size(width, height);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; background(255, 255, 255);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; makeConnection(); &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void draw()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (t == 0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; while (getNextReading() != 128) {}; // wait for zero crossing&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int a = (256 - getNextReading()) * 2 + messageHeight;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // clear a vertical strip just infront of waveform&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; fill(255, 255, 255);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; noStroke();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; rect(t, messageHeight+1, dt, height-messageHeight);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // draw 0V line&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; fill(0, 255, 0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; stroke(1);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; line(t, 256 + messageHeight, t+dt, 256 + messageHeight); &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // draw the waveform line&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; fill(255, 0, 0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; stroke(2);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; line(t, a_, t+dt, a);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; t += dt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; a_ = a;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (t &amp;gt; width) t = 0; // flyback to start&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;int getNextReading()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; int readAttempts = 0;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; while ( myPort.available() &amp;lt; &amp;nbsp;0 &amp;amp;&amp;amp; readAttempts &amp;lt; 10000)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; readAttempts ++;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; return myPort.read(); &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; catch (Exception e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; makeConnection();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; return 128;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;} &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void makeConnection()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; // I know that the first port in the serial list on my mac&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // is always my &amp;nbsp;FTDI adaptor, so I open Serial.list()[0].&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // On Windows machines, this generally opens COM1.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // Open whatever port is the one you're using.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; String portName = "None";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; portName = Serial.list()[0];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; myPort = new Serial(this, portName, 115200);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; notify("Port: " + portName);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; catch (Exception e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; warn("Not Connected: " + portName);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void notify(String message)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; fill(255, 255, 255);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; stroke(0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; rect(0, 0, width, messageHeight);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; fill(0, 0, 255);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; text(message, 0, 20);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;void warn(String message)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; fill(255, 0, 0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; stroke(0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; rect(0, 0, width, messageHeight);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; fill(0, 0, 0);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; text(message, 0, 20);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-4639115668195679914?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/4639115668195679914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=4639115668195679914' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4639115668195679914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4639115668195679914'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/12/arduino-oscilloscope-update.html' title='Arduino Oscilloscope Update'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-sBvOaTqL_IE/TvsTfuqcFjI/AAAAAAAAARg/Det4xdAJlW0/s72-c/F07-04.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-60237415417516954</id><published>2011-12-21T02:01:00.000-08:00</published><updated>2011-12-21T02:32:54.803-08:00</updated><title type='text'>Freetronics EtherTen Review</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;If you have read some of my other blog posts, you will know that I am a bit of a fan of &lt;a href="http://www.freetronics.com/" target="_blank"&gt;Freetronics&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;They may not be the cheapest Arduino boards and shields, but the quality of both design and manufacture is of the highest standard.&lt;br /&gt;&lt;br /&gt;This is a review of the Freetronics &lt;a href="http://www.freetronics.com/pages/etherten-quickstart-guide" target="_blank"&gt;EtherTen board&lt;/a&gt;. This board effectively combines an Arduino Uno with an Ethernet shield. This board costs AUD 69.95 (about USD 70) which is cheaper than an Uno + Ethernet card (29.95 + 45.95 = &amp;nbsp;USD 79) and a lot smaller and more convenient.&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/-fW1NQOBWJb4/TvGrBwLjEdI/AAAAAAAAAQo/pc_ZDOGtoMU/s1600/etherten.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="231" src="http://2.bp.blogspot.com/-fW1NQOBWJb4/TvGrBwLjEdI/AAAAAAAAAQo/pc_ZDOGtoMU/s400/etherten.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Features&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The EtherTen has a Micro SD slot (why would you need anything bigger?). This is very handy if you are using the EtherTen to serve a lot of content or are using it for any kind of data logging application.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Connection to your computer is by a miniUSB which saves space. There are various headers that allow you to do clever things like use PoE (Power over Ethernet) as well as status LEDs that let you know what's going on.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;In common with all Ethernet devices it gets pretty warm, and I left my project (see below) running all night, with no ill effects.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The board functions just like an Arduino Uno + Ethernet shield. I used it on Arduino 1.0 and standard Ethernet library without having to change anything. It all just worked first time.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;This is a terrific little board and if you have an Ethernet Arduino project in mind, I would recommend it over using separate Uno and Ethernet shield combination. Its cheaper and it will keep your Arduino sandwhich from looking like something Scooby-Doo would eat.&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;If you want to see how I used it in a little test project then read on....&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Mini-Project&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;In reviewing a product, I always like to try it out with some little project I, rather than use simple example sketches, so I decided to try out an Ethernet Telegraph. A bit silly really, but the idea is that the EtherTen would act as a web server connected to my home hub (next to my desk) and would have a homemade Luxeon LED shield attached to it. Then when my beloved wanted to contact me, she could open a browser page (even from work if I open up the firewall) and type in a message, that would be relayed to me as the Luxeon LED flashing me in Morse Code.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;I used to know a little Morse, but actually, I'd probably have to note it down then decode each letter. Still, thats not the point.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;This is the web page:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-YbjgMgTWSmo/TvGtr1XyEDI/AAAAAAAAAQw/yGZ68fc19Kk/s1600/web.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="160" src="http://4.bp.blogspot.com/-YbjgMgTWSmo/TvGtr1XyEDI/AAAAAAAAAQw/yGZ68fc19Kk/s400/web.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Here is the shield attached to the EtherTen:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tXsTcjzXg2g/TvGuhJBGntI/AAAAAAAAAQ4/6UNz7TYwd2s/s1600/shield.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="208" src="http://4.bp.blogspot.com/-tXsTcjzXg2g/TvGuhJBGntI/AAAAAAAAAQ4/6UNz7TYwd2s/s320/shield.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The shield is from my book '&lt;a href="http://www.arduinoevilgenius.com/" target="_blank"&gt;30 Arduino Projects for the Evil Genius&lt;/a&gt;'. I had to change the pin it uses from 11 (which is used by the EtherTen) to pin 8. Here are the schematic and protoshield layouts for the shield.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-B_LqV5q7vuY/TvGwaQpY0QI/AAAAAAAAARA/p9TZFkxuR6A/s1600/cct.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="292" src="http://1.bp.blogspot.com/-B_LqV5q7vuY/TvGwaQpY0QI/AAAAAAAAARA/p9TZFkxuR6A/s320/cct.png" 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/-mUad6jwOlxc/TvGweFDBAHI/AAAAAAAAARI/Uw4laR4PrHo/s1600/layout.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="378" src="http://2.bp.blogspot.com/-mUad6jwOlxc/TvGweFDBAHI/AAAAAAAAARI/Uw4laR4PrHo/s400/layout.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The sketch for all this is listed below. It is a modified version of a sketch from my book '&lt;a href="http://www.arduinobook.com/" target="_blank"&gt;Programming Arduino&lt;/a&gt;' see page 74 for an explanation of the Morse part and Chapter 10 for the Ethernet part.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;You may need to change the IP address on line 6, to something compatible with your home network.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#include &amp;lt;SPI.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#include &amp;lt;Ethernet.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;int ledPin = 8;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;IPAddress ip(192, 168, 1, 177);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;EthernetServer server(80);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;char line1[256];&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;int dotDelay = 100;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;char* letters[] = {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", &amp;nbsp; &amp;nbsp;// A-I&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", &amp;nbsp;// J-R&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.." &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// S-Z&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;};&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;char* numbers[] = {"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."};&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;void setup() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; pinMode(ledPin, OUTPUT);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; digitalWrite(ledPin, LOW);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; Ethernet.begin(mac, ip);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; Serial.begin(9600);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;void loop()&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; EthernetClient client = server.available();&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; if (client)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; while (client.connected())&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; readHeader(client);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (! pageNameIs("/"))&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; client.stop(); &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.println("HTTP/1.1 200 OK");&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.println("Content-Type: text/html");&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.println();&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // send the body&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.println("&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;");&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.println("&amp;lt;h1&amp;gt;Morse Sender&amp;lt;/h1&amp;gt;");&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.println("&amp;lt;form method='GET'&amp;gt;"); &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.println("Message: &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;");&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.println("&amp;lt;input type='TEXT' name='m' size='100'&amp;gt;"); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.println("&amp;lt;input type='submit' value='Send Morse'/&amp;gt;");&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.println("&amp;lt;/form&amp;gt;");&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.println("&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;");&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; client.stop(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; processHeader();&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;void processHeader()&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; // header lloks like this:&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; // GET /?m=Happy+Christmas HTTP/1.1&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; // so Morse flash everything from [=] to [space]&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; int n = strlen(line1);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; int i = 0;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; while (i &amp;lt; n &amp;amp;&amp;amp; line1[i] != '=') i++; // skip to =&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; while (i &amp;lt; n &amp;amp;&amp;amp; line1[i] != ' ')&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; flashCharacter(line1[i]);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; i++;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;boolean pageNameIs(char* name)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;// page name starts at char pos 4&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;// ends with space&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;int i = 4;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;char ch = line1[i];&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;while (ch != ' ' &amp;amp;&amp;amp; ch != '\n' &amp;amp;&amp;amp; ch != '?')&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if (name[i-4] != line1[i])&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;i++;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ch = line1[i];&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;return true;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;void readHeader(EthernetClient client)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; // read first line of header&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; char ch;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; int i = 0;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; while (ch != '\n')&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; if (client.available())&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ch = client.read();&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; line1[i] = ch;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; i ++;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; line1[i] = '\0';&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; Serial.println(line1);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;void flashCharacter(char ch)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; if (ch &amp;gt;= 'a' &amp;amp;&amp;amp; ch &amp;lt;= 'z')&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; flashSequence(letters[ch - 'a']);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; else if (ch &amp;gt;= 'A' &amp;amp;&amp;amp; ch &amp;lt;= 'Z')&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; flashSequence(letters[ch - 'A']);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; else if (ch &amp;gt;= '0' &amp;amp;&amp;amp; ch &amp;lt;= '9')&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; flashSequence(numbers[ch - '0']);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; else if (ch == '+')&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;delay(dotDelay * 4); &amp;nbsp; &amp;nbsp; &amp;nbsp;// gap between words &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;void flashSequence(char* sequence)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;int i = 0;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;while (sequence[i] != NULL)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;flashDotOrDash(sequence[i]);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i++;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;delay(dotDelay * 3); &amp;nbsp; &amp;nbsp;// gap between letters&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;void flashDotOrDash(char dotOrDash)&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; digitalWrite(ledPin, HIGH);&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; if (dotOrDash == '.')&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; delay(dotDelay); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; else // must be a -&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; delay(dotDelay * 3); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; digitalWrite(ledPin, LOW); &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; delay(dotDelay); // gap between flashes&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Note: In the interests of transparency, Freetronics did supply me with a board for review, but I can honestly say that this has not biased my opinion of the board.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-60237415417516954?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/60237415417516954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=60237415417516954' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/60237415417516954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/60237415417516954'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/12/freetronics-etherten-review.html' title='Freetronics EtherTen Review'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-fW1NQOBWJb4/TvGrBwLjEdI/AAAAAAAAAQo/pc_ZDOGtoMU/s72-c/etherten.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-4748707934063596154</id><published>2011-12-13T07:35:00.000-08:00</published><updated>2011-12-13T07:35:22.838-08:00</updated><title type='text'>.NET Gadgeteer - First Impressions</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;It shows just how far Arduino and the other open source hardware platforms have come, when Microsoft wants to get in on the act.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The question often posed is 'is .NET Gadgeteer an Arduino Killer?'&lt;br /&gt;&lt;br /&gt;&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://2.bp.blogspot.com/-SLebj0o8uYY/Tudl9F8OXZI/AAAAAAAAAPc/kG6zsMcQyas/s1600/arduino+sm.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="138" src="http://2.bp.blogspot.com/-SLebj0o8uYY/Tudl9F8OXZI/AAAAAAAAAPc/kG6zsMcQyas/s200/arduino+sm.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/-xvGOeuajNEc/TudlfUiTWtI/AAAAAAAAAPM/2a039eDOJ2c/s1600/gadgeteer.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-xvGOeuajNEc/TudlfUiTWtI/AAAAAAAAAPM/2a039eDOJ2c/s200/gadgeteer.jpg" width="191" /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span class="Apple-style-span" style="color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; vs.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The answer is an emphatic NO, it isn't. In the same way that a Rolls-Royce isn't a pedal cycle killer. They are both vehicles and some people will own one of each, but they are very different beasts.&lt;br /&gt;&lt;br /&gt;It is rare that you get very far with an Arduino without a bit of soldering. It has a laughably&amp;nbsp;feeble&amp;nbsp;processor, tiny amounts of RAM and program storage. However, thats often all you need. Its 'lightness' is part of its charm.&lt;br /&gt;&lt;br /&gt;The .NET Gadgeteer is a quite different beast. The kit I have is the 'Fez Spider Starter Kit' from GHI electronics. And it comes with a fantastic range of things to connect to your Controller board.&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/-cOLXKsPMV4w/TudntownsoI/AAAAAAAAAPs/1eTekYT0cXA/s1600/kit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="255" src="http://2.bp.blogspot.com/-cOLXKsPMV4w/TudntownsoI/AAAAAAAAAPs/1eTekYT0cXA/s400/kit.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Yup, thats right, there is a camera, a large LCD touch screen, a joystick, multicolor LED, USB host, SD card and even a little push button. And they all have little DIL connectors, so you assemble your project by plugging things together. Nearly all the components actually have their own microcontroller, and I suspect there are more transistors in one of these kits than a thousand Arduinos.&lt;br /&gt;&lt;br /&gt;So whereas an Arduino project will often involve a shield, that has a few components on, say a screen and a joystick, &amp;nbsp;in the Gadgeteer world, you plug in separate&amp;nbsp;components using lengths of ribbon cable. So the front of a Gadgeteer controller board is covered in sockets into which things can be plugged.&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/-21bMugyolTY/TudrQpPJMLI/AAAAAAAAAQM/tIMlZLggBsY/s1600/gadgeteer_front2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-21bMugyolTY/TudrQpPJMLI/AAAAAAAAAQM/tIMlZLggBsY/s400/gadgeteer_front2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;There are rules about what can be plugged into what, but we will come to that in a moment.&lt;br /&gt;&lt;br /&gt;You can see the separate programmer, which yes, you guessed it uses one of those little sockets to connect it to your computer via USB. When I say your computer, obviously I mean your Windows computer. You program the Gadgeteer using the Visual Studio integrated development environment, and this is only available for Windows. However, Mac and Linux users do not despair. I had no problems running the development environment on Virtual Box and Windows on my Mac.&lt;br /&gt;&lt;br /&gt;I have to say that programming the Gadgeteer was a very pleasant surprise. The libraries are very well though out and easy to use and backed up by a really&amp;nbsp;excellent&amp;nbsp;hardware designer. Let me show you.&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/-FqrpgAv2fAA/TudsJ4cJYMI/AAAAAAAAAQU/UDn6hS-tszs/s1600/designer.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="488" src="http://4.bp.blogspot.com/-FqrpgAv2fAA/TudsJ4cJYMI/AAAAAAAAAQU/UDn6hS-tszs/s640/designer.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In this mini project I am connecting a joystick and a RGB LED. So, as I change the position of the joystick, it will use the X position of the joystick to control the brightness of the blue channel of the LED.&lt;br /&gt;&lt;br /&gt;So, before I actually plug together the physical hardware, I plug together virtual hardware on the designer. This does nice things like tell me which of the sockets are compatible with the peripheral I am plugging in.&lt;br /&gt;&lt;br /&gt;Then, when I am done designing the hardware, I hit save, and a load of boilerplate code is generated for me. All I need to do then is add in a Timer and a single line that reads the X position, scales it and assigns it to the blue channel of the LED and I am done.&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/-Kflh69HpwgI/Tudtceq4a2I/AAAAAAAAAQc/4qEzSDu4XJQ/s1600/gadgeteer_code.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="488" src="http://2.bp.blogspot.com/-Kflh69HpwgI/Tudtceq4a2I/AAAAAAAAAQc/4qEzSDu4XJQ/s640/gadgeteer_code.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Installing it in the actual hardware is a button press and what's more I can use a proper debugger and set break-points in my code and everything.&lt;br /&gt;&lt;br /&gt;Very cool.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;I can see .NET Gadgeteer working really well in educational settings. Its a great way of getting kids to understand that their gadgets don't just fall ready formed from the sky, but they get designed by people like them. The ability to make things without soldering is sadly another win in our safety conscious society.&lt;br /&gt;&lt;br /&gt;It is a very well thought out and consistent system that provides another approach to hardware development for the masses.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-4748707934063596154?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/4748707934063596154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=4748707934063596154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4748707934063596154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4748707934063596154'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/12/net-gadgeteer-first-impressions.html' title='.NET Gadgeteer - First Impressions'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-SLebj0o8uYY/Tudl9F8OXZI/AAAAAAAAAPc/kG6zsMcQyas/s72-c/arduino+sm.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-3063858317685238831</id><published>2011-12-06T02:31:00.001-08:00</published><updated>2011-12-06T03:33:15.696-08:00</updated><title type='text'>Arduino 1.0 First Impressions</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;The Arduino software - the development environment that you run on your computer to be able to write programs and program your Arduino has bumped versions. It has gone from version 23 to version 1.0&lt;br /&gt;&lt;br /&gt;The first thing to say that while this is a major (if slightly&amp;nbsp;confusing) update in version numbering, it is more of a tidy up and general stability release than any major change in functionality. The rewrite as a stand-alone Eclipse RCP, would have been my choice, &amp;nbsp;but never mind.&lt;br /&gt;&lt;br /&gt;The two IDE's are shown side by side below:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-DGY0csQltWM/Tt3wnFpImMI/AAAAAAAAAOk/pHJdgy49nps/s1600/Arduino1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="167" src="http://1.bp.blogspot.com/-DGY0csQltWM/Tt3wnFpImMI/AAAAAAAAAOk/pHJdgy49nps/s200/Arduino1.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;a href="http://4.bp.blogspot.com/-o7e2ob0R90Y/Tt3wnxWGK4I/AAAAAAAAAOo/LrUi9zJLnMw/s1600/Arduino23.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="167" src="http://4.bp.blogspot.com/-o7e2ob0R90Y/Tt3wnxWGK4I/AAAAAAAAAOo/LrUi9zJLnMw/s200/Arduino23.jpg" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Arduino 1.0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Arduino 23&lt;br /&gt;&lt;br /&gt;I know these are too small to see properly, but I wanted to illustrate one of the changes. The color! Does anyone else think that IDE's should be a more macho color like black or silver, rather than the color of over-boiled brocoli?&lt;br /&gt;&lt;br /&gt;Anyway, here is a bigger picture of the new IDE:&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/-DGY0csQltWM/Tt3wnFpImMI/AAAAAAAAAOk/pHJdgy49nps/s1600/Arduino1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="536" src="http://1.bp.blogspot.com/-DGY0csQltWM/Tt3wnFpImMI/AAAAAAAAAOk/pHJdgy49nps/s640/Arduino1.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The first thing I noticed (apart from the horrendous color) was the really useful text at the bottom of the editor that correctly told me I had a Mega attached to a serial port, and the serial port's name. This is a nice touch.&lt;br /&gt;&lt;br /&gt;Another improvement, for beginners especially, is that the toolbar items have been given an overhaul.&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/-vynzXUDDslw/Tt3y0eCcIEI/AAAAAAAAAO0/B_MpaRQxCg4/s1600/Arduino23toolbar.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="26" src="http://3.bp.blogspot.com/-vynzXUDDslw/Tt3y0eCcIEI/AAAAAAAAAO0/B_MpaRQxCg4/s200/Arduino23toolbar.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;Old Arduino 23 Tool bar.&lt;br /&gt;&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/-mdXHE-JPsU0/Tt3y2zXJw2I/AAAAAAAAAO8/P9Ia24jmJZ0/s1600/Arduino1toolbar.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-mdXHE-JPsU0/Tt3y2zXJw2I/AAAAAAAAAO8/P9Ia24jmJZ0/s1600/Arduino1toolbar.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;New Toolbar:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The new icons make a lot more sense. The Play button of earlier versions that compiles without uploading to the board just becomes a 'check' icon. The button next to it uploads to the board and the other three icons allow you to start a new sketch, open and save sketches respectively.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So, what's new then?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Looking at the &lt;a href="http://arduino.cc/en/Main/ReleaseNotes" target="_blank"&gt;release notes&lt;/a&gt;, the main new features are:&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;The sketch file names extension has changed from .pde to .ino. See later where I talk about&amp;nbsp;compatibility.&lt;/li&gt;&lt;li&gt;Serial Communications using the standard UART (Rx and Tx pins) has been improved&lt;/li&gt;&lt;li&gt;The SoftwareSerial library has been supplanted by the superior NewSofwareSerial library. This allows you to have several serial connections on the go at the same time.&lt;/li&gt;&lt;li&gt;The String class has been reimplemented - if you like that kind of thing&lt;/li&gt;&lt;li&gt;There is a nice new syntax for putting your strings into flash (PROGMEM) rather than having to use up valuable RAM. You just wrap it in F() like this:&amp;nbsp;Serial.print(F("hello world")). Very cool!&lt;/li&gt;&lt;li&gt;The Ethernet library now has DHCP and DNS support - thanks to Adrian McEwen. This is a great improvement, although it does&amp;nbsp;unavoidably&amp;nbsp;swell the library size.&lt;/li&gt;&lt;li&gt;The Wire and SD libraries have been improved and tidied up.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Compatability&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The one thing that scared me in the release notes was the change in extension from .pde to .ino. But I needn't have worried. When I started up Arduino 1.0 IDE, the sketches that I had previously left open in Arduino 23 opened too.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you create any new sketches, they will automatically get saved with the .ino extension, however, it is only when you come to save an existing sketch after modifying it, that you will get the following prompt.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ccaK9J7N3Qc/Tt33H4R8WVI/AAAAAAAAAPE/2M4Djvrk_3g/s1600/warning.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="165" src="http://3.bp.blogspot.com/-ccaK9J7N3Qc/Tt33H4R8WVI/AAAAAAAAAPE/2M4Djvrk_3g/s400/warning.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which is fine. But if you have an important sketch, make a backup of it somewhere before changing it in 1.0 in case you need to go back to 23.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One issue is the amount of flash the sketches take up when deployed fo an Arduino board. All these improvements come at the cost of bigger fiels, especially if you use some of the new libraries (&lt;a href="http://arduino.cc/forum/index.php/topic,81070.0.html"&gt;http://arduino.cc/forum/index.php/topic,81070.0.html&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Arduino team have been brave in adressing some overdue tidying up and enhancements. But with all such changes, the is likely to be some disruption.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are likely to be problems with some existing libraries, so my plan is to stick with 23 for all my exisiting projects, for any minor changes and use Arduino 1.0 for any new developments. There is no problem having both IDE's available, just edit their names so that you can tell them apart.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh, and Arduin team - please do something about that color! A Preferences setting would be great.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-3063858317685238831?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/3063858317685238831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=3063858317685238831' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3063858317685238831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3063858317685238831'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/12/arduino-10-first-impressions.html' title='Arduino 1.0 First Impressions'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-DGY0csQltWM/Tt3wnFpImMI/AAAAAAAAAOk/pHJdgy49nps/s72-c/Arduino1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-8707117525810038730</id><published>2011-12-05T03:22:00.001-08:00</published><updated>2011-12-05T03:51:25.855-08:00</updated><title type='text'>Photo Etching: Part 3 - Make a Timer</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Now that we can create our own circuit boards, lets improve our UV Light Box, by adding an automatic timer to it.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-wfUenBxaces/Ttyq-h-aZkI/AAAAAAAAAN0/oyFETz5mxLY/s1600/board+with+timer.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://3.bp.blogspot.com/-wfUenBxaces/Ttyq-h-aZkI/AAAAAAAAAN0/oyFETz5mxLY/s320/board+with+timer.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The PCB is designed in &lt;a href="http://www.cadsoftusa.com/" target="_blank"&gt;EagleCAD&lt;/a&gt;. A free version is available for non-commercial use. It is not the easiest software to use, but you will soon get the hang of it with a bit of patience. The Eagle project files are available &lt;a href="http://dl.dropbox.com/u/3993179/Timer.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-uwz_bauLkNw/TtyrBA__ehI/AAAAAAAAAOI/aBvc13SIWjI/s1600/timer+boxed.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-uwz_bauLkNw/TtyrBA__ehI/AAAAAAAAAOI/aBvc13SIWjI/s320/timer+boxed.jpg" width="256" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;We will use the famous and much used 555 timer and a variable resistor to control the length of the exposure. We will also have two indicator LEDs. A red one to indicate that power is supplied to the Light Box and a blue one that will only be illuminated when the UV LEDs are lit.&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;You will need the following parts:&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;1 x NE 555 time&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-tab-span"&gt;&lt;/span&gt;1 x 8 pin DIL IC socket&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;1 x MΩ Log potentiometer&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;2 x&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;470Ω 0.5W metal film resistor&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;1 x&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;33KΩ 0.5W metal film resistor&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;1 x&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;100µF 16V electrolytic capacitor&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;1 x&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;Red 3mm LED&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;1 x&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;Blue 3mm LED&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-tab-span"&gt;&lt;/span&gt;1 x FQP7N10 N-Channel MOSFET&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-tab-span"&gt;&lt;/span&gt;1 x Push to make switch&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The schematic diagram for the board is shown below, along with the board itself.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-BrQQVEeU_gY/TtyrBopYpKI/AAAAAAAAAOQ/djpCTHUy47Q/s1600/timer+cct.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="227" src="http://4.bp.blogspot.com/-BrQQVEeU_gY/TtyrBopYpKI/AAAAAAAAAOQ/djpCTHUy47Q/s400/timer+cct.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;The board design is included in &lt;a href="http://dl.dropbox.com/u/3993179/Timer.zip" target="_blank"&gt;this zip&lt;/a&gt;. Its also shown below, but not to the correct scale.&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Print off the timer board design onto transparency film and expose it in the same way as you did for your test strip, using the exposure you decided on in the previous section.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Make sure that you put the transparency on top of the board the right way up. I.e. it should have the rougher side on which the image was printed to the top, as the PCB layout shown at the end of the document is from the perspective of looking through the board from above and so we need to reverse it.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;When the transparency is on the board in a position for printing, the text should read correctly rather than be mirror image.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ua2hhY0nAGg/Ttyq_KI7OBI/AAAAAAAAAN8/Gt3LsNGZt58/s1600/board.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="227" src="http://4.bp.blogspot.com/-ua2hhY0nAGg/Ttyq_KI7OBI/AAAAAAAAAN8/Gt3LsNGZt58/s400/board.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Once the board is etched, you will need to drill the board using a 1mm drill bit. Use the diagram below to identify the position of each component. Solder the components into place, starting with the lowest components first.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-LEOXLXB2oos/TtyrCPOoTqI/AAAAAAAAAOc/-DElXlvl1dY/s1600/timer+pcb+top.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="208" src="http://4.bp.blogspot.com/-LEOXLXB2oos/TtyrCPOoTqI/AAAAAAAAAOc/-DElXlvl1dY/s320/timer+pcb+top.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The potentiometer is attached to short wires to make it stand far enough away from the board to fit into our enclosure. Depending on the design of your index box, you may not need to do this. Similarly, wires are soldered between the termination points on the circuit board and the switch. This also applies to the connection to the UV LED Array and the power socket.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Note that you could use screw connectors for J1, J2 and J3 on the board, but I just soldered leads directly to the board.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Note also the two red jumper links that are required.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Test the board connected to the power supply and the switch using just the blue LED, before fitting everything into the box and connecting up the UV LED panel.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-QeQuE5LWNN8/TtyrAV5vZcI/AAAAAAAAAOE/OblRxZLGpRs/s1600/inside+the+box.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://3.bp.blogspot.com/-QeQuE5LWNN8/TtyrAV5vZcI/AAAAAAAAAOE/OblRxZLGpRs/s320/inside+the+box.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Line up the completed board against the inside of the box and mark the position in which to drill the holes for the potentiometer, the push switch and the LEDs. The collar of the potentiometer and the snug fit of the LEDs into their holes is used to keep the board in place.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;After it is all assembled, we need to calibrate the timer. I used a paper label onto which I marked the times, including the optimal time for my set of equipment of 30 seconds.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;A stop watch and trial and error was used to calibrate the dial.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p3"&gt;&lt;span class="s1"&gt;It is beyond the scope of this article to go any further into PCB design. The author uses the free (for home use and small boards) Eagle CAD software. This excellent software takes a little getting used to, but is very powerful and will attempt to automatically create board layouts from your schematic diagrams.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p3"&gt;&lt;span class="s1"&gt;Have fun, but above all, be careful - almost everything in this project is dangerous!&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&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/-ua2hhY0nAGg/Ttyq_KI7OBI/AAAAAAAAAN8/Gt3LsNGZt58/s1600/board.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-8707117525810038730?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/8707117525810038730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=8707117525810038730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8707117525810038730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8707117525810038730'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/12/photo-etching-part-3-make-timer.html' title='Photo Etching: Part 3 - Make a Timer'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-wfUenBxaces/Ttyq-h-aZkI/AAAAAAAAAN0/oyFETz5mxLY/s72-c/board+with+timer.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-8796783689205459754</id><published>2011-11-29T01:38:00.001-08:00</published><updated>2011-11-29T01:59:13.612-08:00</updated><title type='text'>Photo Etching: Part 2 - Exposure and Etching</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;We have a functioning light box, so, now its time to do some etching!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;WARNING: IN THIS SECTION WE ARE USING POISONOUS CHEMICALS, THAT CAN ALSO BURN. WEAR PROTECTIVE GOGGLES AND GLOVES WHILE HANDLING THESE CHEMICALS.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;ALWAYS FOLLOW THE INSTRUCTIONS INCLUDED WITH THE CHEMICALS EVEN WHERE THEY DIFFER FROM THE INSTRUCTIONS BELOW.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;b&gt;You will need:&lt;/b&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;An assembled light box from Part 1 of this blog entry&lt;/li&gt;&lt;li&gt;Small single-sided pre-sensitised copper-clad board 100mmx75mm&lt;/li&gt;&lt;li&gt;Craft knife&lt;/li&gt;&lt;li&gt;Steel rule&lt;/li&gt;&lt;li&gt;Scissors&lt;/li&gt;&lt;li&gt;Sodium persulphate etch powder&lt;/li&gt;&lt;li&gt;Universal photo-etch developer&lt;/li&gt;&lt;li&gt;Disposable latex gloves&lt;/li&gt;&lt;li&gt;Safety goggles&lt;/li&gt;&lt;li&gt;Empty bottles to contain the mixed chemicals (not the bottles should be clearly labelled POISON - DO NOT DRINK)&lt;/li&gt;&lt;li&gt;A bucket&lt;/li&gt;&lt;li&gt;Developer trays, I use recycled plastic food tubs&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Everyone learns by making mistakes. Every exposure box is likely to have a slightly different intensity, and need different lengths of exposure. Also your inkjet printer, transparency film and copper-clad board are all likely to be different to mine. Although there is actually quite a wide margin or error, we need to try and find the optimal exposure for our set of equipment without wasting too much copper clad board.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;So, to avoid frustration, just accept that you are not going to get anything except knowledge out of your first few dollars worth of copper-clad board and transparency film.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;We are going to start by making a test strip to determine the best exposure for our printer / board / lightbox combination. This is a technique taken from ‘good old fashioned’ film photography. The idea is that we will have a test pattern printed onto transparency film that we will partially cover up with the first exposure and then gradually move the card to expose more of the board for the subsequent exposures.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;But first, let’s print the test strip onto transparency film.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Printing&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;First of all, we need to create a test strip pattern. The test strip below can be printed directly by printing the last page of these instructions onto transparency film. This film used to be used extensively for presentations on over-head projectors.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;I use an inkjet printer, but if you have a laser printer then you can also get transparency film for them. Be sure to get film for your correct type of printer. You cannot put inkjet film into a laser printer and vice-versa. Any major office supplier will sell transparent film.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;We need to print as boldly onto the transparency film as possible to ensure as little UV as possible leaks through to the coper clad board. To do this, make sure that you set:&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;the media type to ‘Transparency’&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;document type to ‘Monochrome’&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;quality to ‘Maximum’&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The transparency sheets are relatively expensive, so I tend to print at the top of the page and then cut the top of the film and use the remainder for the next board, getting three or four boards out of one film.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;When you have printed the film, try to keep it clean until you are ready to use it, as any little specs of dust will end up as copper.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;A Test Strip&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Firstly we need to cut up our sacrificial copper clad board into test strip sized pieces. You can do this with a craft knife and metal rule. Score the board top and bottom, where you want to cut it and then snap it over the edge of a table.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;You will notice that the copper side of the board has a thick layer of light-proof plastic covering. This will need to be removed from the test strip before exposing it.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Here are the steps for creating your test strip.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;/div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Mix water into the developer powder according to the instructions on the packet. Mixing them into a storage bottle. If the chemicals are designed to work at a higher than room temperature then place the bottle it in a bucket of hot water to bring them up to temperature.&lt;/li&gt;&lt;li&gt;Do the same for the etch solution.&lt;/li&gt;&lt;li&gt;Trim the transparency film to be about the same size as the copper-clad board.&lt;/li&gt;&lt;li&gt;Disassemble the clip frame&lt;/li&gt;&lt;li&gt;Peel the protective layer off the board and place is sensitized side up on the base of the clip-frame&lt;/li&gt;&lt;li&gt;Place the test strip over the board&lt;/li&gt;&lt;li&gt;Fix the glass lid of the frame back into place.&lt;/li&gt;&lt;li&gt;Place the whole photo frame into the bottom of the light box.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Now we can begin making the exposures.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ZESaFMxixMM/TtSpQ3-qCNI/AAAAAAAAANM/aVyU4QUhPKI/s1600/test+strip.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="101" src="http://2.bp.blogspot.com/-ZESaFMxixMM/TtSpQ3-qCNI/AAAAAAAAANM/aVyU4QUhPKI/s320/test+strip.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;We are going to make four exposures, for the first three covering successively less and less of the test board.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The sequence is:&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;/div&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Cover sections D, C and B with a thick piece of card (on top of the glass) and expose for 40 seconds.&lt;/li&gt;&lt;li&gt;Move the board to cover just the sections D and C and expose for 20 seconds&lt;/li&gt;&lt;li&gt;Move the board to just cover section D and expose for 10 seconds&lt;/li&gt;&lt;li&gt;Remove the board completely and expose for 10 seconds&lt;/li&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-UGDCLFjrF3I/TtSp9RQstKI/AAAAAAAAANU/GB01nqkeiHo/s1600/making+test+strip.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-UGDCLFjrF3I/TtSp9RQstKI/AAAAAAAAANU/GB01nqkeiHo/s320/making+test+strip.jpg" width="270" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Developing&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;By this time your chemicals will be at the right temperature and we can develop the board. If you are not quite ready to develop yet, then it does not matter, as long as you cover the board to prevent any further exposure from ambient light. Turning it upside-down is sufficient.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Put on your protective eye-ware and latex gloves and place the board copper side up in the tray that you are going to develop in.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Pour some developer onto the board enough to cover it with about half an inch of developer. Then gently rock the tray back and forth. You should soon see a picture starting to develop. Do not remove the board from the developer until the test strip image is clearly visible and well defined on the board. It is much easier to under-develop the board than to over-develop it, so if in doubt leave it in the developer a bit longer.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;When its ready, it should look something like this:&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-hM0e7FSJ0-8/TtSraamuaWI/AAAAAAAAANc/-zVvAMX9YJI/s1600/test+strip+1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="105" src="http://2.bp.blogspot.com/-hM0e7FSJ0-8/TtSraamuaWI/AAAAAAAAANc/-zVvAMX9YJI/s320/test+strip+1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;When you are happy that the board is ok, then remove it and wash it in the water in your bucket. Pour your developer back into its storage bottle ready for next time.&lt;br /&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Etching&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Either use a separate tray from the developing tray or clean your developer tray very carefully, then place the board in copper side up again and pour the etchant over it. Again a depth of about half an inch is ideal. The etchant solution will gradually go blue as it dissolves the copper that is not protected by the photo-resist image, so it is much easier to see what is going on if you don’t fill the tray right up.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-z2Ba-Rn-xe0/TtSra-uloFI/AAAAAAAAANg/tx-781Arws4/s1600/test+strip+2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="110" src="http://1.bp.blogspot.com/-z2Ba-Rn-xe0/TtSra-uloFI/AAAAAAAAANg/tx-781Arws4/s320/test+strip+2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;You may have to fish the board out of the etchant form time to time to check on it.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Almost immediately, you will notice the exposed copper areas to start to go pink. You know when the board is ready when all the pink areas have gone. The two pictures below show a board that is not quite ready yet followed by a board that is fully etched.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;When the etching is complete, put it back into the bottle and put your chemicals away safely out of the reach of children. Especially the etchant, which turns an attractive blue color when used.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Wash the board again, and you are done!&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;Assessing the Test Strip&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;An example test strip is shown below.&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-h1NIw36Y__U/TtSrbJbpZII/AAAAAAAAANo/BCf40ZixMGI/s1600/test+strip+3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="110" src="http://1.bp.blogspot.com/-h1NIw36Y__U/TtSrbJbpZII/AAAAAAAAANo/BCf40ZixMGI/s320/test+strip+3.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;On the left had side of the board, 10 seconds was not enough as most of the copper is still there. On the other hand 80 seconds was too much as the UV clearly went straight through the printed mask.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;40 seconds was still a bit much, but 20 seconds was just about right. Echos of Goldilocks there!&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;In the final part of the blog entry we will use our new toy to create a PCB for a timer to control the the UV exposure box.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Now I call that bootstrapping!&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-8796783689205459754?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/8796783689205459754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=8796783689205459754' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8796783689205459754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8796783689205459754'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/11/photo-etching-part-2-photo-etching.html' title='Photo Etching: Part 2 - Exposure and Etching'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ZESaFMxixMM/TtSpQ3-qCNI/AAAAAAAAANM/aVyU4QUhPKI/s72-c/test+strip.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-1985764001770312399</id><published>2011-11-27T08:52:00.001-08:00</published><updated>2011-11-27T09:14:28.437-08:00</updated><title type='text'>Photo Etching: Part 1 - UV Light Box</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Before I get started, I first need to say that I haven't forgotten about part 2 of my '&lt;a href="http://srmonk.blogspot.com/2011/11/canine-radio-direction-finder-part-1.html" target="_blank"&gt;Canine Direction Finder'&lt;/a&gt;. &amp;nbsp;The&amp;nbsp;receiver&amp;nbsp;is on breadboard and all that remains is to build a directional antenna. So, watch this space.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the mean time, I thought I would add this&amp;nbsp;article&amp;nbsp;I wrote a while back about making your own PCBs using photo etching. Starting by creating your own UV light box using UV LEDs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Creating your own printed circuit boards is not as difficult or expensive as you might think. In this article, I describe how you can use pre-sensitised boards and a home made light box to create your own boards.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="p1"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-YXtiWYrHWco/TtJsklHvbTI/AAAAAAAAAMc/alRLStS0Gco/s1600/kit.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-YXtiWYrHWco/TtJsklHvbTI/AAAAAAAAAMc/alRLStS0Gco/s400/kit.jpg" width="375" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Photo etching uses a transparency with an image of the PCB to be created printed onto transparency film, that is then placed over copper-clad board that has been pre-sensitised. These boards are not much more expensive than plain boards. The board is then exposed to UV light through the transparency film.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The board is then put into a tray of developer and the image of the PCB tracks will become visible on the board just like an old fashioned photograph being developed.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Next, the board is etched in a chemical that dissolves the copper except where it is protected by the photographic image of the PCB tracks.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;A Light box&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="s1"&gt;WARNING: ULTRAVIOLET LIGHT IS DANGEROUS IT CAN DAMAGE YOUR EYESIGHT. WHEN ASSEMBLING THIS PROJECT DO NOT LOOK DIRECTLY AT A LIT UV LED. IF YOU HAVE TO CHECK THAT THE LEDS ARE WORKING, THEN POINT THE BOARD AWAY FROM YOU AND LOOK AT THE LIGHT REFLECTED ON A PIECE OF PAPER. YOU CANNOT SEE IT, BUT THIS LED PANEL PRODUCES VERY BRIGHT UV.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Rather than buy a light box I decided to save some money and have some fun by designing my own. To start with the light box will have no timer, but rather the exposure that normally needs to be about 30 seconds will just be timed by hand. The first job of the light box will be to create a PCB for a simple timer to control our exposure more accurately.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-vhmUZRcmhEg/TtJtdhmBXyI/AAAAAAAAAMk/h-j9RKm8big/s1600/panel.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-vhmUZRcmhEg/TtJtdhmBXyI/AAAAAAAAAMk/h-j9RKm8big/s1600/panel.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Traditionally, UV light boxes are built using florescent UV tubes. These are relatively expensive and the tubes have to be replaced, so I decided to use a large array of UV LEDs sourced from eBay as a lot of 100 at a cost of about USD 20 - by far the biggest single outlay for the project.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The light box itself is going to be housed in an 7x5 inch index card box and the copper clad board and photo mask transparency will be sandwiched together in a cheap clip-style photo frame.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Power is supplied by a 12V wall-wart power supply.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;b&gt;You will need&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;84 (buy 100) x&amp;nbsp;400nm (at least 3000 mcd) UV LEDs&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;28 x&amp;nbsp;56Ω 0.5W resistors&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;Strip board 15cm x 10 cm (roughly 6” x 4”)&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;6” x 4” photo clip frame&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;7” x 5” index card box&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;12V 1.5A ‘wall-wart’ power supply&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;2.1mm power socket&lt;span class="Apple-tab-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;When buying the LEDs, it does not really matter whether they are 5mm or 2mm diameter, but do ensure that they are 400nm wavelength and bright enough (at least 3000 mcd).&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The LEDs will be mounted in the top of the index box and the copper clad board will be a good 6 inches away in the bottom of the box, and so the angle of the LEDs is not critical.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;The LEDs are arranged in sets of 3 LED in series each with their own current limiting resistor. These series sets are all arranged in parallel on the strip board in a hexagonal pattern.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xfVZfQAIbWw/TtJureVrjoI/AAAAAAAAAMs/OrKUPtnY33U/s1600/schematic.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="287" src="http://1.bp.blogspot.com/-xfVZfQAIbWw/TtJureVrjoI/AAAAAAAAAMs/OrKUPtnY33U/s320/schematic.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;You will need to make breaks in the copper track of the strip board. The easiest way to do this is by hand using a drill bit. Put the bit at the hole where you want to make the cut and twist it between forefinger and thumb, just enough to break the track.&amp;nbsp;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;There are a lot of LEDs and resistors to solder into place. Start with the linking wires and then the resistors and finally the LEDs.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Since there is a significant risk of accidentally creating a short-circuit, I found a good way of working to be to solder up a batch of three LEDs and then make sure that they lit before moving onto the next set.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-QApjUU3n0Co/TtJu3P1YyxI/AAAAAAAAAM0/8YUyiMD5HgU/s1600/stripboard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="386" src="http://4.bp.blogspot.com/-QApjUU3n0Co/TtJu3P1YyxI/AAAAAAAAAM0/8YUyiMD5HgU/s640/stripboard.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-r9-QkI4uH9Q/TtJvNZk_NOI/AAAAAAAAAM8/D9KTWyDee0w/s1600/stripboard_back.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://2.bp.blogspot.com/-r9-QkI4uH9Q/TtJvNZk_NOI/AAAAAAAAAM8/D9KTWyDee0w/s400/stripboard_back.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Hold the board away from you or upside-down and shine the LEDs onto a sheet of paper and look at the sheet of paper when testing them. Although they do not look bright, these LEDs are emitting a lot of ultraviolet and could easily damage your eyesight.&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;Make a hole in the index card box for the power supply and attach the LED board to the top of the index box. I used strips of self adhesive velcro to attach the board to the box, but you could also use self adhesive pads.&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="s1"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="s1"&gt;So there we have it, our own light box. The next step is to try out some test exposures and learn how to etch some boards.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-1985764001770312399?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/1985764001770312399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=1985764001770312399' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/1985764001770312399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/1985764001770312399'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/11/photo-etching-part-1-uv-light-box.html' title='Photo Etching: Part 1 - UV Light Box'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-YXtiWYrHWco/TtJsklHvbTI/AAAAAAAAAMc/alRLStS0Gco/s72-c/kit.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-1067644367050145898</id><published>2011-11-18T07:54:00.000-08:00</published><updated>2011-11-18T07:54:20.504-08:00</updated><title type='text'>New book: 'Programming Arduino: Getting Started with Sketches'</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;My new book 'Programming Arduino: Getting Started with Sketches' is just out on Amazon.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; height: 8pt; list-style-image: initial; list-style-position: initial; list-style-type: none; min-height: 8pt; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;a class="jive-link-external-small" href="http://www.amazon.com/Programming-Arduino-Getting-Started-Sketches/dp/0071784225" rel="nofollow" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #355491; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" target="_blank"&gt;http://www.amazon.com/Programming-Arduino-Getting-Started-Sketches/dp/0071784225&lt;/a&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-TVZa3ktBqP0/TsZ_bWkS09I/AAAAAAAAAMA/rfnOI-8x69s/s1600/cover2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-TVZa3ktBqP0/TsZ_bWkS09I/AAAAAAAAAMA/rfnOI-8x69s/s1600/cover2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; height: 8pt; list-style-image: initial; list-style-position: initial; list-style-type: none; min-height: 8pt; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;It is intended as a companion to Massimo's book, but it concentrates on how to program the Arduino.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; height: 8pt; list-style-image: initial; list-style-position: initial; list-style-type: none; min-height: 8pt; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;It is intended for non-programmers and programmers alike.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; height: 8pt; list-style-image: initial; list-style-position: initial; list-style-type: none; min-height: 8pt; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; height: 8pt; list-style-image: initial; list-style-position: initial; list-style-type: none; min-height: 8pt; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;The book is organized into the following chapters:&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chapter 1. This is Arduino. An introduction the Arduino hardware, what it is capable of and the various types of Arduino board that are available.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chapter 2. Getting Started. First experiments with your Arduino board, installing the software, powering it up and uploading your first sketch.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chapter 3. C Language Basics. The basics of the C language and for complete programming beginners an introduction to programming in general.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chapter 4. Functions. This chapter explains the key concept of using and writing functions in Arduino sketches. Demonstrated throughout with runnable code examples.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chapter 5. Arrays and Strings. How to make and use more advanced data structures than simple integer variables. A Morse Code example project is slowly developed to illustrate the concepts being explained.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chapter 6. Input and Output. How to use the digital and analog inputs and outputs on the Arduino in your programs. A multimeter will be useful to see what is happening on the Arduino’s input output connections.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chapter 7. The Standard Arduino Library. Making use of the Arduino functions that come in the Arduino’s standard library.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chapter 8. Data Storage. Writing sketches that can save data in EEPROM memory and make use of the Arduino’s built-in Flash memory.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chapter 9. LCD Displays. Programming with the LCD Shield library to make a simple USB message board example.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chapter 10. Arduino Ethernet Programming. Making the Arduino behave like a web server, including a little&amp;nbsp;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;background on HTML and the HTTP protocol.&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; background-attachment: initial; background-clip: initial; background-color: #eef4f9; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-collapse: collapse; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #333333; font-family: 'Lucida Grande', Arial, Helvetica, sans-serif; font-size: 12px; list-style-image: initial; list-style-position: initial; list-style-type: none; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Chapter 11. C++ and Libraries. Beyond C, looking at adding object-orientation and writing your own Arduino libraries.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-1067644367050145898?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/1067644367050145898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=1067644367050145898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/1067644367050145898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/1067644367050145898'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/11/new-book-programming-arduino-getting.html' title='New book: &apos;Programming Arduino: Getting Started with Sketches&apos;'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-TVZa3ktBqP0/TsZ_bWkS09I/AAAAAAAAAMA/rfnOI-8x69s/s72-c/cover2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-6438159992676406245</id><published>2011-11-17T10:28:00.000-08:00</published><updated>2011-11-17T10:28:07.464-08:00</updated><title type='text'>Handbag - Android and Arduino without the Java</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I saw a great &lt;a href="http://androidopen.com/android2011/public/schedule/detail/22509" target="_blank"&gt;presentation&lt;/a&gt; by Philip Lindsay on a technology that he had developed called '&lt;a href="http://www.labradoc.com/i/follower/p/android-arduino-handbag" target="_blank"&gt;Handbag&lt;/a&gt;' at the Android Open conference last month.&lt;br /&gt;&lt;br /&gt;Handbag is another way to write the code part of an Android Accessory. That is to link an Android phone that supports Open Accessory to an Arduino. The Arduino part might be an Arduino Uno with a USB Host shield, or a specialist board such as the Freetronics USBDroid board that I reviewed a few weeks ago (&lt;a href="http://srmonk.blogspot.com/2011/10/freetronics-usb-droid-review.html" target="_blank"&gt;http://srmonk.blogspot.com/2011/10/freetronics-usb-droid-review.html&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I decided to try out Handbag to control a couple of servos that raise little paper flags in a project I developed for my book 'Arduino + Android Projects for the Evil Genius'. In the book, the servos were attached to an Arduino / Ethernet shield combination. In this case, I decided to attach them to a USBDroid board, although an Uno and USB host shield would work just as well.&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/-nBu-IQRv9k4/TsUSTudv8hI/AAAAAAAAALY/l5hDmL740-A/s1600/F11-01.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-nBu-IQRv9k4/TsUSTudv8hI/AAAAAAAAALY/l5hDmL740-A/s320/F11-01.jpg" width="153" /&gt;&lt;/a&gt;&lt;/div&gt;Philip's stroke of genius was to realise that if the Arduino is acting as the host in the USB relationship (as it does) then it might as well be in charge of telling the Android phone what to do. In other words, there is zero&amp;nbsp;programming&amp;nbsp;to be done on the Android side, instead you put code in your Arduino script that tells a general purpose Android app what to display in its UI and to do when someone presses a button etc.&lt;br /&gt;&lt;br /&gt;I'll just say that again! &amp;nbsp;G&lt;b&gt;enius!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1. Downloading the Handbag App onto my Android Phone.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So, my first task was to fetch the general purpose Handbag app down for my Android phone.&lt;br /&gt;&lt;br /&gt;Its not on the Android Market, so I downloaded the APK binary from &lt;a href="http://rancidbacon.com/files/handbag/002/Handbag.apk" target="_blank"&gt;here&lt;/a&gt;. For your&amp;nbsp;convenience&amp;nbsp;here is a QR code for it.&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/-SvdwhoMi554/TsUlD2FcPyI/AAAAAAAAALg/ezSE8q4AymA/s1600/qr.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-SvdwhoMi554/TsUlD2FcPyI/AAAAAAAAALg/ezSE8q4AymA/s1600/qr.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Note that because this App is not from the Market, you have to allow your phone to download apps from 'Unknown Sources'. You will find this in Settings-&amp;gt;Applications.&lt;br /&gt;&lt;br /&gt;When the App starts, it should look like this.. Philip, I stole that image from your web site - hope thats okay.&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/-w7uY9l7-TIE/TsUqI7DUFbI/AAAAAAAAALo/Nxum7SZXYz8/s1600/rb_handbag_no_device.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-w7uY9l7-TIE/TsUqI7DUFbI/AAAAAAAAALo/Nxum7SZXYz8/s320/rb_handbag_no_device.jpg" width="195" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 2. Setup the Arduino Environment&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you haven't used the Android ADK, then you will need to install the necessary libraries onto your Arduino IDE. To do this, you just unzip the library files here into your libraries folder which will be in the Arduino folder in your documents folder, so on a Mac thats in ~/Documents/Arduino. If there isn't a 'libraries' folder there, make one.&lt;br /&gt;&lt;br /&gt;Then unzip &lt;a href="http://rancidbacon.com/files/handbag/002/handbag-arduino-library-20110613a.zip" target="_blank"&gt;this file&lt;/a&gt;&amp;nbsp;and copy its 'Handbag' folder into the libraries folder.&lt;br /&gt;&lt;br /&gt;You will also need to install the ADK library and a modified USB host library. These live in these two locations.&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-family: helvetica, arial, sans-serif; text-align: -webkit-auto;"&gt;&lt;li&gt;&lt;a href="http://developer.android.com/guide/topics/usb/adk.html#installing"&gt;http://developer.android.com/guide/topics/usb/adk.html#installing&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.circuitsathome.com/mcu/programming/android_adk_compatible_usb_host_library_release"&gt;http://www.circuitsathome.com/mcu/programming/android_adk_compatible_usb_host_library_release&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Note that if you are using a Uno and USB host shield or a USB Droid board then, when installing the ADK (first link) don't install the USB Host library that comes with the ADK download, use the one that come in the second link instead.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 3. Upload this minimal sketch to your Uno or USBDroid.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;You will also need to attach an LED and resistor to pin 4, as shown below.&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/-MUxjlRlrxZQ/TsU15SDmhbI/AAAAAAAAALw/vushzktR5Jc/s1600/led+test.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="383" src="http://2.bp.blogspot.com/-MUxjlRlrxZQ/TsU15SDmhbI/AAAAAAAAALw/vushzktR5Jc/s400/led+test.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Initially I tried to use 13 as the LED pin to make use of the built-in LED, but that seems to be reserved for use somewhere, so I had to resort to using an LED on pin 4.&lt;br /&gt;&lt;br /&gt;Anyway, here is the minimal sketch.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;Max3421e.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;Usb.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;AndroidAccessory.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include "Handbag.h"&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#define ledPin 4&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;AndroidAccessory acc("rancidbacon.com",&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp; "Handbag",&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp; "Handbag (Arduino Board)",&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp; "0.1",&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp; "http://rancidbacon.com",&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp; "0000000000000001");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;HandbagApp Handbag(acc);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void setupHandbagUI()&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Handbag.addLabel("Minimal Handbag Example");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Handbag.addButton("Toggle LED", toggleLED);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; pinMode(ledPin, OUTPUT);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Handbag.begin(setupHandbagUI);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Handbag.refresh(); &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void toggleLED()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; digitalWrite(ledPin, !digitalRead(ledPin));&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Lets just pause for a moment. We have 37 lines of code here. If you want to see the equivalent is writing it long hand in Android, you could add at least one zero to the lines of code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have a quick read through the code above. Its really very easy to see how to use Handbag.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, lets change my flags code to use Handbag.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is the wiring diagram, it shows an Ethernet Board, but its the same pin numbers as an Uno or USB Droid.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tdP7lS-kwF8/TsVRfIgjFVI/AAAAAAAAAL4/4di2NVZY_is/s1600/wiring.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-tdP7lS-kwF8/TsVRfIgjFVI/AAAAAAAAAL4/4di2NVZY_is/s400/wiring.png" width="358" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And here is the sketch:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;Servo.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;Max3421e.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;Usb.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;AndroidAccessory.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include "Handbag.h"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#define REQUEST_BUFFER_SIZE 700&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#define MIN_ANGLE 30&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#define MAX_ANGLE 175&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;// pins 10, 11, 12 and 13 used by Ethernet&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#define SERVO_1_PIN 2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#define SERVO_2_PIN 3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Servo servo1;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Servo servo2;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int servo1pos = MIN_ANGLE;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int servo2pos = MIN_ANGLE;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;AndroidAccessory acc("rancidbacon.com",&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp; "Handbag",&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp; "Handbag (Arduino Board)",&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp; "0.1",&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp; "http://rancidbacon.com",&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &amp;nbsp; &amp;nbsp; "0000000000000001");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;HandbagApp Handbag(acc);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void setupHandbagUI()&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Handbag.addLabel("Evil Genius Flags");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Handbag.addButton("Raise Flag 1", raiseFlag1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Handbag.addButton("Lower Flag 1", lowerFlag1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Handbag.addButton("Raise Flag 2", raiseFlag2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Handbag.addButton("Lower Flag 2", lowerFlag2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Handbag.begin(setupHandbagUI);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; servo1.attach(SERVO_1_PIN);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; servo2.attach(SERVO_2_PIN);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Handbag.refresh(); &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; servo1.write(servo1pos);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; servo2.write(servo2pos);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; delay(100);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void raiseFlag1()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; servo1pos = MAX_ANGLE;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void lowerFlag1()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; servo1pos = MIN_ANGLE;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void raiseFlag2()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; servo2pos = MAX_ANGLE;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void lowerFlag2()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; servo2pos = MIN_ANGLE;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And here is a short video of the flags in action. It all worked like a dream.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&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/rsUdAi7i_Xk/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rsUdAi7i_Xk?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/rsUdAi7i_Xk?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In short, Handbag is a wonderfully simple way to make Android accessories without having to learn large amounts about Java programming and the Android libraries.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-6438159992676406245?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/6438159992676406245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=6438159992676406245' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6438159992676406245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6438159992676406245'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/11/handbag-android-and-arduino-without.html' title='Handbag - Android and Arduino without the Java'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-nBu-IQRv9k4/TsUSTudv8hI/AAAAAAAAALY/l5hDmL740-A/s72-c/F11-01.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-8152866509366471013</id><published>2011-11-08T14:13:00.000-08:00</published><updated>2011-11-08T14:13:45.511-08:00</updated><title type='text'>Arduino LCD Shield Review</title><content type='html'>In this review I look at two 16x2 LCD modules at opposite ends of the price spectrum. Both have very similar display modules, both is size and visual clarity.&lt;br /&gt;&lt;br /&gt;Freetronics LCD and Keypad Shield AUD 29.95 (approx 31 USD)&lt;br /&gt;&lt;a href="http://www.freetronics.com/products/lcd-keypad-shield" target="_blank"&gt;http://www.freetronics.com/products/lcd-keypad-shield&lt;/a&gt;&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/-pNyS-muHObw/TrlLFZyK9ZI/AAAAAAAAAK8/i19OTe5AFn8/s1600/DSC_0004.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://4.bp.blogspot.com/-pNyS-muHObw/TrlLFZyK9ZI/AAAAAAAAAK8/i19OTe5AFn8/s400/DSC_0004.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;DFRobot LCD Shield 17 USD&lt;br /&gt;&lt;a href="http://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=51" target="_blank"&gt;http://www.dfrobot.com/index.php?route=product/product&amp;amp;product_id=51&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/-JBlnRJ6N4tg/TrlLFwuZ8tI/AAAAAAAAALE/ZWgku3w1QYA/s1600/DSC_0005.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://2.bp.blogspot.com/-JBlnRJ6N4tg/TrlLFwuZ8tI/AAAAAAAAALE/ZWgku3w1QYA/s400/DSC_0005.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;That is quite a difference in price spread, with the Freetronics device being almost twice the price of the DFRobot shield.&lt;br /&gt;&lt;br /&gt;However, the Freetronics shield is much better made and is well thought out. features that I particularly liked are:&lt;br /&gt;&lt;br /&gt;* Extra long headers mean it will fit onto an Ethernet Shield.&lt;br /&gt;* Pins used and init string for LCD are marked on the board itself.&lt;br /&gt;* Long stalk switches.&lt;br /&gt;* LCD Module firmly attached with nuts and bolts.&lt;br /&gt;&lt;br /&gt;My only dislikes are that the in the module I&amp;nbsp;received, the trim-pot used to adjust the contrast of the display was not included on the board. This could easily be added, and the 'default' contrast was okay, but I would have preferred this component to be included.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The DFRobot shield is very good value, but there are a few features that let it down.&lt;br /&gt;* Not compatible with Ethernet Shield&lt;br /&gt;* Reset button next to user definable buttons&lt;br /&gt;* LCD module just attached by solder connections on one side&lt;br /&gt;* Trim pot sticks up too high&lt;br /&gt;&lt;br /&gt;This first feature was a problem for me, because I bought it with the intention of attaching it to an Ethernet Shield to display my current book Amazon ranking (yes, I know, the&amp;nbsp;vanity&amp;nbsp;of the man!). No conflict in the main control pins, so fine I thought. Unfortunately, the DFRobot module uses&amp;nbsp;D10 for backlight which is used as SPI CS on Ethernet shield.&amp;nbsp;In addition, while the board fits snuggly on an Arduino Uno, the pins are to short to fit square on an Ethernet shield.&lt;br /&gt;&lt;br /&gt;The height of the trim-pot causes a problem because it sticks up to the same height as the LCD panel, so I think it would be difficult to mount it in a case with a cutout and bezel for the display.&lt;br /&gt;&lt;br /&gt;In conclusion, if you need a low cost display shield and you are not using an Ethernet&amp;nbsp;shield&amp;nbsp;or worried about fitting it in a box then buy the DFRobot shield, otherwise, go for the much better designed and built Freetronics shield.&lt;br /&gt;&lt;br /&gt;You will find many other LCD shields out there too, but when selecting one, be careful to check for pin&amp;nbsp;compatibility&amp;nbsp;with any other shields that you may be using.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;Disclosure: While I have tried to be completely unbiassed in this review, I do need to point out that the Freetronics module was provided to me free of charge from Freetronics.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-8152866509366471013?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/8152866509366471013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=8152866509366471013' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8152866509366471013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8152866509366471013'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/11/arduino-lcd-shield-review.html' title='Arduino LCD Shield Review'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-pNyS-muHObw/TrlLFZyK9ZI/AAAAAAAAAK8/i19OTe5AFn8/s72-c/DSC_0004.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-7494391358241273914</id><published>2011-11-06T13:58:00.000-08:00</published><updated>2011-11-06T13:58:54.386-08:00</updated><title type='text'>Canine Radio Direction Finder - Part 1</title><content type='html'>After our new dog ran off when we were out, I decided it might be fun to make a radio direction finder, so that we can at least see in which direction he is.&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/-sYTdCz7rVxs/Trb0mZedA2I/AAAAAAAAAKc/gJtPQM3kYNU/s1600/DSC_0032.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="313" src="http://4.bp.blogspot.com/-sYTdCz7rVxs/Trb0mZedA2I/AAAAAAAAAKc/gJtPQM3kYNU/s400/DSC_0032.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;So far, I have made the radio transmitter end of the project. In the second part of this blog I will look at the&amp;nbsp;receiver&amp;nbsp;and the directional antenna.&lt;br /&gt;&lt;br /&gt;The transmitter is built using a low cost 433MHz AM Radio Frequency transmitter module. This is the module that I used&amp;nbsp;&lt;a href="http://cpc.farnell.com/rf-solutions/qam-tx1/module-transmitter-am-433mhz/dp/RF00225" target="_blank"&gt;RF SOLUTIONS - QAM-TX1 - MODULE TRANSMITTER AM 433MHZ&lt;/a&gt;&amp;nbsp;but theses modules are pretty standard in their pinouts and features.&lt;br /&gt;&lt;br /&gt;To provide pulses to the RF transmitter, I use an ATTiny45 programmed using an Arduino board as described here:&amp;nbsp;&lt;a href="http://hlt.media.mit.edu/?p=1229" target="_blank"&gt;http://hlt.media.mit.edu/?p=1229&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/--XsXKyjLctA/Trb9Kbr0fhI/AAAAAAAAAKk/UIhNaZE_1hg/s1600/schematic.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/--XsXKyjLctA/Trb9Kbr0fhI/AAAAAAAAAKk/UIhNaZE_1hg/s400/schematic.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;The pulses are are a continuous series of 'Sputnik-style' beeps at a frequency of 300Hz.&lt;br /&gt;&lt;br /&gt;The 3.7V battery and tiny slide switch were&amp;nbsp;scavenged&amp;nbsp;from a broken RC helicopter and the antanna is made by wrapping 17cm of solid core wire around a screwdriver.&lt;br /&gt;&lt;br /&gt;To test out the transmitter, its corresponding 433MHz&amp;nbsp;receiver&amp;nbsp;module (&lt;a href="http://cpc.farnell.com/rf-solutions/qam-rx2/module-receiver-am-433mhz/dp/RF00228" target="_blank"&gt;RF SOLUTIONS - QAM-RX2 - MODULE RECEIVER AM 433MHZ&lt;/a&gt;) was fitted to some breadboard and an oscilloscope attached.&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/-AqLLQ-1ksOE/Trb0k71WGUI/AAAAAAAAAKU/tFVJe5E4rrU/s1600/DSC_0031.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-AqLLQ-1ksOE/Trb0k71WGUI/AAAAAAAAAKU/tFVJe5E4rrU/s320/DSC_0031.jpg" width="255" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&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/-dRidZmPGH9E/Trb_Il7HB1I/AAAAAAAAAKs/3m6CVucXfAY/s1600/scope1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://1.bp.blogspot.com/-dRidZmPGH9E/Trb_Il7HB1I/AAAAAAAAAKs/3m6CVucXfAY/s320/scope1.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://4.bp.blogspot.com/-MxCtw-jAWl4/Trb_Jn9PJiI/AAAAAAAAAK0/0Qxpm41k27U/s1600/scope2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://4.bp.blogspot.com/-MxCtw-jAWl4/Trb_Jn9PJiI/AAAAAAAAAK0/0Qxpm41k27U/s320/scope2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;So there we go! We are&amp;nbsp;receiving&amp;nbsp;the signal. The next step is to build a directional antenna with ajustable gain, so that by sweeping it back and forth we can find the point of maximum signal strength.&lt;br /&gt;&lt;br /&gt;The sketch:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int pin = 3;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; pinMode(pin, OUTPUT);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; beep();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; delay(500);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void beep()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; for (int i = 0; i &amp;lt; 100; i++)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(pin, HIGH);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; delayMicroseconds(200);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; digitalWrite(pin, LOW);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; delayMicroseconds(200);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-7494391358241273914?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/7494391358241273914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=7494391358241273914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7494391358241273914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7494391358241273914'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/11/canine-radio-direction-finder-part-1.html' title='Canine Radio Direction Finder - Part 1'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-sYTdCz7rVxs/Trb0mZedA2I/AAAAAAAAAKc/gJtPQM3kYNU/s72-c/DSC_0032.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-7964613123636780535</id><published>2011-11-02T14:53:00.000-07:00</published><updated>2011-11-02T14:53:14.233-07:00</updated><title type='text'>Copyright Theft - a good outcome</title><content type='html'>My book writing take me a lot of time, and while I do enjoy it, I probably wouldn't do it if it were not for the handy extra income it gives me.&lt;br /&gt;&lt;br /&gt;As such its distressing when a friend sends me an URL for a free download of one of my books. The whole thing as a PDF was there on a web site in full with a load of other hobby electronic books.&lt;br /&gt;&lt;br /&gt;I used 'whois' to find the ISP for the web site and wrote a polite letter like this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;i&gt;One of the companies you host (******.****) is hosting illegal electronic copies of books including my own book '30 Arduino Projects for the Evil Genius' at this address:&amp;nbsp;&lt;/i&gt;&lt;a href="http://lucifer.planet.ee/"&gt;&lt;span class="s1"&gt;&lt;i&gt;http://********.***/&lt;/i&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;i&gt;As a reputable ISP I am sure you do not want to be associated with copyright theft.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;i&gt;I would appreciate it if you could take action to stop this.&lt;/i&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;i&gt;Thanks, Simon.&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The sent back an immediate reply saying that they had contacted the host and asked them to take the books down.&lt;br /&gt;&lt;br /&gt;I went back to they site and yes the books had gone!&lt;br /&gt;&lt;br /&gt;I love it when things like that just work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-7964613123636780535?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/7964613123636780535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=7964613123636780535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7964613123636780535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7964613123636780535'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/11/copyright-theft-good-outcome.html' title='Copyright Theft - a good outcome'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-8603730622160372219</id><published>2011-10-28T11:54:00.000-07:00</published><updated>2011-10-28T12:00:18.821-07:00</updated><title type='text'>Freetronics USB Droid Review</title><content type='html'>5 Stars! The best thing to come out of Australia since Rolf Harris!&lt;br /&gt;&lt;br /&gt;I was given one of these boards at Android Open, and rather like the IOIO of my &lt;a href="http://srmonk.blogspot.com/2011/10/ioio-first-impressions.html"&gt;previous Blog&lt;/a&gt;, I have only just got around to having a play with it.&lt;br /&gt;&lt;br /&gt;It is intended as an alternative to the Android ADK reference board which is Arduino Mega-based and so probably overkill for most Android Accessories that you are likely to make. The USB Droid is far more practical in size.&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/-Y2DBYquOXzU/Tqr1bZDKdLI/AAAAAAAAAJc/9u-vvGlJ7jk/s1600/DSC_0001.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="277" src="http://4.bp.blogspot.com/-Y2DBYquOXzU/Tqr1bZDKdLI/AAAAAAAAAJc/9u-vvGlJ7jk/s400/DSC_0001.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It comes in a nice retail pack, with a Mini USB lead which is used to connect it to your computer rather than the 'normal' Arduino USB-B connector - good choice.&lt;br /&gt;&lt;br /&gt;And that is where the magic starts...&lt;br /&gt;&lt;br /&gt;The board is extremely well made, and well thought out. When I plugged the Mini USB into my computer I was surprised to see a green LED light along with the blue power LED.&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/-ZEAwMms6Nqw/Tqr1clAV01I/AAAAAAAAAJk/u0IWn5rPusA/s1600/DSC_0002.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://2.bp.blogspot.com/-ZEAwMms6Nqw/Tqr1clAV01I/AAAAAAAAAJk/u0IWn5rPusA/s400/DSC_0002.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The green LED is labelled VBUS and yes, the USB 5V is passed through from your computer and out of the USB-A connector to your phone. A really nice touch as you don't have to use an external power supply while you are developing.&lt;br /&gt;&lt;br /&gt;I am not sure Putting a Micro SD card on there is much use for making Android accessories, as effectively all the storage of the phone is available to you. But I guess you could make a data logger that worked off-line until you connected it to the Android phone to send the data to Pachube. Also it could come in handy for other types of USB host projects.&lt;br /&gt;&lt;br /&gt;I have a minimal Android Open Accessory test app that I describe in my Arduino + Android book. You can download it from &lt;a href="http://www.duinodroid.com/"&gt;here&lt;/a&gt;&amp;nbsp;(the app that is, not the book). There are also slides from my talk at Android Open &lt;a href="http://assets.en.oreilly.com/1/event/68/Building%20Android%20Accessories%20using%20the%20Open%20Accessory%20Development%20Kit%20and%20Arduino%20Presentation%201.pdf"&gt;here&lt;/a&gt; that describe the app. All it does is send a number to the Arduino that increments it and sends it back.&lt;br /&gt;&lt;br /&gt;The sketch installed and ran perfectly.&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/-bXOB8XkYFx8/Tqr1edal9HI/AAAAAAAAAJs/-WFNPZBNzIU/s1600/DSC_0003.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-bXOB8XkYFx8/Tqr1edal9HI/AAAAAAAAAJs/-WFNPZBNzIU/s400/DSC_0003.jpg" width="375" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I am very impressed with this board, &amp;nbsp;its certainly a lot neater than an Uno with a USB host shield on the top.&lt;br /&gt;&lt;br /&gt;I see that &lt;a href="http://www.freetronics.com/"&gt;Freetronics&lt;/a&gt; have done similar things with an Ethernet board. I look forward to trying out one of these.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-8603730622160372219?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/8603730622160372219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=8603730622160372219' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8603730622160372219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8603730622160372219'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/10/freetronics-usb-droid-review.html' title='Freetronics USB Droid Review'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Y2DBYquOXzU/Tqr1bZDKdLI/AAAAAAAAAJc/9u-vvGlJ7jk/s72-c/DSC_0001.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-6747474824686864973</id><published>2011-10-23T09:17:00.000-07:00</published><updated>2011-10-30T01:27:27.096-07:00</updated><title type='text'>IOIO First Impressions</title><content type='html'>I picked up a IOIO (apparently pronounced YoYo) from Android Open and I have just had chance to play with it.&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/-gjIcAnDIZ2g/TqQ6XWIypsI/AAAAAAAAAJU/0hhnAiXPy5g/s1600/ioio.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-gjIcAnDIZ2g/TqQ6XWIypsI/AAAAAAAAAJU/0hhnAiXPy5g/s400/ioio.jpg" width="288" /&gt;&lt;/a&gt;&lt;/div&gt;Unlike the Arduino, IOIO is not intended to operate independently. It has to be paired with an Android phone. While it can use the Android Open Accessory protocol, it can also use plain old ADB which means that it works on most phones rather than the smaller choice of phones that Open Accessory works on.&lt;br /&gt;&lt;br /&gt;I even tried an old Android 1.6 LG phone that one of my kids cast off six months ago and it works just fine.&lt;br /&gt;&lt;br /&gt;When creating a project, you do not change the firmware on the IOIO, but rather you issue commands that read values from pins and turn pins on and off from the Android app.&lt;br /&gt;&lt;br /&gt;It took 10 minutes to get the example working that turns the on-board LED on and off from a little Android app. Although I had Eclipse and the Android SDK already installed. These are probably the most complex part of setting up.&lt;br /&gt;&lt;br /&gt;IOIO sets out to do just one job and do it well. It is not a general purpose board like the Arduino, and for $50, it is just cheaper than an Arduino and USB host shield and smaller and neater.&lt;br /&gt;&lt;br /&gt;I like it a lot and it looks great. Far more IO ports than you are ever likely to use. In fact, I will probably solder 0.2 inch screw terminals onto the connectors and just use make every other IO available.&lt;br /&gt;&lt;br /&gt;Pros.&lt;br /&gt;Pot to adjust charging current to phone&lt;br /&gt;Nice looking board&lt;br /&gt;Good documentation set on the Wiki (https://github.com/ytai/ioio/wiki)&lt;br /&gt;&lt;br /&gt;Cons.&lt;br /&gt;Only 20mA output current per IO pin (Arduino can do 40mA)&lt;br /&gt;3.3V logic, but some pulls can cope with being pulled up to 5V&lt;br /&gt;No Power socket, you have to solder power leads on. This means that to do anything with the board, you will need to solder.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Edit: I forgot to mention that IOIOs with the latest firmware can accept a cheap Bluetooth dongle and work seamlessly over BT. Even switching connection without restart if you plug in with USB.&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-6747474824686864973?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/6747474824686864973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=6747474824686864973' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6747474824686864973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6747474824686864973'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/10/ioio-first-impressions.html' title='IOIO First Impressions'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-gjIcAnDIZ2g/TqQ6XWIypsI/AAAAAAAAAJU/0hhnAiXPy5g/s72-c/ioio.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-2586145051187285308</id><published>2011-10-13T09:01:00.000-07:00</published><updated>2011-10-13T09:01:03.907-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino android conference'/><category scheme='http://www.blogger.com/atom/ns#' term='android open'/><title type='text'>Android Open Conference 2011</title><content type='html'>Super conference.&lt;br /&gt;&lt;br /&gt;As well as the day job aspect of it promoting Meme IDE http://www.memeide.com I also got to present on my favourite hobby topic of Arduino&amp;nbsp;http://androidopen.com/android2011/public/schedule/detail/20972&lt;br /&gt;&lt;br /&gt;The talk went well and I was surprised how many people knew about Arduino. I met several people who I had exchanged messages with and it was good to put some faces to conversations. Someone even got me to sign a copy of my book that they had brought. For a moment there I felt like a real author!&lt;br /&gt;&lt;br /&gt;I was really impressed by Handbag (http://rancidbacon.com/p/android-arduino-handbag/). Its a great way to &amp;nbsp;solve the problem of the Android end of Open Accessory programming. I look forward to seeing how this project develops.&lt;br /&gt;&lt;br /&gt;Well the conference is over now and I am taking the rest of the week-off to enjoy San Francisco - which isn't hard!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-2586145051187285308?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/2586145051187285308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=2586145051187285308' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/2586145051187285308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/2586145051187285308'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/10/android-open-conference-2011.html' title='Android Open Conference 2011'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-3529820816841210037</id><published>2011-09-26T05:29:00.000-07:00</published><updated>2011-09-26T05:30:32.437-07:00</updated><title type='text'>Arduino + Android Projects for the Evil Genius</title><content type='html'>My new book 'Arduino + Android Projects for the Evil Genius' is now available for pre-order from Amazon. See the link to Amazon in the right-hand panel (scroll down a bit).&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/-wVc59Tx3LbM/ToBu5rpOVHI/AAAAAAAAAJI/Mb838HqoeSo/s1600/cover_big.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-wVc59Tx3LbM/ToBu5rpOVHI/AAAAAAAAAJI/Mb838HqoeSo/s640/cover_big.jpg" width="492" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The cover on Amazon hasn't been updated yet, so it looks a little different.&lt;br /&gt;&lt;br /&gt;The first books should be shipped around the start of December.&lt;br /&gt;&lt;br /&gt;The projects are:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt;"&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td style="border: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Chapter&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Project&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-left: none; border: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Notes&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Bluetooth Robot&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Control a small   rover from your Android Phone using Bluetooth and an Arduino and Motor   shield.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Android Geiger   Counter&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;An Android Open   Accessory Project using a USB host shield and Arduino Uno.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;3&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Android Light   Show&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;A powered Open   Accessory dock for your Android phone that drives three LED panels to make a   sound sensitive light show.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;4&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Android TV   Remote&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Programmable   Infrared remote control accessory for your Android phone.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;5&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Temperature   Logger&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;A temperature   logger that uses the Android phone to wirelessly send readings to Pachube.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;6&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Ultrasonic   Range Finder&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;An Android Open   Accessory for measuring distance.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;7&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Home Automation   Controller&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;The Android   tablet base unit with a audio jack interface to Arduino.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;8&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Home Automation   Power Control&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Add control of   AC outlets and lights to the Home Automation Controller from Chapter 7.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;9&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Home Automation   Thermostat&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Add control of   domestic heating to the Home Automation Controller using low cost RF data   modules.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;10&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Remote Door   Lock&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Control access   to your home using RFID tags, also with a RF link to the Home Automation   Controller&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;11&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Ethernet Flag&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Network control   of two flags that can be activated from any Internet device. Useful for the   Evil Genius to summon minions.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr&gt;   &lt;td style="border-top: none; border: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 59.4pt;" valign="top" width="59"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;12&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 138.0pt;" valign="top" width="138"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;Delay Timer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;   &lt;td style="border-bottom: solid windowtext .5pt; border-left: none; border-right: solid windowtext .5pt; border-top: none; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; width: 222.0pt;" valign="top" width="222"&gt;&lt;div class="MsoBodyText" style="text-indent: 0cm;"&gt;&lt;span lang="EN-US"&gt;A simple to   make Arduino-based delay timer.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-3529820816841210037?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/3529820816841210037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=3529820816841210037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3529820816841210037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3529820816841210037'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/09/arduino-android-projects-for-evil.html' title='Arduino + Android Projects for the Evil Genius'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-wVc59Tx3LbM/ToBu5rpOVHI/AAAAAAAAAJI/Mb838HqoeSo/s72-c/cover_big.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-8276108677094670207</id><published>2011-09-25T00:52:00.000-07:00</published><updated>2011-09-25T00:53:18.656-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='brakes'/><category scheme='http://www.blogger.com/atom/ns#' term='slotcar'/><category scheme='http://www.blogger.com/atom/ns#' term='led'/><category scheme='http://www.blogger.com/atom/ns#' term='slot car'/><title type='text'>Pimp Your Slot Car Racer</title><content type='html'>A while ago my son's school entered a competition where they made their own slot cars with vacuum formed plastic bodies. They were allowed to bring them home and 'pimp' them.&lt;br /&gt;&lt;br /&gt;So being British we decided to interpret 'pimping' rather conservatively and take it to mean adding headlights and working brake lights.&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/-sPhscQD4BjY/Tn7btk8KfCI/AAAAAAAAAI4/YGh_VmTPh4k/s1600/photo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://2.bp.blogspot.com/-sPhscQD4BjY/Tn7btk8KfCI/AAAAAAAAAI4/YGh_VmTPh4k/s320/photo.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here is the schematic:&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/-TPVC38SI7TU/Tn7b93aixKI/AAAAAAAAAI8/lCOQzBTXLMY/s1600/schematic.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://3.bp.blogspot.com/-TPVC38SI7TU/Tn7b93aixKI/AAAAAAAAAI8/lCOQzBTXLMY/s320/schematic.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;When there is power on the tracks, the headlights are always on, but the diode will&amp;nbsp;bypass the Brake LEDs and charge the capacitor.&amp;nbsp;When the controller is released and the supply voltage drops to zero or open circuit, then the current flows out of the capacitor lighting the brake LEDs discharging through the stationary motor for a couple of seconds.&lt;br /&gt;&lt;br /&gt;We didn't win the race competition, but actually I think the electronics was more fun anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-8276108677094670207?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/8276108677094670207/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=8276108677094670207' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8276108677094670207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8276108677094670207'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/09/pimp-your-slot-car-racer.html' title='Pimp Your Slot Car Racer'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-sPhscQD4BjY/Tn7btk8KfCI/AAAAAAAAAI4/YGh_VmTPh4k/s72-c/photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-6983604739028904297</id><published>2011-09-19T01:21:00.000-07:00</published><updated>2011-09-19T01:21:01.776-07:00</updated><title type='text'>Arduino Solar Radio</title><content type='html'>I have finished my Arduino Solar Radio.&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/-UxSWw_vBUrI/Tnb3h8DbF0I/AAAAAAAAAIY/lKKygF9nQSo/s1600/finished.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="425" src="http://3.bp.blogspot.com/-UxSWw_vBUrI/Tnb3h8DbF0I/AAAAAAAAAIY/lKKygF9nQSo/s640/finished.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;* Solar charging, via the panel on the back.&lt;br /&gt;* 12 position switch to select channel number&lt;br /&gt;* Seek up / seek down controls and 'store' button&lt;br /&gt;* RDS display of call sign&lt;br /&gt;* Frequency display&lt;br /&gt;* Battery voltage display&lt;br /&gt;* Solar charging current display&lt;br /&gt;&lt;br /&gt;The software still needs a bit of attention. Its fine if the signal is good and RDS comes in quickly, but if not, then adjusting the volume or changing channel takes a few seconds to kick in. As I only really listen to Radio 4, its not a problem, but I'll get round to updating it some time.&lt;br /&gt;&lt;br /&gt;Here are the circuit diagrams and the stripboard layout as will as a picture of the breaks in the back.&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/-K44gwDhzDzc/Tnb6g7mLZhI/AAAAAAAAAIg/XxC7EHqSG6U/s1600/cct.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/-K44gwDhzDzc/Tnb6g7mLZhI/AAAAAAAAAIg/XxC7EHqSG6U/s640/cct.jpg" width="596" /&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/-qd4OvNzQuS4/Tnb6kUid1EI/AAAAAAAAAIk/LZa4VYCbxOU/s1600/stripboard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="267" src="http://2.bp.blogspot.com/-qd4OvNzQuS4/Tnb6kUid1EI/AAAAAAAAAIk/LZa4VYCbxOU/s320/stripboard.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://3.bp.blogspot.com/-806hpzilJag/Tnb6nwVrHOI/AAAAAAAAAIo/8_QQopfOeVc/s1600/stripboard_back.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="269" src="http://3.bp.blogspot.com/-806hpzilJag/Tnb6nwVrHOI/AAAAAAAAAIo/8_QQopfOeVc/s320/stripboard_back.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&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/-XxBDr0IhgKA/Tnb6TnHSa8I/AAAAAAAAAIc/wqjibk_gneY/s1600/strip_design.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="492" src="http://4.bp.blogspot.com/-XxBDr0IhgKA/Tnb6TnHSa8I/AAAAAAAAAIc/wqjibk_gneY/s640/strip_design.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Also, here is the sketch. It uses the library I described in my previous post.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;EEPROM.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;LiquidCrystal.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;Si4703_Breakout.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;Wire.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int resetPin = 4;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int SDIO = A4;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int SCLK = A5;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int volumePin = A2;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int rotaryPin = A3;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int upSwitchPin = 5;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int downSwitchPin = 6;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int setSwitchPin = 7;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int lcdRSPin = 3;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int lcdEPin = 2;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Si4703_Breakout radio(resetPin, SDIO, SCLK);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;LiquidCrystal lcd(lcdRSPin, lcdEPin, 12, 11, 10, 9);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int channel[12];&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int currentChannel = 0;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int channelNumber = 3;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int volume = 1;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;long autoUpdatePeriod = 5000l;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;long lastUpdate;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; pinMode(upSwitchPin, INPUT);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; digitalWrite(upSwitchPin, HIGH);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; pinMode(downSwitchPin, INPUT);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; digitalWrite(downSwitchPin, HIGH);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; pinMode(setSwitchPin, INPUT);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; digitalWrite(setSwitchPin, HIGH);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; radio.powerOn();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; radio.setVolume(0);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.begin(16, 2);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.clear();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; readChannelsFromEEPROM();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; updateChannel();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; setVolume();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; displayRDS();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int newChannelNumber = 11 - (analogRead(rotaryPin) / 90);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (newChannelNumber != channelNumber)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; channelNumber = newChannelNumber;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; updateChannel();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; displayRDS();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int up = ! digitalRead(upSwitchPin);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int down = ! digitalRead(downSwitchPin);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int set = ! digitalRead(setSwitchPin);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (up)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; currentChannel = radio.seekUp();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; updateDisplay();&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (down)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; currentChannel = radio.seekDown();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; updateDisplay();&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (set)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; channel[channelNumber] = currentChannel;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; saveChannel(channelNumber, currentChannel);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; flashSet();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; displayRDS();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; setVolume();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (millis() &amp;gt; lastUpdate + autoUpdatePeriod)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; lastUpdate = millis();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; updateDisplay();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; displayRDS();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; delay(50);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void updateChannel()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; clearRDS();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; currentChannel = channel[channelNumber];&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; updateDisplay();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; radio.setChannel(currentChannel);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void setVolume()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; volume = (analogRead(volumePin) + 35) / 70;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; radio.setVolume(volume);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void updateDisplay()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.setCursor(0, 0);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if ((channelNumber + 1) &amp;lt; 10) lcd.print(" ");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(channelNumber + 1);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.setCursor(12, 0);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(currentChannel / 10); lcd.print("."); lcd.print(currentChannel % 10);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.setCursor(0, 1); lcd.print("Batt ");&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int v = getBatteryVolts(); &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(v / 10); lcd.print("."); lcd.print(v % 10); lcd.print("V");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int i = getChargeCurrent();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.setCursor(11, 1); lcd.print(" &amp;nbsp; &amp;nbsp; "); &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.setCursor(11, 1);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(i / 10); lcd.print("mA");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; char rdsBuffer[10];&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; getRDS(rdsBuffer);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.setCursor(3, 0);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(rdsBuffer);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void displayRDS()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; char rdsBuffer[10];&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; getRDS(rdsBuffer);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.setCursor(3, 0);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(rdsBuffer); &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void flashSet()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.setCursor(3, 0);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(" &amp;nbsp;SET &amp;nbsp; ");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; delay(500);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; clearRDS();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void clearRDS()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.setCursor(3, 0);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; lcd.print(" &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int getBatteryVolts()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // volts * 10&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // potential divider 33k:10k&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // Vcc 3.3V&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // Vin 10V, Vout = 2.326V, raw at 10V = 1023 * 2.326 / 3.3 = 721&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // V*10 = raw / 72&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int raw = analogRead(1);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; return raw / 7;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int getChargeCurrent()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; // current mA * 10&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int battVoltsTen = getBatteryVolts();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int solarVoltsTen = analogRead(0) / 7;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int mV = (solarVoltsTen - battVoltsTen) * 100;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; int mA10 = mV / 10;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (mA10 &amp;lt; 0)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; mA10 = 0;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; return mA10;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void getRDS(char* buffer)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; radio.readRDS(buffer, 2000);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void saveChannel(int i, int channel)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; byte high = highByte(channel);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; byte low = lowByte(channel);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; EEPROM.write(i * 2, high); &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; EEPROM.write(i * 2 + 1, low); &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void readChannelsFromEEPROM()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; for (int i = 0; i &amp;lt; 12; i++)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; byte high = EEPROM.read(i*2);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; byte low = EEPROM.read(i*2 + 1);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; int ch = high * 256 + low;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; if (ch &amp;gt; 700 &amp;amp;&amp;amp; ch &amp;lt; 1500)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; channel[i] = ch;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-6983604739028904297?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/6983604739028904297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=6983604739028904297' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6983604739028904297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6983604739028904297'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/09/arduino-solar-radio.html' title='Arduino Solar Radio'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-UxSWw_vBUrI/Tnb3h8DbF0I/AAAAAAAAAIY/lKKygF9nQSo/s72-c/finished.jpg' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-7073475046321630893</id><published>2011-09-16T05:19:00.000-07:00</published><updated>2011-09-16T11:09:33.608-07:00</updated><title type='text'>New Arduino Library for Sparkfun Si4703 FM Receiver Breakout Board</title><content type='html'>The&amp;nbsp;&lt;a href="http://www.sparkfun.com/products/10344"&gt;Sparkfun Si4703 FM Receiver Breakout Board&lt;/a&gt; is a great little FM radio, complete with RDS and a 100mW&amp;nbsp;stereo&amp;nbsp;amp.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://dlnmh9ip6v2uc.cloudfront.net/images/products/10344-01_i_ma.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://dlnmh9ip6v2uc.cloudfront.net/images/products/10344-01_i_ma.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;There is example code for using it and top marks to&amp;nbsp;Nathan Seidle from Sparkfun for working out how to use the pesky thing from the largely opaque datasheet for the receiver chip.&lt;br /&gt;&lt;br /&gt;I have been making myself the 'ultimate' FM&amp;nbsp;receiver. Arduino-based and using nice controls, solar-charging of battery with charging data and an LCD display for the RDS data. I will post on this when its finished.&lt;br /&gt;&lt;br /&gt;The software engineer in me railed at just hacking away at Nathan's example. So I put his code in a library and also fixed some of the problems with RDS and did a bit of tidying.&lt;br /&gt;&lt;br /&gt;You can download it from&amp;nbsp;&lt;a href="http://dl.dropbox.com/u/3993179/Si4703_Breakout.zip"&gt;here&lt;/a&gt;.&amp;nbsp;Continuing Nathan's licensing arrangement, I also offer it as 'Beer-ware'. If you are feeling extremely grateful then by all means buy one of my books (see right panel).&lt;br /&gt;&lt;br /&gt;Here is an example app, just connect up the three pins at the top of the sketch but remember Vcc for the breakout board is 3.3V NOT 5V. 5V will kill it:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;Si4703_Breakout.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include &amp;lt;Wire.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int resetPin = 2;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int SDIO = A4;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int SCLK = A5;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Si4703_Breakout radio(resetPin, SDIO, SCLK);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int channel;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;int volume;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;char rdsBuffer[10];&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.begin(9600);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println("\n\nSi4703_Breakout Test Sketch");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println("==========================="); &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println("a b &amp;nbsp; &amp;nbsp; Favourite stations");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println("+ - &amp;nbsp; &amp;nbsp; Volume (max 15)");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println("u d &amp;nbsp; &amp;nbsp; Seek up / down");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println("r &amp;nbsp; &amp;nbsp; &amp;nbsp; Listen for RDS Data (15 sec timeout)");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; Serial.println("Send me a command letter.");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; radio.powerOn();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; radio.setVolume(0);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; if (Serial.available())&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; char ch = Serial.read();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; if (ch == 'u')&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; channel = radio.seekUp();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; displayInfo();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; else if (ch == 'd')&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; channel = radio.seekDown();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; displayInfo();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; else if (ch == '+')&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; volume ++;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (volume == 16) volume = 15;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; radio.setVolume(volume);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; displayInfo();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; else if (ch == '-')&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; volume --;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (volume &amp;lt; 0) volume = 0;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; radio.setVolume(volume);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; displayInfo();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; else if (ch == 'a')&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; channel = 930; // Rock FM&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; radio.setChannel(channel);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; displayInfo();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; else if (ch == 'b')&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; channel = 974; // BBC R4&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; radio.setChannel(channel);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; displayInfo();&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; else if (ch == 'r')&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Serial.println("RDS listening");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; radio.readRDS(rdsBuffer, 15000);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Serial.print("RDS heard:");&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Serial.println(rdsBuffer); &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void displayInfo()&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;Serial.print("Channel:"); Serial.print(channel);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp;Serial.print(" Volume:"); Serial.println(volume);&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here is the public part of the class definition.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;class Si4703_Breakout&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; public:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; Si4703_Breakout(int resetPin, int sdioPin, int sclkPin);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; void powerOn();&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;     &lt;/span&gt;// call in setup&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;void setChannel(int channel); &amp;nbsp;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;// 3 digit channel number&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;int seekUp(); &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;     &lt;/span&gt;// returns the tuned channel or 0&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;int seekDown(); &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;void setVolume(int volume); &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;// 0 to 15&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;void readRDS(char* message, long timeout);&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;         &lt;/span&gt;// message should be at least 9 chars&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;         &lt;/span&gt;// result will be null terminated&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;         &lt;/span&gt;// timeout in milliseconds&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-hFTjaZDlA4c/TnOQ0tmvI5I/AAAAAAAAAHY/tbq1RNTfZhM/s1600/radio.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://2.bp.blogspot.com/-hFTjaZDlA4c/TnOQ0tmvI5I/AAAAAAAAAHY/tbq1RNTfZhM/s320/radio.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-7073475046321630893?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/7073475046321630893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=7073475046321630893' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7073475046321630893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7073475046321630893'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/09/sparkfun-si4703-fm-receiver-breakout.html' title='New Arduino Library for Sparkfun Si4703 FM Receiver Breakout Board'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-hFTjaZDlA4c/TnOQ0tmvI5I/AAAAAAAAAHY/tbq1RNTfZhM/s72-c/radio.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-7307018210949313053</id><published>2011-08-17T05:37:00.000-07:00</published><updated>2011-08-17T13:42:45.751-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arduino android conference'/><title type='text'>Android Open Conference</title><content type='html'>I shall be giving a presentation on the subject of: 'Building Android Accessories using the Open Accessory Development Kit and Arduino' at the Android Open Conference in October.&lt;br /&gt;&lt;br /&gt;The talk is a 40 minute session that describes how to use Open Accessory with standard Arduino hardware to create accessories for Android devices. Both the Arduino and the Android ends of the solution are explained in detail, with example code.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://androidopen.com/android2011/public/schedule/detail/20972"&gt;&lt;br /&gt;&lt;img alt="O'Reilly Android Open Conference 2011" border="0" height="60" src="http://assets.en.oreilly.com/1/event/68/android2011_speaking_210x60.png" width="210" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm also going to bring along a few examples of projects that I have made while doing the research for my next book 'Arduino + Android Projects for the Evil Genius' - see right.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Geiger Counter is my favourite:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-CZvxuBIYxN4/Tku0v4ifDhI/AAAAAAAAAGw/fPUbq-A13ZA/s1600/geiger+counter.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-CZvxuBIYxN4/Tku0v4ifDhI/AAAAAAAAAGw/fPUbq-A13ZA/s320/geiger+counter.jpg" width="236" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Ultrasonic Range Finder&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-VWVzNkVHfq8/Tku0zj1B2xI/AAAAAAAAAG4/044ervOCg4c/s1600/rangefinder.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="284" src="http://4.bp.blogspot.com/-VWVzNkVHfq8/Tku0zj1B2xI/AAAAAAAAAG4/044ervOCg4c/s320/rangefinder.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Bright LED panel light show - sound sensitive.&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/-oJ8TH4GoCdM/Tku0zJKSizI/AAAAAAAAAG0/4BJ3um2Aaus/s1600/lightshow.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://3.bp.blogspot.com/-oJ8TH4GoCdM/Tku0zJKSizI/AAAAAAAAAG0/4BJ3um2Aaus/s400/lightshow.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There may be a few awkward conversations with customs&amp;nbsp;officials!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It promises to be a really good event, so I hope to see you there.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-7307018210949313053?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/7307018210949313053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=7307018210949313053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7307018210949313053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7307018210949313053'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/08/open-android-conference.html' title='Android Open Conference'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-CZvxuBIYxN4/Tku0v4ifDhI/AAAAAAAAAGw/fPUbq-A13ZA/s72-c/geiger+counter.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-6209934473979893481</id><published>2011-08-02T12:31:00.000-07:00</published><updated>2011-08-02T12:31:00.710-07:00</updated><title type='text'>Hack a USB Computer Keyboard to Make a Synth Pedal Board</title><content type='html'>My son asked me if I could make a pedal board to connect to his laptop to use with his synth software, so that he can switch loops while performing -- or something musical like that.&lt;br /&gt;&lt;br /&gt;Fortunately for him he does not get his musical ability from his Dad.&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/-zPjj9_ztCdM/TjhHl7Bgq1I/AAAAAAAAAGE/tpck_1Qj4s4/s1600/finished.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="175" src="http://4.bp.blogspot.com/-zPjj9_ztCdM/TjhHl7Bgq1I/AAAAAAAAAGE/tpck_1Qj4s4/s320/finished.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;The brief was 10 big buttons to be pressed with his feet, while on stage. The buttons to be arranged in three groups of three and one button on the end, that he would map to mute on his software.&lt;br /&gt;&lt;br /&gt;You will need:&lt;br /&gt;* A USB keyboard that you do not mind destroying.&lt;br /&gt;* 10 stout push to make switches&lt;br /&gt;* 20 spade terminals (if thats the connection on your switches)&lt;br /&gt;* A 1KΩ resistor&lt;br /&gt;* A length of plastic ducting&lt;br /&gt;* Stripboard - for size see description below&lt;br /&gt;* Soldering tools and patience&lt;br /&gt;* Twin multicore wire - as for a door bell (when door bells used to have wires)&lt;br /&gt;&lt;br /&gt;Rather than try and do anything with an Arduino - which was my first throught - I decided to hack an old keyboard I had lying around:&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/-yK412Vk7zpU/TjhI0gyoToI/AAAAAAAAAGI/gc8Cfqli268/s1600/keyboard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="121" src="http://4.bp.blogspot.com/-yK412Vk7zpU/TjhI0gyoToI/AAAAAAAAAGI/gc8Cfqli268/s320/keyboard.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The only bit of the keyboard I kept was the USB controller module:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-q4N1LP144I0/TjhK24Eht8I/AAAAAAAAAGc/3sXi11jkirw/s1600/usb_module_bottom.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://4.bp.blogspot.com/-q4N1LP144I0/TjhK24Eht8I/AAAAAAAAAGc/3sXi11jkirw/s320/usb_module_bottom.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;The connectors at the top normally press against the conductive plastic of the keyboard connections and were coated with some kind of conductive polymer. So, to be able to solder them, I rubbed them with glass paper, to bring up the raw copper.&lt;br /&gt;&lt;br /&gt;There then followed the tedious problem of working out how to simulate the pressing of one of the keys '0' to '9'. The keys are arranged in a matrix, so connecting the right row to the right column would simulate a press. But, you do not want to accidentally connect one row to another, so rather than experiment with a wire to find out the combination that simulated a digit, I used a 1K resistor to test connecting two points together.&lt;br /&gt;&lt;br /&gt;To keep track of which combinations produced the desired results, I made up a matrix, assigning each contact a number.&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/-hs91ZUK9F1g/TjhK16zupOI/AAAAAAAAAGU/iNtY8Y_5ll0/s1600/pin_matrix.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://2.bp.blogspot.com/-hs91ZUK9F1g/TjhK16zupOI/AAAAAAAAAGU/iNtY8Y_5ll0/s320/pin_matrix.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;With the controller connected to my computer and a word processor open, every time I got a digit by connecting two of the connections with a resistor, I added it to the table. So, connecting the resistor between pins 22 and 17 caused the digit '1' to appear on the screen. [ignore the rogue 0 to the left].&lt;br /&gt;&lt;br /&gt;This is not actually as tedious as it sounds, you will rapidly home in on clusters of combinations that work.&lt;br /&gt;&lt;br /&gt;There is not enough room to solder the leads for the switches directly onto the connectors on the controller, so I found a bit of stripboard and carried the connections across.&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/-mPfGDusZ6BU/TjhK37YBpXI/AAAAAAAAAGk/2QAeImFfZz8/s1600/with_stripboard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://4.bp.blogspot.com/-mPfGDusZ6BU/TjhK37YBpXI/AAAAAAAAAGk/2QAeImFfZz8/s320/with_stripboard.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Using the matrix as a guide, I soldered up leads to the spade terminals and to the appropriate connections on the stripboard.&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/-pbQg8oEetYE/TjhK2cNWglI/AAAAAAAAAGY/VMpjwvmkjho/s1600/switches+attached.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="272" src="http://1.bp.blogspot.com/-pbQg8oEetYE/TjhK2cNWglI/AAAAAAAAAGY/VMpjwvmkjho/s320/switches+attached.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Loosely&amp;nbsp;attaching the switches, I tested them all before fitting them into the box.&lt;br /&gt;&lt;br /&gt;The box is made from a length of ventilation ducting with holes drilled for the switches.&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/-UNL-3dnA_qk/TjhK1pu8uXI/AAAAAAAAAGQ/kZz4QPiPlzk/s1600/case_drilled.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="84" src="http://3.bp.blogspot.com/-UNL-3dnA_qk/TjhK1pu8uXI/AAAAAAAAAGQ/kZz4QPiPlzk/s320/case_drilled.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;There now follows the tricky task of threading the wires through to the appropriate holes in the box. Labelling each pair of wires and using a stronger guide wire to pull the wires through helped with this.&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/-b2QxTEqsMWc/TjhK1FM3wnI/AAAAAAAAAGM/Wwp_5pmrd3o/s1600/boxed_buttons_out.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="159" src="http://4.bp.blogspot.com/-b2QxTEqsMWc/TjhK1FM3wnI/AAAAAAAAAGM/Wwp_5pmrd3o/s320/boxed_buttons_out.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;All that remains is to reattach the switches, test again and then push all the switches into the holes.&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/-zPjj9_ztCdM/TjhHl7Bgq1I/AAAAAAAAAGE/tpck_1Qj4s4/s1600/finished.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="175" src="http://4.bp.blogspot.com/-zPjj9_ztCdM/TjhHl7Bgq1I/AAAAAAAAAGE/tpck_1Qj4s4/s320/finished.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The tennis ball is just for scale.&lt;br /&gt;&lt;br /&gt;Have fun and post me pictures if you have a go for yourself. I'm always interested in ideas for version 2!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-6209934473979893481?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/6209934473979893481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=6209934473979893481' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6209934473979893481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6209934473979893481'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/08/hack-usb-computer-keyboard-to-make.html' title='Hack a USB Computer Keyboard to Make a Synth Pedal Board'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-zPjj9_ztCdM/TjhHl7Bgq1I/AAAAAAAAAGE/tpck_1Qj4s4/s72-c/finished.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-5927153701887822916</id><published>2011-06-18T04:16:00.000-07:00</published><updated>2011-07-05T14:42:00.174-07:00</updated><title type='text'>Android Open Accessory without charging the phone</title><content type='html'>I have been spending some time recently working on Android Open Accessory using an Uno and the Sparkfun USB host shield. I'm including a range of accessories, Geiger counter, ultrasonic distance meter etc. in my soon to be released (well Dec 2011) book&amp;nbsp;&lt;a href="http://www.amazon.com/gp/product/007177596X"&gt;Arduino + Android Projects for the Evil genius&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Although the feature that the accessory should provide half an amp at 5V to charge the phone is all very well for AC outlet powered accessories, it means battery powered accessories need a big battery.&lt;br /&gt;&lt;br /&gt;Or does it?&lt;br /&gt;&lt;br /&gt;I decided to do a bit of experimenting with a&amp;nbsp;surplus&amp;nbsp;USB extension lead that came with a USB modem dongle and just extends the USB lead a couple of inches.&lt;br /&gt;&lt;br /&gt;Firstly simply cutting the red 5V USB power lead. This stopped the accessory being recognised and the charge indicator on my Nexus One did not&amp;nbsp;indicate&amp;nbsp;any charging (no surprise there).&lt;br /&gt;&lt;br /&gt;If, however, I put a 1k resistor in line on the red 5V wire, everything works fine as an accessory, but the phone does not draw anything significant from the accessories battery, allowing it to be powered from a small 9V battery. At least it does if the phone is well charged.&lt;br /&gt;&lt;br /&gt;WARNING: This result was&amp;nbsp;derived&amp;nbsp;experimentally. This may well void your phone&amp;nbsp;warranty, if you connect it up like this. It didn't hurt my phone, but do it at your own risk. Also your wire may not use the same color coding as mine did, so red might be the wrong lead for you.&lt;br /&gt;&lt;br /&gt;The following sequence of photos shows the construction of the lead.&lt;br /&gt;&lt;br /&gt;Carefully cut away some of the outer plastic with a sharp knife on one side and tease out the shielded bundle of wires.&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/-unEhw1-svEU/TfyHZBZrK4I/AAAAAAAAAEk/zHiTzQ_iZ1g/s1600/usb_lead1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="115" src="http://4.bp.blogspot.com/-unEhw1-svEU/TfyHZBZrK4I/AAAAAAAAAEk/zHiTzQ_iZ1g/s320/usb_lead1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Scrape a gap between the shielding to get at the +5V wire.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-s8AA-IXN954/TfyHZmSZyVI/AAAAAAAAAEo/OI9NwefmTUQ/s1600/usb_lead2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="134" src="http://4.bp.blogspot.com/-s8AA-IXN954/TfyHZmSZyVI/AAAAAAAAAEo/OI9NwefmTUQ/s320/usb_lead2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Cut the red wire and strip and tin the ends.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Vpob9Np3EY0/TfyHaBUA1LI/AAAAAAAAAEs/XQZpsfdo3-s/s1600/usb_lead3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="146" src="http://1.bp.blogspot.com/-Vpob9Np3EY0/TfyHaBUA1LI/AAAAAAAAAEs/XQZpsfdo3-s/s320/usb_lead3.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Solder the 1k resistor into place. Then wrap it all up with insulating tape. Wrap the part behind the tape carefully, so that there is no chance of the bare leads from either side of the resistor making contact with the shielding wires or foil.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-8k4N4plJ4VE/TfyHaYuCn8I/AAAAAAAAAEw/HKYbYO-n8V0/s1600/usb_lead4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="153" src="http://3.bp.blogspot.com/-8k4N4plJ4VE/TfyHaYuCn8I/AAAAAAAAAEw/HKYbYO-n8V0/s320/usb_lead4.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-5927153701887822916?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/5927153701887822916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=5927153701887822916' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/5927153701887822916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/5927153701887822916'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/06/android-open-accessory-without-charging.html' title='Android Open Accessory without charging the phone'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-unEhw1-svEU/TfyHZBZrK4I/AAAAAAAAAEk/zHiTzQ_iZ1g/s72-c/usb_lead1.jpg' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-4512629658508827338</id><published>2011-06-03T03:58:00.000-07:00</published><updated>2011-06-03T03:58:36.529-07:00</updated><title type='text'>Trebuchet concerns</title><content type='html'>There have been some concerns that my son was hurt during the making of this trebuchet video from the new &lt;a href="http://www.dangerouslymad.com/"&gt;book&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I would like to reassure everyone that while he was struck, the projectile was a tennis ball, and while it did hit him squarely on the chest, there was a certain amount of acting involved ;)&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://2.gvt0.com/vi/FDKBp_wtIWo/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/FDKBp_wtIWo&amp;fs=1&amp;source=uds" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266" src="http://www.youtube.com/v/FDKBp_wtIWo&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-4512629658508827338?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/4512629658508827338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=4512629658508827338' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4512629658508827338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4512629658508827338'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/06/trebuchet-concerns.html' title='Trebuchet concerns'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-7874508851884937731</id><published>2011-05-10T06:09:00.000-07:00</published><updated>2011-05-10T06:09:00.092-07:00</updated><title type='text'>15 Dangerously Mad Projects for the Evil Genius</title><content type='html'>.. its finally for sale on &lt;a href="http://www.amazon.com/gp/product/0071755675/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&amp;amp;tag=ardui-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0071755675"&gt;Amazon.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I had a lot of fun writing this one. What is this instinctive urge to make weapons?&lt;br /&gt;&lt;br /&gt;The website for the book is &lt;a href="http://www.dangerouslymad.com/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-7874508851884937731?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/7874508851884937731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=7874508851884937731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7874508851884937731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7874508851884937731'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/05/15-dangerously-mad-projects-for-evil.html' title='15 Dangerously Mad Projects for the Evil Genius'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-6537698424589473236</id><published>2011-04-02T13:03:00.000-07:00</published><updated>2011-04-02T13:03:19.296-07:00</updated><title type='text'>Westinghouse Dynamotor</title><content type='html'>As well as the Radio (as it turns out) from the previous post to this, my brother and I also uncovered a Westinghouse Dynamotor.&lt;br /&gt;&lt;br /&gt;This wonderful contraption is a low voltage DC motor coupled to a high voltage DC generator. These things were used in WW2 and may well have found its way back from the war with my Dad, along with assorted bits of mine, which I remember being used as door stops around the house. He was in the Royal Navy on a motor launch - mine sweeper in the Adriatic for most of the war.&lt;br /&gt;&lt;br /&gt;My brother remembers my Dad taking this on camping holidays so that he could use his electric shaver.&lt;br /&gt;&lt;br /&gt;So, why not I thought, lets fire it up! And it still works well and here is the video evidence to prove it.&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/rs8_appzFg0/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rs8_appzFg0?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266" src="http://www.youtube.com/v/rs8_appzFg0?f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-6537698424589473236?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/6537698424589473236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=6537698424589473236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6537698424589473236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6537698424589473236'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/04/westinghouse-dynamotor.html' title='Westinghouse Dynamotor'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-463772589748420210</id><published>2011-03-31T02:17:00.000-07:00</published><updated>2011-03-31T02:17:04.288-07:00</updated><title type='text'>Surgery - similarities with programming?</title><content type='html'>Over the years, people have tried to label the people who write software professionally as:&lt;br /&gt;* Engineers&lt;br /&gt;* Programmers&lt;br /&gt;* Analyst / Programmers&lt;br /&gt;* Software Engineers&lt;br /&gt;* Hackers&lt;br /&gt;&lt;br /&gt;One of the many excellent ideas that came with eXtreme Programming is that writing code does not really have a neat metaphor in other walks of life. Its a creative process, part craft, part engineering is fairly close.&lt;br /&gt;&lt;br /&gt;Having listened to a program on BBC Radio 4 about how surgeons work and learn, it stuck me that there are some similarities with the way a writer of code works and learns within a modern agile process.&lt;br /&gt;&lt;br /&gt;Surgeons save lives and loose lives on a daily basis. There work is clearly far more important than that of someone writing some code, but the similarities are there.&lt;br /&gt;&lt;br /&gt;* Surgeons tend to be arrogant - there are good reasons for this, and it is not as bad a thing as it may sound.&amp;nbsp;This is because they must quickly decide on the best course of action for a patient. Most writers of code will quickly form an opinion of the best way to go about something and get on with it.&lt;br /&gt;&lt;br /&gt;* Surgeons start with 'standard' training. Their medical degree and then learn on the job, from each other and by honing their technique, trying out variations. Ditto coders. After the usual degree in Computer Science, most learning codes from the rest of the team and for experimentation.&lt;br /&gt;&lt;br /&gt;* They mostly share their knowledge in an informal manner when cooperating, but also disseminate more widely in journals, but usually in a qualitative rather than quantitate way. Surgeons by and large are not overly keen on controlled clinical trials. This is a bit like coders in an agile team avoiding to much up front design, doing just enough to clarify thought, share the vision and get on with it.&lt;br /&gt;&lt;br /&gt;Writing this down, it doesn't sound as good as it did in my head when I was listening to the program. It may be as simple as they are both jobs that have a high degree of pragmatism and a distrust of organisational culture.&lt;br /&gt;&lt;br /&gt;Oh well, I'll throw it out there anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-463772589748420210?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/463772589748420210/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=463772589748420210' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/463772589748420210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/463772589748420210'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/03/surgery-similarities-with-programming.html' title='Surgery - similarities with programming?'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-4399841617242814316</id><published>2011-03-29T05:38:00.000-07:00</published><updated>2011-03-29T05:38:40.444-07:00</updated><title type='text'>Mystery solved</title><content type='html'>The Philips museum came up trumps:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;the apparatus is an old radio receiver without loudspeaker.&lt;/blockquote&gt;&lt;blockquote&gt;Probably the type number is Philips 2501, Philips 2502, Philips 2514 or Philips 2515 produced in 1927/1928.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I asked if they wanted it for their collection, but they already have several.&lt;br /&gt;&lt;br /&gt;Anyone interested in it as a restoration project,? Its yours for the cost of postage. It currently resides in York - England.&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/-ZUSDM0Vntx0/TZHSKf2CRNI/AAAAAAAAAEU/nPHhjNvPfl4/s1600/IMG_1846_2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://1.bp.blogspot.com/-ZUSDM0Vntx0/TZHSKf2CRNI/AAAAAAAAAEU/nPHhjNvPfl4/s400/IMG_1846_2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-4399841617242814316?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/4399841617242814316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=4399841617242814316' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4399841617242814316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4399841617242814316'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/03/mystery-solved.html' title='Mystery solved'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ZUSDM0Vntx0/TZHSKf2CRNI/AAAAAAAAAEU/nPHhjNvPfl4/s72-c/IMG_1846_2.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-3143254205858820132</id><published>2011-03-28T02:26:00.000-07:00</published><updated>2011-03-28T02:26:17.359-07:00</updated><title type='text'>What on earth is this?</title><content type='html'>Over the weekend, I helped my brother clear out his loft, because they are moving home. In it, we found this ancient bit of valve equipment, which we have totally failed to be able to identify.&lt;br /&gt;&lt;br /&gt;Any ideas?&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/-WUW0smkHGLU/TZBSIHV0EaI/AAAAAAAAAD0/kcmrJ_YCd8w/s1600/IMG_0116.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-WUW0smkHGLU/TZBSIHV0EaI/AAAAAAAAAD0/kcmrJ_YCd8w/s320/IMG_0116.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Its heavy and a peek behind the back board looks like some seriously big tubes, but interestingly very little in the way of ventilation.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The big control in the middle is a 3 position switch labelled 200/400, 300/600, 1000/2000&lt;/div&gt;&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/-Ck1aQk_Rpdc/TZBSMplY4DI/AAAAAAAAAEA/Jai_rcv1100/s1600/IMG_0119.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-Ck1aQk_Rpdc/TZBSMplY4DI/AAAAAAAAAEA/Jai_rcv1100/s320/IMG_0119.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Its made by Phillips - and both ends are the same, each with a big knob and a small knob.&amp;nbsp;&lt;/div&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/-4EWRRvqZev4/TZBSSQJ4BqI/AAAAAAAAAEM/oKJYW13plHM/s1600/IMG_0122.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-4EWRRvqZev4/TZBSSQJ4BqI/AAAAAAAAAEM/oKJYW13plHM/s320/IMG_0122.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;One big knob changes the dial setting labelled 'S' and the other the dial labelled 'P'&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-uVOccrQyfDs/TZBSOfp2lMI/AAAAAAAAAEE/_fJD81L-F1A/s1600/IMG_0120.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-uVOccrQyfDs/TZBSOfp2lMI/AAAAAAAAAEE/_fJD81L-F1A/s320/IMG_0120.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Its very very odd.&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/-jdONWQyeNtk/TZBSUCCBasI/AAAAAAAAAEQ/2ywzZpeKzVI/s1600/IMG_0123.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-jdONWQyeNtk/TZBSUCCBasI/AAAAAAAAAEQ/2ywzZpeKzVI/s320/IMG_0123.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Any help identifying this would be much appreciated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-3143254205858820132?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/3143254205858820132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=3143254205858820132' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3143254205858820132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3143254205858820132'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/03/what-on-earth-is-this.html' title='What on earth is this?'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-WUW0smkHGLU/TZBSIHV0EaI/AAAAAAAAAD0/kcmrJ_YCd8w/s72-c/IMG_0116.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-7082330115390335449</id><published>2011-01-24T10:16:00.001-08:00</published><updated>2011-01-24T10:16:37.604-08:00</updated><title type='text'>New web site</title><content type='html'>There is a new website for '30 Arduino Projects for the Evil Genius'.&lt;br /&gt;&lt;br /&gt;http://www.arduinoevilgenius.com&lt;br /&gt;&lt;br /&gt;Google sites is excellent!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-7082330115390335449?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/7082330115390335449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=7082330115390335449' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7082330115390335449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7082330115390335449'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/01/new-web-site.html' title='New web site'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-4378947406784117806</id><published>2011-01-23T12:52:00.000-08:00</published><updated>2011-01-23T12:52:54.840-08:00</updated><title type='text'>Make Your Own PCBs</title><content type='html'>I wrote this a while back and thought it might be of interest...&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px;"&gt;Creating your own printed circuit boards is not as difficult or expensive as you might think. In this article, I describe how you can use pre-sensitised boards and a home made light box to create your own boards.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica; font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://dl.dropbox.com/u/3993179/pcbs.pdf"&gt;http://dl.dropbox.com/u/3993179/pcbs.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-4378947406784117806?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/4378947406784117806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=4378947406784117806' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4378947406784117806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4378947406784117806'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2011/01/make-your-own-pcbs.html' title='Make Your Own PCBs'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-4014389168281943873</id><published>2010-12-29T03:54:00.000-08:00</published><updated>2010-12-29T03:54:02.720-08:00</updated><title type='text'>Broken banking site</title><content type='html'>Humm. This scares me.&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/_mcUPc534hb8/TRshPGAns6I/AAAAAAAAADk/mpbeREfCpK0/s1600/microsoft+fail.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://4.bp.blogspot.com/_mcUPc534hb8/TRshPGAns6I/AAAAAAAAADk/mpbeREfCpK0/s320/microsoft+fail.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-4014389168281943873?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/4014389168281943873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=4014389168281943873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4014389168281943873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/4014389168281943873'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/12/broken-banking-site.html' title='Broken banking site'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mcUPc534hb8/TRshPGAns6I/AAAAAAAAADk/mpbeREfCpK0/s72-c/microsoft+fail.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-777283097812834236</id><published>2010-12-02T14:31:00.000-08:00</published><updated>2010-12-02T14:31:36.902-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grammar fewer less'/><title type='text'>A better quality of grammer</title><content type='html'>Most supermarkets in the UK have special checkouts for '10 items of less'.&lt;br /&gt;&lt;br /&gt;I recently went to Booths, a higher quality supermarket and was very please to see that the quality of the food was not the only thing that was better. Their grammar was better too.&lt;br /&gt;&lt;br /&gt;Their equivalent said '10 items or fewer'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-777283097812834236?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/777283097812834236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=777283097812834236' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/777283097812834236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/777283097812834236'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/12/better-quality-of-grammer.html' title='A better quality of grammer'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-5309971735441523214</id><published>2010-11-16T23:54:00.000-08:00</published><updated>2010-11-16T23:54:53.351-08:00</updated><title type='text'>2 MOSFETS and split power to drive motors</title><content type='html'>I am working on a robot project and started down the design of an H-bridge. After I had counted up that I would need 4 MOSFETS plus 4 bipolar transistors, I decided there must be an easier way.&lt;br /&gt;&lt;br /&gt;I know there are chips for this, but I feel like thats cheating.&lt;br /&gt;&lt;br /&gt;So I decided that I could more than halve what I needed if I took a centre-tap on the batteries to split the power supply.&lt;br /&gt;&lt;br /&gt;It works well.&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/_mcUPc534hb8/TOOJVd7V-2I/AAAAAAAAADU/ykPBqJGRMCk/s1600/F15-03.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_mcUPc534hb8/TOOJVd7V-2I/AAAAAAAAADU/ykPBqJGRMCk/s320/F15-03.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A-GND, B-GND - motor off&lt;br /&gt;A-5V, B-GND - motor turns one way&lt;br /&gt;A-GND, B-5V - motor turns the other way&lt;br /&gt;A-5V, B-5V - HEAT SMOKE AND DEAD TRANSISTORS&lt;br /&gt;&lt;br /&gt;I haven't tried it, but it should work fine with PWM outputs too. As long as your PWM off is really 0% duty cycle!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-5309971735441523214?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/5309971735441523214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=5309971735441523214' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/5309971735441523214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/5309971735441523214'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/11/2-mosfets-and-split-power-to-drive.html' title='2 MOSFETS and split power to drive motors'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mcUPc534hb8/TOOJVd7V-2I/AAAAAAAAADU/ykPBqJGRMCk/s72-c/F15-03.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-8017925208908525457</id><published>2010-11-05T03:08:00.000-07:00</published><updated>2010-11-05T03:08:02.909-07:00</updated><title type='text'>Errata page on Arduino book web site</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Helvetica;"&gt;I have added a page to http://www.arduinoevilgenius.com for Errata.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica;"&gt;I would be grateful if people would pass on any other errors they find to me directly at simon@arduinoevilgenius.com&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-8017925208908525457?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/8017925208908525457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=8017925208908525457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8017925208908525457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8017925208908525457'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/11/errata-page-on-arduino-book-web-site.html' title='Errata page on Arduino book web site'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-1947040659149927590</id><published>2010-10-21T14:42:00.000-07:00</published><updated>2010-10-21T14:42:33.795-07:00</updated><title type='text'>Amateur's and Open Source</title><content type='html'>There was an interesting programme of BBC Radio 4 yesterday. 'The Long View' that looked amongst other things at the Amateur movement. The idea of which was that sport should be carried out for the love of it and not the money. Prior to its invention by the Victorians, sports such as boxing were highly commercial.&lt;br /&gt;&lt;br /&gt;The amateur movement has largely reverted to commercialism these days and I guess the experiment and the ideals have faded. It was founded with the best of intentions, but was always something of a sham.&lt;br /&gt;&lt;br /&gt;It struck me that there are interesting parallels with the open source movement. Originally, it was founded with the best of intentions and great things were created by amateurs. These days, the big boys have taken over projects like MySQL and everything seems to me to be becoming more and more commercial.&lt;br /&gt;&lt;br /&gt;Will open source eventually go the way of amateur sport?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-1947040659149927590?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/1947040659149927590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=1947040659149927590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/1947040659149927590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/1947040659149927590'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/10/amateurs-and-open-source.html' title='Amateur&apos;s and Open Source'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-8365909999328702386</id><published>2010-10-11T05:32:00.000-07:00</published><updated>2010-10-11T05:32:55.203-07:00</updated><title type='text'>Even busses suffer from 500 errors</title><content type='html'>The other day, I was following a bus that had broken down and was being towed back to be repaired. Interestingly the big matrix sign on the back of the bus said 500.&lt;br /&gt;&lt;br /&gt;It seems even busses suffer from Error 500 HTTP response codes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-8365909999328702386?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/8365909999328702386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=8365909999328702386' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8365909999328702386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/8365909999328702386'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/10/even-busses-suffer-from-500-errors.html' title='Even busses suffer from 500 errors'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-7756150836431853810</id><published>2010-09-20T13:43:00.000-07:00</published><updated>2010-09-20T13:43:30.767-07:00</updated><title type='text'>Book available in the UK</title><content type='html'>'30 Arduino Projects for the Evil Genius' is now available in the UK!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.arduinoevilgenius.com/"&gt;http://www.arduinoevilgenius.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-7756150836431853810?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/7756150836431853810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=7756150836431853810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7756150836431853810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7756150836431853810'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/09/book-available-in-uk.html' title='Book available in the UK'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-330822114576463186</id><published>2010-08-15T02:18:00.000-07:00</published><updated>2010-08-15T02:52:57.540-07:00</updated><title type='text'>My Arduino book is for sale on Amazon</title><content type='html'>On arriving back from holiday (Italy) I was very pleasantly surprised to find '30 Arduino Projects for the Evil Genius' availabe on Amazon. So please go and buy it and write some great customer reviews.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/30-Arduino-Projects-Evil-Genius/dp/007174133X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1281863328&amp;amp;sr=8-1"&gt;http://www.amazon.com/30-Arduino-Projects-Evil-Genius/dp/007174133X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1281863328&amp;amp;sr=8-1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are also more details, youTube videos of some of the projects and the like at &lt;a href="http://www.arduinoevilgenius.com/"&gt;www.arduinoevilgenius.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-330822114576463186?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/330822114576463186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=330822114576463186' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/330822114576463186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/330822114576463186'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/08/my-arduino-book-is-for-sale-on-amazon.html' title='My Arduino book is for sale on Amazon'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-5635103783009080448</id><published>2010-07-01T05:22:00.000-07:00</published><updated>2010-07-01T05:23:05.401-07:00</updated><title type='text'>Embedded Software Crashes</title><content type='html'>Warning, this post is a bit childish and demonstrates a certain operating system prejudice that I harbour.&lt;br /&gt;&lt;br /&gt;I have a compulsion to photograph ATMs and other embedded software systems, where the software has crashed. Its about the only time you get to see what the underlying operating system is.&lt;br /&gt;&lt;br /&gt;Obviously for ultimate reliability you would use some kind of embedded operating system?&lt;br /&gt;&lt;br /&gt;Perhaps not judging by these photos I have collected over the last couple of years.&lt;br /&gt;&lt;br /&gt;I can't quite place that dialog style, but it does look kind of familiar. Interestingly all the writing would lead me to think that actually, it was responding fairly well.&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/_mcUPc534hb8/TCyECVfOgKI/AAAAAAAAACM/CoGTUhhe8-s/s1600/DSC00167.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://2.bp.blogspot.com/_mcUPc534hb8/TCyECVfOgKI/AAAAAAAAACM/CoGTUhhe8-s/s400/DSC00167.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;PLEASE TAKE YOUR CRASH FROM THE SLOT BELOW.&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/_mcUPc534hb8/TCyEFduXMxI/AAAAAAAAACU/mDQPulVL9Q8/s1600/DSC00169.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://3.bp.blogspot.com/_mcUPc534hb8/TCyEFduXMxI/AAAAAAAAACU/mDQPulVL9Q8/s400/DSC00169.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;'Unexpected rebooting in the self-sevice area.'&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/_mcUPc534hb8/TCyEH0nIZMI/AAAAAAAAACc/ZgtSk8iQVwc/s1600/IMG_0069.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/_mcUPc534hb8/TCyEH0nIZMI/AAAAAAAAACc/ZgtSk8iQVwc/s640/IMG_0069.jpg" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;HEY EVERYONE ! I'VE CRASHED AGAIN !&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_mcUPc534hb8/TCyEKBvRaSI/AAAAAAAAACk/AuFiYa9C588/s1600/IMG_0085.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/_mcUPc534hb8/TCyEKBvRaSI/AAAAAAAAACk/AuFiYa9C588/s400/IMG_0085.jpg" width="400" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-5635103783009080448?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/5635103783009080448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=5635103783009080448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/5635103783009080448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/5635103783009080448'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/07/embedded-software-crashes.html' title='Embedded Software Crashes'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_mcUPc534hb8/TCyECVfOgKI/AAAAAAAAACM/CoGTUhhe8-s/s72-c/DSC00167.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-7156090725004096304</id><published>2010-06-18T00:57:00.000-07:00</published><updated>2010-06-18T14:57:44.201-07:00</updated><title type='text'>Elderflower Cordial, Citric Acid, Crack and Sherbert</title><content type='html'>Its the Elderflower season, and a family tradition is that I make a batch of cordial from the flowers. See last years post on this for the recipe.&lt;br /&gt;&lt;br /&gt;But this year, it nearly didn't happen through difficulty in obtaining the essential ingredient of citric acid. It has long been the case that in England, you buy citric acid from a chemist shop (drug store). But this year the first two shops I tried said that they didn't have any and looked at me as if I was asking for heroin.&lt;br /&gt;&lt;br /&gt;Finally at the third shop, the assistant said they were only allowed to keep three packets in stock, but they had sold out and would be getting some more the next day. The next day I went back and sure enough, they were willing to sell me two packets. But she actually held them up for the pharmacists permission before she would sell them to me, in the same way as if you are buying pain killers.&lt;br /&gt;&lt;br /&gt;Surprised, I asked why there was all this fuss over a harmless home cooking ingredient and the reply was that apparently people use it to make crack cocaine injectable rather than smokeable and furthermore they were under instructions to notify the police if anyone tried to buy a lot.&lt;br /&gt;&lt;br /&gt;So, if you go into a chemist shop and ask for citric acid and they look at you as if you were a drug addict, then thats because they think you are a drug addict.&lt;br /&gt;&lt;br /&gt;Ho, hum what a complicated world we live in.&lt;br /&gt;&lt;br /&gt;Incidentally, a GOOD thing to mix citric acid with is sugar, just put a tiny bit in with some sugar to make your own Sherbert. Yummy, and a bit addictive, but in a harmless way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-7156090725004096304?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/7156090725004096304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=7156090725004096304' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7156090725004096304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/7156090725004096304'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/06/elderflower-cordia-citric-acid-crack.html' title='Elderflower Cordial, Citric Acid, Crack and Sherbert'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-678307854448849957</id><published>2010-05-28T07:38:00.000-07:00</published><updated>2010-05-28T07:38:15.477-07:00</updated><title type='text'>Google IO 2010 Some Observations</title><content type='html'>This was a well staged event, with good honest technical presentations of the type you would expect from Google. I went there primarily in the hope of finding other people considering Android for the field service type applications that are &lt;a href="http://www.momote.com/"&gt;Momote's&lt;/a&gt; bread and butter. This to help inform our current work of extending the MX Platform to include Android. In that respect I failed because the Android developers that I met were all concerned either with developing games, quirky utilities or mobile extensions to existing web apps.&lt;br /&gt;&lt;br /&gt;On the other hand, I did learn quite a lot to improve my amateurish experiments in Android development. As well as some important dos and donts for efficient and responsive applications. I discovered that my approach to the relationship between fetching data and presenting it was rather out of date.&lt;br /&gt;&lt;br /&gt;Let me explain. Momote's MX Platform for mobile solutions distinguishes between resilient requests (fetching data from web services on a separate thread) and blocking requests. The distinction for us was that, if you were signing in you would block and wait, but when sending status updates, you would just push them off onto the 'resiliency queue'. Fetching bulk data could happen in the background, but you would not try and display it until you had got it all back.&lt;br /&gt;&lt;br /&gt;This could lead to the situation where you arrive at a sync point in the application and get nothing but an hour glass until data has finished loading or times out. Users often interpret as 'its crashed' and soft reset the device.&lt;br /&gt;&lt;br /&gt;The better approach and something that is very iPhone / Android is to just render the list and let the data start to appear as it becomes available. That way the user has a much finer level of granularity visible to them. So no more having to trust the 'something is happening, be patient message'.&lt;br /&gt;&lt;br /&gt;Stepping back a level, its good to see Apple being given a bit of competition, although I have to say that there were a lot of iPhones and iPads in use by the delegates.&lt;br /&gt;&lt;br /&gt;So, come on manufacturers, where's my g-pad!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-678307854448849957?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/678307854448849957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=678307854448849957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/678307854448849957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/678307854448849957'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/05/google-io-2010-some-observations.html' title='Google IO 2010 Some Observations'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-888761590162405835</id><published>2010-05-28T06:58:00.000-07:00</published><updated>2010-05-28T06:58:06.514-07:00</updated><title type='text'>Maker's Faire, San mateo 2010</title><content type='html'>A business trip to Google IO also gave me the chance to go to the &lt;a href="http://www.makerfaire.com/"&gt;Maker Faire&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I particularly liked this:&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/_mcUPc534hb8/S__KR9ed_PI/AAAAAAAAAB0/ysP2Rcw6LXg/s1600/DSC_0089.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="425" src="http://2.bp.blogspot.com/_mcUPc534hb8/S__KR9ed_PI/AAAAAAAAAB0/ysP2Rcw6LXg/s640/DSC_0089.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;and this:&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/_mcUPc534hb8/S__KjVJZbcI/AAAAAAAAAB8/L4p8iG944GM/s1600/DSC_0104.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="426" src="http://4.bp.blogspot.com/_mcUPc534hb8/S__KjVJZbcI/AAAAAAAAAB8/L4p8iG944GM/s640/DSC_0104.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;and these - there was a whole group of R2D2 makers:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_mcUPc534hb8/S__K614b64I/AAAAAAAAACE/LC16D3uwvH4/s1600/DSC_0098.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://4.bp.blogspot.com/_mcUPc534hb8/S__K614b64I/AAAAAAAAACE/LC16D3uwvH4/s640/DSC_0098.jpg" width="426" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Also, there were lots of kids there learning how to solder. Its great to see that, despite so many fine gadgets being available off-the-shelf, people still want to make their own. Fantastic!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-888761590162405835?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/888761590162405835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=888761590162405835' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/888761590162405835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/888761590162405835'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/05/makers-faire-san-mateo-2010.html' title='Maker&apos;s Faire, San mateo 2010'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_mcUPc534hb8/S__KR9ed_PI/AAAAAAAAAB0/ysP2Rcw6LXg/s72-c/DSC_0089.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-5871758324144696103</id><published>2010-04-02T11:14:00.000-07:00</published><updated>2010-04-02T11:16:41.417-07:00</updated><title type='text'>UK Author US Publisher</title><content type='html'>I live in the UK, but my publisher McGraw Hill is American. US law says that the publisher must withhold 30% of all payments (advances and royalties) to foreigners. This would then be followed by the Inland Revenue taking its slice, leaving me a tiny little morsel.&lt;br /&gt;&lt;br /&gt;Your publisher does not have to deduct the 30% if you have completed a form W-8BEN and given it to the publisher. However, to complete a &lt;a href="http://www.irs.gov/pub/irs-pdf/fw8ben.pdf"&gt;W-8BEN&lt;/a&gt;&amp;nbsp;(the easy part) you must have a valid US tax code (the hard part).&lt;br /&gt;&lt;br /&gt;The kind of US Tax Code that you need to get is called an&amp;nbsp;&lt;a href="http://www.irs.gov/individuals/article/0,,id=96287,00.html"&gt;ITIN&lt;/a&gt;. To obtain one of these, you must have a supporting letter (see mine below), complete a form &lt;a href="http://www.irs.gov/pub/irs-pdf/fw7.pdf"&gt;W-7&lt;/a&gt; (also see mine below) an SAE and send them special delivery along with your passport to the IRS at the US Embassy. They will then send back your passport (mine came back by return of post).&lt;br /&gt;&lt;br /&gt;They pass on the form and letter to the IRS in Texas, who in my case sat on it for 3 months and then said that the letter from the publisher was wrong. After much discussion with the IRS in the US embassy we managed to find out that the problem was that the original letter did not have the phrase 'will be receiving payments for the year X and ongoing'. The publisher sent me another letter with the correct phrasing (the one attached) and a very helpful chap (Carlos) at the IRS in London managed to get the ITIN issued very quickly.&lt;br /&gt;&lt;br /&gt;Once you have your ITIN, the W-8BEN is a nice simple one page form.&lt;br /&gt;&lt;br /&gt;Now, I'm just trying to get the wire transfer sorted out. But the end is in sight!&lt;br /&gt;&lt;br /&gt;Good luck!&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Don't forget to put the dates in the American MM DD YYYY format on the forms.&lt;/li&gt;&lt;li&gt;If you have a problem email the IRS at the US Embassy (IRS.London@irs.gov)&lt;/li&gt;&lt;li&gt;Don't blame me if this doesn't work, I'm just trying to help out I am not a tax expert.&lt;/li&gt;&lt;li&gt;Be patient&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_mcUPc534hb8/S7Yzwxt8bUI/AAAAAAAAABk/9HXgfje7Q1E/s1600/fw7-complete_anon.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_mcUPc534hb8/S7Yzwxt8bUI/AAAAAAAAABk/9HXgfje7Q1E/s320/fw7-complete_anon.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_mcUPc534hb8/S7Yz4G_ML_I/AAAAAAAAABs/csey15DL0d4/s1600/revised+letter+anon.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_mcUPc534hb8/S7Yz4G_ML_I/AAAAAAAAABs/csey15DL0d4/s320/revised+letter+anon.jpeg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-5871758324144696103?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/5871758324144696103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=5871758324144696103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/5871758324144696103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/5871758324144696103'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/04/uk-author-us-publisher.html' title='UK Author US Publisher'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_mcUPc534hb8/S7Yzwxt8bUI/AAAAAAAAABk/9HXgfje7Q1E/s72-c/fw7-complete_anon.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-1718609221541811519</id><published>2010-03-26T01:42:00.000-07:00</published><updated>2010-03-26T01:42:41.734-07:00</updated><title type='text'>New Arduino book on the way</title><content type='html'>My book '30 Arduino Experiments for the Evil Genius' (McGraw Hill) is out the door now and I have nothing to do except wait for the proofs and play with the web page (&lt;a href="http://www.arduinoevilgenius.com/"&gt;www.arduinoevilgenius.com&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The book should be on the shelves in August!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-1718609221541811519?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/1718609221541811519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=1718609221541811519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/1718609221541811519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/1718609221541811519'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/03/new-arduino-book-on-way.html' title='New Arduino book on the way'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-3558813839475807938</id><published>2010-03-26T01:21:00.000-07:00</published><updated>2011-12-05T04:06:04.570-08:00</updated><title type='text'>Simplified Ethernet Library for 28J60 Shield</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;With an Ethernet shield you can transform your Arduino into a tiny little web server. Not only that but a web server with Inputs and Outputs. So you can use it to measure things on an analog input and then access those readings from anywhere on the Internet. Or, if you like, you can use it as a remote control to turn things on and off.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;There are two flavours of ethernet shield for the Arduino. There is the official one, based on the Wiznet W5100 chip and the unofficial but significantly cheaper board based on the 28J60 chip.&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_mcUPc534hb8/S6vkJR16U0I/AAAAAAAAABM/DqzMRmBV1bY/s1600/ethernet.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_mcUPc534hb8/S6vkJR16U0I/AAAAAAAAABM/DqzMRmBV1bY/s1600/ethernet.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_mcUPc534hb8/S6vkJR16U0I/AAAAAAAAABM/DqzMRmBV1bY/s320/ethernet.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Nuelectronics sell a board based on this chip and have also produced a library to use it. There are also clones of this to be found on eBay, some of which have a neat little prototying area (see above)&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;The&amp;nbsp;&lt;a href="http://www.nuelectronics.com/estore/index.php?main_page=product_info&amp;amp;products_id=4"&gt;Nuelectronics&lt;/a&gt;&amp;nbsp;library is very thorough, but not the easiest library in the world to use, so I decided to write a library that wrapped up this library with a simpler interface.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;You can download the library from&amp;nbsp;&lt;a href="http://dl.dropbox.com/u/3993179/ETHER_28J60.zip"&gt;here&lt;/a&gt;&amp;nbsp;but you will also need to download the Nuelectronics library from&amp;nbsp;&lt;a href="http://www.nuelectronics.com/download/projects/etherShield.zip"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;Install both libraries into your Arduino environment by unzipping them into a folder called 'libraries' in your sketches directory.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;You can now create a simple sketch like this hello world web server example:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include "etherShield.h"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#include "ETHER_28J60.h"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;static uint8_t ip[4] = {192, 168, 1, 15}; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;static uint16_t port = 80;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ETHER_28J60 ethernet;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;ethernet.setup(mac, ip, port);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;if (ethernet.serviceRequest())&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ethernet.print("&amp;lt;H1&amp;gt;Hello World&amp;lt;/H1&amp;gt;");&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ethernet.respond();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;This example just displays Hello World when you connect to it in a browser.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;I have included some other examples that display the values at the analog ports, set a digital output and also echo the request parameters.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;This is all heavily influenced by a posting I saw and now cannot find by some who had done a very similar thing to this. If you are reading this, please let me know so that I can give you the credit you deserve. I just kind of did things a slightly different way, and put it in a library rather than a set of functions.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The API is documented below:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Setup&lt;/b&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;void setup(uint8_t macAddress[], uint8_t ipAddress[], uint16_t port);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;i&gt;Example&lt;/i&gt;:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;static uint8_t ip[4] = {192, 168, 1, 15}; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;static uint16_t port = 80;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;ETHER_28J60 ethernet;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void setup()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;ethernet.setup(mac, ip, port);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;You will need to find an ipAddress that is both in a valid range and unused on your local network.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The mac address just has to be unique on your network, so unless you have two of these boards on the network, the value above will be fine.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Servicing Web Requests&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;char* serviceRequest();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;i&gt;Example&lt;/i&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;void loop()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;char* params;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;if (params = e.serviceRequest())&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;e.print("&amp;lt;H1&amp;gt;Web Remote&amp;lt;/H1&amp;gt;");&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (strcmp(params, "?cmd=on") == 0)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;digitalWrite(outputPin, HIGH);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;e.print("&amp;lt;A HREF='?cmd=off'&amp;gt;Turn off&amp;lt;/A&amp;gt;");&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;digitalWrite(outputPin, LOW);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;e.print("&amp;lt;A HREF='?cmd=on'&amp;gt;Turn on&amp;lt;/A&amp;gt;");&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;e.respond();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;serviceRequest either returns null if there has not been an incoming web request to service, or it returns a string containing the request parameter string for the incoming request. The request string includes the '?' character.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="http://1.bp.blogspot.com/_mcUPc534hb8/S6xtOm3QAdI/AAAAAAAAABU/Aw2B2Uc9FRw/s1600/webRemote.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_mcUPc534hb8/S6xtOm3QAdI/AAAAAAAAABU/Aw2B2Uc9FRw/s320/webRemote.jpg" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;In the example above, if the request parameter string is '?cmd=on' then the digital output is set high and the hyperlink to turn the output off is rendered. Otherwise, the digital output is set low and the hyperlink to turn it on is rendered.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;This also shows how to write the response and make the final response to the browser's request.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Writing the Response&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;void print(char* text)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;- adds a string of HTML to the response to be returned.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;void print(int value);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;- adds an integer displayed in decimal form to the response.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;void respond();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;- commits the response back to the requesting browser.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Some things to watch.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;The board consumes about 250mA which seems a lot to me. When driven from a power adaptor rather than USB, that makes the Arduino board get pretty hot around the voltage regulator. So just be careful, particularly if you plan to put your project in a box.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;If you start to get strange things happening with the code, and you are using a 168 Arduino, you may well be running out of memory. The examples in the library will work with a 168, but to do anything more substantial use a 328.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-3558813839475807938?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/3558813839475807938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=3558813839475807938' title='43 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3558813839475807938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3558813839475807938'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/03/simplified-ethernet-library-for-28j60.html' title='Simplified Ethernet Library for 28J60 Shield'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_mcUPc534hb8/S6vkJR16U0I/AAAAAAAAABM/DqzMRmBV1bY/s72-c/ethernet.jpg' height='72' width='72'/><thr:total>43</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-2485598529203198221</id><published>2010-03-23T08:23:00.000-07:00</published><updated>2010-03-23T08:37:15.442-07:00</updated><title type='text'>Apple Rant</title><content type='html'>I have been using Macs since the days of the 'Multi-Finder' anyone else remember that? When you could actually have more than one application running at a time!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After a time away from Macs I was first in the queue to get a Mac when OS X first came out. I had to put up with a lot of grief from my co-workers and the highly non-standard nature of my computer. Gradually one by one they took to Macs and there is not really any going back to Windows after you have used one.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;iPod's - fantastic again very happy to be an early adopter. iPhone - yup I need on of them, and its great.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, you may be surprised to discover that I am considering trading in my iPhone for an Android phone. The reason for this change of heart, is that Apple are deliberately making it hard for anyone like me to make any kind of hardware that works with the dock connector, without having to buy special licensing chips and give Apple money!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;All I want to do is to get at the line-out pins on the dock connector to wire my iPod into my car stereo and have a nice neat single plug dock for my iPod when its in the car, without having to plug a lead into the top for audio.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But you can't! Apple have forbidden it, so my iPod breakout board will be going onto eBay and if it wasn't so damned nice, it would be followed shortly by my iPhone!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Apple, you are supposed to be the good guys, just take a leaf out of Google's book and be nice.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-2485598529203198221?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/2485598529203198221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=2485598529203198221' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/2485598529203198221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/2485598529203198221'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2010/03/apple-rant.html' title='Apple Rant'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-6319146305909361460</id><published>2008-06-10T14:32:00.000-07:00</published><updated>2008-06-10T14:46:26.909-07:00</updated><title type='text'>Elderflower Cordial</title><content type='html'>Its that time of year again when the Elderflower bushes are all in bloom. Its very easy to make your own cordial.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ingredients&lt;/div&gt;&lt;div&gt;30 x flower heads from a bush cut in the sunshine&lt;/div&gt;&lt;div&gt;3 x lemons&lt;/div&gt;&lt;div&gt;1 x 60g packet of citric acid&lt;/div&gt;&lt;div&gt;1 kg of sugar&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You will also need 2 big pans and a bit of net curtain or a pop-sock or half a pair of tights for straining the flowers through.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Put the flower heads and lemons cut into quarters into the pan.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Cover with boiling water, bring to the boil and leave over-night.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Fish out the bulk of the flowers and lemons with your fingers and put them in the bin.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Attach the pop-sock over a jug so that only the poring lip of the jug escapes the sock. In this way you can pour the unfiltered brew into the sock then pour filterd liqued out of the jug into a second pan. &lt;/li&gt;&lt;li&gt;Pour all the Elderflower tea a bit at a time into the filtering jug described above. &lt;/li&gt;&lt;li&gt;Add the sugar and citric acid to the filtered brew and bring to the boil.&lt;/li&gt;&lt;li&gt;Allow it to cool and bottle it.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;You can now use it diluted like you would any squash.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Mmm a taste of summer. Make up a jug of it chilled with slices of lemon and ice cubes or use fizzy water.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-6319146305909361460?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/6319146305909361460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=6319146305909361460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6319146305909361460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6319146305909361460'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2008/06/elderflower-cordial.html' title='Elderflower Cordial'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-6384408064353014029</id><published>2008-06-08T11:40:00.000-07:00</published><updated>2010-04-02T15:38:24.921-07:00</updated><title type='text'>Trip to Moscow</title><content type='html'>&lt;a href="http://bp0.blogger.com/_mcUPc534hb8/SEw2sZOxNKI/AAAAAAAAAAM/0V_95l-kuMs/s1600-h/CRW_1715.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5209599005275796642" src="http://bp0.blogger.com/_mcUPc534hb8/SEw2sZOxNKI/AAAAAAAAAAM/0V_95l-kuMs/s320/CRW_1715.jpg" style="cursor: hand; cursor: pointer; float: left; margin: 0 10px 10px 0;" /&gt;&lt;/a&gt;Bit of a retrospective blog, this one.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Last year I presented at SD Best Practice Moscow.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It was a fantastic experience and I very much enjoyed Moscow.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I deliberately stayed near the centre away from the conference hotel so that I could experience a bit more of the real Moscow.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A weekly Metro ticket was very cheap, and I was very please with myself for learning and reciting enough Russian to buy my pass.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The art and decor of the Metro is amazing, as are the escalators, which go up and up and up and ... amazing feats of engineering, far longer than anything in the London underground.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_mcUPc534hb8/SEw2s5OxNLI/AAAAAAAAAAU/VC-wgDJJ5aQ/s1600-h/moscow+copy.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5209599013865731250" src="http://bp2.blogger.com/_mcUPc534hb8/SEw2s5OxNLI/AAAAAAAAAAU/VC-wgDJJ5aQ/s320/moscow+copy.jpg" style="cursor: hand; cursor: pointer; float: left; margin: 0 10px 10px 0;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Not many people in the street spoke English, so its worth having a phrase book and learning to pronounce the place you are looking for. Its also polite.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I found people perfectly friendly and willing to help the stupid&amp;nbsp;foreigner&amp;nbsp;find where he was looking for.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Wandering about, sometimes even late at night seemed safe. I didn't see anything untoward. But I may just have been lucky.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_mcUPc534hb8/SEw2tJOxNMI/AAAAAAAAAAc/vW8rDm69vKY/s1600-h/CRW_1760.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5209599018160698562" src="http://bp3.blogger.com/_mcUPc534hb8/SEw2tJOxNMI/AAAAAAAAAAc/vW8rDm69vKY/s320/CRW_1760.jpg" style="cursor: hand; cursor: pointer; float: left; margin: 0 10px 10px 0;" /&gt;&lt;/a&gt;I can recommend a visit to the VVTs - see your guide book. Its easily accessible from the Metro and its nice to wander about.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At the far end of the park from the Metro is a Vostok rocket. Just sitting there, unguarded largely ignored by all all except me who - as a lover of all things spacey was mightily impressed. It was smaller than I expected and top marks for courage to Uri Gagarin for sitting on top of what is basically a prototype ICBM.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The contrast was even more start for me as the week after I was in Florida and visited the Kennedy Space Center. The understated and free nature of the Vostok rocket was really refreshing. The informality and complete lack of commerciality was great. It was a real reminder of the achievements of this remarkable nation.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_mcUPc534hb8/SEw2tZOxNNI/AAAAAAAAAAk/ZHcD0LCK8Sc/s1600-h/CRW_1755.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5209599022455665874" src="http://bp0.blogger.com/_mcUPc534hb8/SEw2tZOxNNI/AAAAAAAAAAk/ZHcD0LCK8Sc/s320/CRW_1755.jpg" style="cursor: hand; cursor: pointer; float: left; margin: 0 10px 10px 0;" /&gt;&lt;/a&gt;It reminded me of the tale about the urban legend of the Americans spending a million dollars developing a pen that would write in zero gravity. The Russians just used a pencil !&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The impression I was left with of Russia was one of a people with brains and pragmatism.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A nation with very much to be proud of.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-6384408064353014029?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/6384408064353014029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=6384408064353014029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6384408064353014029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/6384408064353014029'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2008/06/trip-to-moscow.html' title='Trip to Moscow'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_mcUPc534hb8/SEw2sZOxNKI/AAAAAAAAAAM/0V_95l-kuMs/s72-c/CRW_1715.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-3868095437317504302</id><published>2008-06-07T00:09:00.000-07:00</published><updated>2008-06-07T00:18:42.831-07:00</updated><title type='text'>Debugging a live Ruby on Rails server</title><content type='html'>This just something useful that occurred to me that is probably blindingly obvious to seasoned rails people out there.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We have a Rails application hosted with Apache and a Mongrel cluster running in production mode. That means if something goes bang, to see what happened you have to go to /log/production.log to see what happened. This system is for internal use to its considered acceptable to reproduce problems quickly on the server and even fix there and copy back to the repository. Mainly because thats much faster. The problem is that you have to restart the cluster every time you change anything.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What occured to me was that to reproduce bugs I could leave the cluster running normally, but just start another instance of the application running on another port in development mode by doing:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;script/server -p 4000&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I can then hit the controllers running on those pages and see the error messages and trace.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So there you go - a bit trivial, but it saved me some time yesterday.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-3868095437317504302?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/3868095437317504302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=3868095437317504302' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3868095437317504302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3868095437317504302'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2008/06/debugging-live-ruby-on-rails-server.html' title='Debugging a live Ruby on Rails server'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-3672625187989745070</id><published>2008-06-03T23:30:00.000-07:00</published><updated>2008-06-03T23:45:09.092-07:00</updated><title type='text'>Extending core Classes in Ruby on Rails</title><content type='html'>While I was tinkering with our agile tracker tool, I had the need of a first_of_month method that would tell me the first day of the month of any particular day. In a less flexible language, you are limited to the choices of:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;write a 'utility' class which is just a bucket of useful methods - not very elegant and ugly too use.&lt;/li&gt;&lt;li&gt;extend the built-in Date class and add your own methods - not very convenient because you have to remember too use the class 'MyDate' everywhere&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;What Ruby lets you do is simply add your own methods to existing classes! This is exactly what's needed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To do this in rails, simple create a new file in your 'lib' directory called date_extension.rb and put the following code in it.&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;class Date&lt;br /&gt;&lt;br /&gt;  def first_of_month&lt;br /&gt;    return Date.new(self.year, self.month, 1)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; &lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;end&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;To get Rails to load this extra method, you need to add the following line to your 'config/environment.rb' file.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;require 'date_extension.rb'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thats it! You'll need to restart Rails to see the change, but then you can use the new method anywhere in your controllers or templates. For example:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;first_of_month = Date.today.first_of_month&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can do the same with String and add your favourite starts_with? or whatever methods.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5416726460697111362-3672625187989745070?l=srmonk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srmonk.blogspot.com/feeds/3672625187989745070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5416726460697111362&amp;postID=3672625187989745070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3672625187989745070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5416726460697111362/posts/default/3672625187989745070'/><link rel='alternate' type='text/html' href='http://srmonk.blogspot.com/2008/06/extending-core-classes-in-ruby-on-rails.html' title='Extending core Classes in Ruby on Rails'/><author><name>Simon Monk</name><uri>https://profiles.google.com/101649293477721768985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-N2MPmYlzm4I/AAAAAAAAAAI/AAAAAAAAAII/mkj97fDwAds/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5416726460697111362.post-1756756534803663910</id><published>2008-06-03T14:47:00.000-07:00</published><updated>2008-06-03T23:30:38.446-07:00</updated><title type='text'>Old Languages - Lisp</title><content type='html'>I have a certain nostalgia for old programming languages. So here are a few notes about Lisp.&lt;br /&gt;&lt;br /&gt;Lisp is an old old language - it was originally specified in 1958. I spent a happy three years in the 1980's on a small team writing a frame-based constraint-satisfaction system that automated the layout of chemical plant. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also implemented an Object-Oriented Database System (CLOSQL) in it as part of my PhD. So, don't think of it as a 'novelty' language, this is an elegant and powerful language.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Its a functional language - that is, everything is expressed as a function using a parenthesis notation. Thus you would add 2 and 2 together by writing:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;(+ 2 2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It uses lists as its data structure, and lists can contain lists to make trees.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even the programs themselves are lists. The first part of the list (the head) is the name of the function and everything else in the list are its arguments.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;(let ((n 0))&lt;br /&gt;&lt;/span&gt
