As a volunteer for an organization that builds custom aids for people with disability, I have recently been looking at a project to create a ‘very large button’ remote control for a cable TV Set Top Box (STB). The custom unit needed basic functions (Channel Up/Down, Volume Up/Down and Power On/Off). Commercially available large button remotes have buttons that are still too small and/or they have too many buttons.
An assessment of the client showed that there the majority of movement is via gross motor control, with reduced muscle strength, so these parameters will largely dictate the user interface for the device. Additionally, the family required that the unit work with their Foxtel STB and that it was battery powered for portability.
IR Remote Technology
There is a lot of material covering the basic technology of IR communications, especially regarding remote controls. A good reference is a PDF file from Vishay, and Wikipedia. For this article it is enough to understand:
- Infrared light is all around us. In order to discriminate a signal from background light IR transmissions are modulated at frequencies between 30 kHz and 56 kHz. 38 kHz is a very common frequency used for consumer electronics remote controls.
- At the physical layer, the most common encoding method is using “Pulse Code Modulation” (PCM). There are three commonly used ‘bit’ encoding schemes and Bits are encoded as Marks (presence of a signal) or Spaces (absence of a signal). Decoding this level of transmission happens in specialized IR receivers, optimized for specific transmission frequencies.
- At the protocol level, the Mark and Space sequences are interpreted as single or combinations of ‘0’ and ‘1’. This encoding and decoding is done in a software layer.
- The time of a pulse and the time between pulses (to a few microseconds) is critical in decoding the IR message.
The figure below shows an example of how an IR message is transmitted and the message encoded.
Identifying suitable project components
Before starting the design I did a quick search for large buttons. Game Console style buttons turn out to be quite large and also relatively cheap, so these are the first choice for this project. A style with built-in LED was chosen to give visual feedback of the button press. Round and triangular styles, as shown in the figure, are used. As these may still require too much pressing force for the application, an alternative (Plan B) considered was implementing capacitance touch sensors.
The box for the remote is custom built from timber or plywood. The dimensions are dictated by the layout of the top and the height of the buttons. A sketch of the button arrangement and approximate dimensions in mm are shown in the figure.
The heart of the remote is an Arduino Nano (clone). There are 2 well known software libraries for receiving, decoding and sending IR remote protocols – irRemote and IRLib. IRLib is based on IRremote but is a more recent development, so they are actually very similar. I tested both during the prototyping process and settled on IRLib, mainly because of better documentation, and better message timing discrimination through the use of interrupts.
Basic Software Operation
In order to keep the design as flexible as possible and to provide a way to reuse the code on other similar projects, I decided to not hard code the functions of the buttons. The function of each button can be programmed into a key during use.
The device therefore operates in two modes – Program mode and Run mode (edit: Clear mode was later added – see Part 3). Run mode is the default operation if Setup mode is not enabled; switching between modes requires cycling the power.
Program mode is used to record and associate the output from an existing remote to a switch. Program mode is started by pressing one of the switches during power up. The device simultaneously flashes all the feedback LEDs to show that it is starting setup.
To program any switch on the device, the switch is pressed, and it starts flashing. Pointing the existing remote and pressing the key for the required function will allow the device to capture the code being sent and store it in EEPROM. If the capture is successful then the selected switch flashes twice quickly and turns off. If the transmission stream could not be decoded the device will flash quickly four times and the IR stream is stored as raw data, essentially a recording. This latter case makes for a less reliable retransmission, but it may still work.
Run mode is the default operation when the device is powered up. The device flashes each feedback LED in turn to show this mode is starting. In this mode, pressing any key transmits the previously recorded code. The switch LED will remain on for the duration of the transmission plus a short delay to minimise the impact of jittery hand control. Once the LED has turned off, the switch needs to be released and pressed again.
Additionally, in Run mode the system must minimize power consumption to extend battery life as long as possible.
Prototyping the Hardware
I prototype my systems using a series of modules I have built up over time. These are all on 1 inch square prototype boards with connectors for Ground, Voltage and Signal (GVS) that neatly plug into a sensor shield and make for very quick assembly and reconfiguration of most prototypes.
As I already had IR receiver and transmission modules, I plugged together the LEDs, switch and send/receive modules and started to develop the software.
Software development was quite straightforward and I quickly got it to a stage where it was turning my LG TV on and off. Then I started to look at the Foxtel device this was meant for, and quickly learned a lot about implementing IR …