こんにちは。今回は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 件のコメント:
コメントを投稿