Close

It's aliiiiive! (for real, this time!)

A project log for USBiano Mk. I

Hacked-apart Casio + AT90USB162 + LUFA = Simple PC Piano

RunnerPackRunnerPack 10/08/2014 at 16:280 Comments

Well, 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:

  1. 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!
  2. 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:

  1. Build the hardware
  2. Download and install WinAVR
  3. Download LUFA
  4. Unzip it into a folder called "LUFA"
  5. Copy the keyboard demo folder mentioned above into the folder containing the above "LUFA" folder
  6. 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.
  7. Open a terminal (I use the Mingw32 terminal installed as part of the RubyInstaller.org devkit), change to the project folder, and run "make"
  8. Flash the resulting .hex to your device and reset it to make it show up as a "USBiano Keyboard"
  9. Run OpenMPT and rock out!

The Code:

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

Discussions