RaspberryPiで照度計をつくろう

#**概要**
RaspberryPiと安価に入手できる電子部品を使用して照度計を作製します。
本記事は、JAWS-UGのハンズオンイベント向けにその大部分を**[「Raspberry Pi でSORACOM 接続＋MQTTをしてみよう 後編 [Step 6 ～ Step 8]」](http://qiita.com/dietposter/items/42cfc8f76997999f3332)**から引用しています(投稿者了承済み)。
##前提条件
RaspberryPiはRaspbianのインストールが完了し、SSH等でコマンドプロンプトにアクセスできる状態になっているものとします。
RaspberryPiのセットアップがまだの場合は、**[「[超初心者向け]RaspberryPiにOS(Raspbian)をインストールして起動し、vimやScratchが使えるようになるまで」](http://qiita.com/Ichiro_Tsuji/items/e7ff30f0ec0b7d0ceed5)**を参照して下さい。

#**照度計回路を組み立ててRaspberryPiに接続する**
##必要部材
| 部材名 | 必要数 |
|:--|:-:|
| Raspberry Pi 2 または Raspberry Pi 3<BR>(電源・SDカードを含む)  | 1  |
| ブレッドボード  |  1 |
| ADコンバーター MCP3002  |  1 |
| フォトトランジスタ NJL7502L |  1 |
| カーボン抵抗 7.5kΩ  | 1  |
| ジャンパワイヤ[オス-メス]  |  6 |
| ジャンパワイヤ[オス-オス]  | 3  |

![スクリーンショット 2016-10-05 15.45.17.png](https://qiita-image-store.s3.amazonaws.com/0/80392/6fd70e2f-f8d9-a715-ec33-51540864945b.png)

##回路を組み立てる
RaspberryPiは電源OFFの状態で接続します。以下の図を元にラズパイとブレッドボード上に部品を配置しケーブルを配線してください。
![回路図](https://qiita-image-store.s3.amazonaws.com/0/4092/800ea87a-2c8f-1ba8-7ff4-38ec8bd5e8a3.png)

1. ADコンバータMCP3002をブレッドボードに差し込む。4つづつある左右のピンは、ブレッドボードの中央の溝にかかるようにし、半円状の切り欠きが図では下側に向くようにする。
2. 7.5kΩ抵抗をADコンバータMCP3002 4番とフォトトランジスタNJL7502Lの短い脚にあたるブレッドボードの穴に差し込む。
3. フォトトランジスタNJL7502Lをブレッドボードの穴に差し込む。短い脚（カソード：陰極側）を図では下側になるようにする。
4. オス・オスケーブルをMCP3002 3番とフォトトランジスタNJL7502Lの短い脚にあたるブレッドボードの穴に差し込む。
5. オス・メスケーブルをRaspberryPiの1番ピン[3.3V PWR]とブレッドボードの＋（赤色）のラインに差し込む。
6. オス・メスケーブルをRaspberryPiの9番ピン[GND]とMCP3002 4番にあたるブレッドボードの穴に差し込む。
7. オス・メスケーブルをRaspberryPiの19番ピン[SPI0 MOSI]とMCP3002 5番にあたるブレッドボードの穴に差し込む。
8. オス・メスケーブルをRaspberryPiの21番ピン[SPI0 MISO]とMCP3002 6番にあたるブレッドボードの穴に差し込む。
9. オス・メスケーブルをRaspberryPiの23番ピン[SPI0 SCLK]とMCP3002 7番にあたるブレッドボードの穴に差し込む。
10. オス・メスケーブルをRaspberryPiの24番ピン[SPI0 CS0]とMCP3002 1番にあたるブレッドボードの穴に差し込む。
11. オス・オスケーブルをブレッドボードの＋（赤色）のラインとMCP3002 8番にあたるブレッドボードの穴に差し込む。
12. オス・オスケーブルをブレッドボードの＋（赤色）のラインとフォトトランジスタNJL7502Lの長い脚（アノード：陽極側）にあたるブレッドボードの穴に差し込む。

##SPIを有効化する
配線が終わったらRaspberryPiの電源を入れます。ADコンバータMCP3002はSPIインターフェースを用いています。ラズパイでは初期状態でSPIモジュールを無効にしているためraspi-configでSPIモジュールを動作するように設定します。

```bash
$ sudo raspi-config
```

* 管理画面が出ますので「9 Advanced Options」を選択してEnter<BR>
![SPI](https://qiita-image-store.s3.amazonaws.com/0/4092/d7e894c2-6f44-9663-bbc7-01214ef501ab.png)
* A6 SPI」を選択
* 「Would you like the SPI interface to be enabled?」と出るので「Yes」を選択
* 「The SPI interface is enabled」と出るので「OK」を選択
* 「 Would you like the SPI kernel module to be loaded by default?」と出るので「Yes」を選択。
* 「SPI kernel module will now be loaded by default」と出るので「OK」を選択
* メニュー画面に戻ってくるので「Finish」を選択し、再起動を促されればそのままリブートします

##照度センサーの動作確認
ADコンバータとフォトトランジスタの配線を確認するため、以下のPythonコードを実行します。

```bash
$ vim get-light.py
$ python get-light.py
ch0 =   40, 0.13[V], ch1 =  391,  1.26[V] ←自然光
ch0 =    0, 0.00[V], ch1 =  400,  1.29[V]
ch0 =    0, 0.00[V], ch1 =  416,  1.34[V]
ch0 =    0, 0.00[V], ch1 =  413,  1.33[V]
ch0 =   77, 0.25[V], ch1 =  382,  1.23[V]
ch0 =  168, 0.54[V], ch1 =  370,  1.19[V]
ch0 =  220, 0.71[V], ch1 =  725,  2.34[V] ←スマホのライトをあてる
ch0 =  194, 0.63[V], ch1 =  936,  3.02[V]
ch0 =  122, 0.39[V], ch1 =  939,  3.03[V]
ch0 =   22, 0.07[V], ch1 =  936,  3.02[V]
ch0 =    0, 0.00[V], ch1 =  932,  3.01[V]
ch0 =   11, 0.04[V], ch1 =  729,  2.35[V]
ch0 =  116, 0.37[V], ch1 =  756,  2.44[V]
ch0 =  191, 0.62[V], ch1 =   13,  0.04[V] ←フォトトランジスタを隠す
ch0 =  224, 0.72[V], ch1 =   15,  0.05[V]
ch0 =  203, 0.65[V], ch1 =   13,  0.04[V]
^C$ ←[Ctrl]+Cキーで中断
```

```python:get-light.py
# coding: utf-8
# 参考：「みんなのRaspberry Pi入門」リックテレコム 石井もルナ・江崎徳秀 著

# spi, time ライブラリをインポート
import spidev
import time

# SpiDev オブジェクトのインスタンスを生成
spi = spidev.SpiDev()

# ポート0、デバイス0のSPI をオープン
spi.open(0, 0)

# 最大クロックスピードを1MHz に設定
spi.max_speed_hz=1000000

# 1 ワードあたり8ビットに設定
spi.bits_per_word=8

# ダミーデータを設定（1111 1111）
dummy = 0xff

# スタートビットを設定（0100 0111）
start = 0x47

# シングルエンドモードを設定 （0010 0000）
sgl = 0x20

# ch0 を選択（0000 0000）
ch0 = 0x00
# ch1 を選択（0001 0000）
ch1 = 0x10

# MSB ファーストモードを選択（0000 1000）
msbf = 0x08

# IC からデータを取得する関数を定義
def measure(ch):
    # SPI インターフェイスでデータの送受信を行う
    ad = spi.xfer2( [ (start + sgl + ch + msbf), dummy ] )
    #
    val = ((ad[0] & 0x03) << 8) + ad[1] 
    # 受信した2バイトのデータを10 ビットデータにまとめる
    voltage =  ( val * 3.3 ) / 1023
    # 結果を返す
    return val, voltage

# 例外を検出
try:
    # 無限ループ
    while 1:
        # 関数を呼び出してch0 のデータを取得
        ch0_val, ch0_voltage  = measure(ch0)
        # 関数を呼び出してch1 のデータを取得
        ch1_val, ch1_voltage  = measure(ch1)
        # 結果を表示
        print  'ch0 = {:4d}, {:2.2f}[V], ch1 = {:4d}, {:2.2f}[V]'.format(ch0_val, ch0_voltage, ch1_val, ch1_voltage)
        # 0.5 秒待つ
        time.sleep(0.5)

# キーボード例外を検出
except KeyboardInterrupt:
    # 何も処理をしない
    pass

# SPI を開放
spi.close()
```

※ 実行例にあるとおりADコンバータMCP3002は、2つのアナログ入力チャネルを持っており、今回はch1だけしか使っていません。時間があれば、ch0側にアナログ入力センサーを接続して2つのデータを取得できるようにしてみてください。

#**可視化にチャレンジ！**
照度計の値が取得できたら可視化(グラフ化)したいですよね！
そんな方は[**「RaspberryPiでセンサーデータをfluentdを使ってDynamoDBに送って可視化してみよう＜完全編＞」**](http://qiita.com/Ichiro_Tsuji/items/fce61bdd5974a2c9cf14)をどうぞ。