つれづれなるまゝに

単なる作業メモ。主に、Linux, arduino, raspberry piとか?

arduio SDカードへのデータ保存 その1

2013-09-29 21:33:55 | arduino
最近は、arduinoにどっぷり。
次はSDカードシールドを使って、取得したデータを保存させようと思う。

SDカードライブラリの主な使い方は、こちらをみて勉強。

購入しているのは、arduino純正のxbee + ワイヤレスSDシールド。

一瞬ケーキ?と思わせるようなおしゃれなパッケージングは、made in Italy。

サンプルスケッチをみていて、あることに気が付いた。

SDにファイルを書き込む際のタイムスタンプだが、

 SdFile::dateTimeCallback( &dateTime );

という形でコールバック関数を登録できるそうだ。
このコールバック関数の中で時間を取得する必要がある。。。そういえば、考えてなかったよ。。。

サンプルスケッチのコメントに書かれているが、GPSかRTCが必要ですね。
ネットワークに繋がってるならntpから取得する方法もあるようですね。ちなみにRaspberry piにもRTCは搭載されてないので、起動時にntpでの時間設定が必要ですね。

先に、RTCモジュールを買ってきて、試してみることにします。

(続く)



arduino 雑記 - delayとsleepとか

2013-09-29 00:12:13 | arduino
これまでスケッチについては、よそ様のをもってきて少し手直しする程度でした。

今後、本格的に使っていくにあたり、今日は少しarduinoの言語を調べてみた。主に以下を参考にしました。

Language Reference
Arduino 日本語リファレンス


1) 基本仕様

・C/C++をベース
 一般的なOSでのC言語はmain()が最初に呼ばれるが、Arduinoでは1:Setup() 2:loop()で以降、loop()が繰り返されて呼ばれる仕組みということね。

AVR Libcにリンクされていてその関数を利用可能
 なければ、このライブラリを直接つかって拡張可能ということですね。


2) delayとsleep

 arduinoの基本的な使い方は制御や測定。ということで、loop()の繰り返しという基本的な仕組みは納得。これまで使ってきたスケッチは、delay()を使って周期をコントロールしているもばかりで、それが普通なのかと思ってましたが、、、

「熟練したプログラマーは、よほどスケッチが簡単になる場合を除き、10ms以上のイベントのコントロールにdelay()を使うことは避けるでしょう」

そうなんですか^^;
理由は、「計算やピン操作といった他の処理が実質的に止まってしまう」から。
なので、millis()を使いなさいと。つまり、delay(1000)なら、


unsigned long last = 0;
unsigned long time = 0;

loop(){
 time = millis();
 if(time - last > 1000){
  // 処理を実行
   ・・・
  last = time;
 }
}

ってことですかね。javaのgetTime()、WindowsのCTime::GetTime()的な処理ですね。
unsigned longなので約50日でオーバフローするので、連続使用するときはその考慮も必要ですね。

ただし、割り込み処理は実行されるので、簡単なものだとdelay()でもよさげ。
このmillis()だと、loop()は常に呼ばれるので、省電力ということではdelay()の方がよい気がします。

さて、じゃぁsleep()は?と思ってみてみたところリファレンスにはない。
こちらをみると、sleepはAVR Libcにはあるようです。スリープメソッドも何種類かあって、処理実行後にパワーダウン、外部割り込みで起きるようなこともできるようです。


今日はここまで。次はC/C++以外の言語でarduinoを使用する方法とか調べてみようかと思います。Processingとか。