こんにちは。今回はMicroPythonでブラシレスモータを制御していきたいと思います。
前提
今回使ったマイコンはM5StickC Plusです。言語はMicroPythonでThonny(読み方:ソニー sonyとは無関係)というソフトで書き込みを行いました。Thonnyの準備は下のブログを見てください。
使用したもの
- M5StickC Plus
- モータ(ARRIS S2205 2300KV)
- ESC(ARRIS Swiftシリーズ 20A)
- バッテリー(3S Zeee lipo)
- 可変抵抗(なんでも良い 今回は5KΩ)
- ブレッドボード
- その他配線
配線
プログラム
from machine import Pin, PWM, ADC
import utime
init_duty = True
def pwm_controller(duty): #duty比を0~1で与えるとarrisのescに合わせてpwmを出力する
#このESCの有効なduty比: 0.114~0.21
global init_duty
converted_duty = None
duty_rate = None
if init_duty: #ESCの初期化
converted_duty = 0.1 * 65535 #duty比が0.1で初期化
pwm = PWM(25, freq = 100, duty_u16 = int(converted_duty))
init_duty = False
print('init_duty')
utime.sleep(4.6) #起動まで待機
else:
duty_rate = 0.096 * duty + 0.114
converted_duty = duty_rate * 65535
pwm = PWM(25, freq = 100, duty_u16 = int(converted_duty))
print(duty, ' ', int(converted_duty), ' ', duty_rate)
adc = ADC(Pin(26))
while True:
value = adc.read_u16()
value_5 = value / 65536
pwm_controller(value_5)
utime.sleep(0.3)
いくつか他の人のブログを見ましたが、このESCは有効なduty比が0.11~0.21で、周期が10 ms、またduty比が10%で初期化がかかるようです。ただ、duty比0.11では回転しなかったので最小値を0.114に設定しました。
6行目 関数の仮引数であるdutyは0~1の間で変化させます。
10行目 duty_rateは受け取ったduty(0~1)を0.114~0.21に変換します。変換には二次関数で求めました。
11行目 ESCの初期化は起動の度に行う必要があります。初期化を行わないとESCからモータに信号が出ません。16行目では4.6秒待機させています。これはESCが起動するのに4.6秒ほどかかるためです。
13行と20行にあるPWMの関数は、左からピン番号、周波数、duty比となります。ここで、duty比は0~1を指定するのではなく、duty_u16/65535の比率で指定します。PWM関数は以下のサイトを参考にしてください。
修正すべきところがあればご指摘お願いします。

0 件のコメント:
コメントを投稿