The Fool In The Valleyの雑記帳

-- 好奇心いっぱいのおじいちゃんが綴るよしなし事 --

Raspberry PiでDCモータを動かす

先の記事「Raspberry Piでstepping motorを動かす 2」ではDRV8835を使用してStepping Motorを動かしましたが、本メモはそのDRV8835でDCモータを動かす方法を記したものです。

ーーーーーーーーー

DRV8835はIN/INとPHASE/ENABLEの2種類のモードがある。データシートを見るとDCモータを制御する場合にIN/INモードを使う方法がサンプルとして挙げられているのでそれに倣うことにする。
f:id:tfitv:20220312115618j:plain

【ハードウェア】
IN/INモードに設定するために、MODEピンをGNDにする。
その他の回路は下のように接続する 
f:id:tfitv:20220312121057j:plain

【ソフトウェア】
GPIOをコントロールするためのライブラリとしてRPi.GPIOを使用する。
基本的な正転、逆転の切り替えは次のようにすればよい。

import RPi.GPIO as GPIO
import time

AIN1 = 5
AIN2 = 6

GPIO.setwarnings(False); GPIO.setmode(GPIO.BCM)
GPIO.setup(AIN1, GPIO.OUT); GPIO.setup(AIN2, GPIO.OUT)
GPIO.output(AIN1, False); GPIO.output(AIN2, False)
try:  
        GPIO.output(AIN1, True)    # CCW
        time.sleep(3)
        GPIO.output(AIN1, False)     # STOP        
        time.sleep(3)    
        GPIO.output(AIN2, True)   # CW
        time.sleep(3) 
        GPIO.output(AIN2, True)    # STOP
        time.sleep(3) 
except KeyboardInterrupt:  # Ctrl-zで停止させる
    pass
GPIO.cleanup()

PWMを使って速度を変えるときは、上記の try: 以下を次のコードで置き換える。
まず、PWMインスタンスを生成する。ここではPWM周波数を50Hz(20msec)とした。この周期が長過ぎるとスムーズに回転しなくなる。逆にPWM周期が短過ぎると、ソフトウェアへの負荷が増えるし、高周波音が発生したりする。

次のコードではフルパワーの0%から1秒ごとに10%刻みで100%まで増加させて回転速度を上げ、そこから逆に10%刻みで0%まで減少させて回転速度を下げ、停止させている。

ctlm = GPIO.PWM(AIN1, 50) # AIN1端子に50Hzの矩形波を出す
ctlm.start(0) # Duty比0でスタートする
try:
    for duty in range(0, 101, 10):
        ctlm.ChangeDutyCycle(duty)
        time.sleep(1)
    for duty in range(100, -1, -10):
        ctlm.ChangeDutyCycle(duty)
        time.sleep(1)    
except KeyboardInterrupt:
    pass
GPIO.cleanup()

実行した様子をビデオで撮影した。オシロの波形はAIN1への入力波形で、左上に表示したDuty比で変化しているのが確認できる。
youtu.be