気圧センサMPL115A1

気圧センサMPL115A1をArduinoに繋いで気圧を測ってみました。

MPL115A1 SPI接続気圧センサモジュール


気圧センサに加えて、補償用の温度センサが入っています。*1 精度は"kPa accuracy"とのことなので、10hPaくらいは誤差範囲ってことでしょうか? (あまり精度よくない… BMP085の方が良かったかも。)


SPI接続のMPL115A1のほか、I2C接続のMPL115A2もありますが、インターフェースが違うだけで中身は同じようです。


書いたプログラム(Arduino用ライブラリ+気圧取得のサンプル)はこちら。ライブラリになってるので、~Documents/Arduino/libraries に放り込んで使います。
接続pinはサンプルの冒頭にあります。(SPIライブラリを使っているため、11〜13番ピンは固定、8,9はライブラリ初期化時に変えられます。)


実行画面はこんな感じ。hPa単位で値が表示されます。誤差結構あるような…


以下、ライブラリを書きつつ調べたりしたこと。

*1:補償のための計算式はデータシートに載ってます。温度の単位は謎。

続きを読む

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のブラウザでは動くものの、iPhoneSafariでは動作しないことが後で判明。。ちょっと残念。
## あと受信はできません…。


作ったコードはgithubにアップしてあります。
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形式のサウンドデータを生成します。


WAVのフォーマットの情報としては下記が参考になります。
http://www.kk.iij4u.or.jp/~kondo/wave/


詳しくはスクリプトを見て頂くとして、まずは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だけじゃ録音できない(多分)から受信は難しいだろうなあ。

*1:実際にはSoftModemインターフェースボードが届く前に書いたのですが、一発で動いてしまって自分でびっくり。FSKって簡単ですね〜。

Make: Tokyo Meeting 05に出展しました

5/22日、23日開催のMake Tokyo Meeting 05に、「チームひつまぶし」という名前でこっそり出展させて頂いてました。

来て頂いた方、どうもありがとうございます!

ちなみに「チームひつまぶし」*1は私(@NeoCat)と中学時代の同級生(@karinsan)の2人でやってます。


展示物はArduinoなどを使った雑多な電子工作作品をいくつか、という感じで統一性も何もないですが…><


Boxel

1pixelだけのディスプレイ(?)。センサや(PC経由で)インターネットから取得した情報を、色に変換して表示してくれます。

情報源は、天気予報(6時間ごとの降水確率)、Twitterのキーワード出現頻度や”返信アリ”などなど。

他にも、Boxel間の相互通信機能があるので、Wiiリモコンで好きな色を作る→別のBoxelに送信!という感じで、簡単な色コミュニケーションに使えたりします。


単純なだけにいろいろな使い方が考えられそう。


ちなみにMTM05の会場では、ハッシュタグ #mtm05 の盛り上がり具合を表示させてました。

Boxelの中身は次のエントリにて。

メカビッチ

いろんなセンサとArduinoを搭載したウサビッチ(ぬいぐるみ)。さりげなく部屋においておくと、気温や部屋の照明に反応して、エアコンなどの家電を付けたり消したりしてくれます。
手動On/Offしたいときは、うさみみをちょっとつついてあげればOK。(うさみみに曲げセンサが入ってます。)

MTM05会場にエアコンは持っていけないので、Apple Remoteを使って、うさみみでiTunesを再生/停止するデモになってました。

YUREX 4 Linux

あのYUREXを、Linuxでも使えるようにドライバ作っちゃいました。

会場では、YUREXを入力に使って、簡単な「リズムゲーム(音ゲー)」のサンプルプログラムを流してました。
スクリーンに表示されたタイミングに合わせて貧乏揺すり! 両足にYUREXを付ければDance! できるかも?


ちなみにYUREX 4 Linuxソースコード、およびユーザランドのサンプルは http://github.com/NeoCat/YUREX-driver-for-Linux にて公開しています。

ニキシー管温度計

ニキシー管を使った温度計です。ぼーっとオレンジに輝く光が綺麗。

ちなみに筐体はハンズで買った歯ブラシケース。あまりにも歯ブラシを挿す穴の口径がぴったりだったので^^;

*1:「暇つぶし」じゃないですよ。まあ「暇つぶし」でもほとんど合ってますけどね。^^;;;

ArduinoからApple Remoteの赤外線信号を送信

Apple Remote MC377J/A

ArduinoからApple Remoteの赤外線信号を送信するライブラリを作りました。


ライブラリのダウンロードはこちらから。


ダウンロード後、AppleRemoteIR フォルダを ~/Documents/Arduino/libraries に入れて下さい。


IDEを起動すると、簡単なサンプルスケッチが File > Examples > AppleRemoteIR > AppleRemoteIR から開けます。

AppleRemoteIR ar = AppleRemoteIR(3); // 赤外線LEDのポートを指定

void loop() {
  ar.play();
  delay(2000);
  ...

まず、AppleRemoteIR を作る際に、赤外線LEDを接続するポートを指定します。赤外線LEDは、HIで点灯するように接続します。
あとは、menu(), play(), up(), down(), right(), left() を呼び出せば、そのボタンを押した際の赤外線信号が送出されます。なお、ボタンを押しっぱなしにした時の動作(リピート信号)には対応していません。

ペアリングについて

Apple Remoteは個々にID(1〜255?)を持っており、特定のApple RemoteからしかMacを操作できないようにすることができます。このMacApple Remoteを対応づけをペアリングと呼びます。なお、ペアリングはしなくとも構いません。その場合は全てのApple Remoteから操作可能な状態になります。一方、Macが別のApple Remoteとペアリングされていると、全く反応しません。ペアリングを解除する際は、システム環境設定 > セキュリティ > 一般 > "登録解除" を押します(ロックされている場合は鍵アイコンをクリックして認証が必要です)。


pair() メソッドを呼び出すと、Macとのペアリングを行うことができます。

AppleRemoteIR ar = AppleRemoteIR(3, 0x97); // 赤外線LEDのポート、Apple RemoteのIDを指定

void setup() {
  ar.pair();
}

void loop() {
  ...


作成に当たって、信号のフォーマットについては、以下のページを参考にさせて頂きました。
http://www.ez0.net/2007/11/appleremote%e3%81%ae%e8%b5%a4%e5%a4%96%e7%b7%9a%e4%bf%a1%e5%8f%b7%e3%82%92%e8%a7%a3%e6%9e%90%e3%81%97%e3%81%a6%e3%81%bf%e3%81%9f/

ArduinoからTwitterにPOSTするライブラリ OAuth版

以前、 ArduinoからTwitterにPOSTするライブラリを作って公開しましたが、その時はTwitter APIのユーザ認証にBASIC認証を使っていました。
しかし、2010年6月からBASIC認証は廃止される予定となっており、新しい認証方式であるOAuthに移行することになっています。


そこで、Arduinoライブラリも、OAuth認証のものを作りました。といっても、Arduinoの限られた資源で複雑なOAuth認証を実装するのはかなり困難なため、難しい部分はGoogle App Engineに任せています。


使い方やライブラリのダウンロードは、http://arduino-tweet.appspot.com/ を見て下さい。

※ ↑ 2021/7 以降、多数のアクセスを受けるなどしたためサイトを https://arduino-tweet-318222.uc.r.appspot.com に移行しました。

ソースコードhttp://github.com/NeoCat/ArduinoTweetLib-server に置いてあります。


基本的には、Twitterライブラリを入れ替え、上記サイトで認証用のtokenを取得し、それをスケッチの今までユーザ名/パスワードを書いていた場所に埋め込めばOKです。


使い方は前のライブラリと変わっていませんが、DNSを引くために EthernetDNSライブラリが別途必要になっています。
ただし、EthernetDNSはCNAMEレコードに対応していないという問題があり、パッチが必要です。
パッチを当てた
ライブラリも上記サイトに置いてありますので、一緒にインストール/入れ替えを行って下さい。
(現在、上記削除部分のパッチは公式に取り込まれたため不要になっています)

      • -

とここまで書いて、arms22さんが既にStewitterというライブラリを作られていたことに気付くなど。

まあ、つぶやきに"via Arduino" って表示させたい方はこちらを使って下さい、ってことで! ^^;

ドア開閉ロガー

ドアを開けたり閉めたりした時刻を記録するデバイスを作ってみました。簡易セキュリティみたいな感じ。

なんと4階建て(下からArduino, XBeeシールド, バニラシールド, 秋月のキャラクタ液晶)。
なお実装がきたないのは仕様です(ぁ)。


ドア開閉の検出は、赤外線の反射を利用して行っています。

リモコン用の赤外線センサを流用している都合、赤外線LEDから38kHzの信号(0.2〜0.3ms)を100ms周期で発信し、これを一定回数連続して受信できたら検知としています。出力はかなり押さえてますが、それでも乱反射した赤外線をノイズとして拾いやすいので、設置場所やフィルタ回数の調整がちょっと面倒。まあ一度調整してしまえば割と正確です。*1


ドアの開閉を検知すると、XBee(2段目)で無線信号を送出。これを拾ってカメラなどを作動させれば防犯カメラ的なことができるかも。


RTCを載せて、検知した時刻の履歴もとっています。この履歴や時計合わせもXBee経由でPCに転送できるようにしています。こちらでライブラリや回路例を公開して下さっているので、ありがたく使わせて頂いてます。写真では見えないけど、いちおう電気二重層コンデンサでバックアップしてあるので、電源を落としても時計は維持されます。


液晶はおまけで現在時刻や検出回数などを表示。ポートが余ってたのでなんとなく^^;

*1:ノイズと言えば、LEDの点滅の影響で電源に38kHzが載ってしまうとセンサが誤動作するので、センサの電源にもフィルタを付ける必要がありました。