ラベル mpl115a2 の投稿を表示しています。 すべての投稿を表示
ラベル mpl115a2 の投稿を表示しています。 すべての投稿を表示

2015年8月16日日曜日

合計1000円以下のArduino+Etherからサーバへデータを送る:Arduino側



今回は1個約400円の激安パチモノArduino nanoと、同じく約350円のEtherアダプタENC28J60をSPIで接続しました。

サーバ側の記事とクライアントの記事(この記事)に分けました。サーバ側についてはこちらの記事をご覧下さい。

最初に注意事項です。ENC28J60は3.3v電源で動作しますが、Arduinoから外部に供給可能な3.3vの電流容量は50mAまでです。ENC28J60は最大で250mA程度消費するとのことなので、ぜんぜん足りません。最初、それに気づかなくて、「なんでEtherのランプが点灯しないんだろ…壊れたか?」と思ってました。

というわけで、9VのACアダプタからArduinoへ電源を供給しましたが、手持ちで250mAを供給できる3.3vレギュレータは秋月で買った超高能率三端子レギュレータ、380円。本体よりも電源の方が高くなって1000円を超えてしまいました。ただ、普通のシリーズレギュレータなら3.3v1Aで100円ぐらいなので…。

電源はACアダプタの9vをブレッドボード手前のレールに接続し、Arduino nanoのVINとGNDに供給しています。同じく手前の9vレールから三端子レギュレータのVin/GNDに接続し、GND/Voutをブレッドボード奥のレールに接続しています。Arduino nanoの5vと3.3v出力はどこにも接続していません。

■接続など■

Arduinoとの接続はSPIです。

ENC28J60ピンArduino nano/unoピン
VCC3.3v電源
GNDGND
CS8
RSTReset(省略可)
SI11
SCK13
SO12

別のArduinoと接続する場合には、SO=MISO, SI=MOSIと読み替えてください。また、前述の通り、3.3vはArduino出力ではなく電源アダプタ〜三端子レギュレータからの出力です。三端子レギュレータの出力側には手持ちの関係で1000μF 35vの電解コンデンサと0.1μFの積層セラミックコンデンサを入れましたが、電解コンデンサは100μF 25v程度で問題ないかと思います。

今回はArduinoに温湿度センサーHDC1000と気圧センサーMPL115A2をI2cで接続しました。

HDC1000(秋月)MPL115A2(秋月)Arduino nano/uno
VCC(1)VDD(1)3.3v
SDA(2)SDA(7)A4
SCL(3)SCL(8)A5
RDY(4)2
GND(5)GND(3)GND
CAP(2)とGNDの間に1μFを入れる

上記HDC1000/MPL115A2のピン番号は秋月版モジュールのピン番号です。HDC1000のRDY端子はArduinoの2につないでいますが、これは今回使用したライブラリのデフォルトが2だからです。HDC1000 mySensor(0x40, 4); の2つめのパラメータを変更すれば他の端子でも使えます。

MPL115A2のCAP端子とGNDの間には1μFのコンデンサを接続します。これを入れないと動作(測定値)がものすごく不安定になります。その辺の経緯はこの辺の記事をご参照くださいませ(涙)。I2cのプルアップ抵抗はHDC1000に入っているので不要です。

■ライブラリ■

まず最初に。各ライブラリ制作者の貢献に敬意と感謝を表します。使用したENC26J60, HDC1000, MPL115A2用ライブラリは下記の通りです。

モジュールライブラリ
HDC1000https://github.com/ftruzzi/HDC1000-Arduino
MPL115A2https://github.com/adafruit/Adafruit_MPL115A2
ENC28J60https://github.com/jcw/ethercard

ENC26J60用としてはいくつか公開されています。一応一通り試してみたのですが、今回は「EtherCard」を用います。機能が多いのにRAMのフットプリントが小さくてArduino nanoでも余裕があるからです。ただ、ライブラリにありがちなことですが、必要最小限の資料しかないので「サンプルは動くけど、自前のコードが動かなくて頭を抱える」パターンでしばらく悩みました。

Adafruitさん、MPL1115A2を秋月で買ったのにライブラリだけ拝借させていただいてすみません。送料がかかるので、もうちょっとショッピングカートに欲しいものが貯まったときに注文します。

HDC1000はググって落として一発で動いたがこれということで他は試していません。

■ソース■

EtherCard収録のサンプルwebClientをベースにhttp postで動くようにしてHDC1000とMPL115の処理を追加したものです。なお、行番号69/70にdhcpSetupを呼び出しています。本来ならばこれはそのあとの#if USE_DHCPの中に入れるべきなのですが、ここで何らかの初期化が行われているようで、非DHCPで使いたい場合もこれを呼び出さないと動いてくれません。接続相手はポートとIPアドレスで指定します。IPアドレスは24〜29あたり、ポートは85のようにether.hisportに指定します。

今回、JSON形式でBeaglebone black上のアプリにPOSTしています。サーバ側についてはこちらの記事をご参照ください。

以下のソースについては、権利も義務もすべて放棄します。ただ、各ライブラリのLicenseについてはご注意ください。特にethercardはGPLです。



■余談■

今回のハマりポイントは以下の通り

  • ethercardのetherPostなどを用いる場合は、call backだけでなくloop上にpacketLoopを忘れないこと。普通call backを入れておけばresponseの処理をしてくれる処理系/ライブラリが多いのですが、このライブラリはpacketLoopで実際の送受信処理を行っているようで、入れないと動きません。
  • 上記の通り、DHCPを使わない場合でもdhcpSetupを呼び出さないと通信できません。
  • 通信相手の指定はあくまでもhisIpとhisport。POSTのパラメータとは関係ありません…って当たり前なんですが、以前使った別のライブラリはGETのパラメータを読み取って自動的に接続してくれていたので、ハマりました。
  • 今回サーバ側がわりとシビアにJSON形式を処理するタイプで、フォーマットが違うとokが返ってこないため、POSTの扱いに問題があるのではないかとしばらく悩みました。結果として正しいJSON形式に変更したら、ちゃんとokが返ってきました。

2015年8月7日金曜日

Arduino nanoとMPL115A2




久しぶりの電子工作です。以前から作らなきゃ作らなきゃと思っていた、室外の気象状況把握デバイスにようやく着手しました。気温気圧湿度。

■追記■

HDC1000、MPL115A2、どちらも動きました。下記「失敗編」では気圧がエラいことばらついていて、MPL115A2やArduinoを交換したり大騒ぎしていたのですが、結果としてMPL115A2のCAP端子につないでいたコンデンサの不良でした。20年もののタンタルが劣化していたのでしょうか。ただ、気圧測定値はかなりバラつきます。もともとこのチップの精度は1kpa以下とのことなので仕様の範囲内ではありますが…このチップ、何に使うモノなんでしょう。この精度だと高度計や晴雨計には使えないですよね。
Temperature = 29.24 degree, Humidity = 57.06%, Pressure = 1005 kPa
Temperature = 29.23 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.20 degree, Humidity = 57.15%, Pressure = 1005 kPa
Temperature = 29.17 degree, Humidity = 57.15%, Pressure = 1003 kPa
Temperature = 29.13 degree, Humidity = 57.15%, Pressure = 1004 kPa
Temperature = 29.13 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1003 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1006 kPa
Temperature = 29.16 degree, Humidity = 57.06%, Pressure = 1004 kPa
Temperature = 29.12 degree, Humidity = 57.06%, Pressure = 1006 kPa
Temperature = 29.13 degree, Humidity = 57.06%, Pressure = 1006 kPa
Temperature = 29.08 degree, Humidity = 57.15%, Pressure = 1004 kPa
Temperature = 29.08 degree, Humidity = 57.15%, Pressure = 1006 kPa
Temperature = 29.07 degree, Humidity = 57.25%, Pressure = 1003 kPa
Temperature = 29.10 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.13 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.13 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.14 degree, Humidity = 57.25%, Pressure = 1006 kPa
Temperature = 29.14 degree, Humidity = 57.25%, Pressure = 1004 kPa
Temperature = 29.19 degree, Humidity = 57.25%, Pressure = 1004 kPa
ともあれ動いてなにより。

■失敗編■

気温湿度はHDC1000、気圧はMPL115A2。どっちもArduino用のライブラリが公開されているので、さくっと作ってみる。と。
Temperature = 28.98 degree, Humidity = 48.95%, Pressure = 960.98
Temperature = 29.02 degree, Humidity = 48.97%, Pressure = 1023.90
Temperature = 28.97 degree, Humidity = 48.85%, Pressure = 986.27
Temperature = 28.97 degree, Humidity = 48.85%, Pressure = 1017.61
Temperature = 28.93 degree, Humidity = 48.85%, Pressure = 1029.64
Temperature = 28.94 degree, Humidity = 48.85%, Pressure = 957.95
Temperature = 28.96 degree, Humidity = 48.85%, Pressure = 957.45
Temperature = 29.04 degree, Humidity = 48.88%, Pressure = 1010.54
Temperature = 28.94 degree, Humidity = 48.85%, Pressure = 952.30
Temperature = 28.96 degree, Humidity = 48.75%, Pressure = 984.23
Temperature = 28.93 degree, Humidity = 48.75%, Pressure = 984.98
Temperature = 28.97 degree, Humidity = 48.66%, Pressure = 987.49
Temperature = 28.98 degree, Humidity = 48.66%, Pressure = 990.82
Temperature = 29.01 degree, Humidity = 48.68%, Pressure = 943.27
Temperature = 28.98 degree, Humidity = 48.56%, Pressure = 986.27
Temperature = 28.93 degree, Humidity = 48.46%, Pressure = 1027.91
Temperature = 28.98 degree, Humidity = 48.46%, Pressure = 959.57
Temperature = 29.01 degree, Humidity = 48.49%, Pressure = 954.06
Temperature = 29.05 degree, Humidity = 48.49%, Pressure = 943.93
Temperature = 29.01 degree, Humidity = 48.49%, Pressure = 970.07
Temperature = 29.05 degree, Humidity = 48.49%, Pressure = 1007.75
Temperature = 29.08 degree, Humidity = 48.39%, Pressure = 1056.10
Temperature = 29.08 degree, Humidity = 48.49%, Pressure = 1000.93
Temperature = 29.05 degree, Humidity = 48.39%, Pressure = 949.96
HDC1000からの気温湿度はともかく、なんすかこの巨大台風と異常高気圧orz Adafruitのライブラリとサンプルで試しても似たような状況。ってか温度も酷い。
Hello!
Getting barometric pressHello!
Getting barometric pressure ...
Pressure (kPa): 101.8867 kPa
Temp (*C): 38.6 *C
Pressure (kPa): 123.9470 kPa
Temp (*C): 61.6 *C
Pressure (kPa): 102.9643 kPa
Temp (*C): 41.3 *C
Pressure (kPa): 122.3504 kPa
Temp (*C): 29.7 *C
Pressure (kPa): 128.0168 kPa
Temp (*C): 30.0 *C
Pressure (kPa): 106.1308 kPa
Temp (*C): 38.6 *C
Pressure (kPa): 96.2912 kPa
Temp (*C): 40.9 *C
Pressure (kPa): 96.4242 kPa
Temp (*C): 38.6 *C
Pressure (kPa): 95.8312 kPa
気圧の計算には同センサーが内蔵している温度センサの値を使っている。温度がダメでそれに引っ張られているのか、どっちもダメなのか。HDC1000の温度値を使って計算しなおす方向にしましょうかorz

ところで出勤前にこれやってるんですが…趣味でストレス貯めてどうする俺orz

とりあえず電源にパスコン追加したり、地道なところからやってみますかね。センサー破損の可能性も皆無ではないけど、それは部品沼が(ry

追記:
パスコン追加して、あと、RSTが5Vにつながっているという大ポカが発覚したものの、代わりありませんでした。さらに、HDC1000を外しプルアップ抵抗をつけてArduinoと直結してもダメでした。センサー故障ですね…5Vつないで壊した可能性も高いですがorz

追記の追記:
その後、新品をつないでみましたが、結果は同じでした。うーん。