Loading...
プロジェクト

高級モーター開拓記

以前、「買ってよかったもの」というテーマで執筆した記事でロボマスモーターを紹介しました。

しかし、こちらでご紹介したロボマスモーターは導入から数ヵ月後に在庫切れとなり、そのまま補充されず入手困難となっています。

せっかく使いやすくて重宝していたのに…

ということで、新しいモーターを開拓してみます。

(学生広報と称して関係のない内容を記事にしていますが、記事の母数が増えるのは良いことなので許してもらえるはず…)

スペック

今回、導入するモーターはこちら!!!

ゴツくてカッコイイ!

そこそこにずっしりしてます。

分厚い装甲に覆われているようで、多少雑に扱っても壊れなさそうです

モーターは「NEO Brushless Motor V1.1」

スペックはサイト内に記載されている通りなのですが、注目すべき点をピックアップしておきます
・重量 0.425kg
・電圧 12 V
・電流(ピーク) 105 A
・トルク 2.6 Nm
・回転数 5676 RPM
・軸 φ8(キー溝)
・取り付け穴 #10-32 

トルクは少し低めですが、圧倒的な回転数でカバーできそうです。
12V駆動というのが少々トレンドから外れていますね
最大の落とし穴は取り付け穴の規格です。

制御回路は「SPARK MAX Motor Controller」

・対象 ブラシ付き、ブラシレスDCモーター
・電圧 5.5V – 24V
・電流(連続) 60A
・電流(瞬間) 100A(2秒間)
・制御方式 PWM,CAN,USB

ブラシ付き、ブラシレス両方いけるドライバって珍しくないですか!?
定格電力的にもほとんどのモーターは問題なく使えそうです(735モーターは無理か…)
制御方式はPWMだと確実に動きますが、制御回路内でのPID制御を発動できないので基本的にはCAN通信を使うことになりそうです。

使い方(機構)

モーターの取り付けネジは#10-32です。

これはインチ規格ではなくユニファイ規格です。

アメリカンですねぇー

一応、M5タップを無理やり掘って固定できるそうですが、私はこの手法を信用していません。

頑張って、ネジ専門店で購入しました。

(専門店でも在庫が少なく、希望の長さがなかったため旋盤で短くしました)

軸関連は純正のアクセサリーを購入すると楽で確実です。

純正品をケチった場合の固定法を軽く説明します。

軸は∅8で2mmのキー溝が掘ってあります。
手元にキー溝のある歯車がなかったので∅2のエンドミルで追加工しています。
キーには2mm厚のジュラルミン板を突っ込みました。
軸の先端に#10-32規格でタップが掘ってあるのでこの穴を活用して抜け止めします。
更にイモネジで上下の動きを拘束して完成です。

大変でした…

使い方(回路)

まず、モーターの線や制御回路側の線にコネクタをつけます。

純正だと高いので今回は適当なバナナプラグを付けました。

電源線にはXT60コネクタを付けましたが定格を考慮すると微妙な気がします。
バッテリー側の放電能力から我々の環境では問題なさそうです。

モーターから出ている信号線は確実に制御回路側につなげましょう。
押し込みすぎると接触不良になります。
線が抜けるとモーターが焦げ付くらしいので気を付けましょう。

CANで動かす場合は終端抵抗510Ωくらいを探ってみてください

ちなみに、モーターから出ている信号線のうち、黄色と青色がエンコーダの線になっています。

黒色の線(GND)と合わせて分岐することで直接的な回転数を読み取れますが分解能が低い上、電源を投入した後に有効になる仕様だったのでおすすめしません。

使い方(プログラム)

ここが一番厄介です。

まず、制御回路の専用ソフトとプログラムの内容を一致させる必要があります。

専用ソフトのダウンロードページはこちら。
Installation | REV Hardware Client | REV Robotics Documentation

起動するとこのような画面になります。

USBケーブルでPCとSPARK MAX Motor Controllerをつなぐと以下の表示になります。
このときCAN通信の線にマイコンなどを繋いでいると認識されない場合があります。

表示された機器をクリックすると、メイン画面が開きます。
ここでは電流保護の値からリミットスイッチの有無、警告などを設定・確認することができます。

最も注意すべき点は、「ブラシレスモーターをブラシ付きモーターのモードで使わないようにすること」です。
壊れるらしい。

Runのタブでは速度制御や位置制御を実行して動作確認をすることができます。
結線や設定に問題のないことを確認したら、動かしてみましょう。
ここで動けば第一関門突破です。

私の環境ではモーターの信号線を制御回路に接続する部分で押し込みすぎて接触不良が発生しました。

↓専用ソフトから位置制御したときの様子です。

めっちゃ速く1回転を繰り返しています。
感動しちゃいますね

1回転を1、半回転を0.5と表現されていますが0.01単位でも余裕そうです。

スペック上の表記ではエンコーダが42分割と書かれていましたが、位置制御にこのエンコーダは使っていないのでしょうか?
とにかく期待以上でよかった。

↓マイコンからPWM信号で動かしてみました。(デューティー比は1000~ 2000です)

問題なく動きました。

プログラム

#include <M5Stack.h>

#include <ESP32Servo.h>

Servo sparkMax;

void setup() {

  sparkMax.attach(26, 1000, 2000);

  sparkMax.writeMicroseconds(1500);  // 初期停止

  delay(3000);

}

void loop() {

  /*

  sparkMax.writeMicroseconds(1500);//停止

  sparkMax.writeMicroseconds(1000);//正転(最大)

  sparkMax.writeMicroseconds(2000);//逆転(最大)

  */

  sparkMax.writeMicroseconds(1400);

  delay(500);

  sparkMax.writeMicroseconds(1500);

  delay(500);

  sparkMax.writeMicroseconds(1600);

  delay(500);

  sparkMax.writeMicroseconds(1500);

  delay(500);

}

CAN通信で動かす資料が少なく、実例も見当たらなかったのでエンコーダの線を分岐してマイコンから直接PID制御をかけてみることにしました。

正直、実用レベルにはなりませんでした。

原因は
・エンコーダの分解能が足りない
・PWM制御に対する応答性が良くない
・正逆転の性能が異なる
あたりだと思います

↓自作の位置制御が一番うまくいったときの様子です
減速比が大きければ使えなくもない…?レベルでした。

せっかく内部でPID制御を効かせる機能があるのに使わないのはもったいないですよね
頑張って使えるようにする方法を見つけました。

参考:https://www.chiefdelphi.com/t/non-frc-spark-max-can-control/468856

上記のサイト内にあるGoogleドライブにあるコードの一部を編集して使いました。
ジョセフさんありがとうございます。
1週間を費やして調べてみたところ、この情報以外見つかりませんでした。

マイコンのCANからSparkMaxを動かすには、まずファームウェアのバージョンを落とします。
1.5.0くらいだったと思います。
忘れたので動かなければ総当たりしてみてください。

モーターの制御方式とプログラム上の制御方式を一致させます
↓こちらから設定します。今回は単純な位置制御を選択しました。

以上の内容を設定し終えたらマイコンのコードを書いて実行するだけです。

マイコンはESP32-wroom

CANトランシーバーはSN65HVD230を使いました

コード(メイン)

#include “driver/twai.h”        //v1.0.1

void setup() {

  // put your setup code here, to run once:

  init_can();  //SparkMax初期化

}

void loop() {

  // put your main code here, to run repeatedly:

  SparkMax(1.00);

}

SparkMax.ino

#include “driver/twai.h”

unsigned long lastSendTime = 0; // 20ms送信タイマー

void init_can() { // CAN初期化

  twai_general_config_t g_cfg = TWAI_GENERAL_CONFIG_DEFAULT(GPIO_NUM_17, GPIO_NUM_16, TWAI_MODE_NORMAL);

  twai_timing_config_t t_cfg = TWAI_TIMING_CONFIG_1MBITS();

  twai_filter_config_t f_cfg = TWAI_FILTER_CONFIG_ACCEPT_ALL();

  twai_driver_install(&g_cfg, &t_cfg, &f_cfg);

  twai_start();

}

void send_can(uint32_t id, const void* data) { // CAN送信

  twai_message_t msg = {.extd = 1, .identifier = id, .data_length_code = 8};

  if (data) memcpy(msg.data, data, 8);

  twai_transmit(&msg, 0);

}

void SparkMax(float setpoint) { // 復帰確認 & SPARK MAX送信 (20ms周期)

  unsigned long now = millis();

  if (now – lastSendTime < 20) return; // 20ms経過していなければ抜ける

  lastSendTime = now;

  twai_status_info_t s;

  twai_get_status_info(&s);

  if (s.state == TWAI_STATE_BUS_OFF) twai_initiate_recovery(), twai_start(); // Bus-Off自動復帰

  uint8_t hb[8] = {255, 255, 255, 255, 255, 255, 255, 255};

  send_can(0x02052C80, hb); // Heartbeat送信

  uint8_t ctrl[8] = {0};

  memcpy(ctrl, &setpoint, sizeof(float));

  send_can(0x02050C80 | (1 & 0x3F), ctrl); // Position_Set送信 (DeviceID: 1)

}

メインのコードは紛失したのでうろ覚えで書きました
関数の方は実際に大会で使っていた内容です。

定期的にCANでデータを送らないと動かない仕様で20msおきに送信するのが正解っぽいです
ハートビートとか言うらしい。かっこよ

↓マイコンから制御している様子です。

すこしクセの強いモーターですが、いざ扱えるようになると、ものすごく便利です。

他の制御方式も同じように実行できると思います。

動かない場合は以下を疑ってみてください
・制御方式の不一致
・終端抵抗(総当たりする覚悟で)
・ファームウェアのバージョン

購入

私はキャチロボの部品支給を活用して入手しました。

モーターは海外の物ですが、日本では代理店があるため簡単に購入できます。

NEO Brushless Motor V1.1 ¥8,550
NEO Brushless Motor V1.1 – Redigiform

SPARK MAX Motor Controller ¥16,200
SPARK MAX Motor Controller – Redigiform

こうみると、めっちゃ高いわけでもないですねー
3万くらいの感覚でいましたが2万ちょいで買えるじゃないですか

ロボマスの代替品としていかがでしょうか。

この記事を書いた学生
ぶちょー

理工学部機械工学科3年
いつもロボット作ってます。

ぶちょーをフォローする