Review Index:

DIY Control Surface for Wirecast and XSplit

Author: Ken Addison
Subject: General Tech

Development Continues

Now that you have seen my proof of concept Arduino shield, let's take a look back at the development.

After I came up with the core idea, prototyping went quick. At the end of the first day, I had this device. Nice and simple, I had two momentary buttons as well as two LEDs connected to the digital pins on the Arduino. If the button on the left was pressed, the Arduino would send a keypress to the host OS it was connected to, and light up the left LED. If the button on the right was pressed, a different key press would be sent, and the other LED would illuminate. 

View Full Size

With a working concept I tackled the next issue, I/O. I knew that I wanted at least 8 buttons and 8 LEDs (ideally 16x16 or more), however the Arduino only has 13 digital IO ports. After doing some research, and comparing the merits of Shift registers and different IO expanders, I settled on the Microchips MCP23017. The MCP23017 is a 16-bit port I/O Expander which communicates over the I2C serial protocol. Using one of these ICs would allow me to expand to 8 inputs, and 8 outputs on the same chip. The interesting part comes when you daisy chain the chips, allowing expansion up to 128bit (64 in, 64 out in my case).

View Full Size

Arduino provides support for I2C through a library called Wire, which makes this process a breeze. The basic idea is to designate the two separate busses of the controller as input or output, and then you can request the current state of each bus. The output is returned as binary, and is positional as to what inputs are high. For example, if the 1st input on one bank of the controller were high, it would return 1. However, if the 4th input were high, it would return 1000. To combat this, I had to create a function, which contains a bunch of cases to return a decimal number from this nonstandard binary input.

int convertDecimal (byte binary)
int dec = 0;
if(binary == B1000)
dec = 3;
return dec;

After the input is sanitized to a decimal number, it is sent to a command which specifies an array. Inside of this array are ASCII keyboard IDs, which correspond to buttons on a standard keyboard. In this case, I am using 225-232, which end up translating to NumPad 1-8. This is because I used the number pad to switch shots previously, but could be set to any group of keys. The decimal number which is outputted from the conversion function is then used in the array to determine what key to "press" when the emulated HID device sends a signal to the computer. I set up the array to correspond to the button positions, so button number 1 on the shield is position 0 of the array, also known as NumPad 1 to the host OS.

In later iterations of the code, I have implemented loading the contents of this "keycode" array from a CSV file stored on a SD card, which is hooked up through the SPI Serial interface to the Arduino. This will allow for user reconfiguration of what keys are being used without having to recompile and upload the microcode to the Arduino, and will be way easier for the end user to tailor it to their own needs.

September 19, 2013 | 05:57 PM - Posted by rodgersk24

Very nice, that looks really cool!

Just out of curiosity, how did you get involved in this, or gain the knowledge to be able to figure this out? Did you study this in school, or is it more of a hobby thing you picked up? I've always wanted to work with Arduinos and circuits, but don't know where to start.

Can't wait to see future updates!

September 19, 2013 | 06:54 PM - Posted by Ken Addison

I learned some basic stuff about electronics in school, but just about everything in this build is self-taught. The nice thing about Arduino as a development platform is that there are tons of guides and help available, and easy to find through google. The Arduino forums themselves are pretty awesome as well.

September 19, 2013 | 06:46 PM - Posted by Andrew (not verified)

I have been attemting to setup a live broadcast system that inputs to the broacast system over an analog signal that i had hoped to put through an s-video output on a geforce 6200, but i have had no luck getting it to cooperate with the geforce gtx 660 in the system (for adobe premier) and put the digital signal to the monitors through the 660 along with the analog through the 6200 for the broadcast system, i am using wirecast, any suggestions?

September 19, 2013 | 06:49 PM - Posted by Branthog

I just wanted to say that after many months of PC Perspective not showing up in my news feed (on multiple readers), this showed up in my feed today. WELCOME BACK YOU DELIGHTFUL BASTARDS! My RSS reader is looking forward to relaying more of your goodness to my eyeballs!

September 19, 2013 | 08:40 PM - Posted by Scott Michaud

Good to be home! : D

September 19, 2013 | 07:13 PM - Posted by Kusanagi (not verified)

Man, this looks really awesome. I could use this myself.

September 20, 2013 | 09:55 AM - Posted by JustWondering (not verified)

Why not instead create an app for touch surface like surface pro or ipad or android?

This is what's being done in the music industry to replace audio mixers and then you can make money selling the app...

September 22, 2013 | 12:19 PM - Posted by DaVolfman (not verified)

Personally I would have mixed output with input to multiplex things. Basically you use an output to address a row and then read out a column on inputs. It only gains you about 3 pins on the buttons but that's still 3 pins freed up. The LED's being diodes are open to charlieplexing using 4 outputs to drive 12 LEDs. That gets you all your IO done with up to 3 pins to spare, though it does sacrifice a bit of brightness on the LEDs.

September 22, 2013 | 12:22 PM - Posted by HeavyG (not verified)

Very impressive, Ken! For a work in progress, it sure is making some good progress.

October 16, 2013 | 11:48 AM - Posted by gratv (not verified)

Hello, we are a small tv station from Athens Greece. Can we bay this control for wirecast? Thank you.

January 28, 2014 | 01:31 PM - Posted by Anonymous (not verified)

Love what your doing with this. I have worked in TV Production for a long time using Tricaster boards but they are big and as you mentioned really expensive. This looks like a great alternative.

Recently I was considering getting a HDMi video Switcher to work in line with my current setup (between the camera HDMI output and the intensity HDMI input) just to give us more camera angles, but i dont know if this would work.

Our Setup : Wirecast, 2 Intensity shuttles, iMac, and 1 Sony hdr-cx380, much smaller inexpensive setup. Do you know if this would work?

Also are you selling your switcher?

January 31, 2014 | 02:40 PM - Posted by Eric Wroldsen (not verified)

Your Concept looks really cool. It would be great to see an updated video on this project. are you going to be selling this any time soon? I could really use one!

November 10, 2014 | 01:49 PM - Posted by ButtonPuncher (not verified)

Here's an alternative idea for you... It would be a little more cumbersome but it may be more versatile in the end. Does and of the software allow you to switch more then two channels of audio at a time? Or do you use a separate audio board for mics and whatnot and use it's output? Here's my idea...

Use DTMF. There's 16 DTMF tones and you can get the generator chips and decoders chips for cheap. If the switching software can do more than 2 channels, feed the DTMF tone into channel 3 or 4 on the capture cards. Then the main output would have the DTMF tone of whatever camera is live. Also, if the software outputs a "preview" channel, you could use that DTMF tone to show the talent/floor crew that they are about to go hot. Use bi-color LEDs to have green if you are in preview and red when you are on air.

If you mix the audio with a separate dedicated audio board, that opens up your options even more. The you can use channel 1 or 2 on your capture cards. You could make a little battery powered DTMF generator, and put a 1/8" male cable on it to plug in to any camera that you have laying around.

Just my $0.02.


Post new comment

The content of this field is kept private and will not be shown publicly.
  • Lines and paragraphs break automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <blockquote><p><br>
  • Web page addresses and e-mail addresses turn into links automatically.

More information about formatting options

By submitting this form, you accept the Mollom privacy policy.