ラズパイ3b+で曲げセンサー使ってDCモーターのPWM制御@最新 Raspberry Piで学ぶ電子工作(ブルーバックス)応用


概要

前回の記事ラズパイ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で学ぶ電子工作サポートページからダウンロードできますが、ここに書いておきます。

08-03-dcmotor.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)

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モーター駆動