Difference between revisions of "Rainboard - DIY Dynamic Rainbow Isomorphic Keyboard"
(→Button Shield Modifications)
|Line 101:||Line 101:|
== Button Shield Modifications ==
== Button Shield Modifications ==
The button shield
The button shield Serial
or for . The used the buttons , buttons were pressedthe
to with (). , the
was pin and on the . the button
== Musical Instrument Shield ==
== Musical Instrument Shield ==
Revision as of 13:30, 5 October 2012
- 1 The iPad version of the Rainboard (Musix) can be found at the main Shiverware webpage
- 2 Mailing List
- 3 Current State of the Rainboard
- 4 Active Development Updates
- 5 Hardware List
- 6 Acrylic Cutting and Moulding
- 7 Button Drilling
- 8 Button Insertion
- 9 LED Wiring
- 10 Button Wiring
- 11 Button Shield Modifications
- 12 Musical Instrument Shield
- 13 LED Connection
- 14 Arduino Code
- 15 Additional Shots
- 16 Future Plans
- 17 Issues / Limitations Encountered
- 18 External Links
The iPad version of the Rainboard (Musix) can be found at the main Shiverware webpage
The goal of the Rainboard is to create an Isomorphic Musix Keyboard that is easy to reconfigure and provides visual feedback to the user.
Current State of the Rainboard
The Rainboard is a 61 button isomorphic keyboard. Each button contains a RGB led in order to light up the button. A midi value is also mapped to each button. The colours and midi values of the buttons are set from an external source (currently the Musix iOS application, but could easily be set by any serial midi device) using sysex messages. This allows the layout to be change very rapidly. All that needs to be done is to use Musix to select the desired layout on screen and push a button to send the data to the Rainboard. The Rainboard then sets all the LEDs and midi values then stores these values in EEPROM to save settings across resets so the external device is not needed after the desired layout is set. When buttons are pressed the midi values are sent across usb to an iPad. Any MIDI program on the iPad can be used to create the audio (NLog Pro Synth is a favorite, Arctic Keys, or SampleWiz). In early version of the device we had an onboard midi instrument shield as well, but the sound wasn't great so we decided to remove it from future versions.
Active Development Updates
For a frequently updated list of development activity please watch the Rainboard Updates page.
The current hardware for the rain board uses standard DIY parts off of the internet.
- 61 - LED Pixel RGB 8mm Naked PCB  from Bliptronics
- 61 - Arcade Button - 30mm Translucent Clear  from Adafruit
- 64 Button Shield  from SpenzieLabs
- Arduino Uno Board 
- Musical Instrument Shield  (No Longer Used)
- iOS Serial Cable  - Redpark Serial Cable (No Longer Used)
- 0.220" (0.559 cm) thick x 24" x 24" piece of acrylic (plexiglass)
Acrylic Cutting and Moulding
A 48" x 24" x 0.220" piece of clear acrylic (plexiglass) was purchased to be the body of the rain board. This piece could easily be substituted with a piece of plywood or any other sturdy material. We only needed ~ 2' x 2' of the material for the board so we cut the sheet in half. The design for the Rainboard was developed as a CAD drawing and printed to scale. It was then taped to the acrylic.
Each button hole was punched in order to ensure accuracy. Each punch hole was then drilled twice with two different bits in order to ensure not to crack the acrylic. An adjustable hole saw was then used to drill each hole. This process proved to be difficult using a hand drill. A drill press would have likely been easier to use, however the one that we had access to did not offer enough room between the drill location and the back of the press in order to reach the inside of the acrylic. As well, the drilling of the holes caused the acrylic to melt and stick to the side of the holes. This forced use to use a Dremol in order to grind away the excess plastic. It was originally decided not to use a hole saw as they generally only come in 1 1/8" and 1 1/4" sizes and we needed a size of ~ 1 3/16". However, it might be able to use a 1 1/8" hole saw and then Dremol the hole slightly larger.
After all the holes were created the rest of the acrylic was cut with a skill saw using a metal cutting blade. The process was loud but worked well. Although the cuts were not perfectly on the line, the end result was acceptable.
The acrylic was then placed on the edge of a table. For the first edge, a computer case door was placed on the acrylic with some weight on it to keep it flat. A heat gun was used slowly heat the acrylic so it could be bent down at a 90 degree angle. After this process was done it was noticed that a large bubble had formed on the acrylic top. A propane torch was used to head up the bubbled area. Weight was then put on it using the computer case door in order to flatten the area back out. For the other 5 sides the propane torch was used. The quicker heating appeared to work better. After all sides were folded down, the edges of the Rainboard were flamed with the torch in order to get ride of the edges caused by cutting. The end result is that the edges are clear and smooth.
In order to fit the LEDs into the buttons a hole was drilled into the bottom of each button casing. The top portion and plunger of each LED was removed. A 5/16" bit was used to drill a hole in the casing.
Each button was then inserted into the housing (still without the tops and plungers). Each was inserted with the same orientation. A large majority of the buttons fit well into the housing, however, about 1 out of 6 had an issue with the housing hole being too large. This caused the button to rotate easily or in a few cases, fall right through the acrylic. In order to remedy this issue hot glue was used to secure these buttons in place.
The LEDs were soldered in a chain the length of each button row using 4 wire ribbon cable. Sadly, we ran across a fair number (1 in 10) LEDs where the board was missing a capacitor. After soldering, each strand was tested to ensure all of the solder points were correct. All of the segments were then soldered into one long strand. Each light was inserted into the bottom of the button casing through the hole drilled. A couple dabs of hot glue was added to each side to secure the LEDs.
Before starting to wire the buttons, some care and consideration was given to the proposed wiring schematic. The button shield works by wiring 8 rows and 8 columns. Our button has 9 rows and 9 columns and its widest point. In order to keep the wiring clean and efficient, a scheme was developed where the rows and columns would hook up on two sides of the housing.
Each column was connected from the button with a diode in order to control voltage flow. This allows the shield to discern which buttons are pressed in the case that several buttons are pressed in similar columns and rows at the same time. The row side of the buttons was connected through using straight wiring. The end of each row and column was soldered to a ribbon cable which runs to the button shield.
Button Shield Modifications
The button shield can either use a SPI or Serial connection to the Arduino.
Much time was spent making sure that no button presses or depresses were missed. This is crucial for the instrument to perform well. The standard stress test that was used was to try to press all the buttons at once, then immediately lift off of the buttons. If all buttons were pressed, and non were stuck in an on mode, the communication was considered successful.
Originally this was accomplished by re-routing the Serial connection to pin 8 with NewSoftwareSerial v11b (as the hardware pins were originally used by the RedPark cable). This had some success, but was not perfectly stable. The standard SPI code provided did not provide the stability required either.
Eventually the final solution was found by using a custom interrupt on pin 2 and using SPI on the button shield. The custom interrupt routine grabs the data coming in from the button shield and stores it in a ring buffer that can be read by the main loop.
Musical Instrument Shield
(No longer used)
A Musical Instrument Shield was added to the project to allow the Rainboard to generate audio without the need for an external device. The input for the shield was rerouted to pin 5. The shield works with very low latency but does not have amazing sound output by any means. The latency between pressing a button and audio generation from the shield is unmeasured, but appears to be imperceptible.
The LEDs come with a LPD6803 chip which allows easy colour modification over 4 wires. However, one of the problems with this chip is that it requires constant clocking in order to perform PWM. The result is that the Arduino must constantly be sending data. The lights connect to the Arduino using two of the built in SPI Pins (11 - Master Out Slave In and 13 - Clock). By using built in SPI the lights an be updated much faster than bit banging and with less cpu usage. The library that was provided by the buttons worked but took much of the cpu time causing button and serial issues. By switching to the Fast SPI library many of the issues eased off, but did not completely go away.
The sketch code uses several static tables to map between button/row numbers, led numbers, midi numbers, and note numbers. The note numbers are used as the top layer of abstraction for note location.
The current code is rather simple as all the layout manipulation is done on the iOS Musix side. The Arduino listens for button presses/depresses as well as serial communication. When a button is pressed midi data is sent to the music shield and Musix. As well, the led colour of the note is changed to white. When the button is released the colour changes back to its previous state and a midi off message is then sent to the music shield and to Musix. Currently the Rainboard only listens for midi sysex input from Musix. One sysex message is used to send colours and a second is used to send midi values. All communication between Musix and the Rainboard is done using the native note numbers, not midi values.
Being as the buttons do not have double press detection, the keys are not velocity sensitive. However, we are going to try to add an accelerometer to the centre of the board in order to try and allow some velocity sensitivity.
We are also considering adding touch strips of joystick buttons to the sides of the Rainboard in order to allow layout dragging (as is done in Musix) or to allow dynamics information to be input.
Issues / Limitations Encountered
Bliptronics lights / SPI / Serial breaking
The Arduino library  that comes with the bliptronics lights uses SPI  in order to send data to the lights quickly. It was found that once the blip library was included with the project and init was called, hardware serial data receive (rx pin 0) on the arduino would not work. The current explanation is that the blip library spends a large quantity of time inside an interrupt. This is causing the serial rx interrupt to not be fired and the receive data is lost. So cercumvent this issue, SoftwareSerial is used instead of hardware serial. For more details on the issue please visit Rainboard SPI LED Serial Conflict page.
SerialSoftware (NewSerialSoftware v11b)
In order to work around the broken hardware serial rx, a software serial solution called NewSoftSerial  was used. The version currently being used is version 11 beta . This library will like replace the SoftwareSerial library included with the Arduino software. The serial connection is used to talk to the red park serial cable. It appears that connections from the Rainboard to the iPad worked fine, but data would get corrupted from the iPad to the Rainboard when sending more than a few bytes. This issue has been fixed by altering the timing of the serial receive delays. For more details on the issue please visit Rainboard NewSoftSerial.