mbedでブラシレスモーターを動かす

この動画がそれです。ここに至るまでの過程を記録に残します(2021/8/1)。

パーツリスト

主役であるところのmbed、モーター、ESC

  • mbed LPC1768
  • DUALSKY ECO 2303C V2 (KV : 2000)
  • DUALSKY XC-12-Lite

その他

  • 直流電源装置(Kungber 30V/10A)
  • ブレッドボード
  • ジャンパワイヤ数本
  • プルアップ抵抗(10kΩ)

ソースコード

最初はとりあえず、mbedのコミュニティで公開されているこちらのサンプルをそのまま動かしました。コード本文はこのリンク先で4割ほどスクロールしたところに記載されています。言語はC++です。

os.mbed.com

一応動きはしますが、前半のスロットル設定の部分がDUALSKYの仕様と異なるため、このままでは使えません。DUALSKYの仕様通りに前半を書き換えました。また、後半の回転も1回の時間が長いので半分にしています。

また、ESC側の設定動作の終了判定のため、新たに20番のデジタルピンをスイッチとして使っています。適当な長さのwait()に置き換えても良いかもしれません。

#include "mbed.h"
#include "Servo.h
PwmOut ledf(LED1); //throttle up test led with PWM dimming
PwmOut ledr(LED2); //throttle down test led with PWM dimming
Servo ESC(p21);
DigitalIn SW(p20); //LOWにしておく

int main()
{
    ESC=0.0;
    wait(4.0);
    for(int i=0;i<8;i++) //この間にESCの信号線を挿す想定だが、予め挿しておいても問題ない
    {
        ledf=ledr=1;
        wait(0.5);
        ledf=ledr=0;
        wait(0.5);
    }
    ESC=1.0; //信号を最大スロットルにセット
    for(int i=0;!SW;i++) //電源に繋ぎ、「ピロリ、ピピ(2セル)......ピー」と鳴るまで待つ。鳴ったらp20をHIGHに切り替える
    {
        ledf=1;wait(0.1);
        ledf=0;wait(0.1);
    }
    ESC=0.0; //信号を最低スロットルにセット
    wait(4.0); //この間にピロリと鳴るはず。設定完了
    while(1)
    {
        for(float p=0.0;p<=1.0;p+=0.025)
        {
            ESC=p;
            ledf=p;
            wait(0.5);
        }
        ESC=0.0;
        ledf=ledr=0;
        wait(2.0);
        for(float p=1.0;p>=0.0;p-=0.025)
        {
            ESC=p;
            ledr=p;
            wait(0.5);
        }
        ESC=0.0;
        ledf=ledr=0;
        wait(2.0);
    }
}

実行結果

このコードをコンパイルして実行したところ、冒頭にリンクを貼った動画ツイートのように動作しました。もう一度同じツイートを掲載しておきます。

今後の展望

今夏、日本水中ロボネット主催の「水中ロボットコンベンション in JAMSTEC 2021」フリー部門に、簡易的なAUVを製作して参加します。1000KV程度のブラシレスモーターを水中で動作させる必要があります。下の写真ツイートは実際に使用する予定のモーターにプロペラを取り付けたものです。