MicroPythonを入れたESP32とBTS7960でDCモータを回してみる

Share on:

ESP32でBTS7960を使ってDCモーターを回してみました

モーターのピンアサイン

モーターに付属していたケーブルのピンアサインは下記の通りでした。ただし、ケーブルの色の並びがいろいろあるようで、基板を正面にしてコネクタが左側に来るように見た場合、上から順番に下記のようなピンアサインになるようです。

機能 ピン
モーター(-) 1
エンコーダ電源 2
エンコーダA相 3
エンコーダB相 4
エンコーダGND 5
モーター(+) 6

BTS7960のピンアサイン

モータードライバはBTS7960を使用しました。ピンアサインは下記の通りです

ピン 機能
VCC 電源
GND グラウンド
R_IS 電流検出とエラーフラグの出力
L_IS 電流検出とエラーフラグの出力
R_EN Rのenable
L_EN Lのenable
RPWM RのPWM
LPWM LのPWM

BTS7960の動作パターン

それぞれのピンへの入力によるモーターの動作パターンは下記の通りになります

R_EN L_EN RPWM LPWM
正転 1 1 1 0
逆転 1 1 0 1
ニュートラル 0 0 X X
ブレーキ 1 1 0 0

BTS7960のデッドタイム生成

データシート内に下記のように、ドライバIC内の回路によって保証され、MOSFETをオフしてから別のMOSFETをオンするまでにデッドタイムが発生するとあります。従って、ソフトによるデッドタイム生成は必要ないでしょう。

This is assured by a circuit in the driver IC, generating a so called dead time between switching off one MOSFET and switching on the other

動作の様子

正転後にブレーキ、逆転後にニュートラルを行い、停止時にエンコーダの値を送信するプログラムを動作させた様子です。

ソースコード

 1import time
 2from machine import Pin
 3
 4class Encorder():
 5    def __init__(self, pin_a, pin_b):
 6        self.pin_a, self.pin_b = pin_a, pin_b
 7        self.position, self.value, self.direction = 0, 0, 0
 8        self.table = [
 9             0, 1,-1, 0,
10            -1, 0, 0, 1,
11             1, 0, 0,-1,
12             0,-1, 1, 0
13        ]
14        
15    def check(self, pin):
16        self.value = (self.value << 2) + self.pin_a.value() + (self.pin_b.value() << 1)
17        self.value = self.value & 0x0F
18        self.direction = self.table[self.value]
19        self.position += self.direction
20
21class BTS7960():
22    def __init__(self, r_en, l_en, rpwm, lpwm):
23        self.R_EN = r_en
24        self.L_EN = l_en
25        self.RPWM = rpwm
26        self.LPWM = lpwm
27        self.neutral()
28
29    def right(self):
30        self.R_EN.on()
31        self.L_EN.on()
32        self.LPWM.off()
33        self.RPWM.on()
34
35    def left(self):
36        self.R_EN.on()
37        self.L_EN.on()
38        self.RPWM.off()
39        self.LPWM.on()
40
41    def neutral(self):
42        self.R_EN.off()
43        self.L_EN.off()
44        self.RPWM.off()
45        self.LPWM.off()
46
47    def brake(self):
48        self.R_EN.on()
49        self.L_EN.on()
50        self.RPWM.off()
51        self.LPWM.off()
52
53# GPIO settings
54encoder_a = Pin(34, Pin.IN)
55encoder_b = Pin(35, Pin.IN)
56r_en = Pin(25, Pin.OUT)
57l_en = Pin(26, Pin.OUT)
58rpwm = Pin(32, Pin.OUT)
59lpwm = Pin(33, Pin.OUT)
60
61# Encoorder settings
62encorder = Encorder(encoder_a, encoder_b)
63
64# Interrupt settings
65encoder_a.irq( encorder.check )
66encoder_b.irq( encorder.check )
67
68bts7960 = BTS7960(r_en, l_en, rpwm, lpwm)
69
70bts7960.neutral()
71time.sleep(3)
72
73print('start')
74
75while True:
76
77    bts7960.left()
78    print('left')
79    time.sleep(1)
80
81    bts7960.brake()
82    print('brake')
83    print(encorder.position, encorder.direction)
84    time.sleep(0.5)
85
86    bts7960.right()
87    print('right')
88    time.sleep(1)
89
90    bts7960.neutral()
91    print('neutral')
92    print(encorder.position, encorder.direction)
93    time.sleep(0.5)

関連記事