2010-08-22 SoftModemインターフェースボードとJavaScriptで通信
SoftModemインターフェースボードとJavaScriptで通信
SoftModemインターフェースボードを購入したので、遊んでみました。
スイッチサイエンスさんでほぼ完成状態で販売されています(ピンヘッダ付けるだけ)。
スイッチサイエンス/商品詳細 SoftModemインターフェースボード--販売終了
SoftModemインターフェースボードが使っている通信方式(FSK)は作者のarmsさんのブログで説明されています。
なんでも作っちゃう、かも。 SoftModemインターフェースボード発売!
なんでも作っちゃう、かも。 Arduinoで遊ぼう - iPhoneのオーディオ端子を使って通信をする
iPhone用のソース ( FSKSerialGenerator.m )を眺めてみたところ、通信方式仕様は
- High(1)は7350Hz, Low(0)は4900Hzのsin波を送る。これを1225baudで切り替える。
- 1文字(8bit)の前後にスタートビット(0)、ストップビット(1)を付けて、10bitで送る。
- 要は送信したい文字をcとすると、(c<<1)|0x200 を送る感じ。
- 一連の文字列の送信の前に、40msのHighをプリアンプルとして送る。(1225baudだと49bit分)
- 一連の文字列の送信後には、5msのHighをプリアンプルとして送る。(1225baudだと6.125bit分)
という感じらしいと分かったので、自分でも実装してみたくなって作ってみました*1。
Cでも何でも良いんですが、JavaScriptから音が鳴らせたらBookmarklet等と組み合わせて面白いことができないかなーなどと妄想したので、JavaScriptで。
# 本当はiPhone等のブラウザで動かしたかったのですが、後述の方法はMac/PCのブラウザでは動くものの、iPhoneのSafariでは動作しないことが後で判明。。ちょっと残念。
## あと受信はできません…。
http://github.com/NeoCat/FSK-Serial-Generator-in-JavaScript/
.htmlファイルをHTML5対応ブラウザで開いて、"Generate and Play"ボタンを押すと音が鳴ります。これをSoftModemインターフェースボードに3.5mmステレオ4極ケーブルで繋いで流せば、文字列を送信できます。
Jumpを押すと、生成したサウンドを直接ブラウザで開きます。ここでSaveすれば生成した.wavファイルとして保存できるはずです。
JavaScriptから音を鳴らす方法としては、Data URI Schemeを使った方法があります。Data URIを利用すると、画像などのバイナリをJavaScriptで生成することができます。今回の場合は、WAV形式のサウンドデータを生成します。
詳しくはスクリプトを見て頂くとして、まずは8bit/mono、リニアオーディオ形式のヘッダを作ります。サンプリング周波数は生成するバイナリのサイズを小さくするため上記High/Lowがぎりぎり表現できる29400Hzを選びましたが、44100Hzでも大して変わらなかったかも。あとは、指定されたテキストをASCIIコードを表現するFSK変調したsin波を8bitのバイナリ(つまり0〜255)で表現していきます。
なお、テキストとしてnon-ASCIIな文字が指定された場合は、UTF-8エンコードしています。(こういう操作もJavaScriptでは関数一発ではできず、自前でバイナリとしてごりごり変換しています)
WAVデータができあがったら、それをbtoa関数でMIMEエンコード & escapeし、前に
data:audio/wav;base64,
という文字列をくっつければ、Data URIのできあがりです。
あとはHTML5のAudioオブジェクトにこのData URIを指定して
audio = new Audio(dataURI);
audio.play();
で再生できます。
生成した波形をwavとして保存してspwaveで開いてみたところ。2種類の周波数があるのが分かります。
そういえば、iPhoneアプリの「音響電文」とも通信できるみたいです(通信といっても一方向だけですが)。JavaScriptだけじゃ録音できない(多分)から受信は難しいだろうなあ。
- 320 http://code.google.com/p/arms22/wiki/SoftModemBreakoutBoard
- 275 http://pipes.yahoo.com/pipes/pipe.info?_id=3eebace824bb60a10f13c841c2c64478
- 179 http://pipes.yahoo.com/pipes/pipe.info?_id=45d5a8c4e92dd6d0ea2937e5cbb455bf
- 144 http://trac.switch-science.com/wiki/ARMS22-SOFTMODEM-HOWTO
- 116 http://arms22.blog91.fc2.com/blog-entry-366.html
- 105 http://translate.googleusercontent.com/translate_c?hl=en&prev=/search?q=http://www.switch-science.com/products/detail.php%3Fproduct_id%3D364&hl=en&client=firefox-a&hs=L9M&rlz=1R1GGLL_en___US367&prmd=iv&rurl=translate.google.com
- 51 http://twitter.com/
- 51 http://www.geocities.jp/twicli/
- 40 http://pipes.yahoo.com/pipes/pipe.info?_id=49361476efd1fe9761d9bbd6c3a05f4d
- 34 http://www.switch-science.com/trac/wiki/ARMS22-SOFTMODEM-HOWTO





