Using the Audio Jack as Data Interface on Android* Systems

Overview

As one of the interfaces on mobile devices and tablets, the key function of the audio jack is to play music. However, its other usage cannot be ignored—the audio jack can also be used to transmit data.

More usages of the audio jack to connect devices are being developed all the time. Peripherals like iHealth Lab’s Glucometer[1] (blood sugar calculator), the Irdroid[2] (provides infrared remote functions to control TVs, set-top boxes, and audio components), and Flojack*[3], an NFC reader (creates near-field-communications functionality for interaction with NFC tags or mobile devices) are made possible through audio jack connectivity.

Since wearable devices and peripherals have broad market prospects, I believe that the audio jack will be the prime data communication portal. In this article I will explain more details of this new feature.

Introduction

The audio jack interface has two standards: OMTP and CTIA[4].  OMTP is an international standard; ATIS is an American standard, which is used on the Apple iPhone* and iPad*. They are different with V-Mic and GND position, the difference are shown in Figure 1.

OMPT and CTIA
Figure 1.   OMTP & CTIA

How to transmit data

When we send a 0x00FF data value, the first step is to convert the digital data value to an analog signal. We need to modulate the data value. Normally, we use a sine wave carrier for the analog signal. 

FSK modulation signal
Figure 2. FSK[5] modulation signal[6]

The second step, in Android systems, is to call the audioTrack API[7] function to play the buffer. The following code sends data to the buffer using the audioTrack function.

public void send(byte[] bytes_pkg) {
		int bufsize = AudioTrack.getMinBufferSize(8000,
				AudioFormat.CHANNEL_OUT_MONO,
				AudioFormat.ENCODING_PCM_16BIT);
		AudioTrack trackplayer = new AudioTrack(AudioManager.STREAM_MUSIC,
				8000, AudioFormat.CHANNEL_OUT_MONO,
				AudioFormat.ENCODING_PCM_16BIT, bufsize, 
AudioTrack.MODE_STREAM);
		trackplayer.play();
		trackplayer.write(bytes_pkg, 0, bytes_pkg.length);
	}

How to receive data

As a receiver, we need to translate the analog signal to a data value, demodulate the signal to remove the carrier signal, and decode the data by protocol. The protocol can be a public data format or private definition protocol. 

Demodulate the signal
Figure 3. Demodulate the signal6]

In Android systems, we use the audioRecord API[8] function to record the audio

public void receive(){
		int minBufferSize = AudioRecord.getMinBufferSize(AUDIO_SAMPLE_FREQ, 2,
				AudioFormat.ENCODING_PCM_16BIT);
		AudioRecord ar = new AudioRecord(MediaRecorder.AudioSource.MIC,
				AUDIO_SAMPLE_FREQ, AudioFormat.CHANNEL_IN_MONO,
				AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
		ar.startRecording();
	   }

How to harvest energy from audio signals

Obviously, power is required to drive the circuit for audio jack peripherals. For example, the L-channel sends data information. The R-channel sends sustained square or sine waveforms. These waveforms can be transformed to power that enables the MCU (Micro Controller Unit) and several sensors.

Case study: infrared peripherals

Androlirc[9] is a Github-based project. Its function is to use the audio jack interface to send infrared commands. We can study this project to understand audio jack data communication. Androlirc uses the LIRC[10] library to create a data buffer. This library is a Linux* infrared library that supports several types of interfaces, for example: USB, audio jack, etc. Androlirc can use the LIRC library as a data encapsulation or data capsulation. Across the marketplace, you can find many infrared coding types, such as the RC-5 and RC-6 protocols. In the example, we use the RC-5 protocol to control a TV set. First, we need to modulate the data value using a 38k frequency sine waveform to generate buffer data; then we use the Android audio API function to play the audio buffer data. Meanwhile we can use one of two channels to play a sine or square waveform to power on the peripherals hardware.

Case study: audio jack development tools

NXP Semiconductors’ new smartphone solution, Quick-Jack*[11], is a tool/development board based on a prototype project called Hijack. Hijack[12] is a University of Michigan student project. The Hijack platform enables a new class of small, cheap, phone-centric sensor peripherals that support plug-and-play operations. We can use the NXP Quick-Jack developed board to help build our prototype product design. Figure 4 shows a smartphone displaying the indoor temperature from the audio jack-based peripheral temperature sensor.

Temperature value from Quick-Jack
Figure 4. Temperature value from Quick-Jack

Figure 5 shows how we can control the peripheral’s LED using an Android-based application.

Controlling the LED on the Quick-Jack
Figure 5. Controlling the LED on the Quick-Jack

Summary

Wearables and smart device peripherals are becoming more prevalent in the consumer market. The audio jack as a data communication function is being adopted by more and more ODMs and iMakers. Perhaps in the future, audio jack data communication functions will be universally supported by smartphone OSs.

Reference

  1. http://www.ihealthlabs.com/glucometer/ihealth-align/
  2. http://www.irdroid.com/
  3. https://www.kickstarter.com/projects/flomio/flojack-nfc-for-ipad-and-iphone
  4. http://en.wikipedia.org/wiki/Phone_connector_(audio)
  5. http://en.wikipedia.org/wiki/Frequency-shift_keying
  6. http://www.maximintegrated.com/en/app-notes/index.mvp/id/4676
  7. http://developer.android.com/reference/android/media/AudioTrack.html
  8. http://developer.android.com/reference/android/media/AudioRecord.html
  9. https://github.com/zokama
  10. http://lirc.org
  11. http://www.nxp.com/news/press-releases/2014/05/nxp-unveils-smartphone-quick-jack-solution-transforming-audio-jack-into-multi-purpose-self-powered-data-port.html
  12. http://web.eecs.umich.edu/~prabal/projects/hijack/

About the Author

Li Liang earned his Master degree in signal and information processing from Changchun University of Technology. He joined Intel in 2013 as an application engineer in the Android mobile enabling team in China. He focuses on differentiation enabling on the Android platform, for example, multi-windows, etc.

For more complete information about compiler optimizations, see our Optimization Notice.

1 comment

Top
James H.'s picture

Hello, I want to create an application for Android phone. It's application send 3 bytes of data format to pilote a RC hélicoptère. So I want if someone can help me for the android coding. Thank you.

Example of the data to transmit via the jack audio of the phone:  00111111 00111111 01111111
 

Add a Comment

Have a technical question? Visit our forums. Have site or software product issues? Contact support.