LoginSignup
5
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-30

概要

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

感想

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

5
3
0

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
  3. You can use dark theme
What you can do with signing up
5
3