
写真1 AD9833 DDS MSOP 0.5ピッチ 変換基板に乗せる
それはさておき、
このチップは10ピンのMSOPで、写真にようにピンセットの先ほどの大きさです。
変換基板に取り付けましたが、ピンのピッチは0.5なので、半田付けにはちょっと技術が必要です。
まずチップをゲルタイプの瞬間接着剤で正確な位置に仮止めしておきます。
フラックスをほんのわずか塗って、すべてのピンにわざとまたがるくらい半田を盛ります。
半田吸い取り線で、余分な半田を吸い取って、出来上がり。
慣れれば簡単ですが、最初は数個パーにする覚悟がいります(笑)。
このDDSは、マスタクロック(MCLK)周波数は最高25MHzで、その場合最高発振周波数(ナイキスト周波数)は12.5MHzとなり、分解能は0.1Hzです。
今回は手持ち部品の関係で、20MHzのクリスタルを使用したので、10MHzまでのプログラマブルオシレータとして、実験してみました。この場合の分解能は約0.075Hzです。
ラズベリーパイ ホームページで自宅の室温を監視
投稿日 2014/08/20
ラズベリーパイのwebサーバで現在の室温とその48時間の推移をグラフで見られるようにしてみました。
ITpro by 日経コンピュータの「PCボード「ラズパイ」で部屋の温度を記録しよう」を参考(以降”記事”と称します)にさせていただきました。
記事で紹介されている内容やソースコードを部分的に変更しています。
閾(しきい)値の設定や、閾値の温度を超えるとシステムをシャットダウンする機能は外しました。
温度変化の24時間推移を48時間推移に増やしました。
温度センサーは記事ではtmp102を使用していますが、adt7410を使用しました。
先日アクセスカウンタを設置したwebサーバのホームページに温度表示用のボタン新たに設け、クリックすると現在の室温や48時間前からの推移をグラフにして表示するようにしてみました。

ラズベリーパイに温度センサーをつないで、
室温を計測しロギング。ブラウザで温度推移を見る
温度センサーはADT7410(右端)
(LCDにも温度を表示していますが関係ありません)
webサーバにはapache2、cgiの言語はperlを使用しています。apache2はすでにインストールされwebサーバが稼働しているのが前提です。perlもすでにインストール済みとします。i2c関連のモジュールと設定も完了しているものとします。
温度センサーにはADT4710を使用
まずは室温を計測しないと話が始まりませんので、温度センサーを決めます。ラズベリーパイの場合はI2Cインターフェースでの接続が容易ですので、秋月電子で取り扱っているADT7410の温度センサモジュールを使用しました。(記事ではTMP102というセンサーを使用しています。)
以下のように結線しておきます。
ADT7410 -> Ras-pi
Vdd -> pin1 3.3V
SCL -> pin5 SCL
SDA -> pin3 SDA
GND -> pin6 GND
SCL, SDAのプルアップはRas-Pi内で行われていますので不要です。
ADT7410が正しく接続できたかを、以下のコマンドで確認します。
sudo i2cdetect -y 1
このコマンドで表示される表に48があれば接続はOK 0x48はADT7410のI2Cスレーブアドレスです。
sudo i2cget -y 1 0x48 0x00 w
このコマンドで 0xf00f などと表示すればOKです。
この値は前後のバイトをひっくり返して10進に変換し128で割れば温度になります。
0xf00fの場合 -> 0x0ff0 -> 4080 -> 128で割る -> 31℃
シェルスクリプトを作って10分毎に実行しログをとる
まず温度を計測するシェルスクリプトですが、記事のスクリプトを少し変更し、年月日、時刻、温度をログにとれるようにしています。
このスクリプトでは、現在の年月日と時刻を記録し、その行にi2cgetで計測した温度データを、awkで温度に変換して出力しています。
記事では温度が設定した閾値を超えるとシステムをシャットダウンしていますが、今回は取り除きました。
/home/pi/tmpget.sh 755
#!/bin/sh
date +"%Y/%m/%d %k:%M" | awk '{printf("%s ",$1 " " $2)}'
sudo /usr/sbin/i2cget -y 1 0x48 0x00 w | awk '{printf("%.2f\n", (t=("0x"substr($1,5,2)substr($1,3,2)))/128)}'
tmpget.shをcronで10分毎に実行させ、ログに記録します。
crontab -e でcrontabに次の一行を追加します。
*/10 * * * * /home/pi/tmpget.sh >> /home/pi/tmpget.log
これで以下のように10分毎の温度が日付、時刻とともに/home/pi/tmpget.logに記録され続けます。
温度記録の例
cat /home/pi/tmpget.log
2014/08/18 0:00 27.81
2014/08/18 0:10 27.81
2014/08/18 0:20 27.81
2014/08/18 0:30 27.81
2014/08/18 0:40 27.81
2014/08/18 0:50 27.75
2014/08/18 1:00 27.75
2014/08/18 1:10 27.75
2014/08/18 1:20 27.69
...
10分毎に温度が記録されている。
このようなログがとれたらシェルスクリプトとcronの設定はOKです。
perlのグラフィックライブラリをインストール
以下のコマンドでグラフィック・ライブラリをインストールしておきます。
sudo apt-get install libgd-gd2-perl libgd-graph-perl bc
cgiを作ってページに埋め込む
/var/www/index.htmlにFORMを追加し、そのFORMに「現在の室温」と「48 時間推移」の送信ボタンを用意します。

index.htmlにFORMを追加し、
「現在の室温」と「48時間推移」送信ボタンを用意
FORMの部分は、こんな感じです。
...
<FORM method="GET" action="./cgi-bin/adt7410.cgi">
<p><input type="submit" name="ctmp" value="現在の室温"></p>
<p><input type="submit" name="draw" value="48 時間推移"></p>
</FORM>
...
これによって「現在の室温」または「48 時間推移」送信ボタンを押すとadt4710.cgiが実行され、新たなページで現在の室温、または推移グラフが表示されます。

現在の室温を表示

室温の推移
早朝が最低温度です。
朝から昼にかけて徐々に温度が上昇しますが、
途中でエアコンを入れたので下がっています。(右端)
(このグラフは、まだ48時間分を満たしていません)
adt7410.cgiは以下のようになっています。
送信ボタンが押されると引数としてnameの内容が送られてきますので、それが"ctmp"だったら現在の室温表示処理を、"draw"だったらグラフ表示を行います。
ctmpは、tmpget.shを実行して/tmp/tmp.curに現在の温度を記録し、それを読み込んで変数にセットしHTML形式にしてページを作っています。
drawは、グラフィックライブラリを呼ぶ前に、/home/pi/tmpget.logの最後の288行を読み込んで、X軸、Y軸のデータを配列に組み立てています。温度は10分毎に計測しているので、(288 x 10) / 60 = 48時間分となります。
データを折れ線グラフに渡し、描画しています。
/usr/lib/cgi-bin/adt7410.cgi
#!/usr/bin/perl
use GD::Graph::lines;
($arg1,$arg2) = split( /&/ ,$ENV{'QUERY_STRING'} );
($name,$value) = split( /=/ , $arg1 );
sub hthead {
print "Content-Type:text/html\n";
print "\n";
print "JF1VRR Archives.\n";
}
if ($name eq "ctmp") {
&hthead;
system("/home/pi/tmpget.sh > /tmp/tmp.cur");
open(FILE,"/tmp/tmp.cur");
($date, $time, $temp) = split /\s+/, <FILE>;
close (FILE);
print <<"HTML";
<BR>
<H2>
<p>Date = $date</p>
<p>Time = $time</p>
<p>Temp = $temp C</p>
<BR><BR><BR>
HTML
} elsif ($name eq "draw") {
system("tail -n 288 /home/pi/tmpget.log > /tmp/draw.log");
open(FILE, "/tmp/draw.log");
while($line = <FILE>) {
chomp($line);
($d1, $d2, $d3) = split(/\s+/, $line);
if ($dat1 ne ""){
$dat1 = $dat1.",".$d1;
$dat2 = $dat2.",".$d2;
$dat3 = $dat3.",".$d3;
} else {
$dat1 = $d1;
$dat2 = $d2;
$dat3 = $d3;
}
}
my @labels = split(/,/, $dat2);
my @dsheet = split(/,/, $dat3);
my @data = (\@labels, \@dsheet);
print "Content-type: image/png;\n\n";
my $graph = GD::Graph::lines->new(1200,600);
binmode STDOUT;
print $graph->plot(\@data)->png;
close(FILE);
exit;
}
print <<"RET";
<A href="../index.html"> Back to Top.</A>
RET
exit;
ファイル構成
/var/www/index.html FORMの送信ボタンが押されたらadt4710.cgiを呼ぶ
/home/pi/tmpget.sh 温度計測スクリプト
/home/pi/tmpget.log 記録ファイル 日付、時刻、温度が10分毎に記録される
crontab 10分毎にtmpget.shを実行し、tmpget.logに記録しつづける
/usr/lib/cgi-bin/adt7410.cgi <- 現在の室温表示、48時間温度推移グラフ描画
/tmp/tmp.cur adt7410.cgiが一時的に使う現在温度用ファイル
これでFORMとcgi連携の勉強ができました。また、グラフィック・ライブラリを実際に使ってみることができました。まだまだ勉強不足ですが、凝ったものを作るのも、そんなに難しくはなさそうです。
外出先からwebサーバに入って、温度推移を確認して遊んでいます。
(JF1VRR)