見出し画像

Day8. 『Raspberry Pi』セットアップからはじめリアルタイム温度計を作る!

※ひとりでIoTまるっとチュートリアル Advent Calendar 2018
8日目の記事です。まだ登録していない方はこの機会によろしくおねがいします!

ラズパイ

電子工作をしている人は、Arduino(アルディーノ)と同じくらい、こいつの名前もよく聞くと思います。Arduinoよりも、もっとPCに近いものです。特徴としてはOSを元に動くので、我々が普段使っているPCとほとんど遜色なく動きます。最近ではWiFiモジュールやBluetoothモジュールも内蔵されており、ますます色々なことができるようになっています。

今回は、raspberry piについて、詳しく触れていきましょう。

目次
・Raspberry Piとは
・準備(ものを揃える編)
・準備(インストール編)
・準備(環境構築編)
・センサ読み取り・LED出力をする
・リアルタイム温度計づくり

Raspberry Piとは?

下記の特徴を備えています。

・マイコンなので、GPIOがあり、PCよりも自由に入出力をいじれる
・SDカードを元に動く。OSやストレージ機能を備える。
安価。5000円以内で本体を購入できる

などの特徴があり、安価にPCとマイコンのいいとこ取りをしているマシンです。

現在の主要モデルを表にしてみました。。大別して高性能版と、コンパクト&廉価版の2種があり、両種ともに無線機能を備えているため、環境構築等の設定がとてもしやすいです。

表の通り、2018年3月に、新しいラズパイのモデルが発表されました。それまでの高性能版ラズパイだったModel3Bと比べ、性能アップPoE(Power over Ethernet)が大きな変更点です。PoEとは、コンセントを用いず、有線LANケーブルのみで電源を受給電できるようになる機能です!

このように、今もバージョンアップを繰り返し、進化し続けています。

準備(ものを揃える)

さて、ラズパイを動かす準備をしていきましょう。まずはものを揃えなければいけません。ラズパイは、単体では動かず、結構いろいろと準備するモノがあります

☑ ラズパイ本体
☑ microUSBケーブル
☑ microSDカード/カードリーダ
☑ ラズパイケース
☑ HDMIケーブル

などなど。また、ラズパイZEROとかになると、加えて

☑ mini HDMI ⇛ HDMI変換アダプタ
☑ microUSB ⇛ USB変換コネクタ
☑ USBハブ(口がmicroUSBの一つしか無い)

が必要です。一通り揃えていれば後で使いまわしが効くものもありますが、初期投資は結構かかるかもしれません。

全部まとまっている商品、無いかなーと思っていたら、Amazonでいいものがありました。

素晴らしい。さすがAmazonさま。これ買うとすべて解決ですね!ラズパイ自体も新型(2018年)ですし。いちいち秋葉原などに行ってパーツ選定も楽しいですが、まず動かしたいという方は、ここから初めてみるのがお手軽でいいかなと思います!

準備 : インストール編

まずはインストールです。様々なOSを使えるのですが、最も一般的なのがRaspbianとよばれるOSです。今回は、Raspberry Pi 3Bにインストールしていきます。

まずは、自分が持っているPCを使って、OS本体のダウンロードです。ここではまだ、ラズパイは使いません。下記リンクより、ダウンロードします。

デスクトップはあったほうが何かと便利なので、デスクトップ版をダウンロードしましょう。

つぎに、先程ダウンロードしたOSをmicroSDに書き込んでいきます。PCにmicroSDを差し込んで、Etcherというソフトウェアで書き込んでいきましょう。DLはこちらから。

はじめにDLしたOSを選択、次に差し込んだmicroUSBを選択してFinishです。

下記画面が現れると、書き込み完了です。

あとは、このmicroSDをラズパイにぶっ刺すだけで使えます。電源につなぐと...

爽やかなデスクトップ!本当に小さなパソコンって感じです。なぜかmathematica(数値計算用ソフトウェア)とかが入っているんですよね。このマシンパワーで必要なのか。。。という感じですが。

準備 : 環境構築編

ラズパイが起動できたので、中身の環境構築に移りましょう。環境構築と言っても今回扱う基本的なところだけを。
ラズパイをネットワークに繋ぎ、いくつか必要なライブラリをインストールしていきましょう。

まずは、pythonのパッケージマネージャのpipと、gitをインストールします。役割は以下の通り

pip : pythonの便利なライブラリが簡単に使えるようになる
git : コードの管理が簡単になる&git cloneで他の人のコードを簡単に取り込める

コンソール画面を開き、下記コマンドを実行しましょう。

# pipのインストール/アップグレード
sudo apt-get -y install python-dev python-pip
sudo pip install --upgrade pip
# gitのインストール
sudo apt-get install git

次に、この後必要なpython関係のライブラリをインストールします。今回は

☑ GPIOを使った出力 : wiringpi
☑ I2Cを使ったセンサ情報入力 : smbus
☑ websocketが簡単に取り扱えるライブラリ : tornado

を使うので順にインストールしていきましょう。

## pythonでi2c通信をするときのツール
sudo apt-get -y install i2c-tools python-smbus 
## GPIOの入出力を管理するツール
sudo pip install wiringpi
## websocketを取り扱えるwebフレームワーク
sudo pip install tornado

これで準備完了です。

センサ読み取り・LED出力をする

さて、OSの準備も完了したので、いよいよ光らせていきましょう。せっかくなので、Arduinoと同じように、「センサ受信して、光量を変える」操作を実装します。今回は、pythonを使います。

といっても、配線関係は、Arduinoのときに行ったこととほとんど同じです。Raspberry Piのピンアサイン(下図)に従って、回路を組んでいきましょう。

なお、PWMが可能なピンはGPIO12, 13, 18, 19のみです。なので、今回は13番ピンを用いました。配線後の写真がこちら(少し雑ですみません)

次に、コードを実装していきます。Arduinoのsetup()/loop()とは違い、基本的にPCとして動いているので、通常通常のpythonの動作と全く同じです。Arduinoのときと同じように、センサから温度を拾い、LEDの明るさに反映させていきましょう。

import time, smbus
import wiringpi as pi

def read_temp():
    # i2cのチャンネルと、adtのアドレスを決める
    i2c_channel = 1
    adt7410_addr = 0x48

    i2c = smbus. SMBus( i2c_channel )
    # データの読み取り
    data = i2c.read_i2c_block_data(adt7410_addr, 0x00,2)
    # データの整形(Arduinoのときと同じ温度換算)
    temp = ((data[0]<<8|data[1] ) >> 3)/16.0
    return temp

if __name__ == '__main__':
    # GPIO13(PWMができるピン)を指定
    led_pin = 13
    pi.wiringPiSetupGpio()
    # PWMができるように初期設定
    pi.pinMode(led_pin,pi.GPIO.PWM_OUTPUT)
    pi.pwmSetMode(pi.GPIO.PWM_MODE_MS)
    pi.pwmSetClock(500)
    # 明るさ初期値0とする
    pi.pwmWrite(led_pin, 0)
    
    temp = read_temp()

    while True:
        print(temp)
        # 温度読み取り
        temp = read_temp()
        # 読み取った温度をLEDに反映(大きさはint型)
        pi.pwmWrite(led_pin, int(temp))
        time.sleep(1)

pythonファイルとして保存(temp_led.pyとする)し、下記コマンドを打てば、温度が読み取れます。

python temp_led.py

リアルタイム温度を画面に表示させてみる。

さて、はじめにRaspberry PiはArduinoよりももっとPCに近いと言いました。その一要素が、「画面出力」の有無だと思います。
画面を出せるので、ローカルサーバを立てればウェブページ上に温度のデータを可視化することが出来ます。リアルタイム温度計の完成です!

実は、2018年の暑さにやられ、夏に一度作っていました。これがいい例になるかなと思ったので、作り方を公開します。

今回、長くなるので、割愛しますが、websocketと呼ばれる通信プロトコルを用います。それを簡単に取り扱えるwebフレームワークがtornadoです。
websocketはIoT関連のサービスにおけるウェブ側の設計において、すごく相性のいいプロトコルだと思うので、これを機に少し勉強してみるのもいいと思います。

とりあえず、私のgithubにコード一式をあげておきました。下記コマンドで、Raspberry piにコード一式をダウンロードしてください。(Day8とついているものです)

git clone https://github.com/hokekiyoo/advent-calendar-2018.git

Rasperry Piを配線したあと、server.pyを起動し、http://localhost:9999にアクセスすれば、下記の様な温度が表示されます。

コードをいじりながら、どこがどういう役割なのかを勉強していくといいでしょう。

このように、簡易webサーバとして扱ったり、ディスプレイを使った可視化を行えたりするのは、Raspberry Piならではだと思います。自由度も高く、またスクリプト言語でも記述できることが多いので、使っていてとても楽しいです!

まとめ

いかがでしたか?Arduinoより少し導入コストが高いですが、それを補える自由度や拡張性を持つRaspberry Piの良さが少しは伝わったかなと思います。

さて、今回自前でLEDの点灯スクリプト、可視化スクリプトを用意しました。しかし、スクリプトを書くのはかなり大変な作業です。これがめちゃくちゃ簡単にできるとうれしくないですか?

というわけで、明日はフローチャートプログラミングの代名詞、Node-REDについて触れていきます。弊社の非エンジニアでも今回のような可視化ツールが作れちゃう超強力ツールです。お楽しみに!ではではっ

前の日 :  Day7. Arduinoで温度センシング!入出力をマスターせよ。
次の日 : Day9. 非エンジニアでもシステム構築可能。IoTのキラーアイテム『Node-RED』


サポートいただけると励みになります! よろしくおねがいします!!