# Reverse Geocache Box

## Overview

![](https://cdn-learn.adafruit.com/assets/assets/000/002/873/medium800/customer_projects_propose.jpg?1396788214)

Adafruit customer Kenton Harris used a reverse geocaching box to propose to his girlfriend (she said yes). &nbsp;After the project build and successful proposal, he shared how he built the reverse geocache with us. &nbsp;We thought others may be interested in building a similar box for their own proposals, or for fun!  
  
A reverse geocaching box works similar to other geocaching devices. &nbsp;It will guide you to certain coordinates on earth and instead of finding a geocache located at those coordinates, you carry the box with you, and it opens for you at a predetermined destination. &nbsp;This is also a&nbsp;great way to do a scavenger hunt (making someone go to multiple locations before the box opens).

# Reverse Geocache Box

## Parts and Tools

To get started with your reverse geocache build, here are the required parts:

[An Arduino UNO](https://www.adafruit.com/products/50) -&nbsp;The brains of the reverse geocache.![customer_projects_arduinounor3_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/874/medium640/customer_projects_arduinounor3_LRG.jpg?1396788220)

[Adafruit Ultimate GPS Module](http://www.adafruit.com/products/746) - This little guy will tell us where we are, and where we need to go.![customer_projects_746_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/875/medium640/customer_projects_746_LRG.jpg?1396788227)

[A Standard 16x2 LCD](http://www.adafruit.com/products/181) - This will be used to communicate with the person using the reverse geocache box. &nbsp;You can have it help people navigate to the destination, give them a clue, or ask them to marry you. &nbsp;:)![customer_projects_LCDblue162_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/876/medium640/customer_projects_LCDblue162_LRG.jpg?1396788236)

[A Micro Servo](http://www.adafruit.com/products/169) - This little servo will be used to lock and unlock the box with the Arduino.![customer_projects_ID169_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/877/medium640/customer_projects_ID169_LRG.jpg?1396788244)

[Prototyping Board](http://www.adafruit.com/products/571) - Assemble and solder your electronics to this proto-board so it doesn't fall apart in the field.![customer_projects_permaprotohalf_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/878/medium640/customer_projects_permaprotohalf_LRG.jpg?1396788253)

[A Power Switch](https://www.adafruit.com/products/915) - Kenton prefers the Adafruit Waterproof Metal On/Off Switch (with blue LED ring).![customer_projects_metalbutton16mmblue_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/879/medium640/customer_projects_metalbutton16mmblue_LRG.jpg?1396788264)

[Hook-Up Wire](https://www.adafruit.com/products/288 "Link: https://www.adafruit.com/products/288") - For connecting all of the electronics together.![customer_projects_redwire_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/880/medium640/customer_projects_redwire_LRG.jpg?1396788271)

[A Battery](https://www.adafruit.com/products/67) - Power the whole thing with this 9V battery holder.![customer_projects_9vbattplug_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/881/medium640/customer_projects_9vbattplug_LRG.jpg?1396788280)

A Box - Something to enclose the project in. &nbsp;Kenton made his out of cherry, but you can use just about anything. &nbsp;Just don't use a metal box, as the metal will block the GPS signals.

![customer_projects_IMG_20121114_085133.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/882/medium640/customer_projects_IMG_20121114_085133.jpg?1396788293)

Also, you will need a few tools and supplies:

[A Soldering Iron](http://adafruit.com/products/180) - Use this to solder the electronics to the proto-board. &nbsp;If you have never soldered before, [check out our soldering tutorial here](http://learn.adafruit.com/adafruit-guide-excellent-soldering).![customer_projects_xytronics258usa_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/883/medium640/customer_projects_xytronics258usa_LRG.jpg?1396788300)

[A Spool of Solder](http://adafruit.com/products/145)![customer_projects_145solder_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/884/medium640/customer_projects_145solder_LRG.jpg?1396788309)

[Solder Wick](http://adafruit.com/products/149) - To fix your soldering mistakes the easy way.![customer_projects_wick_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/885/medium640/customer_projects_wick_LRG.jpg?1396788315)

[Wire Cutter & Stripper](http://adafruit.com/products/527)![customer_projects_csp301_LRG.jpg](https://cdn-learn.adafruit.com/assets/assets/000/002/886/medium640/customer_projects_csp301_LRG.jpg?1396788321)

# Reverse Geocache Box

## Electronics Assembly

## Understanding the Components
We’re going to start by reading the tutorials for each of the components separately, then we are going to combine them to make our reverse geocache box.  

- Ultimate GPS Tutorial:[http://learn.adafruit.com/adafruit-ultimate-gps](http://learn.adafruit.com/adafruit-ultimate-gps "Link: http://learn.adafruit.com/adafruit-ultimate-gps")  
- Character LCD: [http://learn.adafruit.com/character-lcds/](http://learn.adafruit.com/character-lcds/ "Link: http://learn.adafruit.com/character-lcds/")  
- Servo: [http://www.arduino.cc/en/Reference/Servo](http://www.arduino.cc/en/Reference/Servo "Link: http://www.arduino.cc/en/Reference/Servo")&nbsp;- It’s pretty simple. You just tell it what angle you want the servo to go to, and it obliges.

Read through these links and get to know the basics of how they work. Use a breadboard and examples to experiment and get familiar with them.Info: 

## Arduino Pins
Now that you’ve read how the LCD, GPS, and servo work, let’s combine them. The serial Library uses digital pins 0 and 1, so we want to stay away from those. This allows us to debug the Ardunio with Serial.print() and see what’s going on in the program. The GPS breakout uses digital pins 2 and 3, just like in the Ultimate GPS tutorial. The LCD uses 6 pins, and the Servo motor uses 1 pin.   
  
I put the Servo on Pin 9, and I put the LCD in pins 7,8,6,10,11,and 12 (I had to move the third LCD pin from pin 9 to pin 6 to accommodate the servo).  
  
NOTE: The Servo library and the SoftwareSerial library (which the GPS uses to spit out data) do NOT play nice with each other.&nbsp;To fix this, we’re going to install an older version of the servo library that doesn’t interfere with SofwareSerial.   
  
That library is located here: [http://arduiniana.org/libraries/pwmservo/](http://arduiniana.org/libraries/pwmservo/ "Link: http://arduiniana.org/libraries/pwmservo/")  
  
Download version 2 (by Paul Stoffregen) and install it into the libraries folder in your Arduino folder, just like you did with the Adafruit\_GPS folder in the Ultimate GPS tutorial. This library is called PWMServo. It requires the servo to be on Pin 9 or 10 (which is why you see the change above). Otherwise, you interface with it similarly, you just have to use servoLatch.attach(SERVO\_PIN\_A); when you attach the servo pin.  
## Wire It Up
Now, lay out all of your components. I tried to make the total size as small as possible, and fit into the 5” x 5” box I made. You can see my layout below. The Uno is on the bottom, with two wires coming off to power my proto board. The LCD does not use pins 7, 8, 9, or 10, so I chose to put the contrast potentiometer there. I cut the traces to those pins so I didn’t advertently send a signal to the LCD.  
![](https://cdn-learn.adafruit.com/assets/assets/000/002/887/medium800/customer_projects_IMG_20121106_122200.jpg?1396788330)

Here’s the underside of the proto board. &nbsp;You can see the row of male headers at the bottom. These plug into the digital pins in the Arduino (note: The servo is connected to pin 6 here. It was later swapped to pin 9).![](https://cdn-learn.adafruit.com/assets/assets/000/002/888/medium800/customer_projects_Perma-proto_detail.jpg?1396788337)

Now you’re ready to melt some solder and connect you electronics! Solder the LCD, GPS, and servo pins into the protoboard. Then connect jumpers to your digital pin headers. Solder the contrast pot into the slots not used by the LCD (I used 7, 8, and 9) and cut the trace to the LCD pin. You can also just not attach headers to the LCD for pins 7-10. I installed a jumper from the pot wiper to pin 3 of the LCD (green wire).  
  
NOTE: If you’re using the perma-proto board, you’ll notice that the digital pins on the Uno are not spaced correctly between pins 7 and 8. There is a .160” gap between the pins. I got around this by bending pins 8-12 to fit. If I did this again, [I would have used the proto shield](http://www.adafruit.com/products/51), which accounts for this gap and makes it super easy to connect to the Uno.

# Reverse Geocache Box

## Enclosure

You can use pretty much any box you want for your reverse geocache. Make sure you don’t cover up the GPS antenna with any metal that would block the reception. I made my box out of cherry and cut holes for the LCD and Power Button. I cut matching 45° angles on the back side to allow the box to open 90°.![](https://cdn-learn.adafruit.com/assets/assets/000/002/889/medium800/customer_projects_geobox_tutorial_public_top_bottom.jpg?1396788355)

![](https://cdn-learn.adafruit.com/assets/assets/000/002/890/medium800/customer_projects_geobox_public_hinge.jpg?1396788371)

Next, insert all of your electronics. I cut a square hole in the side of the box with a jigsaw so I can connect to the Uno without taking it out of the box. I connected the circuit up to the power switch and mounted the servo on some standoffs.![](https://cdn-learn.adafruit.com/assets/assets/000/002/891/medium800/customer_projects_IMG_20121113_164444.jpg?1396788381)

I added some foam covered in velvet cloth on the bottom to hold the ring:![](https://cdn-learn.adafruit.com/assets/assets/000/002/892/medium800/customer_projects_IMG_20121114_085206.jpg?1396788393)

I added a latch mechanism to the servo arm that locks the box (not shown).# Reverse Geocache Box

## Software

I got a lot of help on the software from Bobby Nordlund who built his own Geobox that has a lot more features than mine. [Check out his box here.](http://www.youtube.com/watch?v=g0060tcuofg) His stuff is based off of Mikal Hart of [http://arduiniana.org](http://arduiniana.org/) who had the original idea for the Reverse Geocache box. &nbsp;Below is the final version of the code I used:

```auto
/* Engagement Box   by Kenton Harris 11/12/2012
Reverse Geocache Engagement Ring Box
This program unlocks a box that has reached a certain location.

The device uses the following products from Adafruit Industries:
Arduino Uno: https://www.adafruit.com/products/50
Ultimate GPS (version1): http://www.adafruit.com/products/746
16x2 Character LCD: https://www.adafruit.com/products/181
TPro Micro Servo SG90: https://www.adafruit.com/products/169
Half Sized Perma proto: https://www.adafruit.com/products/571

Tutorials for these products found on learn.adafruit.com helped with much of this.
Copyright (c) 2012, Adafruit Industries
All rights reserved.

Thanks to bnordlund9 for much of the code. This is  simplified verison of his Geobox found here:
http://www.youtube.com/watch?v=g0060tcuofg
Credit to Mikal Hart of http://arduiniana.org/ for the original idea of Reverse Geocache.

*/

#include <math.h>
#include <LiquidCrystal.h>
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3,2);
Adafruit_GPS GPS(&mySerial);
#define GPSECHO false												     //make true to debug GPS
boolean usingInterrupt = false;
void useInterrupt(boolean);

//Servo
#include <PWMServo.h>
PWMServo servoLatch;

//Declarations
const float deg2rad = 0.01745329251994;
const float rEarth = 6371000.0;                                          //can replace with 3958.75 mi, 6370.0 km, or 3440.06 NM
float range = 3000;                                                      // distance from HERE to THERE
String here;                                                             // read from GPS

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 6, 10, 11, 12);

int gpsWasFixed = HIGH;                                                  // did the GPS have a fix?
int ledFix = 4;                                                          // pin for fix LED
int servoPin = 9;                                                        // pin for servo
int servoLock = 110;                                                     // angle (deg) of "locked" servo
int servoUnlock = 0;                                                     // angle (deg) of "unlocked" servo

String there = "N38 51.409, W077 01.328";                                //Desired Location goes here. Make sure you use the same syntax and number of characters

void setup()
{
  servoLatch.attach(SERVO_PIN_A);
  servoLatch.write(servoLock);
  delay(50);
  lcd.begin(16, 2);
  Serial.begin(115200);
  Serial.println("Debug GPS Test:");

  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);                          // RMC (recommended minimum) and GGA (fix data) including altitude
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);                             // 1 Hz update rate
  useInterrupt(true);                                                    // reads the steaming data in a background
  delay(1000);
  

}

void loop(){
  // Parse GPS and recalculate RANGE
  if (GPS.newNMEAreceived()) {
    if (!GPS.parse(GPS.lastNMEA()))                                      // also sets the newNMEAreceived() flag to false
      return;                                                            // We can fail to parse a sentence in which case we should just wait for another
  }
    if (GPS.fix) {
    gpsWasFixed = HIGH;
    digitalWrite(ledFix, HIGH);

  
    here = gps2string ((String) GPS.lat, GPS.latitude, (String) GPS.lon, GPS.longitude);
    range = haversine(string2lat(here), string2lon(here), string2lat(there), string2lon(there));
    Serial.print("Here: ");                                        //for GPS debug
    Serial.print(here);
    Serial.print("There: ");
    Serial.println(there);
    Serial.print("Range: ");
    Serial.print(range);
    Serial.println("m");
    
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Distance to LOYL");
    //lcd.setCursor(0,1);
    //lcd.print("                ");
    lcd.setCursor(0,1);
    lcd.print(range);

    delay(500);
  }
  else {                                                              //No GPS fix- take box outside
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Hello Jenny!");
    lcd.setCursor(0,1);
    lcd.print("Take me outside!");
    delay(200);
  }
  
  if (range < 20.0){
    servoLatch.write(servoUnlock);
    delay(1000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Jenny: Will you ");
    lcd.setCursor(0,1);
    lcd.print("Marry Me?!");
    delay(5000);
  }
}


SIGNAL(TIMER0_COMPA_vect) {
  // Interrupt is called once a millisecond, looks for any new GPS data, and stores it
  char c = GPS.read();
  if (GPSECHO)
    if (c) UDR0 = c;  
}

void useInterrupt(boolean v) {
  if (v) {
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
    usingInterrupt = true;
  } else {
    TIMSK0 &= ~_BV(OCIE0A);
    usingInterrupt = false;
  }
}

String int2fw (int x, int n) {
  // returns a string of length n (fixed-width)
  String s = (String) x;
  while (s.length() < n) {
    s = "0" + s;
  }
  return s;
}

String gps2string (String lat, float latitude, String lon, float longitude) {
  // returns "Ndd mm.mmm, Wddd mm.mmm";
  int dd = (int) latitude/100;
  int mm = (int) latitude % 100;
  int mmm = (int) round(1000 * (latitude - floor(latitude)));
  String gps2lat = lat + int2fw(dd, 2) + " " + int2fw(mm, 2) + "." + int2fw(mmm, 3);
  dd = (int) longitude/100;
  mm = (int) longitude % 100;
  mmm = (int) round(1000 * (longitude - floor(longitude)));
  String gps2lon = lon + int2fw(dd, 3) + " " + int2fw(mm, 2) + "." + int2fw(mmm, 3);
  String myString = gps2lat + ", " + gps2lon;
  return myString;
};
/*
float string2radius (String myString) {
  // returns a floating-point number: e.g. String myString = "Radius: 005.1 NM";
  float r = ((myString.charAt(8) - '0') * 100.0) + ((myString.charAt(9) - '0') * 10.0) + ((myString.charAt(10) - '0') * 1.0) + ((myString.charAt(12) - '0') * 0.10);
  return r;
};*/

float string2lat (String myString) {
  // returns radians: e.g. String myString = "N38 58.892, W076 29.177";
  float lat = ((myString.charAt(1) - '0') * 10.0) + (myString.charAt(2) - '0') * 1.0 + ((myString.charAt(4) - '0') / 6.0) + ((myString.charAt(5) - '0') / 60.0) + ((myString.charAt(7) - '0') / 600.0) + ((myString.charAt(8) - '0') / 6000.0) + ((myString.charAt(9) - '0') / 60000.0);
  //Serial.print("float lat: ");
  //Serial.println(lat);
  lat *= deg2rad;
  if (myString.charAt(0) == 'S')
    lat *= -1;                                                           // Correct for hemisphere
  return lat;
};

float string2lon (String myString) {
  // returns radians: e.g. String myString = "N38 58.892, W076 29.177";
  float lon = ((myString.charAt(13) - '0') * 100.0) + ((myString.charAt(14) - '0') * 10.0) + (myString.charAt(15) - '0') * 1.0 + ((myString.charAt(17) - '0') / 6.0) + ((myString.charAt(18) - '0') / 60.0) + ((myString.charAt(20) - '0') / 600.0) + ((myString.charAt(21) - '0') / 6000.0) + ((myString.charAt(22) - '0') / 60000.0);
  //Serial.print("float lon: ");
  //Serial.println(lon);
  lon *= deg2rad;
  if (myString.charAt(12) == 'W')
    lon *= -1;                                                           // Correct for hemisphere
  return lon;
};


float haversine (float lat1, float lon1, float lat2, float lon2) {
  // returns the great-circle distance between two points (radians) on a sphere
  float h = sq((sin((lat1 - lat2) / 2.0))) + (cos(lat1) * cos(lat2) * sq((sin((lon1 - lon2) / 2.0))));
  float d = 2.0 * rEarth * asin (sqrt(h)); 
  //Serial.println(d);
  return d;
  
};
```

When you turn on the box, it instructs the user to take it outside (to obtain the GPS satellites). Once it has a GPS fix, it displays the distance (in meters) to a programmed latitude/longitude location.

![](https://cdn-learn.adafruit.com/assets/assets/000/002/893/medium800/customer_projects_IMG_20121112_181019.jpg?1396788403)

When it gets within 20 meters of the location, the servo rotates the latch, unlocking the box. The display then asks, “Will You Marry Me?”.![](https://cdn-learn.adafruit.com/assets/assets/000/002/894/medium800/customer_projects_propose.jpg?1396788414)

# Reverse Geocache Box

## Support Forums


## Featured Products

### Adafruit Ultimate GPS Breakout - 66 channel w/10 Hz updates

[Adafruit Ultimate GPS Breakout - 66 channel w/10 Hz updates](https://www.adafruit.com/product/746)
We carry a few different GPS modules here in the Adafruit shop, but none that satisfied our every desire - that's why we designed this little GPS breakout board. We believe this is the **Ultimate** GPS module, so we named it that. It's got everything you want and...

In Stock
[Buy Now](https://www.adafruit.com/product/746)
[Related Guides to the Product](https://learn.adafruit.com/products/746/guides)
### Standard LCD 16x2 + extras

[Standard LCD 16x2 + extras](https://www.adafruit.com/product/181)
Standard HD44780 LCDs are useful for creating standalone projects.

- 16 characters wide, 2 rows
- White text on blue background
- Connection port is 0.1" pitch, single row for easy breadboarding and wiring
- Pins are documented on the back of the LCD to assist...

In Stock
[Buy Now](https://www.adafruit.com/product/181)
[Related Guides to the Product](https://learn.adafruit.com/products/181/guides)
### Adafruit METRO 328 Fully Assembled - Arduino IDE compatible

[Adafruit METRO 328 Fully Assembled - Arduino IDE compatible](https://www.adafruit.com/product/50)
We sure love the ATmega328 here at Adafruit, and we use them&nbsp;_a lot_&nbsp;for our own projects. The processor has plenty of GPIO, Analog inputs, hardware UART SPI and I2C, timers and PWM galore - just enough for most simple projects. When we need to go small, we use a <a...></a...>

Out of Stock
[Buy Now](https://www.adafruit.com/product/50)
[Related Guides to the Product](https://learn.adafruit.com/products/50/guides)
### Micro servo

[Micro servo](https://www.adafruit.com/product/169)
Tiny little servo can rotate approximately 180 degrees (90 in each direction) and works just like the standard kinds you're used to but _smaller_. You can use any servo code, hardware, or library to control these servos. Good for beginners who want to make stuff move without...

In Stock
[Buy Now](https://www.adafruit.com/product/169)
[Related Guides to the Product](https://learn.adafruit.com/products/169/guides)
### Adafruit Perma-Proto Half-sized Breadboard PCB - 3 Pack!

[Adafruit Perma-Proto Half-sized Breadboard PCB - 3 Pack!](https://www.adafruit.com/product/571)
Customers have asked us to carry basic perf-board, but we never liked the look of most basic perf: its always crummy quality, with pads that flake off and no labeling. Then we thought about how people **actually** prototype - usually starting with a solderless breadboard and then...

In Stock
[Buy Now](https://www.adafruit.com/product/571)
[Related Guides to the Product](https://learn.adafruit.com/products/571/guides)
### Rugged Metal On/Off Switch with Green LED Ring

[Rugged Metal On/Off Switch with Green LED Ring](https://www.adafruit.com/product/482)
These chrome-plated metal buttons are rugged and look real good while doing it! Simply drill a 16mm hole into any material up to 1/2" thick and you can fit these in place, there's even a rubber gasket to keep water out of the enclosure. On the front of the button is a flat metal...

Out of Stock
[Buy Now](https://www.adafruit.com/product/482)
[Related Guides to the Product](https://learn.adafruit.com/products/482/guides)
### 9V battery holder with switch &  5.5mm/2.1mm plug

[9V battery holder with switch &  5.5mm/2.1mm plug](https://www.adafruit.com/product/67)
This is a 9V battery pack with on/off switch and a pre-attached 5.5mm/2.1mm center-positive barrel plug. Use this to battery-power your Arduino (or other electronic projects) - it's ready to go out of the box!

Battery & screw not included.

![]()

In Stock
[Buy Now](https://www.adafruit.com/product/67)
[Related Guides to the Product](https://learn.adafruit.com/products/67/guides)

## Related Guides

- [Remote Control with the Huzzah + Adafruit.io](https://learn.adafruit.com/remote-control-with-the-huzzah-plus-adafruit-io.md)
- [Wave Shield Voice Changer](https://learn.adafruit.com/wave-shield-voice-changer.md)
- [Arduin-o-Phone](https://learn.adafruit.com/arduin-o-phone-arduino-powered-diy-cellphone.md)
- [Adafruit INA219 Current Sensor Breakout](https://learn.adafruit.com/adafruit-ina219-current-sensor-breakout.md)
- [Wireless Gardening with Arduino + CC3000 WiFi Modules](https://learn.adafruit.com/wireless-gardening-arduino-cc3000-wifi-modules.md)
- [Breadboards for Beginners](https://learn.adafruit.com/breadboards-for-beginners.md)
- [Arduino Lesson 7. Make an RGB LED Fader](https://learn.adafruit.com/adafruit-arduino-lesson-7-make-an-rgb-led-fader.md)
- [Program an AVR or Arduino Using Raspberry Pi GPIO](https://learn.adafruit.com/program-an-avr-or-arduino-using-raspberry-pi-gpio-pins.md)
- [Arduino Lesson 13. DC Motors](https://learn.adafruit.com/adafruit-arduino-lesson-13-dc-motors.md)
- [Wave Shield Talking Clock](https://learn.adafruit.com/wave-shield-talking-clock.md)
- [TMP36 Temperature Sensor](https://learn.adafruit.com/tmp36-temperature-sensor.md)
- [CircuitPython Essentials](https://learn.adafruit.com/circuitpython-essentials.md)
- [Low Power Coin Cell Voltage Logger](https://learn.adafruit.com/low-power-coin-cell-voltage-logger.md)
- [0.96" mini Color OLED](https://learn.adafruit.com/096-mini-color-oled.md)
- [Overwatch Prop Gun: Lucio's Blaster Pt. 3](https://learn.adafruit.com/overwatch-prop-gun-lucios-blaster-pt-3.md)
