LoginSignup
1
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-07-12

概要

前回の記事ラズパイ3b+でAD変換からのLED点灯@最新 Raspberry Piで学ぶ電子工作(ブルーバックス)の続き。
今度は、曲げセンサーの曲げ具合によって、DCモーターの回転数を制御したいと思います!
と言っても、やったのはカラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス) の8章の回路の可変抵抗を、曲げセンサーと抵抗10kΩに変えただけ。難しくないのでぜひやってみてください。

使用部品

ADコンバーター:MCP3208-CI/P ←前回と同じ!
抵抗:10kΩ 2個, 330Ω 2個
モータードライバー: TA7291P ご参考:秋月電子モータードライバー TA7291P (2個入)
2個で300円だけど、送料が。。。

配線図

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

ここの、可変抵抗の部分を曲げセンサーと10kΩ抵抗で置き換え。下記参照。
IMG_0525.JPG

実配線

IMG_0524.jpg
モーターは、タミヤのツインモーターギヤボックスに埋め込んでしまったので、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で学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス) を見てみてください!!

実行結果

<曲げてないとき>
IMG_0521.jpg

<曲げたとき>
IMG_0522.jpg
一応右のモーターが回っているます。。。
うーんわかりにくい。。。。
下記に動画上げてみましたので、見てみてください。こっちのほうが断然わかりやすい。
Youtube:ラズパイ3の曲げセンサーを使ったDCモーター駆動

感想

ADコンバーターの値を見ると、曲げたときに800あたりになり、伸ばしたままだと2000くらいだったので、プログラムの通り、一方方向にしか回転させることができなかった。閾値変えれば、正転逆転できますね。

1
1
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
1
1