つれづれなるまゝに

単なる作業メモ。主に、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とか。

arduino LCD シールド

2013-09-26 23:17:07 | arduino
本日は、はんだ付けになれるため、LCDシールドを作成。

スイッチサイエンスから購入した、LCDシールドキットを作ってみた。

作り方がここに書いてあるので、作り間違うことはないはず。問題が発生するとすればはんだ付けに失敗することかな・・・。

で、完成。


いやぁ、はんだ盛りすぎ orz
これでも動作するんですね、よかったよかった。

スケッチは、こちらのものを使用させてもらって動作確認。

ん?真っ青・・・
⇒コントラストのデフォルト位置だとそうなる。右にまわしてコントラストを落とす。

ん?■■■■■■■■■って表示される・・・
⇒参考にさせてもらったスケッチの接続ピン指定を、LCDシールドキットの方に書き換えるの忘れていた(汗)


ちゃんと動きましたと。


よかった~><

次は、前回の温度センサーとの合わせ技で、測った値をLCDに表示させてみようと思います。

--- 追記 ---

明日まで我慢しきれず、さくっと試してみました。



本日、27℃。だいぶ涼しくなりましたね。

いやー、とっても簡単(10分くらい?)でできました。

raspberry piで温度計測(TMP102)

2013-09-22 21:40:07 | raspberry pi
さて、次はraspberry piにTMP102を繋いでみます。

1) I2Cデバイスを扱えるようにする

ここを参考にさせていただきました。

1.1) /etc/modulesに以下一行を追加

i2c-dev

1.2) /etc/modprobe.d/raspi-blacklist.confで以下一行をコメントアウト

blacklist i2c-bcm2708

1.3) 再起動

1.4) 以下にてモジュールが組み込まれていることを確認

$ dmsg | grep i2c

1.5) i2cツールのインストール

$ sudo apt-get install i2c-tools


2) TMP102の接続

2.1) Revの確認

Rev1とRev2ではGPIOピンの配列が若干違うため、念のために確認しておく。確認方法は、ここここを参考にした。

私のは、ねじ止めの穴が開いてることから、Rev2であることが確認できた。またメモリが512MBなので、Rev2確定。

ちなみにcpuinfoは、

Hardware : BCM2708
Revision : 000d

でした。

2.2) ピン接続

ここや本を参考にピン配置を確認。
ちなみにワイヤーはArduinoがオス-オスに対して、raspberry piはメス-オス。同じなら出費が減らせたのだが。。。

あと、GPIOはSoCに直結とのことで、静電気には注意が必要と聞いているので、金属物にタッチ。

こんな感じ?



3) 動作確認

再度起動後、動作確認。またまた、ここを参考にさせていただいてます。

3.1) i2cレベルでの動作確認

pi@raspberrypi:~$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

ちゃんと0x48と出ています。

ここで1点補足。参考元のサイトでは、コマンドが"sudo i2cdetect 0"となっています。
最初はそのままコマンド打ってみたところ、アドレスが表示されず、接続間違えた?と焦りました。

i2cdetect -hでヘルプをみたことろ、-lというオプションを見つけたので打ってみる。

pi@raspberrypi:~$ sudo i2cdetect -l
i2c-0 i2c bcm2708_i2c.0 I2C adapter
i2c-1 i2c bcm2708_i2c.1 I2C adapter

あぁ、I2Cが2つあるのに気付く。手元の本でピン配列を再度確認すると、接続してるのはi2c-1の方でした。
ちなみにRev1では両方ともi2c-0でした。

3.2) 値取得

参考先のシェルスクリプトを使用させていただきました。
ここでも注意。アドレスが 0x49 -> 0x48、i2cが 0 -> 1 なので、i2cgetのパラメータは以下になります。

sudo i2cget -y 1 0x48 0x00 w

2行あるので変更忘れずに。

pi@raspberrypi:~$ ./tmp102.sh
30.5625

値がとれました :-)

本日は、以上!

arduinoで温度計測(TMP102)

2013-09-22 11:21:04 | arduino
サーバ構築から一転、今日はarduino UNO R3から温度センサー(TMP102)をI2Cで使ってみることにした。

1) はんだ付け

ブレッドボードで試すので、TMP102にピンをはんだ付け。久しぶりのはんだ付けで緊張したw

2) 配線

こちらの動画を参考。0:46あたりで、図での説明があり、わかりやすい。

まとめておくと、

SCL -> ANALOG IN A5
SDA -> ANALOG IN A4
GND -> GND
V+ -> 3.3V

ADD0 -> GND
※ADD0の接続先でIC2のアドレスが変わるので注意。こちらを参考
GNDなら0x48


こんな感じになりました。


3) スケッチ

こちらを参考にさせてもらいました。

注意点は、先ほど書いたアドレス。参考にしたサイトでは、0x49になってます。私はGNDにつないだので0x48に変更。
最初、ここがわからず動かなくて焦りました。


4) 結果

tmp(HEX)=1E4 tmpin(DEC)=484 tmp C=30.25
tmp(HEX)=1E5 tmpin(DEC)=485 tmp C=30.31
tmp(HEX)=1E4 tmpin(DEC)=484 tmp C=30.25
tmp(HEX)=1E4 tmpin(DEC)=484 tmp C=30.25
tmp(HEX)=1E4 tmpin(DEC)=484 tmp C=30.25
tmp(HEX)=1E4 tmpin(DEC)=484 tmp C=30.25
tmp(HEX)=1E4 tmpin(DEC)=484 tmp C=30.25
tmp(HEX)=1E5 tmpin(DEC)=485 tmp C=30.31
tmp(HEX)=1E5 tmpin(DEC)=485 tmp C=30.31
tmp(HEX)=1E5 tmpin(DEC)=485 tmp C=30.31
 ・・・

エアコンの室内温度みると29°となっていたので大体あってるかなと。
あまり数値が動かないので息をかけたりしてみて温度に変化があるか確かめたりしました。^^;

と、ここまでで1時間程度。
arduino + ブレッドボードは初めてだったのですが、聞いてた通り簡単でした。

5) 今後

次は湿度計つけてみたいなと。
あと、xbee+SDのシールドは買ってあるので、家の中の温度湿度を観測してみようかと思っています。
xbeeはまだ買ってないので、先にSDに値を蓄積させるのを作ろうかなぁ。