ラズパイ3b＋でAD変換からのLED点灯＠最新 Raspberry Piで学ぶ電子工作(ブルーバックス)

#概要
曲げセンサーを使って、ラズパイ経由でモーター駆動したい！
というモチベーションから始まりましたが、まずは曲げセンサーの値を検出するところから。
そうこうしてると、検出はできたので、曲げセンサーからの入力がある閾値を超えたらLED点灯するというところまで、まずは作ってみた。

最初はnomolkさんの
[曲げセンサとArduinoで人形を躍らせる](http://nomolk.hatenablog.com/entry/2017/12/17/223000)
を参考にして[曲げセンサー]()と、ラズパイ3b+で抵抗挟めばできるかなーと思っていたらなんと、どうもラズパイはAD変換ICを挟まないと、アナログ入力ができないということが分かった。。。参考：[Arduino vs. Raspberry Pi：あなたにぴったりのDIYプラットフォームはどっち?](http://readwrite.jp/develop/7827/)
そこでいろいろ調べてみると@shiracoさんの
[はじめてのAD変換（RaspberryPi3で試すアナログ・デジタル変換）](https://qiita.com/shiraco/items/8c2587ae5a647b4f9803)を見つけ[カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス) ](https://www.amazon.co.jp/%E3%82%AB%E3%83%A9%E3%83%BC%E5%9B%B3%E8%A7%A3-Raspberry-Pi%E3%81%A7%E5%AD%A6%E3%81%B6%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C-%E4%BD%9C%E3%81%A3%E3%81%A6%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%97%E3%81%8F%E3%81%BF%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9/dp/4062579774/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4%E3%81%A7%E5%AD%A6%E3%81%B6%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C&qid=1561894984&s=hobby&sr=1-3-catcorr)にすべてが書いてありそうだったので、購入。
6.4のフォトレジスタを用いた回路のフォトレジスタを曲げセンサーに置き換えたらうまくいきました。

#使用部品
ADコンバーター：[ＭＣＰ３２０８－ＣＩ／Ｐ](http://akizukidenshi.com/catalog/g/gI-00238/)1個310円だけど、送料が。。。。
抵抗：10kΩ, 330Ω
LED:青
[曲げセンサー112mm](https://www.switch-science.com/catalog/126/)←1900円と結構高いがこれしか出回ってないっぽい。。。

ちなみに抵抗と、LEDは[ラズベリー・パイ３/２model B用　UNO R3 Arduino キット 互換キット172 in 1基本部品セット](https://www.amazon.co.jp/gp/product/B075167Y4D/ref=ppx_yo_dt_b_asin_title_o03_s00?ie=UTF8&psc=1)のものを使用。


#配線図
![IMG_0509.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333380/4f65595b-39c4-7ac6-8ee5-947427b67345.jpeg)
引用元：[カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス) ](https://www.amazon.co.jp/%E3%82%AB%E3%83%A9%E3%83%BC%E5%9B%B3%E8%A7%A3-Raspberry-Pi%E3%81%A7%E5%AD%A6%E3%81%B6%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C-%E4%BD%9C%E3%81%A3%E3%81%A6%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%97%E3%81%8F%E3%81%BF%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9/dp/4062579774/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4%E3%81%A7%E5%AD%A6%E3%81%B6%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C&qid=1561894984&s=hobby&sr=1-3-catcorr)

ついでに、MCP3208はこうなってます。
左上の四角に2つ←が入っているところを曲げセンサーと代替え。
![IMG_0508.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333380/3a3f261c-455e-7078-1818-6a9259c71a6b.jpeg)
引用元：[カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス) ](https://www.amazon.co.jp/%E3%82%AB%E3%83%A9%E3%83%BC%E5%9B%B3%E8%A7%A3-Raspberry-Pi%E3%81%A7%E5%AD%A6%E3%81%B6%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C-%E4%BD%9C%E3%81%A3%E3%81%A6%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E3%81%97%E3%81%8F%E3%81%BF%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9/dp/4062579774/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4%E3%81%A7%E5%AD%A6%E3%81%B6%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C&qid=1561894984&s=hobby&sr=1-3-catcorr)

実は6.3の半固定抵抗をAD変換して読み取る回路の、半固定抵抗を曲げセンサーで置き換えたら読み取れるかなと思ってやってみたらだめだった。今回と前回の違いは、
![583586917.083867 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333380/e9dc6134-e150-c76a-aa58-7258060c4a3f.jpeg)


#実配線
![IMG_0511.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333380/b777288d-1efb-04ad-5a43-2f3a2878b909.jpeg)


#プログラム
[Raspberry Piで学ぶ電子工作サポートページ](http://bluebacks.kodansha.co.jp/books/9784062578912/appendix/)からダウンロードできますが、ここに書いておきます。デフォルトでは閾値が2000になってますが、曲げセンサーに合わせて1500としています。

```python:06-02-led.py
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
from time import sleep

# MCP3208からSPI通信で12ビットのデジタル値を取得。0から7の8チャンネル使用可
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
    if adcnum > 7 or adcnum < 0:
        return -1
    GPIO.output(cspin, GPIO.HIGH)
    GPIO.output(clockpin, GPIO.LOW)
    GPIO.output(cspin, GPIO.LOW)

    commandout = adcnum
    commandout |= 0x18  # スタートビット＋シングルエンドビット
    commandout <<= 3    # LSBから8ビット目を送信するようにする
    for i in range(5):
        # LSBから数えて8ビット目から4ビット目までを送信
        if commandout & 0x80:
            GPIO.output(mosipin, GPIO.HIGH)
        else:
            GPIO.output(mosipin, GPIO.LOW)
        commandout <<= 1
        GPIO.output(clockpin, GPIO.HIGH)
        GPIO.output(clockpin, GPIO.LOW)
    adcout = 0
    # 13ビット読む（ヌルビット＋12ビットデータ）
    for i in range(13):
        GPIO.output(clockpin, GPIO.HIGH)
        GPIO.output(clockpin, GPIO.LOW)
        adcout <<= 1
        if i>0 and GPIO.input(misopin)==GPIO.HIGH:
            adcout |= 0x1
    GPIO.output(cspin, GPIO.HIGH)
    return adcout

GPIO.setmode(GPIO.BCM)
# ピンの名前を変数として定義
SPICLK = 11
SPIMOSI = 10
SPIMISO = 9
SPICS = 8
# SPI通信用の入出力を定義
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICS, GPIO.OUT)

LED = 25
GPIO.setup(LED, GPIO.OUT)

try:
    while True:
        inputVal0 = readadc(0, SPICLK, SPIMOSI, SPIMISO, SPICS)
        if inputVal0 < 1500:
            GPIO.output(LED, GPIO.HIGH)
        else:
            GPIO.output(LED, GPIO.LOW)
        print(inputVal0)
        sleep(0.2)

except KeyboardInterrupt:
    pass

GPIO.cleanup()

```

この本では、なぜこのようなコードになるのか、また、コードの読み方・解釈の仕方をほぼ０ベースの人向けに解説しているので、かなりわかりやすい！上記見ても解釈がわからない方は、ぜひご購入をお勧めします。


#実行結果
ちょっと配線の位置を変えてしまっていますが、同じ回路です。
・曲げてないとき
![IMG_0513.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333380/6de87783-1c63-74c7-ee93-9f9b7cc950df.jpeg)

・曲げたとき
![IMG_0514.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333380/e220a989-67df-63be-fbfc-854225214454.jpeg)


#感想
何とかここまでたどりついた。。。。
まだまだぎこちないですが、次は曲げセンサの入力を使ってサーボの制御をやるぞ！