ブラシレスモータの制御

2024年2月14日水曜日

ブラシレスモータ

 こんにちは。今回はMicroPythonでブラシレスモータを制御していきたいと思います。


前提


 今回使ったマイコンはM5StickC Plusです。言語はMicroPythonでThonny(読み方:ソニー sonyとは無関係)というソフトで書き込みを行いました。Thonnyの準備は下のブログを見てください。

使用したもの


配線


 見やすくしたのが下の図です。


 写真ではわかりやすいようにLEDを配線していますがなくても問題ないです。あと、ESCから出てるBECの赤い線はどこにも繋がないように気をつけてください。ESCから5V 1Aが出てくるところです。

プログラム

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関数は以下のサイトを参考にしてください。

 修正すべきところがあればご指摘お願いします。

このブログを検索

ブログ アーカイブ

自己紹介

自分の写真
大学3年。小学のころから電子工作が好きです。現在はIoTデバイスの制作やドローンの制作などをしています。

連絡フォーム

名前

メール *

メッセージ *

QooQ