When implementing USB on a microcontroller, most people are going to reach for V-USB if they’re using an AVR, one of Microchip’s USB libraries if a PIC is involved, or any number of the USB libraries for various ARM processors. [Kevin] had a different idea. As a challenge to himself, he wrote a USB device driver for the Teensy 3.1 microcontroller board, getting as close to the bare metal as he could get.
Writing a USB device driver first required a literature review. There are a few peculiarities in the Freescale K20 family of microcontrollers – the one found in the Teensy 3.1 – that dictate the need for a specific memory layout, using several clocks, and handling all the USB descriptors. [Kevin] started with the clocks, every last one of which must be enabled. The clock is generated by the Multipurpose Clock Generator from a 16MHz crystal, PLL’ed to the frequencies the USB module needs, and sent out over the System Integration Module.
Following the flowcharts and sequences found in the Freescale reference guide told [Kevin] exactly what needed to be done with the startup sequence, and offered a few suggestions on what needed to be done to set up all the interrupts. [Kevin] spent an incredible amount of time documenting, programming, and smashing his head against the keyboard for this tutorial, but he does give everyone a great opportunity to learn from his struggles.
While [Kevin] has a mostly complete USB device driver, his work is far from done. That’s alright, because this project wasn’t meant to be a full-featured driver; it’s still missing real error handling, strings in the configuration, and a real VID/PID. That’s alright, it’s still a great exercise in building something from scratch, especially something that very few people have built successfully.
Oh, blatant Hackaday Store plug for the Teensy 3.1.
If you travel often, use your mobile devices a lot, or run questionable ROMs on your phone, you likely have an external USB battery pack. These handy devices let you give a phone, tablet, or USB powered air humidifier (yes, those exist) some extra juice.
[Pedro]’s PeriUSBoost is a DIY phone charging solution. It’s a switching regulator that can boost battery voltages up to the 5 volt USB standard. This is accomplished using the LTC3426, a DC/DC converter with a built in switching element. The IC is a tiny SOT-23 package, and requires a few external passives work.
One interesting detail of USB charging is the resistor configuration on the USB data lines. These tell the device how much current can be drawn from the charger. For this device, the resistors are chosen to set the charge current to 0.5 A.
While a 0.5 A charge current isn’t exactly fast, it does allow for charging off AA batteries. [Pedro]’s testing resulted in a fully charged phone off of two AA batteries, but they did get a bit toasty while powering the device. It might not be the best device to stick in your pocket, but it gets the job done.
FTDI-gate wasn’t great for anybody, and now with hardware hobbyists and technological tinkerers moving away from the most popular USB to serial adapter, some other chip has to fill the void. The cheapest USB to serial chip on the market appears to be the CH340G, available for 20-40 cents apiece from the usual retailers. There is, however, almost no English documentation, and the datasheet for the CH340 family doesn’t include this chip. [Ian]’s here to help you out. He got his mitts on a few of these chips and managed to figure out the pinout and a few reference schematics. He even made an Eagle part for you. Isn’t that nice?
The CH340 series of chips do exactly what you would expect them to do: a full-speed USB device that emulates a standard serial interface, with speeds from 50bps to 2Mpbs. The chip supports 5V and 3.3V, and all the weird modem lines are supported. This chip even has an IrDA mode, because wireless communication in the 90s was exactly as rad as you remember.
With [Ian]’s help, we now have a cheap source of USB to serial chips. If you need the datasheet, here you go. The driver is a bit more difficult to find, but what you’re looking for is the CH341 family of chips. That can be found with a little bit of Google fu.
It is the unspoken law of cordless tools – eventually you will have extra batteries lying around from dead tools that are incompatible with your new ones. Some people let them sit in lonesome corners of the garage or basement; others recycle them. [Eggmont] was facing this dilemma with a Makita battery from a broken angle grinder and decided to make a USB charger out of it.
[Eggmont] took the simplistic approach, using an old cigarette lighter-to-USB adapter. First, [Eggmont] removed the battery connector from the bottom of the broken angle grinder. Next, the casing surrounding the cigarette lighter plug was removed so that the adapter’s wires could be soldered to the contacts on the battery connector. The USB ports were then glued onto the top of the connector. The adapter was rated 9-24V input, so it was fine to use it with the 18V tool battery. Since the battery connector is still removable, the battery can be recharged.
Tool manufacturers are tapping into the market of repurposing old batteries for charging mobile devices. Both DeWalt and Milwaukee Tool have now created their own USB adapters that connect to their batteries. Or, you can purchase the Kickstarter-funded PoweriSite adapter for DeWalt batteries instead. Compared to their cost, [Eggmont’s] project is very economical if you already have the battery at hand – you can find the USB adapter for less than $10 on Amazon.
Wanting to showcase their USB LED strip controller, the folks at Maniacal Labs built a POV LED stick this weekend. Yes, it’s pretty much the same as any other POV LED display you’ve seen; set a camera for a long exposure, wave the POV light stick around, and get a cool pixely image in mid-air. This build is a little different, though: it’s controlled over WiFi with a Raspberry Pi connected to a WiFi network.
The USB LED strip controller in question is the AllPixel, a small board that controls NeoPixels, WS2801, LDP8806, and a bunch of other LED strip controllers over USB. The Stick used for this project consisted of two meters of LPD8806 LEDs, giving 96 pixels of horizontal resolution. A big battery and Raspberry Pi rounds out the rest of the electronics.
Building a LED POV display isn’t that much different from building a LED matrix display; all you have to do is break up the image into individual columns and display them sequentially. To do this, the Maniacal Labs folks whipped up a LEDPOV class that does just that. To get the images, just open the shutter on a camera, wave the stick around, and if you get it right, you’ll have a great pixely image of nyan cat or the rainbow wrencher.
[Daniel] picked up a cheap USB handset to use with his VoIP provider, and included in the box was a CD with all the software that would make this handset work with Windows. [Daniel] is running Linux on his main battlestation, rendering the included CD worthless. Using the handset under Linux would be a problem; although the speaker and mic worked, the buttons and screen did not. No problem, then: [Daniel] just played around with the command line until he figured it out.
The handset presented itself to the Linux box as a soundcard and HID device. The soundcard was obviously the speaker and mic, leaving the buttons and display as the HID device. [Daniel] checked this out by running a hexdump on the HID device and pressed a few buttons. His suspicions were confirmed, and he could easily read the button with a little bit of Python.
With the speaker, mic, and buttons on the handset figured out, [Daniel] turned his attention to the one bit of electronics on the phone he hadn’t yet conquered: the display. After firing some random data at the phone, the display blinked and showed a messy block of pixels, confirming the display was controlled through the HID driver. Loading up usbsnoop to see what the original software does to update the screed showed [Daniel] the data format the display accepts, allowing him to control everything in this VoIP phone.