Projects

Bomb Defusing Robot

Lucid Dreaming Goggles

Solar USB Box SUBcomandante

Boot Bot Arduino Cloner

 Plantduino Greenhouse



Perfduino: Make Your Own Arduino Microcontroller!

Robot Platform

Balloon Bot for Child Roboticists

Climate Controlled Solar House

This little house has three solar panels to power yellow LEDs, a fan, a servo, and a propeller microcontroller. Light sensors turn on the LEDs when night falls. Temperature sensors open a vent and activate the fan when it gets too hot.

Garbage Greenhouse

I made this hydroponic greenhouse out of 100 percent found materials. The key ingredient for this greenhouse was a common toilet valve. The same as the one on the  back of your toilet you have to poke at when it won’t stop running.

Traveling Geocache

A synthesis of human, machine, and our natural physical universe, the Traveling Geocache rejects alienation of lifeforms by machines. Rather than imbue a machine with an exploitative social relation (taylorism, that light on the fry-o-lator that tells you to hurry up), one can create a machine that changes social relations positively each time it is used! Reject commodity fetishism (video) by learning how your traveling geocache was made! Reject bourgeois concepts of ownership by giving it away!

This Traveling Geocache is locked from within until the user brings it to the correct GPS location. Once at the magical location, the box opens to reveal a thoughtful present as well as a log book, programming cable, and usb stick containing a users manual with build, and programming instructions.

Click The Image To Link To A Step By Step Guide On Making Your Own!

Click the above image to see step by step instructions online.

Here is the pdf of step by step instructions for making your very own traveling geocache! The-Traveling-Geocache

A quick look at the major wiring:

Arduino code:

/*
This software is licensed under the terms of the Creative
Commons "Attribution Non-Commercial Share Alike" license, version
3.0, which grants the limited right to use or modify it NON-
COMMERCIALLY, so long as appropriate credit is given and
derivative works are licensed under the IDENTICAL TERMS.  For
license details see
http://creativecommons.org/licenses/by-nc-sa/3.0/
This source code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
This sketch illustrates how one might implement a Traveling Geocache
that incorporates rudimentary aspects of the technology in Mikal
Hart's Reverse Geocache(tm) puzzle.
"Reverse Geocache" is a trademark of Mikal Hart.
For supporting libraries and more information see
http://arduiniana.org.
*/
#include <PWMServo.h>
#include <NewSoftSerial.h>
#include <TinyGPS.h>
#include <EEPROM.h>
#include <LiquidCrystal.h>
/* Pin assignments for the Traveling Geocache */
static const int GPSrx = 2, GPStx = 3;// I use this while connecting the ttl TX gps wire to pin 2. It works perfectly. Don't mess with it.
static const int LCD_Enable = 11, LCD_RS = 10, LCD_RW = 7;//LCD pins
static const int LCD_DB4 = 6, LCD_DB5 = 5, LCD_DB6 = 4, LCD_DB7 = 8;//LCD pins
static const int relay_switch_off = 14; // 5v relay switch control is connected to the arduino on pin 14 (analogue 0)
static const int servo_control = 9;// pin 9 is connected to the signal wire of the servo
static const int LED_pin = 12;
/* These values should be adjusted according to your needs */
static const int CLOSED_ANGLE = 140; // degrees. These angles should not need modification as long as the box is functioning correctly.
static const int OPEN_ANGLE = 20; // degrees
static const float DEST_LATITUDE = 42.1367; // change these coordinates to the new destination
static const float DEST_LONGITUDE = -71.2814;
static const int RADIUS = 500; // meters. This is how close you have to be for the box to open. Adjust as needed.
/* Fixed values should not need changing */
static const int DEF_ATTEMPT_MAX = 50;
static const int EEPROM_OFFSET = 100;
/* The basic objects needed */
NewSoftSerial nss(GPSrx, GPStx);
LiquidCrystal lcd(LCD_RS, LCD_RW, LCD_Enable, LCD_DB4, LCD_DB5, LCD_DB6, LCD_DB7);
TinyGPS tinygps;
int attempt_counter;
PWMServo servo;
/* A helper function to display messages of a specified duration */
void Msg(LiquidCrystal &lcd, const char *top, const char *bottom, unsigned long del)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(top);
lcd.setCursor(0, 1);
lcd.print(bottom);
delay(del);
}
/* The Arduino setup() function */
void setup()
{
/* attach servo motor */
servo.attach(servo_control);
/* establish a debug session with a host computer */
Serial.begin(115200);
/* establish communications with the GPS module */
nss.begin(4800);
/* establish communication with 16x2 LCD */
lcd.begin(16,2); // this for an 16x2 LCD -- adjust as needed
/* Make sure Relay switch pin is OUTPUT and HIGH */
pinMode(relay_switch_off, OUTPUT);
digitalWrite(relay_switch_off, HIGH);
/* make sure motorized latch is closed */
servo.write(CLOSED_ANGLE);
/* read the attempt counter from the EEPROM */
attempt_counter = EEPROM.read(EEPROM_OFFSET);
if (attempt_counter == 0xFF) // brand new EEPROM?
attempt_counter = 0;
/* increment it with each run */
++attempt_counter;
/* Greeting */
Msg(lcd, "     DON'T", "     PANIC!", 2000);
lcd.clear();
Msg(lcd, "      NAME", "       =)", 2000);// Insert the name of the new recipient here
lcd.clear();
Msg(lcd, "    Welcome", "     to the", 2000);
lcd.clear();
Msg(lcd, "   Traveling", "   Geocache!", 3000);
/* Game over? */
if (attempt_counter >= DEF_ATTEMPT_MAX)
{
Msg(lcd, "Sorry! No more", "attempts allowed!", 2000);
lcd.clear();
Msg(lcd, "www.instructable", "s.com/id/The-Tra", 5000); // If you run out of turns you can go to the support website where you could explain the secret backdoor or ask that the box be returned for repairs
lcd.clear();
Msg(lcd, "veling-Geocache/", "", 5000);
PowerOff();
}
/* Print out the attempt counter */
Msg(lcd, "    This is", "    attempt", 2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(attempt_counter);
lcd.print(" of ");
lcd.print(DEF_ATTEMPT_MAX);
delay(2000);
/* Save the new attempt counter */
EEPROM.write(EEPROM_OFFSET, attempt_counter);
Msg(lcd, "((((Seeking))))", "((((Signal.))))", 0);
}
/* The Arduino loop() function */
void loop()
{
/* Has a valid NMEA sentence been parsed? */
if (nss.available() && tinygps.encode(nss.read()))
{
float lat, lon;
unsigned long fix_age;
/* Have we established our location? */
tinygps.f_get_position(&lat, &lon, &fix_age);
if (fix_age != TinyGPS::GPS_INVALID_AGE)
{
/* Calculate the distance to the destination */
float distance_meters = TinyGPS::distance_between(lat, lon, DEST_LATITUDE, DEST_LONGITUDE);
/* Are we close?? */
if (distance_meters <= RADIUS)
{
Msg(lcd, "     ACCESS", "    GRANTED!", 2000);
lcd.clear();
Msg(lcd, "   WELCOME TO", "     Mars!", 2000);// Insert the name of the destination here
servo.write(OPEN_ANGLE);
delay(2000);
nss.end();
tone(16, 659, 200);// Play a victory tune! on pin 16 (Analogue 2) tone(PIN# of speaker connection, frequency, duration in miliseconds)
delay(400);
tone(16, 659, 100);
delay(200);
tone(16, 659, 100);
delay(200);
tone(16, 1319, 200);
delay(400);
tone(16, 1319, 200);
delay(400);
tone(16, 1760, 750);
delay(1500);
}
/* Nope.  Print the distance. */
else
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Distance");
lcd.setCursor(0, 1);
if (distance_meters < 1000)
{
lcd.print((int)distance_meters);
lcd.print(" m.");
}
else
{
lcd.print((int)(distance_meters / 1000));
lcd.print(" km.");
}
delay(4000);
Msg(lcd, "     Access", "     Denied!", 2000);
}
PowerOff();
}
}
/* Turn off after 5 minutes */
if (millis() >= 300000)
PowerOff();
}
/* Called to shut off the system using the Pololu switch */
void PowerOff()
{
Msg(lcd, "    Powering", "      Off!", 2000);
lcd.clear();
/* Bring relay switch control pin LOW to turn off */
digitalWrite(relay_switch_off, LOW);
/* This is the back door.  If we get here, then the battery power */
/* is being bypassed by the USB port.  We'll wait a couple of */
/* minutes and then grant access. */
delay(120000);
servo.write(OPEN_ANGLE); // and open the box
/* Reset the attempt counter */
EEPROM.write(EEPROM_OFFSET, 0);
/* Leave the latch open for 10 seconds */
delay(10000);
/* And then seal it back up */
servo.write(CLOSED_ANGLE);
/* Exit the program for real */
exit(1);
}