The vaults are insufferably damp.

Friday, November 13, 2009

My go development box is a virtual machine

I've been playing around with the new go language from Google. It is a very interesting computer language. It is currently only supported on Linux and MacOSX. I've been watching the #go-nuts IRC channel on the past few days. A lot of the messages there are pleading for a Windows implementation. I also saw complaints about the mercurial source code version control system used (Oh no, not another version control system...).

Haven't any of these people heard of virtual machines?

I set up a Gentoo Linux image in Qemu and use that for learning Go. It doesn't matter that my laptop is running Windows, the tools I need for Go are right there in the vm. Install mercurial? All I had to do was emerge it. And since I wasn't installing it on my primary machine I didn't think twice.

With all the work I've done on embedded systems and Processing I just don't care so much about what OS or device some software will run on. I have the tools to connect the different platforms. This early release of Go seems especially suited for running network services, and I can whip up a Processing GUI for that, no problem. I do think that a ready-built vm image, either for Qemu or a VMWare appliance, would be a great thing.

Saturday, November 07, 2009

Arduino Audio Sandbox

I'm listening to my rendition of the 4ms Autonomous Bassline Generator. Here's how I put it together. First I needed a reasonable audio generator for the Arduino. I found an Adrian Freed Arduino sketch that makes a good sine wave using the PWM2 output. Adrian uses a 256 slot wavetable and some fixed point math. I took his wavetable and his interrupt routine and got that running. Next I wanted one octave of musical notes, so I looked up the frequency values and put them into a 12 slot array. I started with five notes in a melody array that I would cycle through over and over, but now that has grown to eight notes. I play that three times in a row, then generate a new set of melody nodes and run that.

The sine wave I was getting was good, but I wanted a raspier sound, so I added a second wave table (this one in RAM) and filled it with random values. My first attempt at mixing this with the sine wave failed. All I got was noise. I worked with the values some and got it working, but I think the next build will have a total volume level. The noise level is user variable, and the sine level is the master volume minus the noise level.

I used a LDR (light sensor) to set the noise level, but it was more fun to use it to alter the tempo. My desk gets a sliver of sunlight crossing it around 12:30 pm, so I set the Arduino on the desk. The music starts out slow, getting faster as the light moves over it, then slowing again as darkness returns. If a cloud passes in front of the sun that also slows the tempo.

This is more fun than you might expect already, but I have several ideas for continuing the project. I'm going to use one of my Arduino Pro boards to build this as a permanent fixture. I'll have to build an enclosure for it, with a built-in audio amplifier and speaker. I'll mount the LDR on top and a few variable resistors. I also want to try IR synchronization like the original ABG project. I'll probably add a breadboard section for experimenting with the generated audio.

On the software side I want to expand the melody section to three 'passages'. The default will be to cycle through each in turn, over and over again. A second mode will change just one or two notes in each passage. There will also be a way to replace all the notes in the melody at once. The goal here is to make a kind of musical game, with the Arduino playing the bassline and the human improvising over the top.

Saturday, October 31, 2009

USBtiny build notes

Spent a few hours this morning building the USBtinyISP AVR Programmer from Very happy to report that it went together easily and worked the first time out. Awesome! I did make one small blunder though. I should have read through the installation instructions before starting. You are supposed to put the LEDs one half inch over the pc board. I mounted them flush to the board, and now you have to look down into the enclosure to see them. I'm hoping a little work with coffee stirrers and perhaps a little hot glue can remedy the situation.

The online assembly instructions are very good. I did wait to install R7 as suggested and I was glad for it. One change I would make is to put the USB jack on after the 6 and 10 pin headers. The headers have a lower profile and I had to prop them up on something when I soldered them. Also, my kit had a smaller C2 100 microfarad capacitor than in the instructions. It fits in beside the '125 buffer chip so I didn't bend it over the '125.

After it was all assembled I turned off the solder iron and downloaded the Windows drivers. The USBtinyISP runs as an actual USB device and not as a serial port emulator, so for AVRDude you just use "-c usbtiny". That's a lot nicer than plugging in the Arduino and then trying to figure out what COM port it got. I connected it first to a project I have installed on the Evil Mad Scientist MegaXX8 target board but that didn't work. I'll have to sort that out later. Next I connected it to the six pin port on an Arduino. This time it connected and read out the device signature just fine. Last I hooked it up to a Larson Scanner I built with a Tiny2313 chip. Read that one also. This is so cool, now I have an AVR programmer that I can just plug in and use!

Saturday, August 08, 2009

Saturday Is Over

I didn't work on the morse code trainer or the dresser for Sarah. We went to the zoo and saw the baby giraffe. Then I went over to my inlaws and helped set up a new television. Why can't they just put up an external antenna? They need one if they want over-the-air television. Then I loaded the dishwasher, after that I took Cindy out for dinner at Mimi's.

Friday, July 24, 2009


August Challenge: Three Projects

It's been too long since I actually finished a project, so I'm doing a challenge: Complete three projects by the end of August. The goal is to complete the (final) design, construction, and programming of three projects. They will be all put together and provided with a safe home (installed in a box).

Here are the three I'm going to do:
-Morse Code Trainer
-In-car Thermometer
-Audio Signal Detector

More details will follow. Wish me luck!

Thursday, July 09, 2009

Artishop Update

The 'Choose Liberty' shirt is doing well. It is based on a scripture from Second Nephi:
Men are free to choose Liberty and Eternal Life --2 Nephi 2:27.

See for yourself at the Art Shirt Shop.

Tuesday, June 30, 2009

Watching Events

Suppose you have an event you want to monitor. It happens usually every 24 hours but could take as long as 72 hours, or longer in rare cases. Each time the event happens a log file is updated. Here's what I've come up with, using Powershell, Arduino, and a voltmeter:

#powershell - read time, update meter
$log = dir c:\logs\logfile.txt
$age = ((get-date) - $log.LastWriteTime).TotalHours
$meter = $age / 72.0
$serialPort.write("meter $meter")

Ok, that works, but you get a linear meter reading (0.0 to 1.0). Using a logarithmic scale makes sense here: Most of the time the event happens about daily. With a log scale the first day will take up the first 3/4 of the meter. If the meter gets beyond 75% (red zone?) something might be amiss.

$log = dir c:\logs\logfile.txt
$age = ((get-date) - $log.LastWriteTime).TotalHours
$meter = [math]::log($age) /4.27
$serialPort.write("meter $meter")

How does that distribute the time (from 0.0 to 1.0)? Try this:

1..15 | % {$_ * 6} | % {"$_ $([math]::log($_)/4.27)"}

If you run that (powershell again) you will see that at 24 hours you are using up to 0.74778. After 48 hours you get 0.91, and 72 hours is at 1.0.

For the Arduino you can make it easier by writing "meter $($meter * 256)". Then you can analogWrite the value to one of the PWM pins and connect that to your voltmeter. If the meter in question has a 3V scale you would use a voltage divider to scale the maximum 5V out to 3V full scale.

I currently have the Powershell side of this working, but instead of the Arduino I'm running the serial out through the MixW serial port bridge and back into a Processing applet.

Thursday, May 14, 2009

Frequency Counter Assembled

My frequency counter kit arrived today from The board wasn't exactly as described on but it was easy to put together. I put a red LED from my stock on it instead of the supplied green LED. I connected it to my USB hub, tweaked the LCD contrast, and there it was: 0 hz.

The circuit board was nicely done. When they added a USB miniB SMT connector they crowded the LCD contrast control against the 6 pin ICSP connector, but it looks like it will still work. The ICSP header wasn't included in the kit, so I added one, again from stock.

I want to build some radio frequency circuits, so hopefully this will help me tune them up. I'll probably add a divide-by-ten front end to it and some signal conditioning. The kit claims to work to 2MHz or higher. If I can get it up to 30 MHz with a prescaler I think it will suit me fine.

Monday, May 04, 2009

Soccer and Bowling

We went to William's last soccer game for the season, but the other team didn't show. So it was Parents and other family members versus the Blue Strikers. I played about 30 minutes. It was a fun game.

Then Ellen needed a couple of bowling games for her PE class, so I took Sarah and Ellen and we all bowled two games. I had the high score for the second game.

I'm not used to this much fun on weekends. Sunday I was tired and sore. But I got all kinds of wii fit credit now!

Thursday, April 16, 2009

So Much Snow

We woke up with four inches of snow on the ground! A large branch broke off our willow tree and barely missed our neighbor's truck. The willow had started putting on leaves, so when the snow fell on it it stuck and overloaded the tree. The other trees in our yard are probably fine, but we may not get any apricots this year. I spent half an hour shoveling snow this morning before I left for work. How much snow at work (30 miles north of home)? Just a trace, the grass is green and the sun is shining. Just a typical spring day here in Utah.

Friday, April 10, 2009

Art Bohn 1938-2009

My father passed away on March 31, 2009. He lived in West Jordan, Utah, with my older brother. We did manage to gather all my brothers and sisters, and we were all with him when he died. Dad always had a sunny disposition and he touched the lives of all he met. You can see a picture of him on the right of this blog.

I miss him, but I know we'll meet again someday.

Thursday, March 26, 2009

Apollo Guidance Computer

Wish I had one of these: Build your own NASA Apollo landing computer. Maybe I'll just build the DSKY terminal and use it for a desktop clock!

This is the sort of thing that cries out for a VHDL implementation. Any takers?

Monday, February 16, 2009

Unbricking a Tiny13

I set the fuses on my Tiny13 wrong. The firmware on it didn't seem to be working, and it wouldn't respond to the ISP programmer. Time to enter the exotic world of High Voltage Programming! OK, to me 12 volts isn't that high, but it's more than you normally provide for a Tiny13. The details of the protocol are in the datasheet, but they don't go into a whole lot of detail. HV serial programming is used on the low-pin-count Atmel parts. The larger Mega8 uses HV parallel programming, and there are published plans etc. if you need that. I didn't find much help online for HV serial.

I built a HV Serial programmer using a Tiny2313 chip. I matched PB0-3 to the same pins on the Tiny13, and used PB4 to switch the 12V line (pin 1 on the Tiny13) using a transistor. I wanted it to work like MightyOhm's HV Parallel Programmer, where you plug in the chip, then press a button to reset the chip. The LED on the board goes off when it starts the procedure, then back on when it is done. So I added a button and a signal LED to my circuit. I found an 18V wall wart to power the whole system. I used a 7812 voltage regulator, then fed that into the Arduino. I then pulled 5 volts from the Arduino to power the Tiny2313 programmer chip and the Tiny13 target chip.

I started the firmware by writing a skeleton that would wait for a keypress, then call the fuseReset function. I figured I would want to read the signature from the Tiny13 to show that the HV mode was working, so I made the LED flash a 'binary morse code' for the three signature bytes. This flashes four 'high nibble' bits (long for zero, short for 1) followed by a short pause, then the four 'low nibble' bits followed by a longer pause. I put three test values into memory and had the LED flash the values out one at a time.

So now I had test firmware running on the '2313 that would light the LED, wait for a keypress, turn the LED off, pause with the 12V line activated, then turn the 12V line off and flash my test values out in binary morse code. Now time to do the HV programming protocol. This involves waiting a bit for the HV enable signals to latch, then sending from three to six instruction (SII) and data (SDI) bytes while you toggle the clock line (SCI). The target chip responds over the SDO line. My hvx() function rotates through the Instruction and Data bytes (II and DI), sets the SII and SDI lines, turns on SCI, waits, reads SDO, then turns SCI off. I added two LED's so I could watch SCI and SDO as the chip was programmed. I had to slow the SCI clock way down so I could actually read the LED's.

The first time I tried it I could read three signature bytes, but only two of them matched the Tiny13. The other one was reading as '0xFF'. I realized that I was trying to read bytes 1 to 3, when I should have been reading 0 through 2. Got that fixed and it was working. Next I put in the code to set the lfuse to 0x6A and then read the value back. It kept coming back as 0xFF, turns out I had misread the datasheet and put in the wrong II values. When I got that fixed it would read back 0x6A. I tested it out on the 'normal' ISP system and sure enough, Tiny13 back from the brickyard!

As I worked on this project I had to ask myself, 'This is a $1.50 part. Is it worth all this trouble?' I think that I learned enough so say with certainty, 'Yes, it was worth it!' Next time I brick a chip I can repair it using my own firmware.

Thursday, February 05, 2009


Got myself the NGW100. This board has two ethernet interfaces and runs Linux. The processor is the AVR32 AP7 chip. I've got the buildroot software installed on my Linux laptop. I built the software and put it on a 512MB SD card, then I used uBoot to load the software. I like the newer kernel better than the one that ships on the board. I want to update the flash memory on the board.