Showing posts with label AMBI Light Sensor. Show all posts
Showing posts with label AMBI Light Sensor. Show all posts

Tuesday, August 14, 2012

Twittering shark laser intrusion detection system, in honor of Shark Week

Thanks again @bbenchoff for the post about the DIY perpetually-powered wireless outpost on @hackaday! A lot of good discussion on natural/perpetual power sources :)

I got an email from Dan earlier this week about making a fish tracking aquarium. Being that we’re right in the middle of Shark Week, I respectfully obliged…

image

This may or may not have implications for real-life shark tracking, but I’ll take an excuse to have my shark tweet me when he (or she, I’m no marine biologist) breaches the perimeter over to the sunny side of the tank.

Of course, I’m doing this with my toy shark-on-a-stick and only a laser level and a light sensor, but it’s possible to make this much more accurate and granular just by adding more strategically placed sensors/light sources into the mix.

Disclaimer: This project was designed purely with fun and proof-of-concept in mind, and in no way is designed to replace the $100 million airport intrusion detection system at JFK. The jet ski was too big and too fast for my 10 gallon fishtank…

I couldn’t find a picture of Tom Cruise doing this 
because the lasers in Mission Impossible weren’t visible…

Concept

Most laser security systems rely on infrared sensors that detect changes in heat, based on a beam of light hitting the sensor. If that beam is interrupted, it’s interpreted as a change in the thermal profile on the sensor, and an alarm goes off. Usually the beams are invisible too, so that picture above is mildly inaccurate. Here’s the basic idea of how the project went:

image

image

I took a little field trip to Petco and Toys R Us to get a fish tank simulation setup. For the laser pointer, a laser light level I had in the shop worked really nicely, but any standard laser pointer will do.

Tank Setup

Building the light sensor/laser setup

I ended up using a real, visible laser for two reasons: first, it’s easy to line up against my light sensor, and second, because I’m shooting the beam through water and 2 glass panels (on either side of my tank), which might otherwise diffuse the beam’s heat profile. Dry museums have it so easy…

Tank Setup Closeup

On the other side of the tank, I have an Arduino with a light sensor elegantly taped to the glass.

Light Sensor Closeup

I cut a hole in the wallpaper – on the left side, the laser is hitting the sensor directly. On the right, I moved the laser away, so you can see it the light sensor more clearly.

image  image

Chris and I just have some basic code running on the Arduino to get analog readings out from the AMBI light sensor. (The dead simple up-and-running post from way back when, as well as the wiki here). I uploaded the code to the Arduino, checked the output from serial, it seems like I’m good to go!

Connecting the sensor setup to a web-connected Android/BeagleBoard system

I connected the Arduino + Light Sensor to the BeagleBoard/BeagleTouch/Android stack sitting in my freshly dug up Mystery Box.

Mystery Box Setup

For a recap on how to connect the Arduino and sensor outputs over serial to output to the BeagleBoard over Android, here’s a link to the Antipasto wiki post. (This can still be tricky even with the Android Ambrosia SD card, so email me justin@liquidware.com, or comment below if you get stuck.)
Once I was able to get readings from the light sensor/Arduino in Android, I wrote a quick little Android APK to do two things:
1) Flash a Red Alert on BeagleTouch screen
2) Trigger a tweet to be sent
Why Twitter? It’s excellent for posting event alerts in an easy to subscribe fashion, and it’s also really easy to have these alerts forwarded to SMS, email, and Facebook. And they have a pretty excellent API, which I’ll get to in the next section.

If nothing is obstructing the the light sensor, the laser drives a light value of about 700-800.

IMG_0255

BeagleTouch Android App Off

As soon as the laser is obstructed by Bruce the shark himself, that light value drops. Once it’s below 400, the Android program issues a Red Alert warning that the sensor has been tripped, and sends a tweet.

IMG_0256

BeagleTouch Android App On

This serial app, which Chris originally wrote for the Liquidware Amber, simply takes the values being sent from the Arduino/light sensor, then funnels it through the following logic:

A ratchet digital filter that detects when the sensor has been obstructed (and resets)
if ( (sensorVal < NIGHT_TRIP_POINT) && (ratchetCounter > ratchetMin))
    ratchetCounter--;

if (ratchetCounter == ratchetMin)
    time = NIGHT;

if ((sensorVal > DAY_TRIP_POINT) && (ratchetCounter < ratchetMax))
    ratchetCounter++;

if (ratchetCounter == ratchetMax)
    time = DAY;
Then here are a few of Bruce’s tweet alerts, stored in a String array:
String [] mTweets = {
        "Yum.",
        "Fish are friends, not food!",
        "I am a nice shark, not a mindless eating machine.",
        "Anchor! Chum!",
        "So, what's a couple of bites like you doing out so late?"
        };
Finally, bringing these two pieces together…

if ((time == NIGHT) && (prevTime == DAY)) {
    mAlertDlg.setVisibility(View.V
ISIBLE);

    mTweetIndex++;
    if (mTweetIndex >= mTweets.length)
        mTweetIndex = 0;

    Tweet tweet = new Tweet(mContext,
             mTweets[mTweetIndex]);
}
I posted the full source code to the Android serial reading application on Github, if you’re interested. Big thanks to the folks who developed the twitter4j Android library!

Twitter Alerts from Bruce the Shark

Two of the world’s most famous sharks have been named Bruce (see hints below):



So I figured @BruceSharkAlert would be a fitting Twitter handle. In order to make Tweets actually happen, the code above needs to be linked to an authenticated Twitter developer account. Logging in as BruceSharkAlert on dev.twitter.com, this is what I’ve got:

I created this application…

image

Filled out the forms and got authentication keys…

image

image

(which I neatly chopped out :) They’re required in my Tweet.java file, which requires an authenticated account to automate tweet posts:
package com.liquidware.
networkedserial.app;

import android.os.AsyncTask;
import android.util.Log;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;

public class Tweet {
    private static final String TAG = "Tweet";

    /** Name to store the users access token */
    private static final String PREF_ACCESS_TOKEN ="[***your key here***]";
    /** Name to store the users access token secret */
    private static final String PREF_ACCESS_TOKEN_SECRET =" [***your key here***] ";
    /** Consumer Key generated when you registered your app athttps://dev.twitter.com/apps/ */
    private static final String CONSUMER_KEY =" [***your key here***] ";
    /** Consumer Secret generated when you registered your app athttps://dev.twitter.com/apps/  */
    private static final String CONSUMER_SECRET = " [***your key here***] "//XXX Encode in your app
    /** Twitter4j object */
    private final Twitter mTwitter;

    /** Called when the activity is first created. */
    public Tweet(String message) {
            Log.i(TAG"Loading TweetToTwitterActivity");

            // Load the twitter4j helper
            mTwitter = new TwitterFactory().getInstance();
            Log.i(TAG"Got Twitter4j");

            // Tell twitter4j that we want to use it with our app
            mTwitter.setOAuthConsumer(CONSUMER_KEY,CONSUMER_SECRET);
            Log.i(TAG"Inflated Twitter4j");

            //tweet
            new postMessage().execute(message);
    }

    /**
     * Login and tweet
     */
    public class postMessage extends AsyncTask {
        @Override
        protected Void doInBackground(String... message) {
            loginAuthorisedUser();
            tweetMessage(message[0]);
            return null;
        }
    }

    /**
     * The user had previously given our app permission to use Twitter
     * Therefore we retrieve these credentials and fill out the Twitter4j helper
     */
    private void loginAuthorisedUser() {
            String token = PREF_ACCESS_TOKEN;
            String secret = PREF_ACCESS_TOKEN_SECRET;

            // Create the twitter access token from the credentials we got previously
            AccessToken at = new AccessToken(token, secret);

            mTwitter.setOAuthAccessToken(at);

            Log.d(TAG"Welcome back user.");
    }

    /**
     * Send a tweet on your timeline, with a //Toast msg for success or failure
     */
    private void tweetMessage(String message) {
            try {
                    mTwitter.updateStatus(message);
                    Log.d(TAG"Tweet successful!");
            } catch (TwitterException e) {
                e.printStackTrace();
            }
    }
}

Now Bruce is tweeting one of the above pre-programmed lines (borrowed from Finding Nemo)

sshot-149

Phone Perimeter Breach Alerts

From there, I just followed @BruceSharkAlert, and since I have Twitter via SMS already set up, all I had to do was text 40404 (my Twitter “short code”) the command ON BruceSharkAlert. Now Bruce’s Tweets show up on my phone every time he breaks the laser line:

image

Mike gives us a little video walkthrough here:


When my phone goes off, I like to tell people that my shark tweeted me. Anyway, that’s my tribute to Shark Week, but if I had more time, laser pointers, and light sensors, I’d probably set up a crazy grid defense system. Till next time…

IMG_0253

What else could I use this for? Let me know in the comments, over email at justin@liquidware.com or tweet me @liquidware

Monday, August 13, 2012

Recap: "Forever Sensor" at the RI Mini Maker Faire

On Saturday, Rith and I loaded up the car, and took the 30 minute ride down to Providence, RI for the 4th Rhode Island Mini Maker Faire!

During the faire, I had chance to explain the concept of the mystery box, and the rooster call it kept making.  The younger and artistic audience really like the concept of a digital rooster, and the engineers truly appreciated the technical hurdles or the DIY perpetually-powered wireless environmental study project.

At first, the customized Android Tablet, 2 deep cycle marine batteries, the Arduino, the light sensor, the temperature/ humidity sensor, the solar panels and Pelican case seemed like overkill, but once I explained our reasons for the project, a lot of makers started having their own ideas on what they'd do with something like this.
Personally, this was my first time back to the Providence Maker Faire since 2009, but it was a lot of fun, and I can't wait for the Maker Faire in New York!

Thursday, August 9, 2012

How to build a DIY perpetually-powered wireless outpost

Earlier this week, I had a mystery box of electronics and was looking for something to do with it. Thanks to Bryan from New Zealand, who asked about creating a wireless farm monitoring outpost…

The idea of a perpetual power supply comes up now and again, mostly in the context of a remote outpost. Naturally, the idea of creating mesh networks in the wild and digital dead drops appeal to my inner Bourne, but that’s a story for a different day.

image

This project is really broken out into two parts: the perpetual powering, and then doing something useful with the perpetual power.

Perpetual (Self-Replenishing) Power

I found a couple of Mike’s old boat motor batteries, along with some 12V solar panels we had here in the lab. Since the batteries were 24V, I put the solar panels in series. Some back of the envelope math, along with my handy voltmeter, suggested that the solar panels could charge the batteries at about 200 mAH outside in the sun.

For the month of August, here in the Boston area, I get about 13.5 hours of sunlight. That means, each day, I’m storing about +2700 mA per day.

image

Testing the system that I have in the mystery box (which I’ll get to in a second), I’m burning a low of -75 mAH and a high of –150 mAH. It averages out to be about –100 mAH, or –2400 mA per day, for a net of +300 mA per day.

The massive batteries ensure that things will keep going for a while, even if I’m wrong about how much sun is getting through, and if there happens to be an unexpected volcanic cloud over Boston that day.

The Mystery Box (a.k.a. awesome Pelican case o’ stuff)

I put the batteries in the box, along with a BeagleBoard xM, BeagleJuice 2nd Gen, and BeagleTouch, as well as a couple Arduinos to run sensors.

image

Mystery Box

The Pelican case itself is designed to be waterproof, although I hacked the neoprene o-ring in the front to run wires out of a single location. For testing purposes, I have a light sensor hooked up to the Arduino, and I have an AT&T 3G setup running from the BeagleBoard, which is sharing that Internet connection over WiFi to create a wireless hotspot. (If you look carefully at the top, I stuffed a wireless router in there as well)

There are three key links here, which each deserve a separate blog post complete with code:

Light Sensor to Arduino
Arduino with Sensor to BeagleBoard
BeagleBoard to 3G (I’ll write a blog about how to do this as well, but Dune made an excellent post, which got me started)

Towards the bottom, I also included a couple USB-powered speakers…  (Oh the possibilities! :-)

image

Matt helped me dig a hole in the ground to bury the case, and then we ran some of the wires through a PVC contraption we made to mount the solar panels and WiFi antenna. It’s not the neatest thing in the world, but it works.

image

I’ve built a (mostly) perpetually-powered outpost, using a Pelican case, solar panels, some boat batteries, and an Android-powered BeagleBoard setup that converts a 3G cellular connection into a WiFi hotspot, all while logging and uploading sensor data. Now all I need is a coffee maker, and I’ll basically have Starbucks!

Naturally Mike had a brilliant idea for a light sensor and speakers…after all, what farm outpost would be complete without a rooster’s cockadoodledoo every morning. So I present to you, Mike’s Digital Cock app :-)

Next week, I’ll break out each piece of the project into distinct tutorials, especially the 3G cellular modem + BeagleBoard + Android component, which quite a few folks have been asking about.

What would you do with a remote, perpetually-powered wireless outpost? I’m planning to save this one for Halloween to have a robotic, motion-detecting scarecrow…

Post your thoughts to comments, or get a hold of me on twitter @liquidware, or over email at justin.huynh@liquidware.com