LoginSignup
3

More than 3 years have passed since last update.

posted at

updated at

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

概要

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

最初はnomolkさんの
曲げセンサとArduinoで人形を躍らせる
を参考にして曲げセンサーと、ラズパイ3b+で抵抗挟めばできるかなーと思っていたらなんと、どうもラズパイはAD変換ICを挟まないと、アナログ入力ができないということが分かった。。。参考:Arduino vs. Raspberry Pi:あなたにぴったりのDIYプラットフォームはどっち?
そこでいろいろ調べてみると@shiracoさんの
はじめてのAD変換(RaspberryPi3で試すアナログ・デジタル変換)を見つけカラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス) にすべてが書いてありそうだったので、購入。
6.4のフォトレジスタを用いた回路のフォトレジスタを曲げセンサーに置き換えたらうまくいきました。

使用部品

ADコンバーター:MCP3208-CI/P1個310円だけど、送料が。。。。
抵抗:10kΩ, 330Ω
LED:青
曲げセンサー112mm←1900円と結構高いがこれしか出回ってないっぽい。。。

ちなみに抵抗と、LEDはラズベリー・パイ3/2model B用 UNO R3 Arduino キット 互換キット172 in 1基本部品セットのものを使用。

配線図

IMG_0509.jpg
引用元:カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)

ついでに、MCP3208はこうなってます。
左上の四角に2つ←が入っているところを曲げセンサーと代替え。
IMG_0508.jpg
引用元:カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)

実は6.3の半固定抵抗をAD変換して読み取る回路の、半固定抵抗を曲げセンサーで置き換えたら読み取れるかなと思ってやってみたらだめだった。今回と前回の違いは、
583586917.083867 (1).jpg

実配線

IMG_0511.jpg

プログラム

Raspberry Piで学ぶ電子工作サポートページからダウンロードできますが、ここに書いておきます。デフォルトでは閾値が2000になってますが、曲げセンサーに合わせて1500としています。

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()

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

実行結果

ちょっと配線の位置を変えてしまっていますが、同じ回路です。
・曲げてないとき
IMG_0513.jpg

・曲げたとき
IMG_0514.jpg

感想

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3