APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

ラズベリーパイを使ってセンサーで遊んでみる

Raspberry Pi 3 Model B+
 

自己紹介

ども。株式会社 エーピーコミュニケーションズ所属の666(社員番号)な人です。

はじめに

久しぶりにラズベリーパイ(以下ラズパイ)を入手したので色々試してみます。

手始めに今回はGrovePi+の接続とセットアップ、幾つかのセンサー/LEDとの接続とプログラムによる制御まで書いてみます。

 

ラズベリーパイのセットアップ

今回購入したラズパイはRaspberry Pi 3 Model B+というモデルです。

amazonだとケースやSDなどセットになっているのでそちらがオススメですね。

ラズパイの初期設定は特に難しい要素は無いです。

Wi-Fiの有効化とSSHD の(パスワード拒否)鍵認証方式化くらいでしょうか。

Wi-Fi

まずはWi-Fiの有効化。
wpa_passphrase というコマンドを実行します。

$ sudo wpa_passphrase wifihoge wifihogepass
network={
	ssid="wifihoge"
	#psk="wifihogepass"
	psk=e7e5eb9a2d3da02197b060678fff7b49f3933b05b827dc8a5e031012c03ce43c
}

生成されたモノをwpa_supplicant.conf ファイルに追記します。
その際、Wi-Fiがシークレットモードの場合はscan_ssid=1を追記しておきます。

$ cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
	ssid="wifihoge"
	#psk="wifihogepass"
	psk=e7e5eb9a2d3da02197b060678fff7b49f3933b05b827dc8a5e031012c03ce43c
        scan_ssid=1
}

SSHD

次にSSHD化。
これは raspi-config というコマンドを使うようです。

$ sudo raspi-config

[5 Interfacing Options] -> [P2 SSH]の順に選択してenabledにします。
設定後はラズパイの再起動が必要らしいです...

sshd_config

必要に応じて sshd_config を修正します。

$ grep -e PermitRootLogin -e PubkeyAuthentication -e PasswordAuthentication /etc/ssh/sshd_config 
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

鍵でログインしたいのでラズパイ側に公開鍵をおきましょう。

ラズパイとGrovePi+の接続(物理的)

ラズパイの電源を一旦落としてGrovePi+と物理的に接続させます。
ラズパイ側とGrovePi+ではピンの数が違います...が写真の様に接続させます。
f:id:yuki-kodama:20190603124815j:plain

GrovePi+接続のセットアップ

本家のサイトhttps://www.dexterindustries.com/GrovePi/get-started-with-the-grovepi/ を参考に初期化を行います。

$ sudo curl -kL dexterindustries.com/update_grovepi | bash

処理が終わったらrebootします。

 $ sudo reboot

i2cの確認

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- 04 -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

$ ls /dev/i2c-*
/dev/i2c-1

案外あっさりと初期化が完了しました。

GrovePi+にLED 取り付け

まずはHelloWorld的なLEDの点滅。
準備したLEDはこちら
www.switch-science.com

このLEDをGrovePi+のD4に取り付けます。ちなみにDなポートならどこでもいいです。

次にLEDを操作するプログラム。
こちらを参考にします。GrovePi/led_blink.js at master · DexterInd/GrovePi · GitHub
長いので必要そうなところを切り貼りしてざっくりと書き直してみました。

var GrovePi = require('node-grovepi').GrovePi;
var led = new GrovePi.sensors.DigitalOutput(4);
var status = 0;

var board;

board = new GrovePi.board({
  debug: true,
  onError: function(err) {
    console.log(err);
  },
  onInit: function(res) {
    console.log("OnInit");
    if (res) {
      setInterval(function() {
        if (status == 0) {
          led.turnOff();
          status = 1;
        } else {
          led.turnOn();
          status = 0;
        }
      }, 1000)
    }
  }
})
board.init();

実行には node-grovepi が必要です。
あと当然ですがnode.jsも。

$ npm install node-grovepi

$ nodejs -v
v9.11.2

先ほどのコードをnode.jsで実行してみてLEDが点滅を繰り返せばOKです。

GrovePi+にデジタル温度・湿度センサー 取り付け

GrovePi+にデジタル温度・湿度センサーを取り付けてみます。
利用するセンサーはこちら
www.switch-science.com
このセンサーをGrovePi+のD2に取り付けます。ちなみにDなポートならどこでもいいです。

GrovePi+に水分センサー 取り付け

利用するセンサーはこちら
GrovePi+に水分センサーを取り付けてみます。
www.switch-science.com
このセンサーをGrovePi+のA2に取り付けます。ちなみにAなポートならどこでもいいです。
水分センサーは主に鉢植えなんかの土に刺して、土壌の水分量を計測するセンサーです。
f:id:yuki-kodama:20190603140910j:plain

デジタル温度・湿度センサーと水分センサーのプログラム

温度・湿度センサーと水分センサーから値を読み取るプログラムを書いてみます。
先ほどのLEDのプログラムをベースに、さらにPython版のサンプルなんかを参考に書いてみます。

'use strict';

const GrovePi = require('node-grovepi').GrovePi;
const Board = GrovePi.board;
const Analog = GrovePi.sensors.base.Analog;
const DHTDigitalSensor = GrovePi.sensors.DHTDigital;

const board = new Board({
    debug: true,
    onError: function (err) {
        console.log(err);
    },
    onInit: function (res) {
        const a2 = new Analog(2);
        const dht2 = new DHTDigitalSensor(2, DHTDigitalSensor.VERSION.DHT11, DHTDigitalSensor.CELSIUS);
        setInterval(function () {
            const moisture = Number(a2.read());
            const dht = dht2.read();
            console.log("moisture: ", moisture);
            console.log("temperature: ", dht[0]);
            console.log("humidity: ", dht[1]);
            console.log("-----");
        }, 1000);
    }
});
board.init();

実行してみます。なんか偶に変な値が出ますが...まーそれっぽい出力ですね。

 $ nodejs myGroveSensor.js 
info GrovePi.board GrovePi is initing
moisture:  747
temperature:  26.5
humidity:  41
-----
moisture:  747
temperature:  26.5
humidity:  41
-----
moisture:  0
temperature:  6.779062778503071e+38
humidity:  6.805646932770577e+38
-----
moisture:  748
temperature:  26.5
humidity:  41
-----
moisture:  746
temperature:  26.5
humidity:  41
-----
moisture:  744
temperature:  26.5
humidity:  41
-----
moisture:  747
temperature:  26.5
humidity:  41
-----
moisture:  747
temperature:  26.5
humidity:  41
-----

 
ラズベリーパイとGrovePi+を組み合わせると割と簡単にセンサーアプリが作れそうです。