#概要
BluemixのRaspberryPi登録レシピに登場するデバイス用のsampleプログラムは、どんなにセンサーがたくさん付いていようが固定の4項目のデータのみをBluemixに送信する作りになっている。
Raspberry Pi 2にセンサーを付け加えて固定4項目以外のデータをBluemixで取得するには、sampleプログラムのソースコードを修正してビルドすれば良い。その方法を整理する。
整理している内に長くなってきたので、(1)Sampleプログラムの仕組みの整理と(2)どこをどのように変更すればよいのかを分けることにした。
(1) 仕組みの理解
(2) センサーを付けてデータを拾う 温度センサーデジタル編
(3) センサーを付けてデータを拾う 温度センサーアナログ編
(4) センサーを付けてデータを拾う 温度センサーデジタル編(リベンジ) (これ)
(5) センサーを付けてデータを拾う 温度・湿度・気圧まとめて採取編
番外編 『ムック「日経Linux ラズパイマガジン 2015年春号 」電子工作入門キット パーツセット』に入っていたもの
#リベンジのポイント
##はんだ付け
『ムック「日経Linux ラズパイマガジン 2015年春号 」電子工作入門キット パーツセット』に入っていたものの中で、唯一はんだ付けが必要だったADT7410。
これだけのためにはんだごてやらはんだやら買うのをためらっていたところ、『はんだづけカフェ』なる所を発見!
無料ではんだ付けができる。中学以来のはんだ付けで色々不安だったが、無事はんだ付け完了。
スタッフさんが親切で、私のような素人におススメ。
#回路(ネタ)
ムック「日経Linux ラズパイマガジン 2015年春号 」第3部 はじめての電子工作ステップ50の内、「No.21 I2Cを有効にしてアドレスをチェック 温度センサーを読んでみよう」に記載されている回路でやってみる。
#回路(設計)
元ネタの図の通りにFritzingで作ってみた。
ADT7410のパーツはここからから入手して、Fritzingにインポートした。
https://github.com/MozOpenHard/examples/blob/master/i2c-ADT7410/ADT7410.fzz
#回路(実装)
Fritzingで作った絵の通りにつなげてみた。
ADT7410は、今度ははんだ付けしてある ←リベンジポイント
#Raspberry Pi 2上でI2Cの有効化
作業はRaspberry Pi 2にログインして行う。
実行時ユーザは次の通り
$ : pi
# : root
##WiringPiの導入
# cd /var/tmp
# git clone git://git.drogon.net/wiringPi
# cd wiringPi
# ./build
導入確認のためにバージョンを確認してみる。
# gpio -v
バージョンが表示されること。
##I2C有効化
Raspberry Pi 2はraspi-configから設定する。
# raspi-config
「8 Advanced Options」を選択して、「Select」を押下
再起動後にI2C用のモジュールが読み込まれていることを確認する。
$ lsmod | grep i2c
「i2c_bcm2708」が表示されること。
##I2C用ツールのインストール
# apt-get -y install i2c-tools
# reboot
##デバイスのアドレス確認
# i2cdetect -y 1
アドレス(48)が表示されること。
#Raspberry Pi 2上で温度を読んでみる
ムック読者限定サイトに用意されたプログラム「adt7410.c」をコンパイル・実行してみる。
画面に温度を出力する。5秒間隔で20回。
センサーを指でつまむと温度が上がり、離すと下がる。
$ mkdir -p ~/bin
$ cd ~/bin
$ ll adt7410.c
$ gcc -o adt7410 adt7410.c -lwiringPi
# ./adt7410
画面出力例)
t:27.625000 d:0xd00d -> msb:0xd0d00 lsb:0xd0 -> v:0442
v : 読み取った値
t : 温度 (v / 16で計算した結果)
#プログラムの改修内容
BluemixのRaspberryPi登録レシピに登場するデバイス用のsampleプログラムを次の通り修正する。
修正前のソースコードはこちらで参照可能
修正するファイル | 新規で追加するファイル |
---|---|
iotmain.c iot.h jsonator.c Makefile |
adt7410.c |
追加・修正内容は以下の通り。
修正内容1
//adt7410.c
float getAdt7410Temp();
修正内容2
JsonMessage json_message = { DEVICE_NAME, getCPUTemp(), sineVal(
MIN_VALUE, MAX_VALUE, 16, count), GetCPULoad() };
JsonMessage json_message = { DEVICE_NAME, getCPUTemp(), sineVal(
MIN_VALUE, MAX_VALUE, 16, count), GetCPULoad(), getAdt7410Temp() };
修正内容3
struct json {
char myname[100];
float cputemp;
float sine;
float cpuload;
};
struct json {
char myname[100];
float cputemp;
float sine;
float cpuload;
float adt7410temp;
};
修正内容4
strcat(jsonReturned, ",");
strcat(jsonReturned, "\"adt7410temp\":");
sprintf(buffer, "%.2f", passedrpi.adt7410temp);
strcat(jsonReturned, buffer);
修正内容5
iot: iotmain.c cpustat.c mac.c mqttPublisher.c jsonator.c iot.h jsonReader.c
export LIBRARY_PATH=$(COMPILELIBDIR):$(LIBRARY_PATH)
$(CC) iotmain.c cpustat.c mac.c mqttPublisher.c jsonator.c cJSON.c jsonReader.c -o $@ -l$(LIBNAME) -lpthread -lssl -lm -L $(COMPILELIBDIR) -I .
iot: iotmain.c cpustat.c mac.c mqttPublisher.c jsonator.c iot.h jsonReader.c adt7410.c
export LIBRARY_PATH=$(COMPILELIBDIR):$(LIBRARY_PATH)
$(CC) iotmain.c cpustat.c mac.c mqttPublisher.c jsonator.c cJSON.c jsonReader.c adt7410.c -o $@ -l$(LIBNAME) -lpthread -lssl -lwiringPi -lm -L $(COMPILELIBDIR) -I .
追加内容1 (ムック読者限定サイトに用意されたプログラム「adt7410.c」をベースに作成)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wiringPi.h>
const int DEV_ID = 0x48; // ADT7410のデバイスID
const int DATA_REG = 0x00; // 温度レジスタ
float getAdt7410Temp();
float getAdt7410Temp() {
float t = 0; // 温度
int i = 0; // カウンタ
int fd = wiringPiI2CSetup(DEV_ID);
if (fd < 0) {
printf("ADT7410 error.\n");
return EXIT_FAILURE;
}
int d = wiringPiI2CReadReg16(fd, DATA_REG); // 温度レジスタから16bit取得
int msb = (0xFF & d) << 8; // MSBの値を取得
int lsb = (0xFF00 & d) >> 8; // LSBの値を取得
int v = (msb + lsb) >> 3; // 下位3ビットを除く13ビットが温度データ
if (v > 4096) { // データシートの式に従って算出
t = (v - 8192) /16.0;
} else {
t = v / 16.0;
}
return t;
}
#プログラムの改修手順
作業はRaspberryPi2にログインして行う。
実行時ユーザは次の通り
$ : pi
# : root
-
設定ファイルの退避
# cd /etc/iotsample-raspberrypi/
# cp -p device.cfg device.cfg.`date +%Y%m%d`_1
※これで、アンインストール(dpkg -P)してもフォルダとバックアップファイルが残るので安心。 -
必要パッケージのインストール
# apt-get install dpkg-dev build-essential devscripts
# apt-get install libssl-dev
-
ソースコード一式を入手
$ cd ~
$ git clone https://github.com/ibm-messaging/iot-raspberrypi.git
-
ソースコード修正・追加
$ cd ~/iot-raspberrypi/samples/c/
$ vi iotmain.c
$ vi iot.h
$ vi jsonator.c
$ vi Makefile
$ vi adt7410.c
-
ビルド
$ debuild -b
署名のエラーは無視する。
#iotサービスの再インストール
-
アンインストール(古いのを)
# dpkg -P iot
-
インストール
# cd /home/pi/iot-raspberrypi/samples/
# dpkg -i ./iot_1.0-1_armhf.deb
-
サービスの確認
# service iot status
※起動している(okが表示される)こと。 -
設定ファイル作成
# cd /etc/iotsample-raspberrypi/
# cp -p device.cfg.`date +%Y%m%d`_1 device.cfg
※6.でいったん削除されてしまうので、1.で退避したファイルで復元 -
サービスの再起動
# service iot restart
※起動している(okが表示される)こと。 -
起動モードの確認
# service iot getdeviceid
※registerd mode で起動している(registerd modeが表示される)こと。
#Bluemix IoT Foundationサービスで確認
IoT Foundationのダッシュボードで、センサー情報欄にて確認する。
センサーの温度データを受信できた!
#所感
あいかわらず「/sys/class/gpio配下を参照する」という流れになっていない。。。
#環境
Raspberry Pi 2 Model B
Raspbian
#参考
Fritzingダウンロード
http://fritzing.org/download/
Fritzing用のADT7410のパーツ
https://github.com/MozOpenHard/examples/blob/master/i2c-ADT7410/ADT7410.fzz
はんだづけカフェ
http://handazukecafe.com/