2012/09/28

Arduino:気圧センサ

なんとなく、まともなデータが取れ始めましたので、本当の目的である急速に発達する
低気圧発見かも?機、通称名「爆弾低気圧発見器」に仕上げるため、プログラムを
ちょこちょこと変更してみました。
まずは、ArduinoからPCへシリアル経由でデータのみ出力するようにしました。

#include <Wire.h>
#include <MPL115A2.h>
void setup()
{
  MPL115A2.begin();
  MPL115A2.shutdown();
  Serial.begin(9600);
}
void loop()
{
  MPL115A2.ReadSensor();
  MPL115A2.shutdown();
  float total = 0;
 
  for (int i=0; i < 30; i++){
   total = total + MPL115A2.GetPressure();
   delay(1000);
  }
  float avepress = (total / 30) * 10; // average + kPa->hPa trans.
  Serial.print(" ");
  Serial.println(avepress);
 
  delay(30000);
}
30秒データを取った後、平均化してkPaからhPaへ変換します。
ArduinoからシリアルUSB変換してPCと送られ、PCではRubyでデータ整形&ファイル出力
するようにしました。
require 'rubygems'
require 'serialport'
require 'date'
port = "/dev/ttyUSB0"    #arduinoのポート番号
sp = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE)
while (press = sp.gets) do
  fp = open("press.log","a")
  day = Time.now
  output = day.strftime("%Y%m%d-%X")+press
  fp.write(output)
  print output
  fp.close
end
sp.close
 で、昨日の0時から動作させて、とりあえず21時までのログを表計算ソフトでグラフ化
してみました。
日中は太陽の影響で気圧が乱されるらしいのですが、傾向としてゆっくりと気圧が低く
なってますね。
現在、気圧と天気について調べているので、それをプログラムに反映できればいいですねぇ。(^^)

2012/09/25

Arduino:気圧センサの読み取り

2週間も経ってしまいました。。。
センサのレジスタを読めた!と喜んでいたのですが、24時間のログ取りテストを
している中で、どうにも値が変化しなかったため、ソフトが悪いのかセンサ周りの
回路が悪いのかと、週に数時間カット&トライを繰り返していました。
試していく中で、そもそもセンサの値がI2Cのバッファに値が入ってこないことがわかり、
今日新しいセンサを入手して試したところ、あっさりと動作。。。
センサが壊れていた、ということですね。(^^;)
この2週間は、一体何だったんだ...orz
ということで、ライブラリのサンプルソフトそのままに、今日から明日までのログ取り開始です。
おおよそ、気象台の変化と同じならば、本格的にプログラム作成開始です。
うまくいっていますように。(-人-)

2012/09/10

Arduino: LCD表示テスト&気圧センサ読み取り

 数年前に買ったLCDが壊れた!、ということで、先週秋葉原で新しいLCDを購入してきました。
で、週末にリンク先のページを元に配線したのですが、VRが見当たらないため固定抵抗を
接続して、まぁ動くだろうと試したところ全く動かず。。。(というか表示されず)
http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=941
接続は間違いないのに、、、と自問自答しながら暫し、、、この前作ったラジオにVRを
使っていたことを思い出し、接続したところサンプルのHello worldがあっさりと動作。
数年前買ったLCDでも試したところ、動作しました。。。
楽して動作させようとした、私に問題がありました。。。orz
ArduinoにはHitachi HD44780と互換チップに対応したライブラリが整備されていて、準拠
していれば、下のようなソースであっさりLCDが動かせます。
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);

void setup() {
  lcd.print("hello, world!");
}

void loop() {}

 次に気圧センサ(MPL115A2)の動作試験を行ったのですが、こちらもまた部品を一つ買い忘れ(そんなのばっかですね(^^;))、
家にあるパーツでなんとかならないかと、色々やっていたのですが、こちらもうんともすんとも。。。(ソフトはよく参考にされているものを利用させていただきました)
ちなみに、I2Cのプルアップ抵抗値は下のリンクを参考に算出しました。
http://www.picfun.com/midi2c02.html
参考にさせてもらったソフトが実用性に富むものだったので、もっと基本的なソフトは
無いだろうかと探してみたところ、githubで公開されているライブラリがありました。
https://github.com/misenso/MPL115A2-Arduino-Library
githubよりライブラリをダウンロードして、/Applications/Arduino.app/Contents/Resources/Java/libraries
にMPL115A2のディレクトリを作り、ダウンロードした中身をmoveします。
それでArduino IDEを起動すると、スケッチ→ライブラリを使用 にMPL115A2が追加されました。
サンプルも追加されますので、そちらをコンパイルしArduinoに書き込んだところ、
無事気圧データと温度データをシリアル経由でMacのターミナルに表示できました。
表示されている値が、見たところ謎なので調整していこうかと思います。
どうも、初めにつまづく癖がありますね。。。

#include <Wire.h>
#include <MPL115A2.h>
void setup()
{
  MPL115A2.begin();
  MPL115A2.shutdown();
  Serial.begin(9600);
}
void loop()
{
  MPL115A2.ReadSensor();
  MPL115A2.shutdown();
 
  Serial.print("Pressure(kPa): ");
  Serial.print(MPL115A2.GetPressure());
  Serial.print("     Temperature(C): ");
  Serial.println(MPL115A2.GetTemperature());
 
  delay(1000);
}

2012/09/03

Arduino: シリアル通信

本当は5年以上前に買ったLCDを接続して、表示しようと思ったのですが、、、
何故か動作せず。。。orz

LCDがNGだったので、外部パーツがなくても試せる、シリアル通信を試しました。
シリアル通信は、USBからとPin0,1から同じデータを送受信できるので、プログラム開発
中ならばUSB接続してIDEのシリアルターミナルを開けば、即確認できるようになっています。
なので、Arduinoに送ったデータを、そのまま返すプログラムを作って試しました。
(拾ってきた、が正しいです(^^;))
println()はformatをBYTEにすることで、文字として送れたらしいですが、現在のIDE
ではエラーとなり、Serial.write()で書いてくれと文句を言われました。
int incomingByte = 0;    // 受信データ用

void setup() {
    Serial.begin(9600);    // 9600bpsでシリアルポートを開く
}

void loop() {
    if (Serial.available() > 0) { // 受信したデータが存在する
        incomingByte = Serial.read(); // 受信データを読み込む
        Serial.write(incomingByte);
        Serial.println("");
    }
}
 結果のターミナルは図のような感じ。(大して面白くない画像ですが。。。)
先週金曜日にセンサーは入手済みだったので、LCDやシリアルとか寄り道しなければ、
センサーからのモニターくらいできたのでは、と ちょっと後悔してます。。。orz