電子工作で何か動くものを作りたいときには、使われる駆動系の双璧はRCサーボとDCモーターではないでしょうか。

DCモータの最低限の操作としては、そのON-OFFでしょうが、モーターカーなどを作成すると、回転速度を変えたり回転方向を変えたりしたいですよね。一般的には、回転速度を変える方法としてはPWM、回転方向を変える方法としてはHブリッジ回路が使われます。

ここでは、PWMで回転速度を変え、Hブリッジ回路を操作して回転方向を変えることができるDCモーターのドライバを紹介します。


Hブリッジ回路

単にDCモーターを回転させるだけでなく、回転方向を変えられるようにすることができるモーターのドライブ回路として、Hブリッジが使用されています。Hブリッジに関しては、図を交えた分かりやすい説明がネット上に掲載されているので、そのいくつかを紹介します。

https://practicalelectronicsblog.com/hbridge/


DCMotor

DRV8833やL9110などのHブリッジ(フルブリッジ)回路を対象にしたDCモータードライバーです。マイクロファンのMicroPythonファームウェアに組み込まれています。

"""
DCMortor: DC Motor driver
for MicroPython
Version 1.0

Copyright 2023 K.Kakizaki
"""

import sys

if sys.platform.startswith('stm32'):
    from stm32pwm import PWM
else:
    from machine import PWM, Pin

class DCMotor:

    def __init__(self, pin1, pin2, freq=1000, rate=0.8):
        self._pin1 = pin1
        self._pin2 = pin2
        self._freq = freq
        self._rate = rate
        self._speed = 0
        if sys.platform.startswith('stm32'):
            self._pwm1 = PWM(pin1, freq=self._freq, duty_percent=0)
            self._pwm2 = PWM(pin2, freq=self._freq, duty_percent=0)
        else:
            self._pwm1 = PWM(Pin(pin1), freq=self._freq, duty_u16=0)
            self._pwm2 = PWM(Pin(pin2), freq=self._freq, duty_u16=0)

    def setFreq(self, freq=1000): # PWMの周波数
        self._freq = freq
        self._pwm1.freq(freq)
        self._pwm2.freq(freq)

    def getFreq(self):
        return self._freq

    def setRate(self, rate=0.8): # speedの実効値比
        if rate > 1:
            rate = 1
        if rate < 0:
            rate = 0
        self._rate = rate
        self.setSpeed(self._speed)

    def getRate(self):
        return self._rate

    def speed(self, v):
        self.setSpeed(v)

    def setSpeed(self, v): # 速度 -100 - 100
        if v > 100:
            v = 100
        if v <-100:
            v = -100
        self._speed = v
        duty = int(v/100*self._rate*65535)
        if v > 0:
            self._pwm1.duty_u16(duty)
            self._pwm2.duty_u16(0)
        else:
            self._pwm1.duty_u16(0)
            self._pwm2.duty_u16(-duty)

    def getSpeed(self):
        return self._speed

    def brake(self):# ブレーキ
        self._speed = None
        self._pwm1.duty_u16(65535)
        self._pwm2.duty_u16(65535)

DCMotorの使用例

RP2040-ROBO, ESP32-ROBOでのDCMotorの使用例を示します。DCモーターの回転速度を変えながら、正転と逆転を繰り返すプログラム例です。

from dcmotor import DCMotor
import time

ma = DCMotor('MA1', 'MA2') # もう一つの回路として、MB1, MB2を使用できます。

v = 0
delta = 1
while True:
    if v >= 100:
        delta = -1
    if v <= -100:
        delta = 1
    v = v + delta
    ma.speed(v)
    time.sleep_ms(20)

上記の例では1回路のみの操作ですが、RP2040-ROBO, ESP32-ROBOでは、2回路のHブリッジを操作できるので、例えば車の両輪をそれぞれ異なるモーターで操作することができます。


関連製品

DCモーターやRCサーボの接続機能を持ち、ロボットやモーターカーなどの作成に適した開発ボードを紹介します。

RP2040-ROBO

Hブリッジ回路をIC化したDRV8833を搭載しています。

ESP32-ROBO

Hブリッジ回路をIC化したL9110のブレークアウトボードを接続して利用できます。