Arduinoでいろんなセンサを試してみる

th_arduino_pro_mini_3

今回は珍しくArduino単体のお話です。ちょっと色々センサを扱ってみたくなりまして。

まず、Arduinoの選定です。とりあえず自分の設定した要件は、

  • なるべくコンパクトに収めたい
  • Raspberry PiとI2Cで通信できる

です。

すぐ近くにあったのがArduino Pro Mini (16MHz, 5V)だったので、とりあえずこれでRaspberry PiとI2C通信ができるかを調べてみたのですが。。。自分のスキル不足のせいで、ちょっと判断ができません。

心配しているのは、Raspberry PiのGPIOは基本3.3V入出力で、Arduino Pro Mini (16MHz, 5V)のGPIOが、その名の通り5V入出力なところです。もちろんレベルコンバーターとかかませば問題ないのでしょうが、ちょっとパーツが増えるのは避けたいところです。

色々調べたところ、

これによれば、「Arduinoにはプルアップ抵抗がなくて、Raspberry Pi側に合わせてプルアップされることになるから、直接接続しても問題ないぜ!」と書いてあるのですが、

こちらを見ると、「ArduinoでWire.hライブラリを使うと、内部的に勝手にプルアップしてくれるぜ!」と書いてあるので、

「あれ、それじゃあRaspberry PiもArduinoも両方プルアップしてまうやないか?」

となって、自分の中で「???」となってしまっているのです。マスターとスレーブのどっちかのプルアップが優先されるとか、そんなルールでもあるのかしら?

I2Cとかプルアップについての自分の勉強不足が原因なのですが、どなたか教えていただけると幸いです。。。とりあえず、プルアップしていようがいまいが問題なさそうな、Arduino Pro Mini (8MHz, 3.3V)を使うことにします。

ちなみに、自分はMaker Faire Tokyo 2014に行ったときに、スイッチサイエンスさんのブースで250円ぐらいで叩き売りされていたものを購入しました。

th_arduino_pro_mini_2

で、ピンソケットをはんだ付けしてみた状態がこちら。普通はピンをつけた方がブレッドボードに挿しやすくてラクだと思うのですが、色々考えた結果ソケットをつけることにしました。しかも横向き。あんまり高さを出したくなかったので。

最初Tesselを見たときには「なんでこんな横に広いんだ?」と思いましたが、同じ理由だったのかもしれないなあと、今更ながら思いました。

 

さて、ではセンサとか諸々を繋いでみようと思います。今回繋いでみるのはこちら。

  • 温度センサ(LM35DZ)
  • 湿度センサ(HIH-4030)
  • 照度センサ(NaPiCa AMS302)
  • 人感センサ(NaPiOn AMN14112)
  • マイク(ADMP401 MEMSマイクモジュール)
  • LED

ではでは、Arduinoのプログラミングを。最近IDEの1.6.0が出たみたいなので、せっかくなのでそちらを使います。

とりあえずサンプルプログラムを動かそうとしたところで、問題発生。Arduino Pro MiniのポートがMacから見えません。

少し調べてみたら、どうもArduino Pro Miniへのプログラムアップロードに使うFTDIとやらが、Mac OS 10.10 Yosemiteでうまく動かない模様。

こちらに書かれていた対処法(FTDIのドライバインストール)を試したところ、それでもまだ動きません。

結局、USBケーブルを変えてみたら無事に認識されました。多分充電しかできないタイプのUSBケーブルを使ってしまっていたのであろう。。。カッコ悪い。

ということは、初めからUSBケーブルを間違えていないければ、特にドライバのインストールは必要なかった?今となってはわかりませんが、うまくいかないときは試してみるとよいと思います。

 

では、改めて。まず、温度センサ(LM35DZ)はこちらを参考にして。

注意が必要なのは、上記の(というか、LM35DZを使うほとんどの)サンプルでは5V出力のArduinoを使っているということ。今回は3.3V出力のArduinoなので、温度の計算式だけ変えてやらないといけません。

tempC = ((3.3 * A_val) / 1024) * 100;

となります。

ちなみにLM35DZの動作電源電圧範囲は4V〜20Vなのですが、一応3.3Vでも動いている模様。5V駆動と比較してみましたが、ほとんど差もないですし、普通の壁掛け温度計との差もほぼないので、とりあえずこれで動かしてみます。

 

次に、湿度センサ(HIH-4030)です。これは、こちらを参考にさせていただきます。

本来このセンサは5V駆動で最適化されているですが、ご丁寧に、「3.3Vのときは試してないけど、多分こうじゃないかな」という計算式を載せてくれているので、そのまま使わせてもらいます。

float sensorRH = 161.0 * voltage / SUPPLY_VOLT – 25.8;

この”-25.8″の部分は、ちょっと調整しないといけないかもしれません。とりあえず使ってみて、壁掛け湿度計の値を見ながら調整していくことにします。

 

次に、照度センサ(AMS302)です。こちらは、ちょっと情報が少なめです。

配線の写真が小さくてよく見えないので、とりあえず3.3Vかけたときに最大でも5mAぐらいしか流れないよう、680Ωの抵抗を直列に繋ぎました。ルクスの正確な値に変換できているかどうかは怪しいですが、とりあえず部屋を真っ暗にすると値が0、普段の部屋の明るさで140、デスクライトをつけると700ぐらいになるので、明暗を判定する分には問題なさそうです。

 

続いて、人感センサ(NaPiOn AMN14112)です。これはそのものズバリのサンプルはありませんでしたが、焦電センサはだいたいみんな同じようなものなので、配線とかはこのあたりを参考にさせてもらいます。

人を検出していないときには出力端子がオープンになっているので、プルダウンしておかないと出力が安定しない、というところだけ注意です。プログラム自体はdigitalReadをするだけです(この場合、その一瞬の判定しかしないので、もうちょっと賢くする必要があるかもしれませんが)。

 

それから、マイク(ADMP401 MEMSマイクモジュール)です。これは最大動作電圧が3.3Vなので、3.3V系のArduinoだと特にレベル変換を気にすることなく簡単に使えます。

基本的に出力をそのままArduinoのアナログ入力端子に突っ込むだけなのですが、細かくサンプリングしないと(=ループを早く回さないと)、瞬間的に発生した音は捉えられないので、ちょっと使い方をうまく考えないといけないかもしれません。

 

th_arduino_pro_mini_3

最終的にこんな感じになりました。

うーん、とりあえず動作確認するだけのためとはいえ、なかなかひどい感じです。右から順に、温度センサ、湿度センサ、照度センサ、人感センサ、マイク、LEDです。

一番左端のものは、赤外線受信モジュールです。実はこれの動作確認もうまくいっていたのですが、これとペアとなるべき赤外線LEDの方がうまく動作してくれませんでした。うーん、同等スペックのArduino Fioのときはちゃんと動作したのになあ。。。

 

というわけで、Arduino Fioで組み直してみました。

rapiro_fio

これだとやっぱり、赤外線LEDで正しく機器制御できました。うーん、何が違うんだろう。

ちょっと予想以上に時間がかかってしまったので、Raspberry PiとのI2C通信のテストは、次回にお預けです。ソースコードは、I2C通信が確認できた時点で公開する予定です。