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.センサの設定とプログラミング へ