fc2ブログ

高精度温度センサLM35を使う(3)

 前回に引き続き、今回はファイル保存されたデータをiPadで確認できるようにします。サーバ側のWebアプリは、鈴木憲治共著「PHP逆引きレシピ 第2版」を参考に、Google Chartsを利用して作成しました。大変分かりやすくまとまった参考書です。


<?php
$data = array();
$fp = fopen('/home/pi/mea.csv', 'r');
while ($row = fgetcsv($fp)) { $data[] = sprintf("['%s', %4.1f] ", $row[0], $row[1]); }
$str = implode(', ' . PHP_EOL, $data);
?>
<html>
<head>
<!-- AJAX API のロード -->
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
// Visualization API と折れ線グラフ用のパッケージのロード
google.load("visualization", "1", {packages:["corechart"]});
// Google Visualization API ロード時のコールバック関数の設定
google.setOnLoadCallback(drawChart);

// グラフ作成用のコールバック関数
function drawChart() {
// データテーブルの作成
var data = google.visualization.arrayToDataTable([ ['time', '温度'],
<?= $str; ?>
]);
// グラフのオプションを設定
var options = { title: '室温',
titleTextStyle: {fontSize:16},
hAxis: {title: '時刻'},
vAxis: {title: '気温(℃)', minValue: 20, maxValue: 30},
backgroundColor: '#f1f8e9'
};
// LineChart のオブジェクトの作成
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
// データテーブルとオプションを渡して、グラフを描画
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div" style="width: 80%; height: 400px;"></div>
</body>
</html>
1〜6行目でデータファイルを読み込み、10行目はGoogle Chartsを使うためのおまじないで、11行以下のスクリプトがグラフ作成の本体です。Google Chartsは機能盛りだくさんで、簡便にデータをグラフ化できるので、何かと使えそうです。
スポンサーサイト



高精度温度センサLM35を使う(2)

 引き続き、Cプログラムを作成しました。プログラムはwiringPiを用いたこのサイトを参考にしました。

//TempMeasure.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <wiringPi.h>
#include <wiringPiSPI.h>
#define SPI_CHANNEL 0

//SubString Command
int mysubstr( char *t, const char *s, int pos, int len )
{
if( pos < 0 || len < 0 || len > strlen(s) )
return -1;
for( s += pos; *s != '\0' && len > 0; len-- )
*t++ = *s++;
*t = '\0';
return 0;
}

//Main
int main(int argc, char **argv){
int retCode;
int i;

int a2dChannel = 0; // analog channel
int a2dVal = 0; // 10bit 0-1023
float a2dVol = 0.0; // Measured Voltage
float Vref = 3.3; // Ref Voltage

FILE *fp;
char a[16]; // time(for file output)
char beforetime[3];
char nowtime[3];
time_t timer;
unsigned char data[2];

//SPI channel 0 を 1MHz で開始。
if (wiringPiSPISetup(SPI_CHANNEL, 1000000) < 0)
{
printf("SPISetup failed:\n");
}

time(&timer);

//initial time
mysubstr(beforetime,ctime(&timer),17,1); //10secの位

//Loop
while(1){

time(&timer);
mysubstr(nowtime,ctime(&timer),17,1); //10secの位
//10secごとに測定・ファイル保存
if(strcmp(nowtime,beforetime) != 0){

strcpy(beforetime,nowtime);
mysubstr(a,ctime(&timer),11,8);

//Measure
data[0] = 0b01100000 |( ((a2dChannel & 0x03) << 4)); // first byte transmitted -> start bit
data[1] = 0; // third byte transmitted....don't care

retCode=wiringPiSPIDataRW (SPI_CHANNEL,data,sizeof(data));

a2dVal = (data[0]<< 8) & 0b1100000000; //first 2 bit
a2dVal |= (data[1] & 0xff);
a2dVol = (float)a2dVal/1023 * Vref;

//output
printf("Time: %s Temp=%.1f[deg]\n",a,a2dVol*100);

//file Output
fp = fopen("./mea.csv","a"); //csvファイルで出力
fprintf(fp,a); //時刻
fprintf(fp,",");
fprintf(fp,"%.1f\n",a2dVol*100);//温度データ
fclose(fp);
sleep(1);
}
}
return 0;
}

データ読み込みのポイントは、7行目でwiringPiSPI.hを読み込み、以下の関数を用います。

int wiringPiSPISetup (int channel, int speed);
チャンネルを初期化する。speedパラメータは、INT型で500,000〜32,000,000の範囲をとり、SPIのクロックスピード(単位はHz)を表す。
int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ;
選択されたSPIを通じて、Readとwriteが同時に実行される。バッファ内にあったデータは、SPIバスから戻ってくるデータによって上書きされる。

 61、62行目が送信コマンドの伝文、63行目が送信コマンド兼受信コマンド、66、67、68行目で受信データを目的の数値データに変換しています。結果は、74行目以降でcsvファイルに出力しました。
 次回は、採取したデータをグラフ化する方法をお話します。

高精度温度センサLM35を使う(1)

 今回は、Raspberry Piと高精度IC温度センサLM35DZを使って、温度を計測、記録し、iPadからデータを確認する試みです。実際にiPadに表示されたグラフはこのような感じです。温度グラフ160130 この温度センサは、+10.0mV/℃の電圧出力を持ち、Raspberry Piにデータを取り込むためにはA/Dコンバータが必要になります。そこで、Microchop製のMCP3002を用いて、以下の回路を組みました。Thermometer_circuit160130.pngLM35DZは3本足のプラスチックパッケージのデバイスで、電源(Vs、GND)と出力(Vout)を接続します。Vsはマニュアルから4〜20Vなので、Raspberry Piの5V(2番)端子を使いました。
MCP3002は、SPI通信対応のA/Dコンバータです。SPI(Serial Peripheral Interface)は、コンピュータ内部で使われるデバイス同士を接続するバスのことで、少ない配線で双方向同期通信ができます。端子は
 SCLK(Serial Clock)
 MISO(Master In Slave Out)
 MOSI(Master Out Slave In)
 SS(Slave Select)
の4個。それぞれ、Raspberry Piの所定の端子に接続します。データ要求の送信コマンドは、下表の上段の2byte分。受信は下段のフォーマットに従います。
CommCmd160130.pngSingle ended modeでCh0を使用し、MSBFはLow(0)設定で取り込むので、"01100000 00000000"を送信コマンドとして送ります。
Table160130.png プログラムについては、次回に続く。

ダイダイ収穫

 以前、スス病で葉っぱ表面に黒い煤の付着物のようなものが付いていたダイダイですが、農薬を散布したおかげで、その後、スス病の進行はなく、無事に橙色になりました。その名の通りです。去年は3個の収穫でしたが、今年は8個。ばっさりと剪定したあとの残りの枝に十分栄養が行き届いたからでしょう。橙160130
 収穫後のダイダイは、絞って蜂蜜を混ぜて美味しくいただきました。のどに優しく、しみ渡りました。

iPadからRaspberry Pi接続のモータを制御する

 今回は、雑誌にも定番に書かれているRaspberry PiでDCモータを制御する試みです。タミヤのモータとタンク工作基本キットを用いて、ラジコンのようにモータを離れた所からiPadで操作できるようにしました。iPadから制御している様子は動画をご覧ください。[広告] VPS
タンク工作キットでは単3乾電池が2本入る電池ボックスに付属しているスイッチを手動で切り替えることにより、前進/後退できますが、今回はその部分を自動で切り替える必要があります。そこで、東芝のDCモータ用フルブリッジドライバTA7291Pを使って、以下の回路を作成しました。MotorControl_circuit160124.png各端子の説明は下表の通りです。モータの駆動は乾電池2本(3V)で、TA7291Pで制御された結果が2番ピン、10番ピンに出力されます。この2、10ピンの極性が変わることによりモータが正転/逆転します。TA7291自身の制御電源(ロジック側電源)Vccは、4.5〜20Vかける必要があるので、Raspberry Piの5V(Pin2)を利用しました。
PinNo160124.pngプログラムは、Cで作成し、引数0、1、2、3でそれぞれ停止、前進、後退、ブレーキを割り当てました。

//RemoteControlCar.c
#include <wiringPi.h>

#define GO_FORWARD 17 /* GPIO17, pin#11 */
#define GO_BACKWARD 18 /* GPIO18, pin#12 */

/*
Command
IN1(17) IN2(18)
0 0 STOP (0)
1 0 GO_FORWARD (1)
0 1 GO_BACKWARD (2)
1 1 BRAKE (3)
*/

void initsetting(void); //ピンの初期設定
void datasend(int inpdata); //データ送信

int main(int argc,char *argv[]){

int i;

//initialize
if(wiringPiSetupGpio() == 1) return 1;

//pin mode
initsetting();

//command send
i = atoi(argv[1]);
datasend(i);

return 0;
}


//ピンの初期設定
void initsetting(){
pinMode(GO_FORWARD, OUTPUT);
pinMode(GO_BACKWARD, OUTPUT);
}

//データ送信
void datasend(int inpdata){

if(inpdata>0 && inpdata<5)
{
switch (inpdata) {
case 0: //Stop
digitalWrite(GO_FORWARD,0);
digitalWrite(GO_BACKWARD,0);
break;
case 1: //GO_FORWARD
digitalWrite(GO_FORWARD,1);
digitalWrite(GO_BACKWARD,0);
break;
case 2: //GO_BACKWARD
digitalWrite(GO_FORWARD,0);
digitalWrite(GO_BACKWARD,1);
break;
case 3: //BRAKE
digitalWrite(GO_FORWARD,1);
digitalWrite(GO_BACKWARD,1);
break;
default:
break;
}
}
else
{
digitalWrite(GO_FORWARD,0);
digitalWrite(GO_BACKWARD,0);
}
}
 iPadからの命令は、PHPで作成した以下のプログラムで受けるようにしました。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
<title>Remote Control Car</title>
</head>
<body>
<h1>Remote Control Car</h1>
<form action = "RmCar.php" method="post">
<input type="submit" style="font-size: 2.4em; background-color: red; color: white;" name="btn" value="Forward">
<input type="submit" style="font-size: 2.4em; background-color: gray; color: white;" name="btn" value="Stop">
<input type="submit" style="font-size: 2.4em; background-color: blue; color: white;" name="btn" value="Backward">


<?php

//ボタン番号取得
$Num = $_POST['btn'];

//サーバ接続
$connection = ssh2_connect("192.168.11.18",22);

if($connection !== false){
$auth = ssh2_auth_password($connection,"pi","raspberry");

if($auth !== false) {
if($Num == "Forward"){
$command = "sudo /var/www/html/RemoteControlCar 1";
} else if($Num == "Stop"){
$command = "sudo /var/www/html/RemoteControlCar 0";
} else if($Num == "Backward"){
$command = "sudo /var/www/html/RemoteControlCar 2";
} else
$command = "sudo /var/www/html/RemoteControlCar 0";
}
$stream = ssh2_exec($connection,$command);
}
?>
</body>
</html>

近江鉄道 合格切符

 多賀大社へ初詣をした帰りに、近江鉄道の合格切符を購入しました。高校受験の娘向けに買ったのですが、感想はイマイチでした・・。中三の女の子には切符など興味ないのでしょう。近江鉄道の五箇荘駅と桜川駅をそれぞれ文字って、「合格しよう」、「さくら咲く」。なるほどなるほど。
合格切符160121
 個人的には、硬券の切符には懐かしさを感じます。近江鉄道(ガチャコン)は国内でも運賃が高い路線で有名ですが、頻繁に乗っていた頃は、硬券切符だったような気がします。今もそうなのでしょうか?
 JRが国鉄時代(私が小学生の頃)に、よく一人旅をしたことがありましたが、田舎の地方駅の切符は硬券が多かったですね。改札時に駅員さんからはさみを入れてもらい、そのカットされたはさみの形が駅によっても異なることを味わいながら旅行しました。大変懐かしい思い出です。

腰痛で苦しむ

 腰痛(天災)は忘れた頃にやってくる。

 先週の水曜日(1/13)から腰の調子が急に悪くなり(身に覚えなし・・)、そのまま翌1/14(木)に仕事で姿勢の悪い状態で作業した関係でさらに病状が悪化、1/15(金)に休暇を取り急遽、整形外科に行きました。骨に異常はなく、痛み止めと湿布を処方してもらい、週末は痛みに耐えながら安静にしていました。週末の土日に始めたウォーキングも第二週目でお休みです・・・。

 日曜日には若干回復したので、月曜日(1/18)から仕事復帰したのですが、腰痛は一向に回復しません。トドメを刺したのが、昨日(1/20)の積雪です。通勤時の電車の中で滑ってしまい、踏ん張りがきかず、モロに腰を捻ってしまいました。思わず声を上げてしまう有様・・。その日は午後早退し、再度病院へ。診断の結果、さらに病状悪化。その流れで、今日(1/21)も、休暇を取り、自宅で安静にしています。腰痛は長引きますね。日頃から運動をしていないせいかもしれません。腰痛が治ったら、日々のウォーキングを心がけようと思います。

 腰を保護するために、サポータを購入して装着しています。気分的なものもあると思いますが、少し楽な気がします。


余呉湖でワカサギを釣る

 昨年に引き続き、今年も余呉湖にワカサギを釣りに行きました。昨年は息子と一緒に行きましたが、今年は休日も部活があり、行くことができなかったので、私一人で気ままに釣りを楽しみました。最近は、余呉湖も手軽にワカサギを釣れるので遠方から来られる方も多いようです。私は高速と下道で1時間程度の道のりです。気軽に行ける場所です。
 7、8年前ぐらいからほぼ毎年行っていますが、昔は比較的大きなワカサギ(10cm前後)がどの場所でも釣れていたのですが、最近は7cm前後の小さなワカサギで、釣れているポイントと釣れないポイントが明確になっています。100匹以上釣っておられる方のそばでボウズの方もおられます。一種のギャンブルのような感じがしますが、それも釣りの醍醐味なのでしょう。
 今日は朝7時前から14時まで釣りましたが、午前中は小雨、午後からは風が強かったです。ここ2、3日はよく釣れていたとのことでしたが、今日は全体的に釣果は減っていたとのこと。私の釣果は34匹でした。しょぼい結果でしたが、こんなものでしょう・・・。
160111_wakasagi.png小ぶりなので、天ぷらにせずに佃煮行きのようです(奥さん談)。リベンジしたいので、今シーズンはもう一回行きたいと思います。部活が休みなら息子も同伴で。

Raspberry Piとスピーカで遊ぶ

 今回はRaspberry Piにスピーカをつないで、音遊びをしました。
年末年始とテレビはスターウォーズ一色でしたね。私自身今までスターウォーズの映画を見たこともなかったのですが、息子が年末に放送されていた映画にハマってしまいました。遊び半分でダース・ベイダーのテーマを打ち込みし、Raspberry Piで演奏させました。演奏は動画をご覧ください。
[広告] VPS
配線図は以下の通りです。音を鳴らしていると奥さんからうるさいとクレームがありましたので、スピーカにはボリュームを付けることにしました。
160110speaker.png
作成したプログラムでは、wiringPiのsoftToneWrite関数で「IOポート番号」と「音の周波数」を設定して音を出しています。短いフレーズでもプログラム上に一音一音再現するのは面倒ですね。昔よくやっていたMIDIの打ち込みを彷彿とさせます。

//darthvader.c
#include <wiringPi.h>
#include <softtone.h>

#define BUZ_PORT 27 // GPIO27
#define TONE_CL 262 // Tone C Low 262Hz
#define TONE_CSL 277 // Tone C#(Db) Low 277Hz
#define TONE_D 294 // Tone D 294Hz
#define TONE_DS 311 // Tone D#(Eb) 311Hz
#define TONE_E 330 // Tone E 330Hz
#define TONE_F 349 // Tone F 349Hz
#define TONE_FS 370 // Tone F#(Gb) 370Hz
#define TONE_G 392 // Tone G 392Hz
#define TONE_GS 415 // Tone G#(Ab) 415Hz
#define TONE_A 440 // Tone A 440Hz
#define TONE_AS 466 // Tone A#(Bb) 466Hz
#define TONE_B 494 // Tone B 494Hz
#define TONE_CH 523 // Tone C High 523Hz
#define TONE_CSH 554 // Tone C#(Db) High 554Hz
#define TONE_DH 587 // Tone D High 587Hz
#define TONE_DSH 622 // Tone D#(Eb) 622Hz
#define TONE_SILENT 0 // Tone Silent 0Hz

int main(void){
int i;

//initialize
if(wiringPiSetupGpio() == -1) return 1; //initialize wiringPi
softToneCreate(BUZ_PORT); //GPIO27->Tone output mode

//DATA
//Darth Vader Thema
softToneWrite(BUZ_PORT,TONE_G);
delay(350);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(150);
softToneWrite(BUZ_PORT,TONE_G);
delay(350);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(150);
softToneWrite(BUZ_PORT,TONE_G);
delay(350);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(150);
softToneWrite(BUZ_PORT,TONE_DS);
delay(325);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(50);
softToneWrite(BUZ_PORT,TONE_AS);
delay(125);

softToneWrite(BUZ_PORT,TONE_G);
delay(350);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(150);
softToneWrite(BUZ_PORT,TONE_DS);
delay(325);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(50);
softToneWrite(BUZ_PORT,TONE_AS);
delay(125);
softToneWrite(BUZ_PORT,TONE_G);
delay(700);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(300);

softToneWrite(BUZ_PORT,TONE_DH);
delay(350);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(150);
softToneWrite(BUZ_PORT,TONE_DH);
delay(350);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(150);
softToneWrite(BUZ_PORT,TONE_DH);
delay(350);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(150);
softToneWrite(BUZ_PORT,TONE_DSH);
delay(325);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(50);
softToneWrite(BUZ_PORT,TONE_AS);
delay(125);

softToneWrite(BUZ_PORT,TONE_FS);
delay(350);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(150);
softToneWrite(BUZ_PORT,TONE_DS);
delay(325);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(50);
softToneWrite(BUZ_PORT,TONE_AS);
delay(125);
softToneWrite(BUZ_PORT,TONE_G);
delay(700);
softToneWrite(BUZ_PORT,TONE_SILENT);
delay(300);

return 0;
}

Raspberry Piにssmtpを実装する

 Raspberry Piから簡便にメールを発信したいと思い、ネットで情報検索していると、「ssmtp」というコマンドベースのプログラムがありました。早速、以下のコマンドを入力してインストールしました。
aptitude install heirloom-mailx ssmtp

Gmail経由でメール発信するために、設定ファイル(/etc/ssmtp/ssmtp.conf)を以下の通りにしました。160102_ssmtp1.pngmailコマンド、メールタイトル、メール本文を打ち、最後に「.(ピリオド)」を打つと、メールが送信できるはずですが、認証エラーが出ました。160102_ssmtp2.pngしばらくすると、メール着信があり、確認すると、セキュリティ面でGmailから拒否された結果でした。低いセキュリティのプログラムを使うなとのこと。160102_ssmtp3.pngそれでも使いたい場合は「Learn more」をクリックとのことなので、そうすると、「安全性の低いアプリ」でも使えるように、アカウント情報を変更する画面に移行しました。160102_ssmtp4.pngその移行した画面で「Turn on」を選択しました。160102_ssmtp5.pngまた、しばらくすると、メール着信があり、「安全性の低いアプリ」からのアクセスがOKになりましたとの連絡。これで準備OKです。160102_ssmtp6.png再度、Raspberry Piからメールをコマンドで打ち込み、発信すると、今度はエラーなく終了しました。160102_ssmtp7.png無事にメールも届いていることを確認できました。160102_ssmtp8.pngこれを用いることで、例えば、監視システムで異常が出た際のメール発信が可能になります。いろいろと応用が効きそうです。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: