-
It's aliiiiive! (for real, this time!)
10/08/2014 at 16:28 • 0 commentsWell, if this project wasn't in "hack territory" before – despite an actual hacksaw already having been part of the process ;) – it's definitely there now!
Yesterday, I removed all 32 "anti-ghosting" diodes, and reinstalled them the other way round (except for the one I broke, which I replaced with one from the ol' junk bin). I did this for a couple of reasons:
- Due to the AVR only having pull-up resistors available on the inputs, the diodes forced me to scan the eight columns, and read the four row inputs, meaning each complete scan took eight iterations of a for loop. Now that the columns are connected to inputs, I can scan the rows, which results in a loop with only four iterations – a 50% speed-up!
- Using the simplest wiring layout, the keyboard is logically laid out as rows of columns. By scanning the columns and reading the rows, I received every eighth key, compressed into a nybble. I didn't technically have to, but to make the key-code map easier to edit, I was unpacking these nybbles to represent consecutive keys as consecutive bits. I suspected that this was the source of my "shifted-columns" problem (although I still have no idea what, exactly, was causing it).
With the above changes to the hard- and firmware complete, it works great! As for the source, I think I'll skip github and just share an archive of the four files that differ from the LUFA keyboard demo (Demos/Device/ClassDriver/Keyboard in the LUFA package, at time of writing) and the .hex file (although, according to various web searches, I appear to be the only person on the planet still using an AT90USB162 at all, much less this particular carrier board :P).
Since I can't attach (non-image) files to the Hackaday.io project, and I don't want to maintain the file on an external hosting service, and the file is so small, I'm going to include a Base64 encoded version of "usbiano.zip" at the end of this post.
To use it:
- Build the hardware
- Download and install WinAVR
- Download LUFA
- Unzip it into a folder called "LUFA"
- Copy the keyboard demo folder mentioned above into the folder containing the above "LUFA" folder
- Covert the Base64 data back into a .ZIP file, and unzip it into the new Keyboard folder, preserving its folder structure and overwriting existing files.
- Open a terminal (I use the Mingw32 terminal installed as part of the RubyInstaller.org devkit), change to the project folder, and run "make"
- Flash the resulting .hex to your device and reset it to make it show up as a "USBiano Keyboard"
- Run OpenMPT and rock out!
The Code:
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
-
It's Coming Along…
10/07/2014 at 03:52 • 0 commentsI know… Thurs was quite a few days ago. I did get the headers then, and I even used them to rig up the new cables the same day. As you can see in the spiffy new photo, I decided to use separate cables for the columns and rows; one 8-pin, and one 4-pin, respectively. This was useful when I moved the rows to port C as a test (which, unfortunately, didn't solve any of my problems). Since this isn't the final resting-place of either the keyboard or the dev. board, it'll also make the reuse of either one much easier.
On the software side, I flipped the keymap the right way round, so that part's working better. I also solved a problem I was having which I didn't mention in the last log entry. Every key was sending a keystroke, but the entire right half of the keyboard was sending the same keystroke. I thought this was just a couple of row lines not making connection, and it would be fixed when I added the new cables/plugs. When I tried it out after the hardware update, it was still happening. I eventually tracked it down to the compiler defaulting to a 16-bit data type, when I need a 32-bit. So, that's fixed, and I get a different keystroke for every key, but the "rotated one column to the left" problem is still there.
Here are some things I've checked:
- The pins on the board are indeed the pins they claim to be on the actual AVR chip.
- The pins on my added connectors correspond with the switches according to the PCB traces.
This leads me to the inevitable conclusion that there is something amiss in the software, but I cannot figure out what it could be. If I'm shifting the wrong number of places, it seems like the "upper" column bit would be lost, not magically wrapped around to the "lower" column! If it was an "off by one" error in the switch-to-keycode map, the whole keyboard would be shifted, not each individual row! It's maddening! (And it's even more maddening knowing that it's something extremely simple that someone with more experience will spot immediately…)
Anyway, that's where I am now. I could start using it now, if I readjusted the key map to compensate for the key rotation, but I really want to know why it's doing that, rather than just cludge a work-around. I'll work on getting the code up on github, ASAP.
-
It's aliiiiiive! (after a fashion…)
09/29/2014 at 07:38 • 0 commentsWell, I loaded the "alpha" firmware, temporarily connected the keyboard, and fired it up. No magic smoke was lost (not that I was expecting any, since the board worked fine with the LUFA joystick demo), and it enumerated as a keyboard.
I pressed the low "F" key, and… I GOT A KEYSTROKE! Of course, it was the wrong one… but, hey, at least it's something, right?
It turns out I somehow got the key-map "end-for-end", despite drawing a really nice diagram of the rows and columns. Something slightly more odd is the fact that each "row" is rotated one "column" to the… left, I think… yeah, left. I'm assuming this is a software problem, since the matrix is very straight-forward, but I can't figure out why it's happening. Once I get the source posted, I'd appreciate some more eyeballs seeing what I'm missing and letting me know about it.
First, though, I have to get the keys properly connected to the board. I've ordered some single-row, male headers from fleaBay. I'm going to replace the tiny piece of ribbon-cable on the keyboard with a longer one from an old floppy cable, and put some pins on the other end. I'm going to put another set of pins on the AVR board. Then, I'm going to plug both sets of pins into a breadboard socket. Easy-peasy. They're estimating Thurs. for delivery of the headers, so I guess I'm on-hold until then (which will give me time to github-ify my code, and maybe post some pictures).