Arduinoという簡単マイコン基板があります。マイコン基板というのは、もっと簡単に言うとちっちゃなコンピュータです。キーボードとマウスとモニタがなくて、メモリがちょー少ないパソコンみたいなものです。
小さいながらもコンピュータなので、プログラム次第でいろんなことをさせられます。で、ここではそのArduinoにセンサをつないで、その記録をパソコンに保存する方法を考えようという話です。
まず、Arduino側のことを考えないといけません。パソコンとの通信方法は今時だといろいろあるのですが、一番簡単にできるシリアル通信にしましょう。RS-232Cとかいわれる類のものです。
ArduinoにはUSBシリアル変換ICが搭載されていて(もしくはマイコンに内蔵されていて)、パソコンからはシリアルポート(COMポート)として認識できるようになっています。ですから、シリアルポートからデータが読み出せるソフトをパソコン側で用意すれば、Arduinoが取ったデータを受け取ることができるようになります。
センサから読み出す方法はネット上にいろいろと例があるので、自分の使いたいセンサに合わせたものを探してくるのがよいでしょう。
注意したいのはセンサの読み出し間隔です。Arduinoの開発言語にはdelay(ミリ秒)という一定時間待つ手段があるので、1秒間隔でデータをセンサから読み出す場合にはdelay(1000)としたくなるのですが、そうすると待ち時間の1秒に加えてセンサからデータを読み出す時間とパソコンにデータを送信する時間が加わるので、1秒以上間隔が開くことになってしまいます。
ですから、正しく1秒間隔でセンサからデータを読み出してパソコンに書き出す場合には、起動からの通算時間を使ってどれだけ時間が経っているかを計るか、割り込みを使うかしましょう。
例えばセンサを読み出すときはdelayを使ってこんな風に書きがちですが、
void setup() { } void loop() { delay(1000); //1秒待つ //センサを読み出す処理 //シリアルポートに書き出す処理 } }
そうじゃなくて、通算時間を使って
unsigned long nexttime; void setup() { nexttime = millis() + 1000; } void loop() { if (nextTime < millis()) { nextTime = nextTime + 1000; // Set Next analyze time //センサを読み出す処理 //シリアルポートに書き出す処理 } }
のようにするといいんじゃないでしょうか。(50日くらいで通算時間のカウンタが0に戻るので、長時間使うときは対策が必要かもしれません。)
割り込みを使うのもいいんですが、ちょっと現在(2012年7月)のArduinoの割り込み関連がわりと混乱していて、Arduinoの種類によって使える割り込みが違ったりしているので、ここでは割り込みではなく上の方法をおすすめしておきます。
[連載リンク]
Arduinoにつないだセンサからの値をパソコンで記録する(1) この記事です
Arduinoにつないだセンサからの値をパソコンで記録する(2)
Arduinoにつないだセンサからの値をパソコンで記録する(3)
Arduinoにつないだセンサからの値をパソコンで記録する(4)
Arduinoにつないだセンサからの値をパソコンで記録する(5)
Arduinoにつないだセンサからの値をパソコンで記録する(6)
Arduinoにつないだセンサからの値をパソコンで記録する(7)
Arduinoにつないだセンサからの値をパソコンで記録する(8)
ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(4) | Ukkari blog
ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(7) | Ukkari blog
ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(6) | Ukkari blog
ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(5) | Ukkari blog
ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(3) | Ukkari blog
ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(2) | Ukkari blog
ピンバック: Arduinoにつないだセンサからの値をパソコンで記録する(8) | Ukkari blog
参考にさせていただいてます
もうお気づきかもしれませんが2つめのプログラムの7行目は
if (NextTime >= millis()) {ではなく
if (NextTime < millis()) {としないと無限に表示しまくってしまいました
ご指摘ありがとうございます。その通りですね。
説明もちょっと付け加えてみました。