気圧センサ MPL115A2を使ってみる (+ Arduino Fio と一緒に)

1cm角の気圧センサ、動作電圧 2.375V〜5.5V と
広範囲、温度センサも内蔵されているが詳細はマニュアルには書いていない

販売先はストロベリーリナックス ¥1,260円

I2Cインターフェイスは2本の線だけで通信できて
複数のデバイスをアドレス指定でデータ送受できるが”Arduino”のようなコンピューターが無ければ
少々データのReed、Writ が面倒。

そこで”Arduino Fio”とタッグを組んでみようと思う

接続はいたって簡単、下の図のようにするだけ
★ Arduino Fio に気圧計測用スケッチを書き込む

プログラムするには、係数に符号付ビット、整数ビット、少数ビットがあるので非常に面倒です、

そこで手抜きして
スケッチは「GarretLab」さんの実験室の”大気圧センサ”から拝借しました、

また温度センサも入っているので使わない手はないと思いますが

温度に関してはほとんど説明が有りませんでしたので
ちょっとデーターを取って解析してみました

                   


I2Cデバイスはマスターとスレーブという関係で通信する、マスターは制御側でスレーブを選ぶときはデバイスのアドレスで特定する、

通信は、まずアドレスを指定して”何バイトおくれ”と、
リクエスト送信する、指定されたスレーブは”OK”の返事をして、要求分のデーターを送信する、といった具合です、詳しく知る必要は無いと思います、

GarretLab」さんから拝借したスケッチは大変良く出来ているので安定してデータが来ます、スケッチの内容はさておき、概要だけ、

MPL115A2 は気圧と温度のアナログ値をAD変換しているので、マニュアルには”両方変換するにはアドレス0x12 に0x01を書き込んでください。”とあります

スケッチの↓この部分です(Master Write)
--------------------------------------
Wire.beginTransmission(address); ←送信開始
   Wire.write(0x12);  アドレス0x12に
   Wire.write(0x01);  値0x01 を書込む指示している
Wire.endTransmission();             ←送信終了
--------------------------------------Arduino の Wireライブラリでは送信開始-終了間に
書き込むアドレスと、値をいれます。

Reed の時も同じように”読みたい”リクエストを送る
Wire.requestFrom(address, 4);  ←リクエストフォーム
   この場合4バイト読みたいとリクエストしてるので
本来は”Wire.read();”を4行書く、このスケッチでは、先に”Padc”は上位と下位の2バイトですと宣言しているので各
unsigned int Padc = read_adc();
unsigned int Tadc = read_adc();
の2行になっている。
 

Cool Term で受信中の画像




温度と気圧は結構正確だ。


★ 無理やり温度センサを使う

温度センサのADC値は温度が上がると減少し下がると増加する負特性でした、英語マニュアルに”-5.35/℃”とチラッと書いてあるのを発見しました、勝手に1次関数 だと考えて式を作ってみました、

中学で学習する負の傾斜を持つ直線グラフの関数
            
y = -ax + b から
 
25℃
の時 ADC値が 472 という事と、グラフの傾き
a=-5.35
  ”b”は切片で 0℃ の時のADC値ですから
下の式に当てはめて解くと
ADC値 y = -5.35×温度 + 0℃の時の切片値

0℃の時のADC値 b = 約605 になりました、気圧のスケッチに 数行プログラムを追加すれば温度も計測できる

切片値 605 は個体によってばらつきがあるので正確な値は前後するようです、カットアンドトライで。

← 一緒に割り込み処理で風速計のパルスと換算した
     風速(大体ですが)

このデバイス1個で気圧と温度が計測できるのだから、個別には、温度計測用の素子と回路が不要になりますね。

風速のスケッチはオリジナルですが、この気圧スケッチと組み合わせるのに苦労しました、公開は次に。

※ Arduinoは最新の 101を使う事、日本語にもなったし

                     
今回使用したスケッチ


気圧センサは良いスケッチのおかげで、すんなりとArduino系で動きます。
 

 

 

Arduino Fio に XBee をソケットしようと”FANNEL”の
”XBeeConfigTool”で書き込んだら...XBeeが仲間外れになって戻らなくなった....これが泥沼か?...。

FANNELのコンフィグツールを使わないで設定してみる

1・XBeeのモードを”ATコマンドモード”にしてみた

2・Fio のUARTとの接続が上手くいくようにXBeeのシリアル設定”D7”と”D6”をハードウエア制御に変更

結果:Fioとは通信しているようだが、コーディネーターに届く情報は普通にXBee単体の時と変化なし。

ついにFioからのデータを捕らえました!それも今までのXBeeネットワークのAPIフレームで。

 
Arduino Fio からのAPIフレーム解説入り画像

基板に取り付けた、空きスペースに湿度センサを予定
Fioはアナログポートが多いので他にも付けれそう。

直ハンダしようと思ったがデュアルラインのソケットが有ったので1ピン足らなかったが思わぬメリットがあった。
★ 設定方法はいたって簡単!
(結局は上で設定した通りで良かったみたいで届いているデータを見落としていただけでした)

■ 設定方法

1・普通に、Arduino Fioに使う XBeeをX-CTUで、
   ATモードのファームウエアを選択する、タイプは
   コディネーターでもルーターでもエンドデバイスでも
   何でも良いです。

2・PAN IDは現在Xbeeのネットワークに参加させたけれ
   ばそのグループの PAN IDにします

3・”Serial Interfacing”項目の”D7”をCTS制御に
   ”D6”をRTS制御にハードウエア制御に変更する。

その他の設定は自分のすきなように設定する、たぶん
リモートコマンドで Arduino Fio にデーターを送れると思
うのでデジタルI/Oは出力モードが良いかと思う、アナログ設定は不要、FioのほうがADCポートが多いし、Fioに刺すとADCピンが使えない。悩んだが大成功!
※ 注意!次回X-CTUの設定はハードウエア制御にしないとエラーになります。

バッテリモニタと湿度センサーを追加、まだ基板スペースは余っている。


赤いLED(XBee電源)緑のLED(無線通信中)が点灯中
Arduino Fio の裏に I2C気圧センサデバイスを取り付け
たので基板ががら空きに。


リモートコマンドで Arduino Fio に送信は
今後調べることにする 結果→→→→→→
 

★ リモートコマンドが有効であると判明!

Fioには無関係のようだがリモートコマンドでXbeeの
ピン11を”DIGITAL Hi”のコマンドを送信したらピン11は
Hiレベルに変わった、しかし接続端子が無いので直接
XBeeのピンにケーブルを取り付けなければいけないようだ、どうもFioXBeeを無駄遣いしているようだ。
 
要望Arduino Fio はArduinoとしては無線UART機能
         が追加されてケーブルの煩わしさから解き放た
         れた感に見えるが、XBee側 からしたら単なる
         モデムとしか扱わていない奴隷的扱いです、
         もっとArduinoとXBeeは異種交配的な、混合種に
         なってほしいですね、どちらの機能も、ある程度
         は使えるような。
XBeeのリモートコマンドとArduino Fioで連携プレー
     を試してみる(ソーラーバッテリーからの自動充電)

大まかな第一弾の概要は、

 Fio でモニターしたバッテリー電圧が一定値より下がったら、コデディネーターから、XBeeリモートコマンドでポートを”H”か”L”にする、

Fio でポートをモニターしてコマンドに従ってソーラーバッテリーに接続する、か切断する

成功したら、第二弾としてソーラーパネルの仰角を、季節に合わせてサーボモーターで変化させる。
 
 
← 左の試みの結果はこのマスに書く予定
     その前に Arduino Fio を改造?

テストでPCからコマンドを送信してブザーをピーピー言わせてみた。
 

■ これで、メインバッテリーは自動充電
   ができるようになった。


Fioのバッテリー電圧が3.4Vを切るとXbeeリモートコマンドで DIO4 をHレベルにするとFETがONになり5V系で充電を開始、4.0Vを超えたら DIO4 を L レベルにするリモートコマンドを発行する、

回路的にはいたって単純です 右枠に回路図 →
(前の図は結線まちがいだったので修正しました)


幸いなことに、Fioの  GNDはアイソレートされていないので共通に使用できたのが功を奏した、

        

メインプログラムからFETゲートに、XBeeにコマンドを発行する主BTTが低下したら”H”に充電完了で”L”に
 

変更・監視側から指令しないで、自分で充電コントロールをするようにArduino Fio側に追加プログラムを入れました、これで Fio が自分で充電したり止めたりします。

//自動充電セクション

if (BttVoltage < 3.5) { //電圧が下がったら充電ピン12を H レベルに
digitalWrite(chargePin,HIGH);
ChargeStat = 1;
}
//指定電圧になったらタイマセット(一回だけ通る)
if (ChargeStat > 0 and ChargeStat < 2 ){
if (BttVoltage > 4.15){
Flag = 1;
Holdtime=millis();
}
}
//電圧が上がったら充電ピン12を Lレベルに
if ( BttVoltage > 4.15) {
ChargeStat = 2;
if (millis() > Holdtime + 3600000) { //規定電圧に達した後1時間充電す
digitalWrite(chargePin,LOW);
Flag = 0;
ChargeStat = 0;
}
}

NEWTON BOY に戻る