Arduinoで気圧計測

森下功啓製作所 ONLINE


1. はじめに

秋月電子やストロベリーリナックスより購入可能なSCP1000という絶対気圧センサの試用テスト結果をまとめました。 このセンサ単体だとリフロー炉がなければ実装もままなりませんので、秋月で購入したセンサボードを使いました。 使ってみると、非常に高感度かつ使い易いセンサだと思いました。 個人的な気象台の他にも、エレベータやエスカレータで上下方向の移動を行うロボットへの応用も可能だと思います。

絶対圧で計測できる気圧センサは2008年頃からようやく個人でも購入できる様になりました。 個人でもなんとか色々とやれる環境が整いつつあり、喜ばしい状況です。


2. 回路の様子

Arduinoでこのセンサを制御する場合、特に3.3Vの電源ラインに電解コンデンサを入れて下さい。 さもないと電源が安定せず、気圧・気温の観測値が明らかにおかしい値となります。 また、一瞬なら5Vを印加しても壊れることはないようです。

気圧計測回路
図1 気圧の計測回路


3. プログラムのダウンロード

サンプルプログラムを以下からダウンロードできます。 開発はArduino IDE 0022で行っています。


プログラムのダウンロード
リリース日 プログラムパッケージ 更新内容
2012/3/4 SPC1000forArduino1_0.zip Arduinoフォーラムで紹介されていたコードをArduino 1.0に対応させたライブラリとサンプルコードです。 簡単な変更だけで対応できましたが、ここに公開しておきます。 著作権は当方にはありませんのであしからず。
2011/6/4 atmospheric_pressure.zip エレキジャックの記事で紹介されていたコードをまとめたものです。 当方には著作権は全くありません。
2011/6/4 atmospheric_pressure_2.zip Arduinoフォーラムで紹介されていたコードです。 気圧センサのコード部分に関して、当方には著作権は全くありません。
[2012/3/4 追記]Arduino IDEバージョン0022にて動作を確認しています。

スケッチ(atmospheric_pressure_2.zipのメインコード)
/***************************************************
 * atmospheric_pressure_2.pde
 * 
 * ネットから頂いた秋月の気圧センサの制御コードを使って、
 * これまた頂いたI2C制御用プログラムを改造して、
 * 計測値をLCDへ出力しています。
 * Read the Barometric Pressure and Temperature values from SCP1000 sensor
 * 
 * based on sample code from Arduino forum
 * http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1236443720/8
 ************************************************/
#include <scp1000.h>

// 各種定義
#define SelectPin    10            // Specify slave select pin for SCP1000 device
// 外部変数(オブジェクト)宣言
SCP1000 scp1000(SelectPin);

void setup()
{
  Serial.begin(9600);             // Open serial connection to report values to host
  Serial.println("Starting up");
  (void)lcd_init();                // LCDを初期化。必要ないならコメントアウトして下さい。
  lcd_print("Air Observation!");
  delay(200);
  (void)scp1000.init();            // センサーを初期化
  delay(800);
}

void loop()
{
  int   air_pressure_I, temp_I, air_pressure_F, temp_F;

  // データ取得
  scp1000.readSensor();
  // LCDへの出力のためにデータを加工
  air_pressure_I  = (int)scp1000.BaroP;                          // 整数部を取得
  air_pressure_F  = (int)((long)(scp1000.BaroP * 100.0) % 100l); // 小数部を取得
  temp_I          = (int)scp1000.TempC;
  temp_F          = (int)((long)(scp1000.TempC * 100.0) % 100l);
  // LCDへデータを表示 必要ないならコメントアウトして下さい。
  lcd_print(air_pressure_I, 4, ' ', 1, 0);                       // 整数部を表示。4桁指定。余った分は半角スペースで埋める。1行目(0より数える)の0文字目に表示を指示。
  lcd_print(".");
  lcd_print(air_pressure_F, 2, '0');                             // 小数部を表示。2桁指定。余った分は'0'で埋める。
  lcd_print(",");
  lcd_print(temp_I, 2, ' ');
  lcd_print(".");
  lcd_print(temp_F, 2, '0');
  lcd_print("  ");
  // 取得データをシリアルへ送信
  Serial.print("Temprature (C),");
  Serial.print(scp1000.TempC);
  Serial.print(",Pressure (hPa),");
  Serial.println(scp1000.BaroP);
  delay(500);
}

4. 実験

実際に気圧を観測した様子と結果を以下に示します。 定常位置における大気圧の観測とエレベータでの上下動の観測を行いました。


4.1 大気圧の観測

熊本大学の近隣にあるアメダスと大気圧の観測値を比較してみました。

大気圧計測の様子
図2 大気圧計測の様子

アメダスの気圧と比較した結果
図3 建屋の5Fで気圧と気温を計測した結果(図中で6Fとなっていますが、正しくは5Fです)
気圧の観測値が異常を示しています。 直射日光の影響により感圧部が局所的に温度変化し、異常値を観測したと考えられます。


4.2 エレベータでの移動を観測

本センサーがロボットの制御に使用できるか確認してみました。 まずはエレベータの階数を認識できるか?という課題について。。


動画1 エレベータでの上下動を観測している様子

エレベータに乗ってみました
図4 エレベータに乗って、高度変化を観測できるか観測してみた
かなり明確にエレベータの昇降をとらえることができました。


4.3 日光の影響を確認

4.1で日射の影響が示唆されましたが、これを分かりやすい形で確認してみました。


動画2 日光の影響を確認している動画




4.4 計測誤差の見積もり 標準偏差編

SCP1000をビン詰にして得た観測値を図5に示します。 観測期間は約20分です。 この図を見ると、内部の電子装置が発する熱により気体が膨張して気圧が上昇する傾向にあることが分かります。 ちなみに、SCP1000の最高分解能は0.025 hPaです。 トランジスタ技術2012年3月号に0.1 hPaと掲載されていましたがこれは誤植と思われます。

気圧の観測例
図5 気圧の観測例

次に、先のデータから近似直線で求めた平均的な変動を差し引いた偏差を図6に示します。 標準偏差は0.0131 hPaでした。 これは高度にして約10 cm程度です。 従って、短時間の気圧観測値を基に推定した変位には、約20cm程度の誤差が含まれると考えられます。

気圧観測の偏差
図6 気圧観測値の偏差


4.5 計測誤差の見積もり バイアス編

SCP1000を多数使用して観測すると、なんと個体差が1 hPaもあることが分かります。 これは気圧高度にして約8~10mの差を生じさせます。 この差は通常の気象観測では大したことはないとされるかもしれませんが、気圧高度を求めるには少々不満が残ります。 しかも、この個体差はセンサ温度に依存しています。 手持ちのセンサー3つを用いたテストの結果を図7に示します。 3つのセンサーとも同じ環境下にあるにも拘らず、個々に異なる値を示しています。 気圧の観測値を基にした絶対高度の推定精度を高めようとした場合、この個体差は予め校正しておく必要があります。

センサのバイアス
図7 バイアスのある観測例

次に、図8に図7とは別の日に観測したバイアスの温度依存性を示すデータを示します。 気温の低下と共にバイアスが拡大しているのが分かるかと思います。 この温度依存性を無視した場合、高度推定値には約2~3 mの誤差を生じ得ます。 ちなみに、大気圧に依存した無視できないバイアスも有るかもしれません。 もし車で行ける1000 mクラスの山が近場にあれば実際に行って観測を実施した方が良いでしょう。

バイアスの温度依存性
図8 バイアスの温度依存性


[2012/3/4 追記]上記の3つのモジュールの内、よく調べてみると気温に対して強くに応答していたのは1台のみでした。 他のモジュールは、気温差30℃程で0.1~0.2 hPa程度です。 モジュールの検査をするときは多数のモジュールを使って相対変化を吟味した方が良さそうです。


4.6 計測誤差の見積もり 経年変化編

SCP1000の経年変化に関してはそれを発見できるほどの観測をやっていないので分かりませんが、おそらく存在します。 何かわかったら半年ほど経って掲載すると思います。


5. 最期に

SCP1000を使用すれば、その非常に高分解能かつ高精度な性能によってエレベータの階数まで判定可能であることが分かりました。 また直射日光には弱く、暗い箱の中へ入れておかなければならない事も分かりました。 これに注意を払いさえすれば、個人的な気象台や屋内を移動するロボットへの応用が可能です。 もし上手いことロボットへ応用した方はぜひお知らせください。


参考文献

[1]ArduinoにSPI通信を行う機器を接続する(1),エレキジャック,http://www.eleki-jack.com/FC/2010/07/arduinospi.html,2011/6.
[2]気圧センサSCP1000(試食),合同会社パレットソフト,http://www.palettesoft.co.jp/technology/pic/etc/press/pic_press.htm,2011/6.
[3]Arduinoフォーラム,http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1236443720/8,2011/6.
[4]Arduinoで秋月の気圧センサーを使う,初心者の電子の館,http://fromgoldenwells.blog.so-net.ne.jp/2010-03-08,2011/6.

inserted by FC2 system