<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>coobrolabs.com</title>
	<atom:link href="http://coobrolabs.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://coobrolabs.com</link>
	<description>Open Source Electronics</description>
	<lastBuildDate>Wed, 23 May 2012 14:26:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Another fantastic Coobro Geo Upgrade</title>
		<link>http://coobrolabs.com/2012/03/another-fantastic-coobro-geo-upgrade/</link>
		<comments>http://coobrolabs.com/2012/03/another-fantastic-coobro-geo-upgrade/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 01:35:12 +0000</pubDate>
		<dc:creator>Tyler Cooper</dc:creator>
				<category><![CDATA[Coobro Geo]]></category>

		<guid isPermaLink="false">http://coobrolabs.com/?p=531</guid>
		<description><![CDATA[I happened to be digging through Google searches a couple weeks back, and I stumbled upon an amazing looking hack of the Coobro Geo. A regular here at Adafruit, Stephanie, has done some nice work with a custom Chronodot library, and other hacks of Adafruit products. Using the open source schematic of the Coobro Geo, [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://coobrolabs.com/wp-content/uploads/2012/03/walk_gps.jpg" class="thickbox no_icon" title="Coobro Geo Upgrade"><img class="aligncenter size-full wp-image-534" title="Coobro Geo Upgrade" src="http://coobrolabs.com/wp-content/uploads/2012/03/walk_gps.jpg" alt="" width="597" height="510" /></a><br />
I happened to be digging through Google searches a couple weeks back, and I stumbled upon an amazing looking hack of the Coobro Geo. A regular here at Adafruit, Stephanie, has done some nice work with a custom Chronodot library, and other hacks of Adafruit products. Using the open source schematic of the Coobro Geo, Stephanie managed to strap on an Adafruit OLED, and a lipo battery she had laying around to create her own GPS tracking device. Here is how Stephanie describes it:</p>
<blockquote><p>In a nutshell &#8211; I was thinking of making an arduino/gps device to help me track walks. I wanted to know the time and distance I was walking. When I saw your Coobro Geo project I realized that would be a perfect platform to build on.</p>
<p>For the LEDs, I&#8217;m using them to indicate the GPS accuracy &#8211; if there&#8217;s no signal or it&#8217;s too poor to use, the three LEDs flash. As the signal gets better, it goes to two, then one, then if the signal is excellent, none of the LEDs blink. The OLED screen displays some basic stuff on the top, like lat, long, UTC time. The push-button toggles the &#8216;track&#8217; mode, so once it&#8217;s on and has a fix, one push starts it tracking &#8211; so it starts counting time, and every 10 seconds it checks how far it&#8217;s travelled. This info is displayed on the lower half of the screen. A second push of the button stops the tracking, so you can see the total distance covered, the time, and the calculated average speed. And finally, a long-push of the button clears the data.</p>
<p>I haven&#8217;t finished working on it yet, I was also planning on having it save the readings to the EEPROM, like every 10 seconds (or once a minute or whatever) I&#8217;d have it save the lat lon and utc stamp. Then I could dump that info at home and play it back over a map or something.</p>
<p>I am using a LiPo for power, I had one I&#8217;d pulled out of a dead handheld gaming device which was almost exactly the same size as the Coobro PCB. I added a JST connector so I can just unplug the battery and plug it in to a charger when I need to top it up.</p>
<p>I left off one of the distance LEDs because I wanted to keep the I2C pins available &#8220;just in case&#8221; and left the other LED off because&#8230; it had to be symmetrical! hehe. To connect the OLED I used several of the directional LED pins, but I did wire three of the direction LEDs up &#8211; they&#8217;re just hidden beneath the screen. The screen is held on by the wires that I used to connect it, most of which are on the left-hand side. On the right hand side there&#8217;s two wires that are not used, other than to hold the screen down. So if I needed to access the uC for any reason, I only have to desolder two wires and the OLED will fold away to one side.</p>
<p>Finally, I wired the power switch for &#8216;always on&#8217; and replaced the jumper with the power switch, so switching it to &#8216;battery&#8217; turns it on and switching it to the &#8216;ftdi&#8217; side turns it off (unless you have the ftdi plugged in of course). The downside is that this means the GPS does not get that backup power to keep its settings. But I realized it would lose that every time I unplugged the battery to recharge it, so I figured it wouldn&#8217;t matter if it had to coldstart each time. It only takes about 2 minutes to get a lock and solid signal even indoors.</p>
<p>I totally love that gps module by the way. It&#8217;s my first experience working with a gps and it blows me away how sensitive it is. I found it was &#8216;too talkative&#8217; though so I figured out how to send it the NMEA control info to have it only send the two sentences I required.</p>
<p>I&#8217;ve pasted my sketch info below. Like I said, it&#8217;s a work in progress&#8230;</p>
<p>Cheers!<br />
<span style="color: #888888;"><br />
-Stephanie<br />
</span><br />
p.s. Just remembered I had to modify the tinygps library. For &#8216;signal quality&#8217; I am actualy using HDOP (horizontal degree of precision) but the tinygps library was ignoring that value. It&#8217;s a bit of an arbitrary thing, but the lower-the-better and I figured i&#8217;d want to know if it was accurately tracking my walk or not.  I&#8217;ve included my modified library as well as the sketch&#8230; I also increased the buffer in the new soft serial library, as I found it was having trouble keeping up with the gps.</p>
<p>p.p.s. I think there&#8217;s a bug in the speed calculations, but haven&#8217;t had time to finish analyzing that &#8211; work has been crazy busy the last few weeks.</p>
<p><span id="more-531"></span></p>
<pre class="brush: cpp; title: ; notranslate">
// constants
#define      UPDATE_INTERVAL  1000    // update screen once per second
#define      LONGPRESS        1500    // hold button down 1.5 sec to clear data
#define      SHORTPRESS        500    // hold button down .5 sec to toggle tracking
#define      BLINK_DUR          10    // length to blink LEDs when signal is poor
// pin definitions
#define      BUTTON              2    // button on d2
#define      GPS_TX              3    // gps tx on d3
#define      GPS_RX              4    // gps rx on d4
#define      OLED_CLK            5    // oled clock on d5
#define      OLED_MOSI           6    // oled mosi on d6
#define      LED_A2              8    // top led, right side
#define      LED_A1              9    // top led, middle
#define      LED_A0             10    // top led, left side
#define      OLED_CS            11    // oled chip select on d11
#define      OLED_RESET         12    // oled reset on d12
#define      OLED_DC            13    // oled d-c on d13
#define      LED_B2             A1    // bottom led, right side
#define      LED_B1             A2    // bottom led, middle
#define      LED_B0             A3    // bottom led, left side

#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;SSD1306.h&amp;gt;
#include &amp;lt;NewSoftSerial.h&amp;gt;
#include &quot;TinyGPS.h&quot;
#include &amp;lt;EEPROM.h&amp;gt;
#include &quot;EEPROMAnything.h&quot;

NewSoftSerial     nss(GPS_RX, GPS_TX);
SSD1306           oled(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
TinyGPS           gps;

unsigned long              lastUpdate;
unsigned long              elapsedTime;
unsigned long              trackingStarted = 0;
unsigned long              trackingStopped = 0;
unsigned long              buttonDown = 0;
float                      last_flat=0.0;
float                      last_flon=0.0;
float                      velocity = 0.0;
float                      totalDistance = 0.0;
byte                       count = 0;
boolean                    isTracking = false;
boolean                    buttonPush = false;

int availableMemory() {
uint8_t * heapptr, * stackptr;
stackptr = (uint8_t *)malloc(4);
heapptr = stackptr;
free(stackptr);
stackptr =  (uint8_t *)(SP);
return int(stackptr - heapptr);
}

void feedGps() {
while (nss.available()) {
gps.encode(nss.read());
}
}

void screenSetup() {
oled.clear();
oled.drawstring(0, 0, &quot;Latitude&quot;);
oled.drawstring(0, 1, &quot;Longitude&quot;);
oled.drawstring(0, 2, &quot;UTC&quot;);
oled.drawstring(82, 2, &quot;Sig&quot;);
oled.drawstring(0, 3, &quot;Velocity&quot;);
oled.drawstring(102, 3, &quot;Km/h&quot;);
}

void setup() {
pinMode(LED_A0, OUTPUT);
pinMode(LED_A1, OUTPUT);
pinMode(LED_A2, OUTPUT);
pinMode(LED_B0, OUTPUT);
pinMode(LED_B1, OUTPUT);
pinMode(LED_B2, OUTPUT);
pinMode(BUTTON, INPUT);

digitalWrite(BUTTON, HIGH);
// blinky LEDs make me happy
digitalWrite(LED_A2, HIGH);
digitalWrite(LED_B0, HIGH);
delay(500);
digitalWrite(LED_A2, LOW);
digitalWrite(LED_A1, HIGH);
digitalWrite(LED_B0, LOW);
digitalWrite(LED_B1, HIGH);
delay(500);
digitalWrite(LED_A1, LOW);
digitalWrite(LED_A0, HIGH);
digitalWrite(LED_B1, LOW);
digitalWrite(LED_B2, HIGH);
delay(500);
digitalWrite(LED_B2, LOW);
digitalWrite(LED_A0, LOW);
delay(500);

oled.ssd1306_init(SSD1306_&lt;wbr&gt;SWITCHCAPVCC);
screenSetup();
oled.display();
delay(250);

nss.begin(9600);
//  some NMEA sentences to tinker with the gps parameters
//  nss.print(&quot;$PMTK220,5000*1B\r\&lt;wbr&gt;n&quot;); // set update to 5 sec
//  nss.print(&quot;$PMTK220,2500*19\r\&lt;wbr&gt;n&quot;); // set update to 2.5 sec
//  nss.print(&quot;$PMTK220,2000*1C\r\&lt;wbr&gt;n&quot;); // set update to 2 sec
//  nss.print(&quot;$PMTK220,1000*1F\r\&lt;wbr&gt;n&quot;); // set update to 1 Hz
//  delay(15);
//  nss.print(&quot;$PMTK314,0,1,1,1,0,&lt;wbr&gt;0,0,0,0,0,0,0,0,0,0,0,0,0,0*&lt;wbr&gt;29\r\n&quot;); // only GGA, RMC, VTG
nss.print(&quot;$PMTK314,0,1,0,1,0,&lt;wbr&gt;0,0,0,0,0,0,0,0,0,0,0,0,0,0*&lt;wbr&gt;28\r\n&quot;); // only GGA, RMC
delay(15);
//  nss.print(&quot;$PMTK605*31\r\n&quot;); // report firmware version
}

void loop() {
feedGps();
boolean testButton = !(digitalRead(BUTTON));
byte ledLevel = 0;
if(testButton != buttonPush) {
if(testButton) {
buttonDown = millis();
digitalWrite(LED_A1, HIGH);
} else {
unsigned long buttonDur = millis() - buttonDown;
buttonDown = 0;
digitalWrite(LED_A1, LOW);
if(buttonDur &amp;gt; LONGPRESS) {
isTracking = false;
trackingStarted = 0;
trackingStopped = 0;
elapsedTime     = 0;
totalDistance   = 0.0;
} else if(buttonDur &amp;gt; SHORTPRESS) {
if(isTracking) {
isTracking = false;
trackingStopped = millis();
elapsedTime = trackingStopped - trackingStarted;
lastUpdate = 0;
} else {
isTracking = true;
trackingStarted = millis();
if(elapsedTime != 0) trackingStarted = millis() - elapsedTime;
count=0;
lastUpdate = 0;
}
}
}
buttonPush = testButton;
}
if((millis() - lastUpdate) &amp;gt; UPDATE_INTERVAL) {
char buf[10];
float flat, flon;
unsigned long age, hdop, time, date;
if(isTracking) {
count++;
feedGps();
if((count&amp;gt;9) &amp;amp;&amp;amp; (gps.data_good())) {
gps.f_get_position(&amp;amp;flat, &amp;amp;flon);
float dist = gps.distance_between(last_&lt;wbr&gt;flat, last_flon, flat, flon);
feedGps();
totalDistance += dist;
last_flat = flat;
last_flon = flon;
count=0;
}
}
screenSetup();
hdop=gps.hdop();
gps.f_get_position(&amp;amp;flat, &amp;amp;flon, &amp;amp;age);
if(!isTracking) {
last_flat = flat;
last_flon = flon;
}
if(!(gps.data_good())) {
oled.drawstring(64, 0, &quot;Unknown&quot;);
oled.drawstring(64, 1, &quot;Unknown&quot;);
} else {
bool north = true;
bool east = true;
if(flat &amp;lt; 0.0) {
flat = flat * -1.0;
north = false;
}
if(flon &amp;lt; 0.0) {
flon = flon * -1.0;
east = false;
}
dtostrf(flat, 7, 5, buf);
oled.drawstring(66, 0, buf);
dtostrf(flon, 7, 5, buf);
if(flon &amp;lt; 100.0) {
oled.drawstring(66, 1, buf);
} else {
oled.drawstring(60, 1, buf);
}
if(north) {
oled.drawstring(121, 0, &quot;N&quot;);
} else {
oled.drawstring(121, 0, &quot;S&quot;);
}
if(east) {
oled.drawstring(121, 1, &quot;E&quot;);
} else {
oled.drawstring(121, 1, &quot;W&quot;);
}
}
velocity = gps.f_speed_kmph();
feedGps();
if((hdop == 0xFFFFFFFF) || !(gps.data_good())) {
ledLevel = 4;
velocity=0.0;
oled.drawstring(103, 2, &quot;Unkn&quot;);
} else if((hdop &amp;gt; 749) || (age &amp;gt; 5999)){
ledLevel = 3;
velocity=0.0;
oled.drawstring(103, 2, &quot;BAD &quot;);
} else if((hdop &amp;gt; 499) || (age &amp;gt; 3999)) {
ledLevel = 2;
velocity=0.0;
oled.drawstring(103, 2, &quot;AVG&quot;);
} else if((hdop &amp;gt; 199) || (age &amp;gt; 2199)) {
oled.drawstring(103, 2, &quot;Good&quot;);
ledLevel = 1;
} else {
ledLevel = 0;
oled.drawstring(103, 2, &quot;Best&quot;);
}
feedGps();
gps.get_datetime(&amp;amp;date, &amp;amp;time, &amp;amp;age);
if(time == 0xFFFFFFFF) {
oled.drawstring(22, 2, &quot;Unknown&quot;);
} else {
time = time / 100;
byte seconds = time % 100;
byte minutes = (time / 100) % 100;
byte hours   = (time / 10000);
if(hours &amp;lt; 10) {
buf[0] = '0';
} else {
buf[0] = (48+(hours/10));
}
buf[1] = (48+(hours % 10));
buf[2] = '.';
if(minutes &amp;lt; 10) {
buf[3] = '0';
} else {
buf[3] = (48+(minutes/10));
}
buf[4]=(48+(minutes % 10));
buf[5]='.';
if(seconds &amp;lt; 10) {
buf[6]='0';
} else {
buf[6]=(48+(seconds/10));
}
buf[7]=(48+(seconds % 10));
buf[8]='&#92;&#48;';
oled.drawstring(22, 2, buf);
}
feedGps();
dtostrf(velocity, 4, 2, buf);
oled.drawstring(54, 3, buf);

if(isTracking) {
oled.drawstring(12, 4, &quot;-- TRACKING ON --&quot;);
elapsedTime = millis() - trackingStarted;
} else {
oled.drawstring(8, 4, &quot;-- Not Tracking --&quot;);
}
if(elapsedTime != 0) {
oled.drawstring(0, 5, &quot;Elapsed&quot;);
oled.drawstring(0, 6, &quot;Speed&quot;);
oled.drawstring(0, 7, &quot;Tot Dst&quot;);
byte seconds = (elapsedTime / 1000) % 60;
byte minutes = (elapsedTime / 1000) / 60;
float lapTime = (float)minutes + ((float)seconds / 100.0);
float distKM = totalDistance / 1000.0;
float pace = distKM / (elapsedTime / 3600);
dtostrf(lapTime, 4, 2, buf);
oled.drawstring(50, 5, buf);
oled.drawstring(96, 5, &quot;mm.ss&quot;);
dtostrf(pace, 5, 3, buf);
oled.drawstring(50, 6, buf);
oled.drawstring(102, 6, &quot;Km/h&quot;);
dtostrf(distKM, 5, 3, buf);
oled.drawstring(50, 7, buf);
oled.drawstring(114, 7, &quot;Km&quot;);
} else {
// display free memory for debugging
// between 1kB for the OLED buffer and
// 256B for the softserial buffer,
// we're tight on ram!
oled.drawstring(0, 7, &quot;FreeMem&quot;);
itoa(availableMemory(), buf, 10);
oled.drawstring(50, 7, buf);
}
oled.display();
feedGps();
if(ledLevel == 4) {
digitalWrite(LED_B0, HIGH);
digitalWrite(LED_B1, HIGH);
digitalWrite(LED_B2, HIGH);
delay(BLINK_DUR);
digitalWrite(LED_B0, LOW);
digitalWrite(LED_B1, LOW);
digitalWrite(LED_B2, LOW);
} else if(ledLevel == 3){
digitalWrite(LED_B0, HIGH);
digitalWrite(LED_B1, HIGH);
delay(BLINK_DUR);
digitalWrite(LED_B0, LOW);
digitalWrite(LED_B1, LOW);
} else if(ledLevel == 2) {
digitalWrite(LED_B1, HIGH);
delay(BLINK_DUR);
digitalWrite(LED_B1, LOW);
} else if(ledLevel == 1) {
digitalWrite(LED_B0, HIGH);
delay(BLINK_DUR);
digitalWrite(LED_B0, LOW);
}
lastUpdate = millis();
}
feedGps();
if(buttonDown &amp;gt; 0) {
unsigned long buttonDur = millis() - buttonDown;
if(buttonDur &amp;gt; LONGPRESS) {
if(!digitalRead(LED_A1)) digitalWrite(LED_A1, HIGH);
} else if(buttonDur &amp;gt; SHORTPRESS) {
if(digitalRead(LED_A1)) digitalWrite(LED_A1, LOW);
}
}
}
</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://coobrolabs.com/2012/03/another-fantastic-coobro-geo-upgrade/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Coobro Geo owner takes the code to a whole new level</title>
		<link>http://coobrolabs.com/2012/02/coobro-geo-owner-takes-the-code-to-a-whole-new-level/</link>
		<comments>http://coobrolabs.com/2012/02/coobro-geo-owner-takes-the-code-to-a-whole-new-level/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 03:54:23 +0000</pubDate>
		<dc:creator>Tyler Cooper</dc:creator>
				<category><![CDATA[Coobro Geo]]></category>
		<category><![CDATA[Gerard]]></category>
		<category><![CDATA[Upgrade]]></category>

		<guid isPermaLink="false">http://coobrolabs.com/?p=439</guid>
		<description><![CDATA[Coobro Geo owner and active user Gerard (call sign DL8SEL) has been pumping out updates to the Coobro Geo code and he is finally ready to show it off.  We are blown away with what Gerard has done here.  Just listen to this long list of new features he has developed: 32 breadcrumb coordinate storage in [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://coobrolabs.com/wp-content/uploads/2012/02/Coobro-Geo-Upgrade4.jpg" class="thickbox no_icon" title="Coobro Geo Upgrade"><img class="aligncenter size-full wp-image-482" title="Coobro Geo Upgrade" src="http://coobrolabs.com/wp-content/uploads/2012/02/Coobro-Geo-Upgrade4.jpg" alt="" width="597" height="400" /></a></p>
<p>Coobro Geo owner and active user Gerard (call sign DL8SEL) has been pumping out updates to the Coobro Geo code and he is finally ready to show it off.  We are blown away with what Gerard has done here.  Just listen to this long list of new features he has developed:</p>
<ol>
<li>32 breadcrumb coordinate storage in eeprom</li>
<li>32 geo coordinate storage in eeprom</li>
<li>Active geo and breadcrumb coordinates shown on the distance LEDs in binary</li>
<li>Activity logging: every time you turn on the device it logs the date/time/location of your start (10 revolving data logs)</li>
<li>Read and write coordinates and breadcrumbs via serial communication</li>
<ul>
<li>a write command allows to store breadcrums lat/lon in a specific location in the table</li>
<li>a read command shows all non-zero breadcrums lat/lon</li>
<li>structure to write: w b17 +00.000000 +00.000000 *</li>
</ul>
<li>When you turn on the device, it will flash the software version in binary</li>
<li>When you turn off, then turn on the device, it will return to the last coordinate you were navigating to</li>
<li>The close up distance display can be changed easily with a #define macro (from 5 to 10 or xx meter if you want to use it in a car)</li>
<li>When you turn on the device, it will transfer all wp of the program code into the corresponding eeprom wp storage area if the corresponding storage field is empty</li>
</ol>
<p>A special thanks to Gerard for all of his hard work on the code!  This is exactly why our kits will always be open source.  <a  title="Coobro Labs GitHub" href="https://github.com/coobro/geo" target="_blank">Download Gerard&#8217;s updated code on GitHub.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://coobrolabs.com/2012/02/coobro-geo-owner-takes-the-code-to-a-whole-new-level/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Coobro Geo on Adafruit&#8217;s Show &amp; Tell</title>
		<link>http://coobrolabs.com/2011/12/the-coobro-geo-on-adafruits-show-tell/</link>
		<comments>http://coobrolabs.com/2011/12/the-coobro-geo-on-adafruits-show-tell/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 04:02:34 +0000</pubDate>
		<dc:creator>Tyler Cooper</dc:creator>
				<category><![CDATA[Coobro Geo]]></category>
		<category><![CDATA[Adafruit]]></category>

		<guid isPermaLink="false">http://coobrolabs.com/?p=410</guid>
		<description><![CDATA[Watch the video below to see the official unveiling of the Coobro Geo on the Adafruit.com show and tell.  Definitely watch the whole video if you haven&#8217;t seen one of Adafruit&#8217;s show and tell&#8217;s before.  If you want to fast forward to me showing off the Coobro Geo, skip ahead to the 7:20 mark.  Make [...]]]></description>
			<content:encoded><![CDATA[<p>Watch the video below to see the official unveiling of the Coobro Geo on the Adafruit.com show and tell.  Definitely watch the whole video if you haven&#8217;t seen one of Adafruit&#8217;s show and tell&#8217;s before.  If you want to fast forward to me showing off the Coobro Geo, skip ahead to the 7:20 mark.  Make sure to check out the show and tell every Saturday night at about 8:30PM CST.</p>
<iframe src='http://player.vimeo.com/video/33690395?title=1&amp;byline=1&amp;portrait=1' width='605' height='340' frameborder='0'></iframe>
]]></content:encoded>
			<wfw:commentRss>http://coobrolabs.com/2011/12/the-coobro-geo-on-adafruits-show-tell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Say Hello to the Coobro Geo</title>
		<link>http://coobrolabs.com/2011/12/say-hello-to-the-coobro-geo/</link>
		<comments>http://coobrolabs.com/2011/12/say-hello-to-the-coobro-geo/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 23:13:26 +0000</pubDate>
		<dc:creator>Tyler Cooper</dc:creator>
				<category><![CDATA[Coobro Geo]]></category>
		<category><![CDATA[Open Source Hardware]]></category>

		<guid isPermaLink="false">http://coobrolabs.com/?p=351</guid>
		<description><![CDATA[The Coobro Geo is a project that started off as a way for me to learn more about designing and building Open Source Electronics.  First, let me explain what the Coobro Geo is, then after the the jump, I will give a little explanation of the process that I went through to get to where the project [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a  href="http://coobrolabs.com/wp-content/uploads/2011/12/Main1_sm.jpg" class="thickbox no_icon" title="Coobro Geo"><img class="aligncenter  wp-image-373" title="Coobro Geo" src="http://coobrolabs.com/wp-content/uploads/2011/12/Main1_sm-605x416.jpg" alt="" width="597" height="416" /></a></p>
<p>The Coobro Geo is a project that started off as a way for me to learn more about designing and building Open Source Electronics.  First, let me explain what the Coobro Geo is, then after the the jump, I will give a little explanation of the process that I went through to get to where the project is today.</p>
<p>The Coobro Geo is an easy to assemble GPS navigation kit.  Upload coordinates, turn it on, and the Coobro Geo will help you navigate to any destination on earth by using LEDs to show you the correct direction and distance remaining.  Before you leave on your quest, press and hold the breadcrumbs button and the Coobro Geo will remember your location and help you navigate back.  Store up to five pre-entered destination coordinates and five breadcrumbs, or modify the open source code and store as many coordinates as you want.</p>
<p>Use the Coobro Geo to help you find geocaches, store and navigate between hot fishing spots, complete a scavenger hunt, or simply help you find your car after a hike.  <a  href="http://coobrolabs.com/products/coobro-kits/coobro-geo-kit/">You can pick up a Coobro Geo of your own here.</a></p>
<p><span id="more-351"></span>The Coobro Geo started as an idea I got after reading about <a  href="http://www.seancarney.ca/projects/arduino-gps-receiver/arduino-gps-system">Sean Carney&#8217;s Arduino GPS System</a>.  I loved the idea of building something like this so I could use it to go geocaching with.  I quickly discovered that when you add up the cost of the LCD shield, GPS shield, GPS module, Arduino, and battery pack, my cost was around $200.  Yikes.  So, I decided to use the components I had and bought only the GPS module, which was $60.</p>
<p><a  href="http://coobrolabs.com/wp-content/uploads/2011/12/GeoProto1.jpg" class="thickbox no_icon" title="Geo prototype 1"><img class="alignleft size-thumbnail wp-image-353" title="Geo prototype 1" src="http://coobrolabs.com/wp-content/uploads/2011/12/GeoProto1-150x150.jpg" alt="" width="150" height="150" /></a>I used a breadboard, some LEDs, and an Arduino to build a really simple navigation system.  I quickly wrote up some code, which used a lot of Sean Carney&#8217;s code and a bit of help from around the web (as well as Mikal Hart&#8217;s TinyGPS library).  The GPS module I started with was the <a  href="http://www.sparkfun.com/products/8975">Locosys LS20031</a>.  This was a great little module as it was possible to use .1&#8243; right angle header pins and use the module with a breadboard.  I had three LEDs up front &#8211; one for left, right and straight headings.  I then had one green LED that would light up when I was within 5m of my destination.</p>
<p><a  href="http://coobrolabs.com/wp-content/uploads/2011/12/GeoProto2.jpg" class="thickbox no_icon" title="First Coobro Geo Prototype Test"><img class="alignright size-thumbnail wp-image-357" title="First Coobro Geo Prototype Test" src="http://coobrolabs.com/wp-content/uploads/2011/12/GeoProto2-150x150.jpg" alt="" width="150" height="150" /></a>I uploaded the code, wrapped the whole gizmo in a ziplock bag, and set out to find a geocache at 10pm on a March evening&#8230;in the middle of a HUGE Minnesota snowstorm (we got nearly 18 inches of snow that night).  Not only did the system work with only four LEDs, it was a lot of fun to use.  Compared to the $200 GPS device I was using to find geocaches, this prototype got me just as close to the cache, and it did so in the simplest possible way.  I knew then that I had to create a more robust version that had more functionality, but the with the same LED only design.  It was time to learn how to design a PCB.</p>
<p>I started out my journey to learn how to use Eagle Cad by designing a simple prototyping board for an Arduino Fio.  Looking back at the way I designed the board, it is pretty comical how ugly the thing was.  I actually used the auto-router to do something as simple as a proto-board.  It wasn&#8217;t pretty, but I was learning fast.  Thankfully, there are a ton of great tutorial videos on Youtube that helped sharpen my Eagle skills.  I started learning tricks: the joys of hand routing traces, and the benefits of ground planes.  With the help of Adafruit and Sparkfun&#8217;s amazing Eagle libraries and open source schematics, I learned the best ways to design my gizmo.  I also found another tool that was invaluable.  The <a  href="http://dorkbotpdx.org/wiki/pcb_order">DorkbotPDX PCB Order</a> that is run by the incredibly awesome Laen.  Not only does he offer a way for us hobbyist electronics tinkerers to get our hands on high quality PCBs for cheap, he also answered my numerous Eagle Cad questions.  I began pumping out prototypes every couple weeks through his service.  Laen offered up advice on how to fix certain things (traces too thin, silkscreen issues, and more), and then took my Eagle .brd file and turned it into a real PCB.</p>
<p><a  href="http://coobrolabs.com/wp-content/uploads/2011/12/GeoProto3.jpg" class="thickbox no_icon" title="My first DorkbotPDX PCB"><img class="alignleft size-thumbnail wp-image-359" title="My first DorkbotPDX PCB" src="http://coobrolabs.com/wp-content/uploads/2011/12/GeoProto3-150x150.jpg" alt="" width="150" height="150" /></a>You have no idea how excited I was when my first pretty purple PCB arrived in the mail.  Something I had assumed, only months earlier, was impossible for someone like me to create.  I quickly soldered in all of the components and flipped it on.  Holy crap, it worked, but I quickly found out that there were a lot of problems with my design.  I spent the next week tweaking code, and tweaking my Eagle design.  I then sent in another PCB order to Laen.  This process repeated every month or two for the next 8 months until I got to the design I am at today.</p>
<p><a  href="http://coobrolabs.com/wp-content/uploads/2011/12/GeoProto4.jpg" class="thickbox no_icon" title="New Coobro Geo Design"><img class="alignright size-thumbnail wp-image-361" title="New Coobro Geo Design" src="http://coobrolabs.com/wp-content/uploads/2011/12/GeoProto4-150x150.jpg" alt="" width="150" height="150" /></a>The design is actually pretty close in design to my first prototype.  The distance LEDs changed from vertical to horizontal, and I switched to the much better (in my opinion) Fastrax UP501 GPS module, which allowed me to make the board quite a bit smaller.</p>
<p>To say the least, I am forever grateful to the great people who helped me discover this amazing hobby.  Only a year ago I was blinking LEDs with an Arduino, and now I am selling a fully functional GPS navigation kit.  Isn&#8217;t the internet great?  What a crazy, and wonderful addiction this has become.  This one kit has made it possible to take all of my other ideas and turn them into an actual product.  I can&#8217;t wait to share them with you all.</p>
<p>Special thanks to Limor Fried of <a  href="http://www.adafruit.com">Adafruit.com</a>, Nathan Seidle of <a  href="http://www.sparkfun.com/">Sparkfun.com</a>, Mikal Hart of <a  href="http://www.arduiniana.org/">arduiniana.org</a>, Sean Carney of <a  href="http://www.seancarney.ca">seancarney.ca</a>, and Laen of <a  href="http://dorkbotpdx.org/wiki/pcb_order">DorkbotPDX</a> for making the Coobro Geo possible.</p>
<p><a  href="http://coobrolabs.com/wp-content/uploads/2011/11/Main2.jpg" class="thickbox no_icon" title="Main2"><img class="aligncenter size-medium wp-image-302" title="Main2" src="http://coobrolabs.com/wp-content/uploads/2011/11/Main2-605x605.jpg" alt="Coobro Geo" width="605" height="605" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://coobrolabs.com/2011/12/say-hello-to-the-coobro-geo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Content Delivery Network via Amazon Web Services: S3: cbcdn.s3.amazonaws.com

Served from: coobrolabs.com @ 2013-05-25 20:37:09 -->