#概要
曲げセンサーを使って、ラズパイ経由でモーター駆動したい!
というモチベーションから始まりましたが、まずは曲げセンサーの値を検出するところから。
そうこうしてると、検出はできたので、曲げセンサーからの入力がある閾値を超えたら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基本部品セットのものを使用。
#配線図
引用元:カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)
ついでに、MCP3208はこうなってます。
左上の四角に2つ←が入っているところを曲げセンサーと代替え。
引用元:カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)
実は6.3の半固定抵抗をAD変換して読み取る回路の、半固定抵抗を曲げセンサーで置き換えたら読み取れるかなと思ってやってみたらだめだった。今回と前回の違いは、
#プログラム
Raspberry Piで学ぶ電子工作サポートページからダウンロードできますが、ここに書いておきます。デフォルトでは閾値が2000になってますが、曲げセンサーに合わせて1500としています。
# -*- 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ベースの人向けに解説しているので、かなりわかりやすい!上記見ても解釈がわからない方は、ぜひご購入をお勧めします。
#実行結果
ちょっと配線の位置を変えてしまっていますが、同じ回路です。
・曲げてないとき
#感想
何とかここまでたどりついた。。。。
まだまだぎこちないですが、次は曲げセンサの入力を使ってサーボの制御をやるぞ!