6.S3静的htmlのJavaScriptでグラフ表示

jPlot

s3の静的サイトにグラフを表示するJavaSciptプログラムを含んだhtmlをアップします。

S3に保管したJSONのデータは、S3の静的サイト内からAJAXで利用できます。
上の画像は html 内の javascript プログラムで以下の処理を行って表示しています。
・JSONの1日のセンサ生データGET
・1分毎のJSONデータを1時間平均に計算
・グラフで表示

グラフには jqPlot を利用しています。

jqPlot
http://www.jqplot.com/

実際のhtml5内の javascript プログラムは以下で確認できます。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/tree/master/S3WebSite

実際にRaspberry Pi から AWS S3 にアップされたJSONデータのサンプルは以下で確認できます。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/tree/master/S3WebSite/Hub01

実際の動きは、以下のサイトで確認できます。
http://s.ykata.net/

こちらのjavascriptプログラムの詳細は上記サイトをご参照ください。

最初のページに 戻る

広告

5.センサ値をクラウドに保管・表示

5.1.node.js の設定

参考情報

m_shige1979のささやかな抵抗と欲望の日々(id:m_shige1979さん )
http://m-shige1979.hatenablog.com/entry/2014/06/17/211645

以下の手順で、開発言語 node.js (Javascript) と、Amazon AWS にデータをアップするためのモジュールを設定します。

$ wget http://node-arm.herokuapp.com/node_latest_armhf.deb
$ sudo dpkg -i node_latest_armhf.deb
$ npm install aws-sdk
aws-sdk@2.1.34 node_modules/aws-sdk
├── xml2js@0.2.8
├── sax@0.5.3
└── xmlbuilder@0.4.2

$ npm install sax@0.5.8
$ npm install xml2js@0.2.8
$ npm install xmlbuilder@0.4.2
$ npm install sax@0.5.3

$ npm install aws-sdk

5.2.AWSコンソールの設定

AWSのコンソールにログインします。
今回は
Cognito => アクセスID認証
Identity and Access Management => アクセスIDの利用権限設定
S3 => 静的Webサイト sensor.ykata.net で公開する設定例
を利用します。

Cognito は現時点で日本のリージョンでは使えません。(夏頃 東京リージョン でも使えるらしいです。)
「バージニア北部」を選択します。
AWS-01

詳細はそれぞれ以下で確認してください。
http://aws.amazon.com/jp/cognito/
http://aws.amazon.com/jp/iam/
http://aws.amazon.com/jp/s3/

先ず Cognito を設定します。
Create new identity pool を行います。
AWS-02

以下 identity pool name が SensorHUB2 の例です。
Create Pool します。
AWS-03


以下自動作成してくれた権限設定はそのままで、許可 します。
Unauthのロール名は設定で使いますので控えておきます。
AWS-04

この画面に来ると設定は完了です。
Get AWS Credentials の赤字部分は設定で使いますので控えておきます。
Go to Dashboad します。

AWS-05

ダッシュボード画面が表示され、以上でCognitoの設定完了です。
AWS-06

Identity and Access Management (IAM)で、先に設定した Cognito で発行される アクセスID の利用権限を設定します。
ロールを選択します。
AWS-07

Cognito の Unauthのロール名 を選択します。
AWS-08

S3をデータ保管先として利用しますので、ポリシーのアタッチ を行います。
AWS-09

Amazon S3 Full Access を選択し、 ポリシーのアタッチ を行います。
AWS-10

以上で IAM の設定は完了しました。
AWS-11

S3にデータを保管する バケット を作成します。
このバケットは JSON でデータを保管するとともに、グラフなどで情報を閲覧するWebサイトとして利用する設定も行います。
AWS-12

バケット名を公開するドメインと同じにすると、公開Webとしても使えます。
リージョンは Cognito と同じになるよう注意して、作成 してください。
AWS-13

バケットができたら、公開Webとして使うための バケットポリシーを追加 します。
AWS-14

ポリシーエディタが起動します。
最初から作成するのは難しいので、AWS Policy Generator を利用します。
AWS-15

以下の例のように入力します。
AWS-16

ARNは arn:aws:s3:::バケット名/* を入力します。
今回の例では arn:aws:s3:::sensor.ykata.net/* となります。
Add Statement します。
AWS-17

以下のように追加されたら、Generate Policy します。
AWS-18

以上、完成したポリシーをコピーして、ページを閉じます。
AWS-19

最初の画面で、ペースト し、保存 します。
AWS-20

保存 して、静的ウエッブサイトホスティング の設定をします。
AWS-21

ウエッブサイトホスティングを有効にします。
インデックスドキュメントを index.html に設定して 保存 します。
AWS-22

以上で設定は完了しました。

S3のバケット内で右クリックすると、アップロードというメニューがあります。
そちらを開いて、htmlなどのファイルをアップすると、Webとして利用できます。

5.3.CognitoによるアクセスIDの発行

Cognitoで実際に アクセスID が node.js のプログラムで発行されるか、確認してみます。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/blob/master/cognito.js

$ nano cognito.js
var AWS = require(‘aws-sdk’);
var awsRegion = “us-east-1”;
var cognitoParams = {
AccountId: “AWSのアカウントID”,
RoleArn: “arn:aws:iam::AWSのアカウントID:role/Cognito_SensorHUBUnauth_Role”,
IdentityPoolId: “us-east-1:AWSのIdentityPoolId”
};

AWS.config.region = awsRegion;
AWS.config.credentials = new AWS.CognitoIdentityCredentials(cognitoParams);
AWS.config.credentials.get(function(err) {
if (!err) {
console.log(“Cognito Identity Id: ” + AWS.config.credentials.identityId);
}
});

実行してみると、実際にIdを獲得している様子が分かります。

$ node cognito.js
Cognito Identity Id: us-east-1:7a465491-dc91-44e7-9d8c-f08dd674c532

5.4.センサ値をS3へ発行

実際にCognitoで発行、取得したIdにS3にアクセスし、データを保管します。

先ずは、センサ値をCSV形式で出力しLCDに表示する Python プログラムを作成します。
ブロッグではインデントが表示されないので、動くコードは以下を参照してください。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/blob/master/getSensor.py

$ nano getSensor.py
#!/usr/bin/python
import time
import wiringpi2
import os
import sys
import struct
import subprocess
from time import sleep
from notsmb import notSMB
#from TSL2561 import TSL2561
from tsl2561_lux import Luxmeter

tmpVal = -999
humVal = -999
co2Val = -999
luxVal = -999

“”” LUX Setting “””
##tsl = TSL2561()
tsl=Luxmeter()

i = 0
while True:
try:
# luxVal = int(tsl.readLux())
luxVal = int(tsl.getLux())
if luxVal <= 200000 and luxVal > 100:
break
i = i + 1
if i > 5:
break
sleep(0.5)
except:
blank =0;
sleep(0.5)

“”” CO2 Setting “””
I2CBUS = 1
CO2_ADDR = 0x68
READ = 0x22
readBytes = [0x00, 0x08, 0x2A]
bus = notSMB(I2CBUS)

i = 0
while True:
try:
resp = bus.i2c(CO2_ADDR,[0x22,0x00,0x08,0x2A],4)
time.sleep(0.1)
co2Val = (resp[1]*256) + resp[2]

if co2Val < 8000:
break

i = i + 1
if i > 5:
break
except:
blank =0;
sleep(0.5)

“”” Temperature Humidity Setting “””
wiringpi2.wiringPiSetup()
i2c = wiringpi2.I2C()
dev = i2c.setup(0x40)

i2c.writeReg16(dev,0x02,0x10)
i2c.writeReg8(dev,0x00,0x00)
sleep((6350.0 + 6500.0 + 500.0)/1000000.0)
tmpVal = ((struct.unpack(‘4B’, os.read(dev,4)))[0] << 8 | (struct.unpack(‘4B’, os.read(dev,4)))[1])
humVal = ((struct.unpack(‘4B’, os.read(dev,4)))[2] << 8 | (struct.unpack(‘4B’, os.read(dev,4)))[3])
os.close(dev)
tmpVal = round(((tmpVal / 65535.0) * 165 – 40), 1)
humVal = round(((humVal / 65535.0) * 100), 1)

sleep(0.5)

line = time.strftime(‘%Y/%m/%d,’) + time.strftime(‘%H:%M:%S,’)
line = line + str(tmpVal) + “,” + str(humVal) + “,” + str(co2Val) + “,” + str(luxVal)
print line

parm1 = time.strftime(‘%m/%d_%H:%M’)
parm2 = “T:” + str(tmpVal) + “*c_H:” + str(humVal) + “%”
parm3 = “CO2:” + str(co2Val) + “ppm”
parm4 = “Lig:” + str(luxVal) + “LUX”
cmd = “/var/www/bin/oled %s %s %s %s” % (parm1, parm2, parm3, parm4)
subprocess.Popen( cmd.strip().split(” “) )

この python プログラムで得たセンサの計測値を AWS の S3 にJSONで保管する node.js のプログラムを作成します。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/blob/master/sensor.js

$ nano  sensor.js
var execSync = require(‘child_process’).execSync;
var id = “Hub01”;

var AWS = require(‘aws-sdk’);
var awsRegion = “us-east-1”;

// 1タイムアクセスID作成
var cognitoParams = {
AccountId: “AWSのアカウントID”,
RoleArn: “arn:aws:iam::AWSのアカウントID:role/Cognito_SensorHUBUnauth_Role”,
IdentityPoolId: “us-east-1:AWSのIdentityPoolId”
};
AWS.config.region = awsRegion;
AWS.config.credentials = new AWS.CognitoIdentityCredentials(cognitoParams);
AWS.config.credentials.get(function(err) {
if (!err) {
// console.log(“Cognito Identity Id: ” + AWS.config.credentials.identityId);
}
});

// S3
var s3 = new AWS.S3();
var bucket = ‘s.ykata.net’;
// センサ値取得
var result = “” + execSync(‘sudo /pi/home/getSensor.py’);

// 現在値をJSONでS3にアップ
var vRes = result.replace(/[\n\r]/g,””).split(“,”);
var vKeyN = id + “/now.json”;
var vKeyF = vRes[0].replace(/\//g,”_”);
var vKeyD = id + “/” + vKeyF + “.json”;
var vJson = ‘{“Date”:”‘+vRes[0]+'”,”Time”:”‘+vRes[1]+'”,”Temperature”:’+vRes[2]+’,’;
vJson = vJson + ‘”Humidity”:’+vRes[3]+’,”CO2″:’+vRes[4]+’,”Illuminance”:’+vRes[5]+’}’;
var params1 = {
Bucket: bucket,
Key: vKeyN,
ContentType: ‘application/json’,
Body: vJson
};
s3.upload(params1, function(err) {
if(err) {
console.log(“Error uploading data 01 : “, err);
}
});

// 1日のデータをファイルに保管し、JSONでS3にアップ
var fs = require(‘fs’);
var path = ‘./’+vKeyF;
var fsData = “”;
var fsUPData = “”;
try {
fs.statSync(path);
fsData = fs.readFileSync(path, ‘utf8’);
fsUPData = fsData + “,” + vJson;
} catch (e) {
execSync(‘echo “” >> ‘ + path);
execSync(‘chmod 666 ‘ + path);
fsUPData = vJson;
}
fs.writeFileSync(path, fsUPData,’utf8′);
var params2 = {
Bucket: bucket,
Key: vKeyD,
ContentType: ‘application/json’,
Body: ‘[‘ + fsUPData + ‘]’
};
s3.upload(params2, function(err) {
if(err) {
console.log(“Error uploading data 02 : “, err);
}
});

このプログラムを cron に登録すると、毎分のデータをJSONで AWS S3 にアップするようになります。
cron の記載はフルパスで記載します。

$ crontab -e
* * * * *  /usr/local/bin/node /home/pi/sensor.js 2>> /home/pi/cron.log

続きは 6.S3静的htmlのJavaScriptでグラフ表示 へ

 

4.センサの設定とプログラミング

20150617_231446
実際の配線の様子ですが、配線の色を揃えれなくて見苦しい所はご容赦を。

以下、ブロッグの構造上Pythonのプログラムの前スペースが消えてます。
そのままでは動きませ。参照サイトからダウンロードのうえ、お試しください。

4.1.今回準備したもの

温湿度センサ HDC1000(秋月電子)
http://akizukidenshi.com/catalog/g/gM-08775/

CO2センサ K30 (co2meter)
http://www.co2meter.com/products/k-30-co2-sensor-module

Grove OLED Display (スイッチサイエンス)
https://www.switch-science.com/catalog/829/

光センサ TSL2561 (スイッチサイエンス)
https://www.switch-science.com/catalog/1174/

Raspberry Pi2 B+
http://jp.rs-online.com/web/p/processor-microcontroller-development-kits/8326274/

Raspberry Pi2 B+ ケース
http://jp.rs-online.com/web/p/development-board-enclosures/8787594/

その他
2000mA 5V 1ポート 2A高出力 USB AC アダプタ USB(Amazon)
USB電源ケーブル(ダイソー 100均)
屋内・屋外兼用ケース P10-22CA (Amazon)
小さいブレットボード(白)(秋月電子)
LTE通信USBモデムカード docomo L-03D (Amazon)
Transcend microSDHCカード 16GB Class10(Amazon)
普通のジャンパワイヤ(オス~オス)(スイッチサイエンス)
普通のジャンパワイヤ(オス~メス)(スイッチサイエンス)
普通のジャンパワイヤ(メス~メス)(スイッチサイエンス)

開発言語は、可能な限り C,C++ の入門者に敷居が高い言語を使わず、Python、node.js(Java Script) を用いる方針です。

4.2.センサ値獲得用プログラム言語Python環境確認

センサ値取得に利用する開発言語 Python のバージョンを確認します。
最新の3にはまだ未対応のライブラリィなどが多く、2.7 を用います。

$ python -V
Python 2.7.3

Pythonのセンサ用開発環境を追加インストールします。

$ sudo apt-get install python-dev

4.3.CO2センサ K30 I2Cプログラム計測

参考情報

K-30 10,000ppm CO2 Sensor
http://www.co2meter.com/products/k-30-co2-sensor-module

メーカPDF資料
http://co2meters.com/Documentation/AppNotes/AN142-RaspberryPi-K_series.pdf

説明は難しくなるので、以下の手順をこなしてみてください。

$ mkdir notsmb
$ cd notsmb
$ wget http://www.byvac.com/downloads/sws/notsmb_1_3.zip
$ unzip notsmb_1_3.zip
$ sudo python setup.py install

以下インデントが表示されていません。
実際に解答したファイルの内容をご参照ください。

$ nano CO2meter.py
import time
from notsmb import notSMB
I2CBUS = 1
CO2_ADDR = 0x68
READ = 0x22
readBytes = [0x00, 0x08, 0x2A]
bus = notSMB(I2CBUS)
while True:
try:
resp = bus.i2c(CO2_ADDR,[0x22,0x00,0x08,0x2A],4)
time.sleep(0.1)
co2Val = (resp[1]*256) + resp[2]
print(resp)
print(co2Val);
break
except:
blank =0;

$ sudo python ./CO2meter.py
[33, 11, 116, 160]
2932

4.3.温湿度センサHDC1000 I2C プログラム計測

参考情報

秋月電子 HDC100使用 温湿度センサーモジュール
http://akizukidenshi.com/catalog/g/gM-08775/

RaspberryPi + wiringPi-Python + HDC1000 で温湿度を取る(femmnomenaさん)
http://d.hatena.ne.jp/femm/20150426/1430033839

説明は難しくなるので、以下の手順をこなしてみてください。

$ sudo apt-get install python-pip
$ sudo pip install wiringpi2

$ nano HDC1000.py
import wiringpi2
import os
import struct
from time import sleep

wiringpi2.wiringPiSetup()
i2c = wiringpi2.I2C()
dev = i2c.setup(0x40)
i2c.writeReg16(dev,0x02,0x10)
i2c.writeReg8(dev,0x00,0x00) #start conversion.
sleep((6350.0 + 6500.0 + 500.0)/1000000.0)

temp = ((struct.unpack(‘4B’, os.read(dev,4)))[0] << 8 | (struct.unpack(‘4B’, os.read(dev,4)))[1])
hudi = ((struct.unpack(‘4B’, os.read(dev,4)))[2] << 8 | (struct.unpack(‘4B’, os.read(dev,4)))[3])
os.close(dev)

print “Humidity %.2f” % (( hudi / 65535.0 ) * 100)
print “Temperature %.2f” % (( temp / 65535.0) * 165 – 40 )

$ sudo python ./HDC1000.py
Temperature 28.0
Humidity 74.3

4.4.OLED ディスプレイ 128×64 表示プログラム

参考情報

GROVE – I2C OLEDディスプレイ128×64
https://www.switch-science.com/catalog/829/

Seeed-Studio/Grove-RaspberryPi
https://github.com/Seeed-Studio/Grove-RaspberryPi/tree/master/Grove%20-%20OLED%20Display%20128×64

こちらだけC++でコンパイルします。
説明は難しくなるので、以下の手順をこなしてみてください。

$ git clone https://github.com/Seeed-Studio/Grove-RaspberryPi
$ cd “Grove-RaspberryPi\Grove – OLED Display 128×64”
$ nano main.cpp
#include <sstream>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include “SeeedOLED.h”

using namespace std;

SeeedOLED oled = SeeedOLED(0x3c);

string GetStdoutFromCommand(string cmd) {
int len;
string data;
FILE * stream;
const int max_buffer = 256;
char buffer[max_buffer];
cmd.append(” 2>&1″);

stream = popen(cmd.c_str(), “r”);
if (stream) {
while (!feof(stream)) {
if (fgets(buffer, max_buffer, stream) != NULL) {
data.append(buffer);
}
}
pclose(stream);
}
len = data.size() – 1;
data = data.substr(0, len);
return data;
}

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

string line0 = ” “;

string argv1 = line0;
string argv2 = line0;
string argv3 = line0;
string argv4 = line0;
if(argc > 1) argv1 = argv[1];
if(argc > 2) argv2 = argv[2];
if(argc > 3) argv3 = argv[3];
if(argc > 4) argv4 = argv[4];

oled.writeString(0, 0, (char*)line0.c_str());
oled.writeString(1, 0, (char*)line0.c_str());
oled.writeString(2, 0, (char*)line0.c_str());
oled.writeString(3, 0, (char*)line0.c_str());

oled.writeString(0, 0, (char*)argv1.c_str());
oled.writeString(1, 0, (char*)argv2.c_str());
oled.writeString(2, 0, (char*)argv3.c_str());
oled.writeString(3, 0, (char*)argv4.c_str());
return 0;
}

$ make clean
$ make
$ OLED 1111 2222 3333 4444

4.5.照度センサ TSL2561 I2C プログラム計測

参考情報

GROVE – I2C デジタル光センサ
https://www.switch-science.com/catalog/1174/

seanbechhofer/raspberrypi
https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code/tree/master/Adafruit_I2C
https://github.com/seanbechhofer/raspberrypi/blob/master/python/TSL2561.py

説明は難しくなるので、以下の手順をこなしてみてください。

$ git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code
$ git clone https://github.com/seanbechhofer/raspberrypi

以下、インデントが分からないので以下を参照してください。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo/blob/master/TSL2561.py

$ nano TSL2561.py
#!/usr/bin/python

import sys
import time
from Adafruit_I2C import Adafruit_I2C

class TSL2561:
i2c = None

def __init__(self, address=0x29, debug=0, pause=0.8):
self.i2c = Adafruit_I2C(address)
self.address = address
self.pause = pause
self.debug = debug
self.gain = 0 # no gain preselected
self.i2c.write8(0x80, 0x03) # enable the device

def setGain(self,gain=1):
“”” Set the gain “””
if (gain != self.gain):
if (gain==1):
self.i2c.write8(0x81, 0x02) # set gain = 1X and timing = 402 mSec
else:
self.i2c.write8(0x81, 0x12) # set gain = 16X and timing = 402 mSec
self.gain=gain; # safe gain for calculation
time.sleep(self.pause) # pause for integration (self.pause must be bigger than integration time)
def readWord(self, reg):

“””Reads a word from the I2C device”””
try:
wordval = self.i2c.readU16(reg)
newval = self.i2c.reverseByteOrder(wordval)
if (self.debug):
print(“I2C: Device 0x%02X returned 0x%04X from reg 0x%02X” % (self.address, wordval & 0xFFFF, reg))
return newval
except IOError:
print(“Error accessing 0x%02X: Check your I2C address” % self.address)
return -1
def readFull(self, reg=0x8C):

“””Reads visible+IR diode from the I2C device”””
return self.readWord(reg);
def readIR(self, reg=0x8E):

“””Reads IR only diode from the I2C device”””
return self.readWord(reg);
def readLux(self, gain = 0):

“””Grabs a lux reading either with autoranging (gain=0) or with a specified gain (1, 16)”””
if (gain == 1 or gain == 16):
self.setGain(gain) # low/highGain
ambient = self.readFull()
IR = self.readIR()
elif (gain==0): # auto gain
self.setGain(16) # first try highGain
ambient = self.readFull()
if (ambient < 65535):
IR = self.readIR()
if (ambient >= 65535 or IR >= 65535): # value(s) exeed(s) datarange
self.setGain(1) # set lowGain
ambient = self.readFull()
IR = self.readIR()

if (self.gain==1):
ambient *= 16 # scale 1x to 16x
IR *= 16 # scale 1x to 16x

ratio = 0
if (ambient != 0):
ratio = (IR / float(ambient)) # changed to make it run under python 2

if ((ratio >= 0) & (ratio <= 0.52)):
lux = (0.0315 * ambient) – (0.0593 * ambient * (ratio**1.4))
elif (ratio <= 0.65):
lux = (0.0229 * ambient) – (0.0291 * IR)
elif (ratio <= 0.80):
lux = (0.0157 * ambient) – (0.018 * IR)
elif (ratio <= 1.3):
lux = (0.00338 * ambient) – (0.0026 * IR)
elif (ratio > 1.3):
lux = 0

return lux

if __name__ == “__main__”:
while True:
tsl=TSL2561()
print “LUX HIGH GAIN “, tsl.readLux(16)
print “LUX LOW GAIN “, tsl.readLux(1)
print “LUX AUTO GAIN “, tsl.readLux()

$ sudo python TSL2561.py
LUX HIGH GAIN 0
LUX LOW GAIN 2318.77744967
LUX AUTO GAIN 0.45162

続きは 5.センサ値をクラウドに保管・表示 へ

3.センサなどを使うための詳細設定

3.1.開発言語・ライブラリィ環境の設定

C,C++,pythonなどの言語及びライブラリィをインストールしておきます。

$ sudo apt-get install cmake libtool doxygen graphviz
$ sudo apt-get install ttf-bitstream-vera ttf-dejavu unzip python-numpy

この作業はしばらく時間がかかります。

3.2.Webサーバの設定

Webサーバは必須ではありません。
設定をしておくと、センサ値をhttp経由でJSON、CSV、htmlで外部からGETできると、活用範囲が広がり便利です。

今回はApacheではなく、軽量でPHPが問題なく稼働する lighttpd を利用します。
PHPは fastcgi で割とサクサク動きます。

先ずインストール。

$ sudo apt-get install lighttpd php5 php5-cgi php5-gd php5-mcrypt

設定ファイルの設定。

$ sudo nano /etc/lighttpd/lighttpd.conf
(中略)
server.document-root = “/var/www/html”
(中略)
server.username = “pi”
server.groupname = “pi”
(中略)
#include_shell “/usr/share/lighttpd/use-ipv6.pl ” + server.port
(中略)
server.modules += ( “mod_cgi” )
cgi.assign = ( “.pl” => “/usr/bin/perl”,
“.cgi” => “/usr/bin/perl”,
“.py” => “/usr/bin/python” )

include “fastcgi.conf”

PHP fastcgi の設定。

$ sudo nano /etc/lighttpd/fastcgi.conf
server.modules += (“mod_fastcgi”)
index-file.names += (“index.php”)
fastcgi.server = (
“.php” => (
“localhost” => (
“bin-path” => “/usr/bin/php-cgi”,
“socket” => “/tmp/php-fastcgi.sock”,
“broken-scriptfilename” => “enable”,
“max-procs” => 4, # default value
“bin-environment” => (
“PHP_FCGI_CHILDREN” => “1” # default value
)
)
)
)

コンテンツフォルダの作成とパーミッション(利用権限など)設定。

$ sudo mkdir /var/www/html
$ sudo mkdir /var/www/etc
$ sudo chown -R pi.pi /var/www
$ sudo chown -R pi.pi /var/log/lighttpd

Webサーバを再起動します。

$ sudo service lighttpd restart

3.3.FTPサーバの設定

FTPサーバも必須ではありません。
設定しておくと、慣れたPCのエディタでプログラムを作成し、Raspberry Pi でデバックすると作業がはかどります。

FTPサーバのインストール。

$ sudo apt-get install vsftpd ftp

設定ファイルの設定

$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.back
$ sudo rm /etc/vsftpd.conf
$ sudo nano /etc/vsftpd.conf
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
tcp_wrappers=YES

FTPサーバを再起動します。

$ sudo service vsftpd restart

Raspberry Pi で稼働試験します。

$ ftp localhost
Connected to localhost.
220 (vsFTPd 2.3.5)
Name (localhost:pi): pi
331 Please specify the password.
Password:*******
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 “/home/pi”
ftp> by
221 Goodbye.

3.4.外部IO端子を活用するためのライブラリィ設定

今回利用するセンサは Raspberr Pi の I2C(データ転送方式) の外部端子を使います。

I2C用のライブラリィをインストールします。

$ sudo apt-get install libi2c-dev

Raspberry Pi でGPIOやIC2、SPIなどの外部端子に接続した機器のプログラムを容易に開発するためのライブラリィ Wiring Pi を導入します。

Wiring Pi
http://wiringpi.com/

Gitでソースコードを取得し、以下でコンパイル、インストールします。

$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build
$ cd

インストールが完了したら、以下を実行し表示を確認します。

$ gpio -v
gpio version: 2.20
Copyright (c) 2012-2014 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
Type: Model B, Revision: 2, Memory: 512MB, Maker: Sony

今回、I2Cを利用しますので、モジュールをロードする設定をします。

$ sudo nano /etc/modules
#snd-bcm2835
i2c-dev

モジュールをロードするため、再起動します。

$ sudo reboot

I2Cのデバイスを外部端子と配線し、問題がなければ各センサの番地が表示されます。
照度センサ、LCD液晶、温湿度、CO2の各I2cセンサの番地 29,3c,40,68,69 が確認できます。

$ sudo /usr/sbin/i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — 29 — — — — — —
30: — — — — — — — — — — — — 3c — — —
40: 40 — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — 68 69 — — — — — —
70: — — — — — — — —

以上でI2Cセンサのプログラミングができる状態になりました。

続きは 4.センサの設定とプログラミング へ

2.OSインストール後の設定

2.1. raspi-config による基本環境の設定

先ず、raspi-config で基本環境の設定を行います。
青色の入力、選択の手順に従って進めてください。
$ 行の先頭にあるのはコマンド実行を意味しますので、$ を除いてコマンドを実行してください。

$ sudo raspi-config
PI-15

1 Expand Filesystem

2 Change User password

You will now be asked to enter a new password for the pi user
Enter new UNIX password: passwd
Retype new UNIX password: passwd

4 Internationalisation Option

I1 Change Locale
Configuring locales
en_US.UTF-8
ja_JP.UTF-8 UTF-8
Default locale for the system environment:
en_US.UTF-8

I2 Change TImezone
Configuring tzdata
Asia
Time zone:
Tokyo

I3 Change Keyboard Layout
※ssh接続では以下表示されない場合あり。
Keyboard model:
Generic 101-key PC
Keyboard layout:
Other
Country of origin for the keyboard:
Japanese
Keyboard layout:
Japanese
Key to function as AltGr:
The default for the keyboard layout
Compose key:
No Compose Key
Use Control+Alt+Backspace to terminate the X server?
No

5 Enable Camera
Enable support for Raspberry Pi camera?
Disable

8 Advanced Options

A2 Hostname
任意な名前

A3 Memory Split
32
※私はX-Window(Windowsのようなグラフィカル画面)を使わないので、最少にとどめています。
※32~128の間で設定するのが良いでしょう。

A7 I2C
I2C kernel module will now be loaded by default
Yes
The ARM I2 C interface is enabled
Ok
Would you like the I2C kernel module to be loaded by default?
Yes
I2C kernel module will now be loaded by default
Ok

A8 Serial
Would you like a login shell to be accessible over serial?
Yes
Serial is now enabled
Ok

A0 Update
更新が始まりますので、終わるまで待ちます。

以上が終わったら、Finish します。

Linux の Windows Update にあたるソフトの更新を行います。

$ sudo apt-get update
$ sudo apt-get upgrade
双方とも終わるまで、しばらく時間を要します。
途中の質問にはすべて Y で答えます。

スワップ領域(メモリが不足する場合などに利用する)を設定します。

$ free
total used free shared buffers cached
Mem: 218420 56860 161560 0 10456 24908
-/+ buffers/cache: 21496 196924
Swap: 102396 0 102396

$ sudo /etc/init.d/dphys-swapfile stop

$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=1024

Raspberry Pi 2 B+ 以外は 512 に設定します。

$ sudo /etc/init.d/dphys-swapfile start

$ free
total used free shared buffers cached
Mem: 981920 79264 902656 0 11188 32920
-/+ buffers/cache: 35156 946764
Swap: 1048572 0 1048572

ネットワークは、以下の赤字のように固定IPに設定しておくと便利です。

 

$ sudo nano /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
#allow-hotplug eth0
#iface eth0 inet manual
iface eth0 inet static
address 固定IPアドレス
netmask サブネットマスク
gateway デフォルトGWのIPアドレス

auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

nano は、コマンドラインで簡単に使えるテキストエディタです。
以下を参考に操作を行ってください。

“nano”を終了する
http://www.obenri.com/_nano/close_nano.html

端末で使うテキストエディタ nano
https://sites.google.com/site/linuxnomemo/mint-use/nano

DNS は Goole提供のものを利用します。
インターネットのどのプロバイダーからでも利用でき、トラブルが少なく便利です。

$ sudo nano /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

$ sudo chattr +i /etc/resolv.conf

ここまで設定したら、一旦再起動します。

$ sudo reboot

2.2.時計の設定

センサなどを活用する場合、正確な時刻設定は重要です。
Raspberry Pi には内臓電池がなく、再起動などで時刻がずれ易く、インターネット先のntpサーバで、1時間に1回時計合わせを行うよう設定します。

$ sudo nano /etc/ntp.conf
(中略)
#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst
pool ntp.nict.jp iburst
(中略)

$ sudo /etc/init.d/ntp restart

$ sudo ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
ntp-b3.nict.go. .NICT. 1 u 1 64 1 30.011 -12.760 2.490
ntp-a3.nict.go. .NICT. 1 u – 64 1 22.472 -12.338 0.282
ntp-b2.nict.go. .NICT. 1 u 1 64 1 34.106 -13.638 0.580
ntp-a2.nict.go. .NICT. 1 u – 64 1 19.484 -10.860 0.430

$ crontab -e
0 * * * * sudo ntpq -p

$ sudo nano /etc/rc.local
( exit 0 の直前に以下を追加)
ntpq -p

続きは 3.センサなどを使うための詳細設定 へ

 

 

1.Raspberry Pi 初期設定

1.1.OSのインストール設定

OS には Raspberry Pi で一番メジャーな Rasbian Linux を選択します。

事前に8GB以上のSDカード(Model B と A の場合)か、microSDカード(Model B+, A+, 2 B+ の場合)を用意します。
データの転送速度が早いClass10のものを選択します。

NOOBS をダウンロードして Windowsのようにインストール方法もありますが時間がかかります。
OSのインストールされたイメージをSDカードに書き込むのが早道です。

以下のサイトよりZipファイルに圧縮されたOSイメージファイルをダウンロードします。
https://www.raspberrypi.org/downloads/
PI-00
あああ2015/06/17現在では、2015-05-05 更新分が最新でした。

ダウンロードしたZipファイルを解答し、SDカードに書き込みます。
但し、Windwsの場合は別途ソフトが必要です。
以下のリンク先から、簡単に使える DD for Windows を入手すると良いでしょう。
http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows
PI-09

SDカードをPCに差し込み後、上記ソフト起動する際は右クリックして、管理権限で実行します。
管理者権限がない場合は、対象ディスクのSDカードを認識しません。
PI-02

PI-03

ファイルの選択で、先ほどダウンロードして解答したイメージを選択します。
PI-04

「<< 書込 <<」 をクリックすると以下の3つの確認が表示されますが、全て「はい(Y)」で答えます。
PI-05

PI-06
PI-07
PI-08

以上で、OSイメージのSDカードへの書き込みが始まります。
PI-09

SDカードが準備できたら、いよいよ Raspberry Pi を起動します。
Raspberry_Pi_2_Model_B_v1.1_front_angle_new

配線他は以下のブロッグなどを参考にさせてもらうと良いでしょう。

Raspberry Pi に入門してみた。(tomk79さん)
http://qiita.com/tomk79/items/cdc1b88358afba2c6337

1.2.Raspberry Pi に接続する

Raspberry Pi HDMIかビデオ端子につなぎ、USBキーボードを接続すると、ログイン画面が表示されます。
私の場合その作業が面倒なので、LANケーブルをつないで、Windows では TeraTerm、Macのターミナルでssh接続して作業を行います。
Raspberry Pi のLANの初期設定はDHCPなので、割り当てIPを調べる必要があります。
画面をモニタで表示すると、そちらでも確認できますが、私は以下のソフトを利用してDHCPで割り当てられたIPアドレスを確認しています。

LanScan(Mac)
https://itunes.apple.com/jp/app/lanscan/id472226235?mt=12

Advanced IP Scanner(Windows)
http://www.forest.impress.co.jp/library/software/advipscanner/

NetEnum(Windows)
http://www.forest.impress.co.jp/library/software/netenum/

Windows の TeraTerm については以下を参照ください。

Tera Termのインストール
http://webkaru.net/linux/tera-term-install/

パスワード認証によるSSH接続
http://webkaru.net/linux/tera-term-ssh-login/

以下、Tera Termの接続例です。
初期ユーザは pi パスワードは raspberry です。
PI-12

最初の1回目だけ、この画面が出ます。
PI-11

Raspberry Pi にssh接続ができました。
PI-13

最初に、 sudo raspi-config コマンドを実行して、パスワード変更などOSの設定を行います。
PI-14

グラフィックでないですが、矢印キーで簡単に操作できます。
PI-15

Macの場合はターミナルで以下のコマンドを実行し、パスワードを入力すると接続できます。

ssh pi@IPアドレス

続きは 2.OSインストール後の設定 へ

AWSとRaspberry Pi でIoT入門 (第9回JAWS-UG佐賀)

- Raspberry Pi で農業(施設園芸)用センサ、クラウド環境分析システム構築入門 -

JAWS-UG佐賀で上記内容で話をさせて頂きました。
理論中心の座学だけでなく、実践を見て頂きたくも仕事の本番環境は全て公開できません。
そこで、新しいセンサを評価がてら、実際の機器、作業で、センサによる値の計測から、クラウドAWSでのデータ保管、グラフによるデータ解析を行う一連のデモシステムを作成しました。

折角のご縁で、時間を頂いて話を聞きに来られた訳ですので、少しでもお役に立ちたく思います。
そこで、興味のある方に是非「ダイブ」(実際に試)して頂くための、デモシステムを構築した記録を以下にまとめました。
是非、ご参照ください。

以下で紹介するプログラムのソースコードは以下に公開しています。
https://github.com/yukataoka/IoT_Raspi_AWS_Demo

1.Raspberry Pi 初期設定
https://yukataoka.wordpress.com/2015/06/20/raspi01/

2.OSインストール後の設定
https://yukataoka.wordpress.com/2015/06/20/raspi02/

3.センサなどを使うための詳細設定
https://yukataoka.wordpress.com/2015/06/20/raspi03/

4.センサの設定とプログラミング
https://yukataoka.wordpress.com/2015/06/20/raspi04/

5.センサ値をクラウドに保管・表示
https://yukataoka.wordpress.com/2015/06/20/raspi05/

6.S3静的htmlのJavaScriptでグラフ表示
https://yukataoka.wordpress.com/2015/06/20/raspi06/

当日のスライド。
(後日公開予定)

実際のWebコンテンツ
http://s.ykata.net/