I have two projects running right now…both are really grinding my gears. Colloquially speaking. You know what? That is a stupid term. Scratch that. I have two problems that I am trying to solve. Number one: figure out how to assign a dynamic IP address to my ethernet setup for the Arduino
Getting old. I need to figure this out in a hurry, as it will open up a whole range of project possibilities. I have been tempted to throw in the towel on this thing and go at it through the Android, but think I need to grind through this on principle. We’ll give it another few hours. Project two involves an image recognition algorithm. I am trying to port a Windows/Matlab proof of concept over to Debial/Octave. This has been my real time-suck…having issues with libraries. I’ll likely dump several more lunch hours into this guy…could be very cool if I can get it running. Pics once I get something aside from a command line to post. Stay tuned.
Spoiler1: This is awesome.
Spoiler2: I’ve never seen Minority Report.
I do know that there is some sort of hands free interface, and that is what I have put together.
Long story short, I have extended upon my PING))) project to include some sweet touchless home automation. I have the ultrasonic sensor interfacing with my garage door and a lamp, utilizing a servo and a PowerSwitch Tail, respectively.
Video contains a rare thumbs up from the author
Snippet? Oh, INDEED…
//DIY Minority Report
// Joseph Swanson | 2011
// https://swantron.com
// Setup
// LEDs connected to pins 11, 2-5
// Ping))) sensor signal to pin 7
// Servo signal to pin 10
// PowerSwitch Tail to pin 13
// Ping))) +, servo + to 5V
// Ground the shit out of everything
#include<Servo.h>Servo myservo;
int pos =0;
// Pin assignment
constint ledPin1 =11;
constint ledPin2 =2;
constint ledPin3 =3;
constint ledPin4 =4;
constint ledPin5 =5;
constint pingPin =7;
constint lampPin =13;
// Create variables to store LED states / lamp state
int ledState1 = LOW;
int ledState2 = LOW;
int ledState3 = LOW;
int ledState4 = LOW;
int ledState5 = LOW;
int lampState = LOW;
voidsetup() {
// Servo pin definition
myservo.attach(10);
//Define pins 1-5, lamp pin as output
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(lampPin, OUTPUT);
}
voidloop()
{
// Reset LEDs levels to low to begin loop
ledState1 = LOW;
ledState2 = LOW;
ledState3 = LOW;
ledState4 = LOW;
ledState5 = LOW;
// Reset Servo position to initial location
pos =0;
// Set duration variable
long duration, cm;
// Loop section for ping signal pin...start as output
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
// Listen with same pin
pinMode(pingPin, INPUT);
duration =pulseIn(pingPin, HIGH);
// Convert time to a distance
cm =microsecondsToCentimeters(duration);
// Configure this for LED sensitivity
delay(100);
// March through cm values...set levels where appropriate
if (cm <95) {
ledState1 = HIGH;}
if (cm <60) {
ledState2 = HIGH;}
if (cm <40) {
ledState3 = HIGH;}
if (cm <25) {
ledState4 = HIGH;}
if (cm <10) {
ledState5 = HIGH;}
if (cm <40&& cm >=30 ) {
lampState = HIGH;}
if (cm <25&& cm >=15 ) {
lampState = LOW; }
if (cm <10) {
pos =( pos +14 ); }
// fire all LED values...fire servo...fire lamp
digitalWrite(ledPin1, ledState1);
digitalWrite(ledPin2, ledState2);
digitalWrite(ledPin3, ledState3);
digitalWrite(ledPin4, ledState4);
digitalWrite(ledPin5, ledState5);
digitalWrite(lampPin, lampState);
myservo.write(pos);
delay(100);
}
longmicrosecondsToCentimeters(long microseconds)
{
// 340 meters per second...do some math
return microseconds /29/2;
}
As the code implies, I have set this thing up to look for pings in particular regions. The LEDs indicate where I am at, and the rest sort of plays out from there. The lamp is set up as a switch, with ON and OFF having separate regions. The servo/g-door opener is a simple ON when the region is occupied…similar to my previous setup.
Pretty flipping sweet. As usual, send any feedback my way. This is still in the proof-of-concept mode, and will likely get scrapped for parts soon. Not to mention, Katie will probably want to be able to use the garage door opener, which I disconnected to string that wire that I have running manually to the servo. Be prompt.
I will fully admit that a product that includes ‘solar’ in its name already has my attention. One of my ‘hindsight being what it is’ items involves biting the bullet, being broke, and going full on physics mode after undergrad. Montana State has a great solar physics department…could have been super nerdy. Next level nerd-dom. I guess I’m sort of trapped in this level nerd-dom. Still, solar perks up my ears. This product, then, already has my focus…
That watch, my friends, is a genuine Seiko SNE177 Mens Watch Black Stainless Steel Solar Quartz Link Bracelet Black Dial watch. I have been checking out Seikos for a while, and really like the look of the Seiko Solar Watches. Very cool. Bluedial has the Seiko SNE177 or a hundred and sixteen bucks (and some change) less than the retail value, which is a bonus. A bonus too would be the spec sheet to this device…good to 100m pressures and the whole works. Not too shabby. The time fight between watches and cell phones is still in full force. Watches are going strong still, due in large part to units like the Seiko Solar line. Stylish and practical…the colloquial double threat. I’ll keep you posted if I come across some geekier watch lines. Solar takes the early cake…
Introducing Open-er-o-matic 3000. OOM3K. My finest project to date. I have my Arduino poking around with a PING))) sensor, a servo, some LEDs, and best of all…my garage door opener. End result: some Star Trek-ass shit.
Check this footage of the OOM3K in action. Here, I had it configured to open the door when the ultrasonic sensor echoes off of something within 8 cm…
Not only is this thing awesome, but you can get all sorts of clear looks at my trusty Ronco Showtime rotisserie oven. Yard bird is a big hit at the old Swanson place.
There is not much to this code…I built it on top of the LED binary project code. Prepare for a bitchin’ snippet.
//Open-er-o-matic 3000
// Joseph Swanson | 2011
// https://swantron.com
// Setup
// LEDs connected to pins 11, 2-5
// Ping))) sensor signal to pin 7
// Servo signal to pin 10
// Ping))) +, servo + to 5V
// Ground the shit out of everything
#include<Servo.h>Servo myservo;
int pos =0;
// Pin assignment
constint ledPin1 =11;
constint ledPin2 =2;
constint ledPin3 =3;
constint ledPin4 =4;
constint ledPin5 =5;
constint pingPin =7;
// Create variables to store LED states
int ledState1 = LOW;
int ledState2 = LOW;
int ledState3 = LOW;
int ledState4 = LOW;
int ledState5 = LOW;
voidsetup() {
myservo.attach(10);
//Define pins 1-5 as output
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
}
voidloop()
{
// Reset LEDs levels to low to begin loop
ledState1 = LOW;
ledState2 = LOW;
ledState3 = LOW;
ledState4 = LOW;
ledState5 = LOW;
pos =0;
// Set duration variable
long duration, inches, cm;
// Loop section for ping signal pin...start as output
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
// Listen with same pin
pinMode(pingPin, INPUT);
duration =pulseIn(pingPin, HIGH);
// Convert time to a distance
inches =microsecondsToInches(duration);
cm =microsecondsToCentimeters(duration);
// Configure this for LED sensitivity
delay(500);
// March through cm values...output LEDs an servo
if (cm <80) {
ledState1 = HIGH;}
if (cm <64) {
ledState2 = HIGH;}
if (cm <48) {
ledState3 = HIGH;}
if (cm <32) {
ledState4 = HIGH;}
if (cm <16) {
ledState5 = HIGH; }
if (cm <16) {
pos =( pos +14 ); }
// fire all LED values...fire servo
digitalWrite(ledPin1, ledState1);
digitalWrite(ledPin2, ledState2);
digitalWrite(ledPin3, ledState3);
digitalWrite(ledPin4, ledState4);
digitalWrite(ledPin5, ledState5);
myservo.write(pos);
delay(100);
}
longmicrosecondsToInches(long microseconds)
{
// 1130 feet per second...transofrm inches
return microseconds /74/2;
}
longmicrosecondsToCentimeters(long microseconds)
{
// 340 meters per second...transform cm
return microseconds /29/2;
}
I hope you enjoyed this one. I had a fun time with this piece of crap. Plus, it has given me some ideas of how to extend this setup into something more refined. Spoiler: more awesome.
I really should have a running list of these mini-projects I have been cranking out. This one: using a PING))) sensor from Parallax Inc to drive LEDs for a set of values. Sounds boring, but it is sort of cool. Oh cool.
Picture time:
Video time:
Snippet time:
//Ping LED Levels
// Joseph Swanson | 2011
// https://swantron.com
// Setup
// LEDs connected to pins 11, 2-6
// Ping))) sensor signal to pin 7
// Ping))) + to 5V, - to ground
// Pin assignment
constint ledPin1 =11;
constint ledPin2 =2;
constint ledPin3 =3;
constint ledPin4 =4;
constint ledPin5 =5;
constint ledPin6 =6;
constint pingPin =7;
// Create variables to store LED states
int ledState1 = LOW;
int ledState2 = LOW;
int ledState3 = LOW;
int ledState4 = LOW;
int ledState5 = LOW;
int ledState6 = LOW;
voidsetup() {
// Start serial
Serial.begin(9600);
//Define pins 1-6 as output
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(ledPin6, OUTPUT);
}
voidloop()
{
// Reset LEDs levels to low to begin loop
ledState1 = LOW;
ledState2 = LOW;
ledState3 = LOW;
ledState4 = LOW;
ledState5 = LOW;
ledState6 = LOW;
// Set duration variable
long duration, inches, cm;
// Loop section for ping signal pin...start as output
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
// Listen with same pin
pinMode(pingPin, INPUT);
duration =pulseIn(pingPin, HIGH);
// Converttime to a distance
inches =microsecondsToInches(duration);
cm =microsecondsToCentimeters(duration);
// Write to serial out
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
// Configure this for fine tuning... 50 is noisy
delay(75);
// March through cm values...output
if (cm <128) {
ledState1 = HIGH;}
if (cm <64) {
ledState2 = HIGH;}
if (cm <32) {
ledState3 = HIGH;}
if (cm <16) {
ledState4 = HIGH;}
if (cm <8) {
ledState5 = HIGH; }
if (cm <4) {
ledState6 = HIGH;}
// fire all LED values
digitalWrite(ledPin1, ledState1);
digitalWrite(ledPin2, ledState2);
digitalWrite(ledPin3, ledState3);
digitalWrite(ledPin4, ledState4);
digitalWrite(ledPin5, ledState5);
digitalWrite(ledPin6, ledState6);
}
longmicrosecondsToInches(long microseconds)
{
// 1130 feet per second...transofrm inches
return microseconds /74/2;
}
longmicrosecondsToCentimeters(long microseconds)
{
// 340 meters per second...transform cm
return microseconds /29/2;
}
Synopsis time:
The code fires the ultrasonic sensor via a digital pin, listens via the same pin, does a little math to transform times to distances using the speed of sound, takes the distances and writes to various LEDs depending upon the value returned.
Think of the backup collision sensors that ship with many new vehicles…same deal. Instead of firing a speaker, I have fired 6 lights instead…more accurate, FTW!
I sort of want to mount this bad boy on my Trail-90. Or my Yukon…that would be ghetto goddamn fabulous. For real.
It seems like the interwebs is full of info regarding a prozac lawsuit of some sort. If you don’t believe me, let Google auto-complete “Prozac Lawsu..” and see for yourself…sites are popping up like whack-a-mole moles. Spoiler: they pop up incessantly. Pause for Prozac-bot:
So, what’s up with that? Birth defects. That is what is up with that. There has been a recall of certain antidepressants and anti-seizure drugs, of which Prozac has been included. Joking aside, some of these things, when taken by women during pregnancy may cause increased risks of serious congenital birth defects, heart defects, spina bifida, club feet, and even cleft palates. Scary stuff. If you fit the bill, hit that link at the top of this post. Good luck.
Parallax Ping))) sensor in the house. Literally.
This dapper-looking little guy can accurately measure distance from a few to a few hundred cm. It is very simple by design…basically just a sonar setup. My sketch sends out a signal and listens for the signal’s signature upon return…calculates time elapsed and interpolates distance using the approximate speed of sound. Slick like Rick. I hugged the sensor on my binary-project-having breadboard, as this is going to be incorporated in some way. My fr1st thought is to turn those LEDs into range holders, and output according to range. Could be awesome. Stay tuned.
My LED work-in-progress has manifested itself as a binary counter, with 100 ms accuracy. Like so…
Video of a video, for the win.
So, basically I have put together a counter that will gauge time from 0 to 25.5 seconds…i.e. 100 ms to 25600 ms. Cite the snippet:
//LED Sandbox v2
// Joseph Swanson | 2011
// https://swantron.com
// Setup... LEDs connected to digi 1-8, grounded
// Pin assignment
constint ledPin1 =1;
constint ledPin2 =2;
constint ledPin3 =3;
constint ledPin4 =4;
constint ledPin5 =5;
constint ledPin6 =6;
constint ledPin7 =7;
constint ledPin8 =8;
// Create variables to store LED states
int ledState1 = LOW;
int ledState2 = LOW;
int ledState3 = LOW;
int ledState4 = LOW;
int ledState5 = LOW;
int ledState6 = LOW;
int ledState7 = LOW;
int ledState8 = LOW;
// Create timestamp holder
long timeStore1 =0;
long timeStore2 =0;
long timeStore3 =0;
long timeStore4 =0;
long timeStore5 =0;
long timeStore6 =0;
long timeStore7 =0;
long timeStore8 =0;
// Configure interval for off/on
long interval1 =100;
long interval2 =200;
long interval3 =400;
long interval4 =800;
long interval5 =1600;
long interval6 =3200;
long interval7 =6400;
long interval8 =12800;
voidsetup() {
//Define pins 1-6 as output
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(ledPin5, OUTPUT);
pinMode(ledPin6, OUTPUT);
pinMode(ledPin7, OUTPUT);
pinMode(ledPin8, OUTPUT);
}
voidloop()
{
// Loop area...compare config for time to current
// time...write when config time is reached
if (millis() - timeStore1 > interval1) {
// re-write timestore
timeStore1 =millis();
// if the LED is off turn it on and vice-versa:
if (ledState1 == LOW)
ledState1 = HIGH;
else ledState1 = LOW;}
if (millis() - timeStore2 > interval2) {
// re-write timestore
timeStore2 =millis();
if (ledState2 == LOW)
ledState2 = HIGH;
else ledState2 = LOW; }
if (millis() - timeStore3 > interval3) {
// re-write timestore
timeStore3 =millis();
if (ledState3 == LOW)
ledState3 = HIGH;
else ledState3 = LOW; }
if (millis() - timeStore4 > interval4) {
// re-write timestore
timeStore4 =millis();
if (ledState4 == LOW)
ledState4 = HIGH;
else ledState4 = LOW; }
if (millis() - timeStore5 > interval5) {
// re-write timestore
timeStore5 =millis();
if (ledState5 == LOW)
ledState5 = HIGH;
else ledState5 = LOW; }
if (millis() - timeStore6 > interval6) {
// re-write timestore
timeStore6 =millis();
if (ledState6 == LOW)
ledState6 = HIGH;
else ledState6 = LOW; }
if (millis() - timeStore7 > interval7) {
// re-write timestore
timeStore7 =millis();
if (ledState7 == LOW)
ledState7 = HIGH;
else ledState7 = LOW; }
if (millis() - timeStore8 > interval8) {
// re-write timestore
timeStore8 =millis();
if (ledState8 == LOW)
ledState8 = HIGH;
else ledState8 = LOW; }
// digi-write LED state
digitalWrite(ledPin1, ledState1);
digitalWrite(ledPin2, ledState2);
digitalWrite(ledPin3, ledState3);
digitalWrite(ledPin4, ledState4);
digitalWrite(ledPin5, ledState5);
digitalWrite(ledPin6, ledState6);
digitalWrite(ledPin7, ledState7);
digitalWrite(ledPin8, ledState8);
}
Where to next with this effort? I’m thinking that I need to focus on doing this exact thing with fewer pins, and see if I can make that work. I have a few tactile switches around…perhaps some sort of dual-output. Could be cool…stay tuned.