I've moved! Please go here: http://bafoontecha.com/2008/06/23/build-a-usb-bit-whacker-in-10-minutes/ for the latest version of this article.
Every so often you come across a reinvention of an old idea that blows you away, not only in its elegance but in its sheer utility. For me, this occurred a few weeks ago, when I came across the USB Bit Whacker. The name was familiar, I'd surely seen it while browsing the Sparkfun product catalog, but for some reason the description hadn't compelled me to click.
First, a bit of history... In the good-old days, computers came with these things called "parallel ports", or so I've been told (should that be active tense?) These "parallel ports", with a bit of register twiddling, empowered the user with 17-some-odd digital pins for inputting and outputting data. Newer computers computers tend to forgo parallel I/O methods for faster and sleeker I/O methods, ala, USB, USB, and USB. While these newer generation of I/O ports are much more compact and support higher bandwidths, they are a bit harder for the common user to interface with.
In comes the USB Bit Whacker. Calling the USB Bit Whacker a virtual parallel port is doing it a disservice; it's much, much more than that. It gives you complete control of a fairly powerful microcontroller, the PIC18F2550, through a serial, command-driven interface. The entire platform is powered from the USB bus, no wall-warts or additional wires! In addition, all communication occurs through a virtual serial (COM) port, using the USB CDC protocol.
Simple ASCII commands allow you to configure and use the following onboard hardware peripherals: SPI/I2C module, USART serial module, PWM module, and 13-channel 10-bit Analog-to-Digital converter module. Support for additional modules can easily be added to the open-source firmware.
I love microcontrollers, and primarily due to the generosity of Microchip, have a number of PICs in my parts collection. I came across the USB Bit Whacker project while desperately trying to get USB CDC working on a PIC18F2550. Encouraged by the extreme simplicity of the schematic , I decided to breadboard it. In a matter of minutes, I had a working development kit. You can either buy a kit, or follow these instructions to build your own.
- 220 uF electrolytic capacitor
- 0.1 uF capacitor
- 20 MHz oscillator (see the PIC18F2550 datasheet or additional options)
- 2 push buttons
- 1 USB Type B connector
- 2 3.3k resistors (the value of the pull-up resistor is not critical)
- 2 pieces of straight headers
- A few jumper wires
- A breadboard/perfboard
- 1 PIC18F2550 or PIC18f2450 microcontroller
- PIC Programmer
Prepare the USB connector by cutting off the mounting brackets
It should look something like this
Solder the header pins to the USB connector.
Original schematic (Credit: Brian Schmalz)
Begin placing the components on the breadboard
Completed breadboard USB Bit Whacker. (I left out the status LED)
Now that you have a completed Bit Whacker, you need to burn the bootloader onto your PIC. Instructions for burning firmware onto your PIC are out of the scope of this document. Luckily, you can find a wealth of information online. I use an MPLAB ICD2 clone that I purchased on eBay.
If you are using a 20 MHz oscillator, you can use this bootloader firmware. Additional bootloader firmware is available on the USB Bit Whacker homepage (Search for 'Bootloader'). (I know this is confusing, but the *Bootloader* firmware is different than the USB Bit Whacker firmware. You need to burn the *Bootloader* firmware onto your PIC first using a dedicated PIC programmer. After this, additional firmware updates can be done through the USB port!)
Bit Whacker in Bootloader mode
Once you've burned the Bootloader firmware onto your PIC18F2x50, you need to load the Bit Whacker firmware. Microchip provides a USB Framework, which comes with an application named PDFUSB.exe. Using PDFUSB, you can load Bit Whacker firmware onto your PIC. To prepare the PIC for loading firmware serially, you need to connect your development board to a USB port on your computer. Then, while holding down the "Program" button (the orange pushbutton in the picture above), press and release the "Reset" button (the black pushbutton in the picture above). The status LED on the prenatal USB Bit Whacker should be steady, and a Custom USB Device named "Microchip Custom USB Device" should show up in your Device Manager.
Download the latest USB Bit Whacker firmware, here. At the time of writing, this was v1.4.3. Load the PDFUSB.exe bootloader and select the firmware and the USB Board as follows:
Click on "Program Device" to load the firmware onto the PIC. Once the loading is complete, hit "Execute" to switch to the USB Bit Whacker Firmware. The status LED on the breadboard should begin to blink. Looking in your Device Manager, you should have a new COM port. On my machine, this shows up as COM4.
Now, open you serial emulator of choice (HyperTerminal, teraterm, etc...) and open up the serial port. If you're using a Mac, try "screen /dev/tty.usbmodem1d11 57600".
Type the following commands to set Port A on the Bit Whacker to analog input, and to set a timer to output values of the analog pins at a 100ms interval (Unfortunately, you won't see what you are typing, so if you think you've made a mistake just hit "Enter" and try again. The next revision of the firmware should fix this. Also, this isn't as big a problem as it seems now, keep reading!)
The first line calls the "Configure" command indicating that all five available pins on Port A are inputs, all the pins on Port B are outputs, all the pins on Port C are outputs, and the 5 Port A pins are analog inputs.
The second line calls the "Timer" command with an interval of 100 ms, in analog mode.
You should see a stream of 0's filling your terminal window. Try touching a few of the pins (2-7) to see the numbers change! You now have a rudimentary, but fairly powerful DAQ at your fingertips.
Further instructions on using your Bit Whacker can be found here.
The major advantage of having a command-driven interface is that it is easily scriptable. I like to write small Python scripts to control my USB Bit Whacker. I had an old Geophone from EPO Depot laying around my parts bin. If you click the link, you can see that a Geophone is a simple electromagnetic device which generates a voltage based on the displacement of a magnetic mass. It's useful for detecting low-frequency vibrations such as earthquakes, footsteps, and in some cases, a combination of both.
Scoping the output of the Geophone, I determined that the maximum voltage swing was around 4VPP (shaking it violently). The average VPP was around 100 mV. I wired up a quick op-amp circuit to center the Geophone output to 2.5V (1/2 the Bit Whacker rail voltage) and add a fair bit of amplification. I rely on the fact that the opamp can not exceed its supply rail voltage to protect the Bit Whacker inputs. This is generally not a good design practice, but hey, I was in a hurry.
I then wrote a Python script to capture the analog output of the Geophone at a sampling rate of 200 Hz. Download it here.
Plot of captured footstep data
The plot above is of four footsteps near the Geophone. From the plot, I suspect the op-amp is latching up, but that's something I'll save for another post!
I've made a number of Bit Whackers over the last few weeks and have made many modifications to the firmware, including adding SPI and I2C support. I've sent the changes to the developer, Brian Schmalz, who will hopefully roll them into the next firmware revision.
Here are a few pictures of the other Bit Whacker's that I've built. One way to prevent components from moving around is to hot-glue them.
Perf-board USB Bit Whacker