= Audio Jack modem for Iphone and Android = === ARMS22-SOFTMODEM SMD === With this board, datas are transferred from Arduino to iPhone and from iPhone to Arduino. The communication speed is 1225bps (※ The actual data transfer rate slightly lower.) It is suitable for a small amount of data communication like switch inputs and sensor information. This is semi-finished products. To use this, solder a pin header or a pin socket to this board. Dimensions: 33 x 18mm ( without audio jack ) == Applications == [http://side2.256byte.com/2010/08/android-softmodem/ Android with this board] [http://side2.256byte.com/application/softmodem-terminal/ Softmodem Terminal application for Android] [http://side2.256byte.com/2010/09/android-shutter-control/ Android to control the camera shutter in a SLR] [http://d.hatena.ne.jp/NeoCat/20100822/1282486171 Make voice audio with JavaScript and play it as a way of data communication] [http://mkroll.mobi/hardware/rfid_tag_reader/rfid_tag_reader.html iPhone RFID Tag Reader] == Disclaimer == * Because data communications with this device uses audio, data corruption may occur sometimes. Please consider incorporating the checksum processing, and retrying. * Please make the iPhone's volume maximum. == Connection == Use a 4 pin male to male cable to connect to iPhone. With some cable, cross-talk may occurs that cause communication errors. Please use the gold plated shielded cables. The shorter the cable, the better. Connect to Arduino as follows (right side is the Arduino's pin.) FSKOUT → D3[[BR]] GND → GND[[BR]] VCC → VCC[[BR]] FSKIN → D6[[BR]] AIN1 → D7[[BR]] == Volume Adjustment == Measure the voltage on AIN1 with tester to make it (VCC / 2) + 300mV. 5V VCC: 2.7V AIN1[[BR]] 3.3V VCC: 1.95V AIN1[[BR]] == Arduino Library: !SoftModem == [http://code.google.com/p/arms22/downloads/detail?name=SoftModem-004.zip SoftModem-004.zip] === Sample Sketch === {{{ #!C # Include # Include SoftModem modem; void setup () { Serial.begin (57600); delay (1000); modem.begin (); } void loop () { while (modem.available ()) { int c = modem.read (); if (isprint (c)) { Serial.println ((char) c); } else { Serial.print ("("); Serial.print (c, HEX); Serial.println (")"); } } if (Serial.available ()) { modem.write (0xff); while (Serial.available ()) { char c = Serial.read (); modem.write (c); } } } }}} '''Notes''' * Two hardware timers and analog comparator are in the library. Therefore, it’s not possible to use these features in the application. * Tone function is not available. == iPhone Apps: !SoftModemTerminal.app == [http://code.google.com/p/arms22/downloads/detail?name=SoftModemTerminal-004.zip SoftModemTerminal-004.zip] !SoftModemTerminal is a simple terminal application for iPhone. With the sample sketch, Arduino sends and receives alphanumeric. Please note that big sound will come from speakers if nothing is put into the iPhone's audio jack. Currently, !SoftModemTerminal is not distributed in !AppStore. Download the source code, please use your own build. !SoftModemTerminal is able to be build with Xcode and iPhone SDK. Xcode is included in the MacOSX installation DVD. Also available for download at Apple's developer pages. You can download the Apple SDK iPhone developers to register with the developer page. To make it work on iPhone, You must participate iPhone Developer Program which costs 10,800 JPY a year. == iPhone Apps: Onkyo Denbun == !SoftModemTerminal.app is now available for download from the !AppStore. If you don't have iPhone application development environment, please download the application from this URL. http://itunes.apple.com/jp/app/id385096654?mt=8 == How to use the iPhone source code == Currently, the source code of the !SoftModem is not made as a framework. If you want to use !SoftModem in your project, the source code related to the !SoftModem must be copied from the source code of the !SoftModemTerminal. The following is the list of source code related to !SoftModem. Please copy these to the project source code. * !AudioQueueObject.h[[BR]] * !AudioQueueObject.m[[BR]] * !AudioSignalAnalyzer.h[[BR]] * !AudioSignalAnalyzer.m[[BR]] * !AudioSignalGenerator.h[[BR]] * !AudioSignalGenerator.m[[BR]] * !CharReceiver.h[[BR]] * FSKModemConfig.h[[BR]] * FSKByteQueue.h[[BR]] * FSKRecognizer.h[[BR]] * FSKRecognizer.mm[[BR]] * FSKSerialGenerator.h[[BR]] * FSKSerialGenerator.m[[BR]] * lockfree.h[[BR]] * !MultiDelegate.h[[BR]] * !MultiDelegate.m[[BR]] * !PatternRecognizer.h[[BR]] !SoftModem uses the following two framework for audio input and output. Please add them to your project. * !AudioToolbox.framework[[BR]] * AVFoundation.framework[[BR]] === Initialization === First, set the category of application with AVAudioSession class. To do voice recording and playback, AVAudioSessionCategoryPlayAndRecord need to be set. {{{ #!C AVAudioSession * session = [AVAudioSession sharedInstance]; session.delegate = self; [Session setCategory: AVAudioSessionCategoryPlayAndRecord error: nil]; [Session setActive: YES error: nil]; }}} Next, for analysis of the voice, make instance of class AudioSignalAnalyzer and FSKRecognizer. AudioSignalAnalyzer parses the input waveform from the microphone to detect the falling and rising edge of the waveform. FSKRecognizer restores the data bits based on the results of the analysis of AudioSignalAnalyzer. {{{ #!C recognizer = [[FSKRecognizer alloc] init]; analyzer = [[AudioSignalAnalyzer alloc] init]; [Analyzer addRecognizer: recognizer]; // set recognizer to analyzer [analyzer record]; // start analyzing }}} Then create an instance of a class FSKSerialGenerator for sound output. FSKSerialGenerator converts the data bits to audio signal and output. {{{ #!C generator = [[FSKSerialGenerator alloc] init]; [Generator play]; // audio output starts }}}