#概要
前回の記事ラズパイ3b+でAD変換からのLED点灯@最新 Raspberry Piで学ぶ電子工作(ブルーバックス)の続き。
今度は、曲げセンサーの曲げ具合によって、DCモーターの回転数を制御したいと思います!
と言っても、やったのはカラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス) の8章の回路の可変抵抗を、曲げセンサーと抵抗10kΩに変えただけ。難しくないのでぜひやってみてください。
#使用部品
ADコンバーター:MCP3208-CI/P ←前回と同じ!
抵抗:10kΩ 2個, 330Ω 2個
モータードライバー: TA7291P ご参考:秋月電子モータードライバー TA7291P (2個入)
2個で300円だけど、送料が。。。
#配線図
引用元:カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)
ここの、可変抵抗の部分を曲げセンサーと10kΩ抵抗で置き換え。下記参照。
#実配線
モーターは、タミヤのツインモーターギヤボックスに埋め込んでしまったので、2つ写ってますが、今回動かすの右側の1つです。
ノイズ処理で、0.01μFのコンデンサつけてます。
#プログラム
Raspberry Piで学ぶ電子工作サポートページからダウンロードできますが、ここに書いておきます。
# -*- 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)
GPIO.setup(25, GPIO.OUT)
GPIO.setup(24, GPIO.OUT)
p0 = GPIO.PWM(25, 50)
p1 = GPIO.PWM(24, 50)
p0.start(0)
p1.start(0)
adc_pin0 = 0
try:
while True:
inputVal0 = readadc(adc_pin0, SPICLK, SPIMOSI, SPIMISO, SPICS)
print(inputVal0)#今回僕が追加したところここだけ。画面にADコンバーターの出力をプリントするのみ
if inputVal0 > 100 and inputVal0 < 2048:
p1.ChangeDutyCycle(0)
duty = (2048-inputVal0)*70/2048#出力を70%に押さえて、モータードライバーへの入力を制限している
p0.ChangeDutyCycle(duty)
elif inputVal0 >= 2048 and inputVal0 < 4000:
p0.ChangeDutyCycle(0)
duty = (inputVal0-2048)*70/2048#出力を70%に押さえて、モータードライバーへの入力を制限している
p1.ChangeDutyCycle(duty)
sleep(0.5)
except KeyboardInterrupt:
pass
p0.stop()
p1.stop()
GPIO.cleanup()
勉強になったのは、ノイズ対策。
DCモーターが駆動すると、ADコンバーターから0とか4095とかのノイズが発生するらしい。ここで行っている対策は2点。
1,ハードでの対策:330Ωの抵抗2個を曲げセンサーを挟むように配置している。
2,ソフトでの対策:inputVal0が100以下と、4000以上はノイズとして読まないようプログラミングしている点。(上記参照)
残りの解説はカラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス) を見てみてください!!
<曲げたとき>
一応右のモーターが回っているます。。。
うーんわかりにくい。。。。
下記に動画上げてみましたので、見てみてください。こっちのほうが断然わかりやすい。
Youtube:ラズパイ3の曲げセンサーを使ったDCモーター駆動
#感想
ADコンバーターの値を見ると、曲げたときに800あたりになり、伸ばしたままだと2000くらいだったので、プログラムの通り、一方方向にしか回転させることができなかった。閾値変えれば、正転逆転できますね。