Tuesday, September 02, 2008

Real Men Use Reel Mowers

 
Why go through the hassle of using a loud and smelly gasoline powered mower that blows up dust and pollutes, when you can push a clean, quiet reel mower? I have a half acre lot (approximately) and I asked myself that question a little more than a year ago. I was toying with the idea of buying a reel mower and mentioned it to my friend Lee. It just so happened that Lee had a reel mower or two, or three, hidden away in the corner of his garage. He gave me two of them and I have been using them to mow my lawn for more than a year now. I've worn a heart rate monitor to calculate the calories burned while mowing and it requires about 1400 calories to mow my lot. Not too shabby. Of course, now my gas mower won't even start so I'm stuck with the reels whether I like it or not.
Posted by Picasa

Thursday, July 10, 2008

Project Idea 3167: Means of driving a generator with a bicycle.

I just remembered that I had this idea at work the other day and I figured that I'd get it down here for future reference. Also, if anyone actually reads my page and likes the idea and does it, I would like for them to send me pictures for my blog so that I can live vicariously through them, as if I too was capable of completing a project. Anyway, my idea involved running a generator(or another mechanism of some sort) off of a bicycle while it was held stationary, such as on a trainer. I've seen some people dismantle trainers and repurpose them, but what if you don't want to destroy a perfectly good trainer? That's where my idea comes in. Assuming that the trainer is like mine and allows you to adjust the wheel that adds resistance such that it no longer touches the rear wheel of the bike it is a pretty simple idea. Otherwise you would have to remove the tire from the rear wheel so that it can spin freely, with no resistance from the trainer. You can then put the rear derailleur into the lowest gear(largest sprocket) and run a chain from your device(ie. generator, blender, grain mill, etc.) to the highest gear(smallest sprocket) so long as the chain is aligned properly and you don't shift the rear derailleur it seems plausible that this would provide a means to power such a mechanism without drastically modifying the trainer, or the bike. Furthermore, this could also be used to drive things mounted to the bike when it is not mounted in a trainer, provided that it is mounted in such a way that the chain does not interfere with anything such as the rear tire or chainstay.

I suck at finishing projects!

Seriously, I suck at finishing projects. I have so many ideas for projects and gadgets but I never get around to them. I wish that that was not the case but it is. I have started soooo many projects and they all remain in various states of progress. I'm not sure what my problem is exactly. Maybe I'm a perfectionist and won't finish a project unless it is absolutely perfect... I think that it is more likely that I'm just a lazy sack of crap. Regardless, things have to change. I think that I need to prioritize my projects better such that I can work in an orderly fashion. Yeah, that's what I'll do; I'll make a list of projects and order them by priority level. I'll do that first thing tomorrow. Yeah, first thing tomorrow.

Monday, June 30, 2008

Current projects

I saw my friend Michelle's blog and it reminded my how badly I've neglected mine. I figure that I may as well post an update of what I've been working on lately even though I never remember to take photos while I do these projects, and posts never seem that interesting without a pretty little picture.
Lisa and I have been doing a bit of work in the basement since it flooded again in February when the rains came whilst the snow and ice was still present in the back yard. Our back yard isn't well graded to begin with, so when the low spots are filled with snow and ice there is not a clear path for water to flow away from the house. It thus flows into the house, through the back door. This is not a good thing. Our basement did have a family room with wall to wall carpeting, and wainscoting on the walls, prior to the flood. After the flood we tore the carpet and some wainscoting out, along with some Sheetrock that got moldy. We have managed to do some Sheetrocking (by we I mean my dad did the Sheetrocking while I watched in amazement at the fact that what would take me weeks to accomplish too him mere hours) and painting. I've begun to lay flooring down. We decided to go with Marmoleum Click because it is relatively easy to install, and made from natural materials. Unlike the carpet that it replaced it won't do the following: off-gas formaldehyde, collect dust/dust-mites, smell like a wet dog. Before winter comes I will have to take steps to remedy the whole flooding thing so that we don't have to replace this floor since it is NOT CHEAP. So far it looks pretty excellent though, so I hope that we will be happy with it.
I've been trying to get my mountain bike ready for my bike trip in September with the boys on the San Juan Hut System Mountain Bike Adventure. My fork hasn't been rebuilt since I bought the bike in '02 so I figured that I had better do that before it died on the trip. Unfortunately for me Manitou only sells rebuild parts for forks for four years after they are sold. You do the math. So I had to spend $300 on a new fork. I may do a writeup on the installation, but it is pretty much covered elsewhere. Aside from that I have replaced the worn brake pads as well as the brake levers that have been thrashed via a few crashes. I still have to get around to replacing some cables and cable housings that are getting pretty ratty looking. I also bought a new wheelset when I got the fork but I think that I'll trash my old wheels until the trip so that I'm riding on fresh new, true wheels. I'll have to be sure to true my old ones a few times between then and now so that I have soe experience in case someone's wheels get tweaked on the trail.
I've also been doing a lot of work on myself physically. I've been really tracking my calories (kilocalories) and trying to stay below 2000 per day. I've managed to lose about forty pounds so far, so I may not die on the bike trip. I may, however, die during the triathlon that my wife has signed us up for. Still a bit worried about the half-mile swim. I bike about fifty miles a week and we've been to the the pool a few times. I even swam about three-quarters of a mile last week. I still haven't done it without grasping the side of the pool a few times to take a bit of a breather though, and the triathlon will be in the Long Island Sound, not the community pool. I think that we may have a chance. I suppose it will be a whole different story when I am faced with the fact the I can swim, drown, or face the humiliation of screaming for help.

Wednesday, April 30, 2008

Rear Derailleur Adjustment

To the best of my ability I'm going to attempt to describe to you how to adjust the rear dérailleur of an index shift bicycle. I've recently been taking a bike repair workshop at The Devil's Gear in New Haven, CT so this is an attempt to share the knowledge that I've gained with anyone that cares to do their own bike maintenance. The following instructions also apply to the procedure for adjusting the rear dérailleur following the replacement of the rear dérailleur cable.
First, put the front derailleur onto the middle chainring, assuming you have a triple. Second, put the chain in highest gear(smallest cog) and make sure that the shifter is also in the highest gear. Turn adjustment barrel all the way tight(Clockwise???), then loosen one full revolution. Loosen the screw that holds the cable onto the rear derailleur. Pay attention to the tab on the washer that clamps the cable in place. Apply light tension to the cable and tighten the screw to fasten the cable end. Turn high limit until top pulley is aligned with smallest cog. Turning the limit screws adjusts the limit of travel of the pulleys. Tightening restricts the travel, while loosening allows more travel. Spin the cranks and shift the rear dérailleur down to the next cog. If the derailleur does not shift to the next cog with a single click then tighten the cable tension with the barrel adjustment until it will. Adjust the barrel to make the top pulley aligned with the second highest cog. Now you should be able to shift up and down through all of the cogs smoothly; with the possible exception of the lowest cog. If the derailleur will not put the chain onto the lowest cog then you first need to adjust the low limit screw to allow it to move far enough to do so. To do this, hold top of the derailleur and loosen the low limit screw. Now shift into the lowest cog and adjust the lower limit screw until the top pulley is inline with the lowest cog. Shift up and down through the full range to verify proper operation.

Friday, December 21, 2007

Using a parallel interface LCD with Arduino















Hitachi HD44780-compatible LCD's are very cheap and readily available from many electronics suppliers, ebay, even from junk that you may find at tag sales. They are also relatively easy to use with microcontrollers, especially when using libraries that reduce the code to a few lines. There are two such libraries available for the Arduino. One is the 8 bit library and one is the 4 bit version. Both libraries end up performing the same basic function, but the 4 bit version requires much fewer digital outputs from the Arduino. This is a huge benefit if you intend to do more than just display messages on an LCD. I wired up the LCD using an IDE cable that I had leftover form and old computer. I just cut it in half, bared the wires, labeled them according to which LCD pin they corresponded with, and tined them with solder to ease inserting them into the breadboard. The labeling was done according to the spec sheet for the particular LCD that I have and the wiring was done according the page describing the 8 bit library. The only difference in the wiring for the 4 bit library is that the R/W lead was connected to ground and data bits 0-3 were not connected at all. When you download the 4 bit library there is an example program included. I modified the example code a bit to suit my tastes. The code is included after the video. Eventually I'll bother narrating these videos. Not there yet.


//example use of LCD4Bit library

#include
//create object to control an LCD.
//number of lines in display=2
LCD4Bit lcd = LCD4Bit(2);

void setup() {
pinMode(13, OUTPUT); //we'll use the debug LED to output a heartbeat

lcd.init();
}

void loop() {
digitalWrite(13, HIGH); //light the debug LED

lcd.clear(); //clear LCD
lcd.printIn("All your base"); //print "All your base"
delay(1000); //wait 1 second
digitalWrite(13, LOW); //turn off the debug LED

//print some dots individually at end of first line of text
for (int i=0; i<6; i++)
{
lcd.print('.');
delay(100);
}
//print something on the display's second line.

lcd.cursorTo(2, 0); //send cursor to the beginning of line 2
lcd.printIn("Are belong to us"); //print "are belong to us"
delay(1000); //wait for 1 second
lcd.leftScroll(20, 100); //scroll entire display 20 chars to left, delaying 50ms each inc
}

Monday, December 17, 2007

Adding Libraries to Arduino - 0010

I'm not sure if the way that libraries are setup has drastically changed since Arduino - 0004 or what, but the tutorial for using an 8 bit LCD display by using the "LiquidCrystal" library needs to be corrected. In this tutorial it says to download the zip file and then paste the "LiquidCrystal" folder into the "arduino-0004\lib\targets\libraries" folder. I assumed maybe that there was a corresponding "arduino-0010\lib\targets\libraries" folder in the latest version of the IDE. I was wrong. There is only a "arduino-0010\lib" folder. I therefore created subfolders to match the file path given, resulting in "arduino-0010\lib\targets\libraries". This did nothing for me. I then tried to just paste the library into the "arduino-0010\lib" folder but this too did not result in the library being visible in the Sketch>Import Library menu. Knowing that there were libraries already working in the Arduino IDE I did a search for *.h and found the import libraries to all be saved in the "arduino-0010\hardware\libraries" folder. I pasted the library into that folder, and presto, it worked! OK, so that's not entirely true. The Arduino IDE listed it in the Import Library menu however it gave a weird error at the bottom of the window. I then tried the 4 bit version and it shows up without an error. That's fine with me as the 4 bit requires fewer wires. I'll have to get it wired up and put up a post soon. Anyway, to sum up what I've found regarding loading libraries into the Arduino IDE(version 0010); paste them into "arduino-0010\hardware\libraries".

Saturday, December 15, 2007

Arduino POV


I´ve been wanting to make a POV(Persistance of vision) device like the one that Ladyada sells on her site for a while now because I think that they are pretty cool. For those unfamiliar with POV devices, they use the fact that images or lights remain in your vision for a small amount of time after you first see them to make a moving column of lights write text by flashing them at a specific sequence. I found the code on the Arduino playground and just changed the test at the end of the program to say ¨NOT A BOMB¨. A little bit of a dig at the Boston police department. My device looked a whole lot more like a bomb than those that caused the ridonculous bomb scare in beantown. Anywho, the code can be seen below. I´ll try to get the pictures that Lee and I took at work the other day and post that ASAP.

/*
????????????????????????????????????????????
persistence of vision typography with arduino
michael zoellner - march 2006
http://i.document.m05.de

connect anodes (+) of 5 leds to digital ports of the arduino board
and put 20-50 ohm resistors from the cathode (-) to ground.

the letters are lookup tables consisting arrays width the dot status in y rows.
????????????????????????????????????????????
*/


// defining the alphabet
int _[] = {0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0};
int A[] = {0,1,1,1,1, 1,0,1,0,0, 0,1,1,1,1};
int B[] = {1,1,1,1,1, 1,0,1,0,1, 0,1,0,1,0};
int C[] = {0,1,1,1,0, 1,0,0,0,1, 1,0,0,0,1};
int D[] = {1,1,1,1,1, 1,0,0,0,1, 0,1,1,1,0};
int E[] = {1,1,1,1,1, 1,0,1,0,1, 1,0,1,0,1};
int F[] = {1,1,1,1,1, 1,0,1,0,0, 1,0,1,0,0};
int G[] = {0,1,1,1,0, 1,0,1,0,1, 0,0,1,1,0};
int H[] = {1,1,1,1,1, 0,0,1,0,0, 1,1,1,1,1};
int I[] = {0,0,0,0,1, 1,0,1,1,1, 0,0,0,0,1};
int J[] = {1,0,0,0,0, 1,0,0,0,1, 1,1,1,1,1};
int K[] = {1,1,1,1,1, 0,0,1,0,0, 0,1,0,1,1};
int L[] = {1,1,1,1,1, 0,0,0,0,1, 0,0,0,0,1};
int M[] = {1,1,1,1,1, 0,1,1,0,0, 0,1,1,1,1};
int N[] = {1,1,1,1,1, 1,0,0,0,0, 0,1,1,1,1};
int O[] = {0,1,1,1,0, 1,0,0,0,1, 0,1,1,1,0};
int P[] = {1,1,1,1,1, 1,0,1,0,0, 0,1,0,0,0};
int Q[] = {0,1,1,1,1, 1,0,0,1,1, 0,1,1,1,1};
int R[] = {1,1,1,1,1, 1,0,1,0,0, 0,1,0,1,1};
int S[] = {0,1,0,0,1, 1,0,1,0,1, 1,0,0,1,0};
int T[] = {1,0,0,0,0, 1,1,1,1,1, 1,0,0,0,0};
int U[] = {1,1,1,1,1, 0,0,0,0,1, 1,1,1,1,1};
int V[] = {1,1,1,1,0, 0,0,0,0,1, 1,1,1,1,0};
int W[] = {1,1,1,1,0, 0,0,1,1,0, 1,1,1,1,0};
int X[] = {1,1,0,1,1, 0,0,1,0,0, 1,1,0,1,1};
int Y[] = {1,1,0,0,0, 0,0,1,0,0, 1,1,1,1,1};
int Z[] = {1,0,0,1,1, 1,0,1,0,1, 1,1,0,0,1};
int colon[] = {0,0,0,0,0, 0,1,0,1,0, 0,0,0,0,0};

int letterSpace;
int dotTime;

void setup()
{
// setting the ports of the leds to OUTPUT
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);

// defining the space between the letters (ms)
letterSpace = 6;
// defining the time dots appear (ms)
dotTime = 3;

}

void printLetter(int letter[])
{
int y;

// printing the first y row of the letter
for (y=0; y<5; y++)
{
digitalWrite(y+2, letter[y]);
}
delay(dotTime);

// printing the second y row of the letter
for (y=0; y<5; y++)
{
digitalWrite(y+2, letter[y+5]);
}
delay(dotTime);

// printing the third y row of the letter
for (y=0; y<5; y++)
{
digitalWrite(y+2, letter[y+10]);
}
delay(dotTime);

// printing the sspace between the letters
for (y=0; y<5; y++)
{
digitalWrite(y+2, 0);
}
delay(letterSpace);
}

void loop()
{
// printing some letters
printLetter(N);
printLetter(O);
printLetter(T);
printLetter(_);
printLetter(A);
printLetter(_);
printLetter(B);
printLetter(O);
printLetter(M);
printLetter(B);
printLetter(_);

}

Tuesday, December 11, 2007

Arduino Knightrider


I finally got around to ordering an Arduino from Sparkfun.com. For those of you who don't know, Arduino is an open source platform for interfacing electronic devices with a microcontroller. More information can be found on arduino.cc. I've tried to used PIC microcontrollers in the past and found that the information available is more geared towards electronic professionals, and therefore over my head. The Arduino, on the other hand, is a collaborative project designed to be used by artists to make interactive art. If an artist can use it I sure as hell can :P The programming language is based on C, which is still a bit foreign to me, so I've resorted to asking my wife to help me since she is a computer programmer by trade. One of the first projects I've decided to make is an LED sweeper, similar to the lights on the front of Kit, the car from Knighrider. I wanted to make the lights fade in and out instead of just being on or off so I used pulse width modulation, which essentially pulses the lights really quickly; so quickly in fact that the human eye cannot easily detect it. You can control the percentage of time that the light is on by assigning a value between 0 and 255. 0 is off and 255 is on. With some help from wifey I wrote the following program to sweep 4 pairs of LEDs back and forth using pulse width modulation to make the LEDs increase in brightness and then decrease back to zero sequentially and then back down the line. A picture of the circuit can be found above and a video of the resulting sweep below the code.


/*
* Loopwithfade
* by mojomoney
*
* Lights multiple LEDs in sequence, then in reverse
* using pwm to fade, creating an incandescant effect.
* In this example 4 LEDs are used
*/
int delaytime = 3; // delay time between steps
int pwmincrement = 6; // value of increment to pwm value
int x; // number of times light sequence cycles
int i; // variable to keep the actual value
int ledpin1 = 9; // light connected to digital pin 9
int ledpin2 = 10; // light connected to digital pin 10
int ledpin3 = 11; // light connected to digital pin 11
int ledpin4 = 6; // light connected to digital pin 6
int value1; // intensity of led 1
int value2; // intensity of led 2
int value3; // intensity of led 3
int value4; // intensity of led 4

void setup()
{

}

void loop()

{ for(x = 0 ; x < 10; x++ ) // makes program cylce 10 times

{ for(i = 0 ; i <= 1530; i+=pwmincrement )

{ if (i<=255)

{
value1 = 255 - i; // fade led 1

value2 = i; // brighten led 2

analogWrite(ledpin1, value1); // sets value1 (range from 0 to 255)

analogWrite(ledpin2, value2); // sets value2 (range from 0 to 255)

delay(delaytime); // waits for 30 milliseconds to see dimming effect

}

else if (i<=510)

{

value2 = 510 - i; // fade led 2

value3 = i-255; // brighten led 3

analogWrite(ledpin2, value2); // sets value2 (range from 255 to 0)

analogWrite(ledpin3, value3); // sets value3 (range from 0 to 255)

delay(delaytime); // waits for 30 milli seconds to see the dimming effect

}

else if (i<=765)

{

value3 = 765 - i; // fade led 3

value4 = i-510; // brighten led 4

analogWrite(ledpin3, value3); // sets value3(range from 255 to 0)

analogWrite(ledpin4, value4); // sets value4(range from 0 to 255)

delay(delaytime); // waits for 30 milliseconds to see dimming effect

}

else if (i<=1020)

{

value4 = 1020 - i; // fade led 4

value3 = i - 765; //brighten led 3

analogWrite(ledpin4, value4); //sets value4(range from 255 to 0)

analogWrite(ledpin3, value3); // sets value3(range from 0 to 255)

delay(delaytime);

}

else if (i<=1275)

{

value3 = 1275 - i; // fade led 3

value2 = i - 1020; // brighten led 2

analogWrite(ledpin3, value3); // sets value3(range from 255 to 0)

analogWrite(ledpin2, value2); // sets value2(range from 0 to 255)

delay(delaytime);

}

else

{

value2 = 1530 - i; // fade led 2

value1 = i - 1275; // brighten led1

analogWrite(ledpin2, value2); // sets value2(range from 255 to 0)

analogWrite(ledpin1, value1); // sets value1(range from 0 to 255)

delay(delaytime);
}

}

}

}

Thursday, November 01, 2007

DIY Data Cable for Garmin eTrex

I have to start out by saying that I am terribly disappointed in Garmin for the exclusion of a data cable with there base eTrex GPS device, as well as the ridiculously overpriced cables that they sell to those who neglected to notice that none was included. I was almost one of those people. Not to mention that it seems as if there should be a way to program waypoints by entering coordinates. Even if doing so involved a tedious menu where you had to use the up and down buttons to increment/decrement the numbers until you got the value you wanted. Then at least you wouldn't absolutely need a $40 data cable. Okay, end of rant.
Upon doing some research I found that other people were a bit peeved at this as well and many had taken it upon themselves to fabricate there own data cables. One such man even made an injection mold and manufactures a few styles of connectors. He then sends up to two of these connectors to anyone that requests them for whatever price that they pledge to pay. They then send him that amount after they receive the connector, but only if they are satisfied with them. Seems like a pretty novel approach to commerce. Also on his site he other peoples' DIY eTrex plugs. A few of which were the inspiration for my own.
My plug is simply a piece of plastic shim stock cut to the width of the eTrex socket, with enough length such that I could hot glue the wires to it to secure them. Also, it is notched to fit the little boss protruding from the eTrex socket, and added notched where the pins need to be in order to contact the pins on the eTrex. To make the pins I soldered some leads that I had snipped off of some resistors and LEDs while making a light for my Jack-o-lantern to the appropriate wires of a serial cable. The pinout and another excellent cable build can be found here. I then bent the leads around the shim and put a mark behind the location where the eTrex pins were located. I used the marks to locate holes that I made by poking a shirt-pin through the shim. Then I bent the leads to poke up through the holes with an arch in them to ensure that they put pressure on the eTrex pins. After the leads were thus located I globbed some hot glue on the wires to hold them in place. I'll try to think of a more elegant way of fastening the wires later. For now the big glob of hot glue will have to suffice.