Puzzle Theory

I’ve been interested in puzzles for a while. I’m more interested in making them than solving them. Being an engineer, I tend to break things down and attack things systematically, so here’s my attempt at codifying a way to estimate puzzle difficulty:

Puzzle Theory

Digital Gaming Table Quick Prototype

I’ve been fascinated by the digital gaming tables I’ve seen on the net for a while now. This weekend I got the bug and decided to see what I could do with just the stuff I had lying around the house. I already had a small Ikea table and ceiling mounted projector up in the loft, so I figured I would try a top-down projection by placing a mirror in the beam path. A quick search out in the garage turned up a donor full-length mirror*. I cut it down to a decent size and proceeded to stand on a chair, holding the mirror in place to get an idea of how it would look.

It wasn’t too bad. Obviously I would eventually need to switch to a front surface mirror because I got quite a bit of ghosting, but the image was usable. Now I just needed a way to hold the mirror in place. Another rummage through the garage and I came back with an Ikea clamp-style goose neck lamp with a teeny burned-out halogen bulb. I knew it was unlikely I’d ever get around to replacing the bulb, so the lamp was harvested also**. Here’s the result:

I have checked several times to make sure the mirror isn’t getting hot, because I don’t want the glue to give way and drop the mirror crashing down on the table. No problems so far, it’s not even getting warm. Not bad for an hour’s worth of prototyping! And when I’m done, I can just un-clip the mirror, re-focus the projector and watch movies again.

*Every time I find something useful out in the garage, it reinforces my pack-rat tendencies. By this point in my life, I think it’s hopeless.

** See? There’s another one. Good thing I saved those, instead of getting rid of them!

Beagle-Book Update

Doesn’t look a whole lot different, but I’ve added a small cooling fan for the DLP and it’s been rewired to run from a single 5V@2.6A wall wart (sorry for the shoddy cell-phone pic) :
Case 4

Beagle Box

I got a BeagleBoard for Father’s Day. My plan is to put the BeagleBoard, the Pico Projector and a battery in a small box, write some ALife software and carry around a virtual world. Tonight I started mounting the board and projector inside a fake book:
Case 1
Case 1
Case 1

Simple Embedded Architecture for Robot Learning and Emotion

I’ve been working on a paper about robot learning for over a year now, more as a place to organize my thoughts than anything else. This paper outlines some ideas I’ve been having about how to implement a learning system that let’s a robot relate state-action sequences to a result. It’s still extremely sketchy, but I thought I’d make it public:
Simple Embedded Architecture for Robot Learning and Emotion
Sorry for the shoddy formatting, but that results from publishing a Google Doc as HTML.

I also have a few background documents that may be interesting* to some:

Senses/States Matrix
Emotional Effects on Outputs
Robot Emotions versus Movements

My current mental obsession is an ALife simulation running under Linux, and I thought I would try out this learning architecture in a simulated environment on a capable processor.

*I find this stuff extremely interesting, but then according to my teenage daughters I’m weird. Of course they think weird is a compliment.

Something useless for xmas

I needed a ~$5 gift for family xmas this year, and was at a loss. Then I remembered the Useless Machine from Make, also known as a “Leave Me Alone Box.”  I had a $5 box from the thrift store, a smaller version of the one I used for my iPad Charger.  After a lot of planning in AutoCAD and even more trial and error I came up with this:

It took me a while to figure out how to put it together with the cam attached to the lid, and my daughter suggested a rod & tube setup:

The cam is connected to the lid through a bearing and a brass “bicycle fork”:

When the cam spins, it lifts the lid enough for the arm to come out and flip the switch.

One thing that I did slightly different was use a 5V DPDT relay to reverse the motor instead of a DPDT  switch. This allowed me to use a SPDT switch with a lower actuation force.

Perl for Puzzlers

I was working on creating a puzzle a couple of weeks ago and needed sets of a dozen 5-letter words that all “interacted” in a certain way (sorry, don’t want to give away too much).  One of the software guys here at work suggested a Perl script to find sets words, specifically Strawberry Perl. I have been programming since I was a kid (basic on a VIC-20) but lately have been resistant to learning new languages because I can usually accomplish my goals with the languages I already know. This time I decided to take his advice and was pleasantly surprised with the simple learning curve and thought I’d pass on a bit of intro on how to set up and start using Perl to help create puzzles.

(more…)

Portable Electrick Storage Device – Mark I

My daughter has swim meets every Saturday morning from 7am until around 1pm. During this time she is actually swimming a total of about 4 minutes, so the entire family tries to stay occupied the rest of the day. Almost every week someone complains “Oh, man! My iPod is dead!” Answering the tinkerer’s call to arms, I would like to present the Portable Electrick Storage Device Mark I:

Outside

Inside

USB Connectors

Charging my iPad

Schematic

Closeup of foot

Battery and Connectors

Internal partition

The yellow piece is some scrap expanded PVC left over from a laptop desk I built for my wife a while back. The PCB is mounted to this, opposite the battery.

Partition & chamfer

The bottom of the partition is chamfered and held into place by another piece on the bottom. This lets it set into place easily, but still holds the battery in place tightly.

Specs:

  • Box – $6 brand new at the local thrift store, I only added electronics and handles. (I need to head back and get a couple more!)
  • Battery – 12V 7Ah (~12 iPod charges or 3.5 iPad charges)
  • Output – 5V @ 1.5A (will charge iPad while watching video)
  • Connectors – 3x USB Type-A female
  • 3A fuse directly on battery
  • Power switch with blue LED indicator

Plans for the future:

  • “Working” steam power plant
  • Microcontroller based monitor (Battery charge level, internal temp, etc) with 128×128 OLED screen
  • Embedded wireless web server (WRT54G based)

Steampunk PDA – Again

I have been convinced to add the Steampunk PDA back to my list of projects I am allowing myself to work on, so the list currently stands as Deskpet, Mazetrix, PDA and notebooks. I ordered the accelerometers for the next 3 Mazetrix tiles (should be here Monday), and I should be building a couple of notebooks for some guys at work, but this sounded like more fun.

I have been thinking about the PDA for a week or two now, and decided to make a custom case rather than attempting to use a pocketwatch case. I picked up a 2″ brass pipe fitting from the hardware store and  started shaping it on the lathe. It should be just about the right size…

PDA Case

Steampunk PDA Case - Size Comparison

PDA Case

Steampunk PDA Case

Steampunk PDA Case

Steampunk PDA Case

Steampunk PDA Case

Steampunk PDA Case

CAD Assembly

CAD Assembly

#mazetrix video 1

I spent about 4 hours programming last night trying to simulate the physics of a rolling ball on the AVR. I think it turned out pretty well:

Here’s the timer interrupt that services the analog to digital converter and the multiplexing of the LEDs:

ISR(TIMER2_OVF_vect){
static unsigned char activeLine=0;
static unsigned char adcChannel=0;
PORTC=0xFF;
PORTA=0xFF;
selectLine(activeLine);
PORTC=~green_display[activeLine];
PORTA=~red_display[activeLine];
activeLine++;
if(activeLine>7){
activeLine=0;
}
switch(adcChannel){
case 0: x_accel=(ADCH-x_flat)/10;
if((x_loc<500)&&(x_accel<0)){ x_accel=0; } if((x_loc>7500)&&(x_accel>0)){
x_accel=0;
}
x_vel=limit(x_vel+x_accel,-MAXVELOCITY,MAXVELOCITY);
ADMUX=0xE1;
adcChannel=1;
break;
case 1: y_accel=(y_flat-ADCH)/10;
if((y_loc<500)&&(y_accel<0)){ y_accel=0; } if((y_loc>7500)&&(y_accel>0)){
y_accel=0;
}
//if((abs(y_accel)>1)||(abs(y_vel)>20)){
y_vel=limit(y_vel+y_accel,-MAXVELOCITY,MAXVELOCITY);
//}else{
// y_vel=0;
//}
ADMUX=0xE2;
adcChannel=2;
break;
case 2: z_accel=(ADCH-125);
ADMUX=0xE0;
adcChannel=0;
break;
default: adcChannel=0;
}

}

And the main loop:

while(1){

if((abs(x_vel)>STICTION)||(abs(y_vel)>STICTION)){
x_vel=(int)((ELASTICNUMERATOR*(long int)x_vel)/ELASTICDENOMINATOR);
x_loc+=x_vel;
y_vel=(int)((ELASTICNUMERATOR*(long int)y_vel)/ELASTICDENOMINATOR);
y_loc+=y_vel;
}
if(x_loc<0){ x_loc=-x_loc; x_vel=-x_vel; } if(x_loc>7999){
x_loc=7999;
x_vel=-x_vel;
}
if(y_loc<0){ y_loc=-y_loc; y_vel=-y_vel; } if(y_loc>7999){
y_loc=7999;
y_vel=-y_vel;
}
x_pos=(unsigned char)(x_loc/1000);
y_pos=(unsigned char)(y_loc/1000);
plotBall(x_pos,y_pos);
_delay_ms(50);

}

Next Page »