Monday, December 15, 2014

Quiz Show Buzzers


Recently I got a commission to create a set of quiz show buzzers.  There was nothing on the market that really fit what my client was looking for so they had me build something for them.  I found this instructable which was similar to, but not exactly, what the client wanted so I used that project as inspiration.

I made a video above which shows some of the steps during development as well as the finished device.

The basic requirements were:
  • A control unit for the person running the game to see the order that players pressed their buttons.
  • Four remote units that connect to the control box.  The remote unit should light up such that both the player and audience can see which player rang in first.
  • A sound should play when the first player rings in.  The preference would be for the sound to be something like the Family Feud ring in sound.
  • As a bonus it would be nice to have the cables between the remote boxes and the control unit be something that is easily replaceable in case longer cable lengths are needed in the future.
Software and Electronics
I started with an Arduino because, for simple devices like this, it is the quickest way for me to get started.  More specifically, I used a RBBB from Modern Device, since it is a cheap way to embed an Arduino in a project.

For the LEDs, I started with some old LEDs that I had lying around, but quickly found that they weren't bright enough to use with the ping pong ball diffusers I used for this project.  I ended up buying some new higher efficiency LEDs.  I tweaked the current limiting resistors for each different color of LED to maximize their drive current (and therefore brightness).  See the video for a demonstration of the LEDs.

I hadn't ever really done much with sound on the Arduino before so this was new territory.  I found that I could embed a WAV file (after re-encoding it as an array of data in the Arduino sketch), and then play it back using the PCM library.  I also found the ring-in sound from Family Feud on this website, which was really handy.

I struggled a bit getting the sound hardware working.  It's pretty easy to connect a speaker directly to an output pin from the Arduino, but that wasn't loud enough in my case where I wanted an entire room to hear it.  So I needed an amplifier of some kind, and I tried a number of different ones, but none seemed to work very well.  Eventually I found this site with the simplest amplifier of all, just a transistor and resistor.  This worked fantastically well, and required almost no work or expense to get it going!  You can see my circuit in the schematic.

I whipped up some more code to time the inputs to detect which player rang in first using the pin change interrupts on the Arduino.  This was easy using the handy PinChangeInt library.

Last of all for the software, I needed to create several different blink patterns on the LEDs.  Again an existing Arduino library came to my rescue in the form of the TimedAction library that allows you to setup psuedo-thread functions to run arbitrary code on a configurable time period.

Hardware
The prototype was now complete but I had to assemble the final version.  I decided to use headphone jacks to connect the remote boxes and the control unit together.  In this way I could carry the signals I needed over an inexpensive patch cable and make the all of the boxes easily detachable for storage.

As mentioned before, I used ping pong balls as inexpensive light diffusers attached through holes in the button boxes and held in place with hot glue.  The large buttons were attached through a hole in the top of each button box.  The speaker in the control box was attached with hot glue with a piece of screen placed in front of the speaker before gluing.

Assembly was much more time consuming than I thought.  Many hours of cutting, drilling, and soldering later, I had the final product which you can see in the video above.  My projects always seem to take way more time in the less interesting mechanical parts than in the super-fun electronics and software parts...

I got everything done in time and my client has been happily playing rounds of Jeopardy and trivia games for months now.

And now you get the benefit of all that work in the form of source code and schematics:
schematic (sorry, it's hand drawn)

4 comments:

Dieltiens Vincent said...

Hi,

Thanks for this article :)
I'm trying to achieve a similar buzzer system but without the additional LEDs.

I don't understand how you can read the button state and turn on/off the LED separately with only 3 wires.
I can do this with 4 wires (1 for turning off/on the LED, 1 for ground of the LED, 1 for powering the button and 1 for reading the value of the button) but not 3.

Thanks :)

Vincent

Ken Sharp said...

Hi Vincent,

The schematic is available here.

The way that I only use 3 lines is that I don't have a line for powering the button. I have one line for the LEDs, one line for ground, and one line that connects to one side of the button. The other side of the button is connected to the same ground line that the LEDs connect to.

The reason this works is because the digital input on the Arduino side has internal pull up resistors that connect to Vcc. So when the button is pressed I get zero volts on the digital input because the button connects the ground line to my input. When the button is not pressed the input line floats and the internal pull up resistor pulls it up to Vcc giving me a "1" on the digital input.

I hope that helps.

-Ken

Dieltiens Vincent said...

Hi Ken,

I already was testing with your schematic from Github and did not understand it (the 4 push-button sections).

The missing information was the internal pull up resistor. There is nothing in the ino code that explicitely sets the pull up resistor. I guess it's the default behavior.

I just configure the pull up resistor of the button pin (I use a raspberry pi, but it also possible to set the pull up resistor) and it works!.

Thanks for your help ;-)

Ken Sharp said...

Hi Vincent,

The pullups are enabled at line 188 in the firmware. If you set the pinMode to INPUT and then do a digitalWrite to HIGH that enables the pull up resistors. It's definitely not obvious though and deserves a comment in the code.

In more recent versions of the Arduino IDE they've changed it so the way to enable pullups is to set the pinMode to INPUT_PULLUP, which makes it much more obvious what the code is doing.

-Ken