電子工作で何か動くものを作りたいときには、使われる駆動系の双璧は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のブレークアウトボードを接続して利用できます。