RoboClaw 2x15A モータコントローラ (V5E)で速度制御ができない

RoboClaw 2x15A モータコントローラ (V5E)
(https://store.shopping.yahoo.co.jp/suzakulab/pololu-3285.html)
こちらの商品とエンコーダ付きモータ(Maxon)を接続し、速度制御を行おうと考えております。

マニュアルに記載されている通りArduinoを接続し、サンプルプログラムを使用すると、エンコーダの値の読み込みや、PWMの値を直接指定することによるモータの回転(ForwardM1関数等使用)は行うことができます。
しかし、同様にして速度を指定してモータを回転(SpeedM1関数使用)させると、指定した速度にかかわらずモータの最高速度で回転し、速度制御ができません。
アドレスやボーレートを変更しても挙動に変化はありませんが、Ion Studioを使用すると速度制御可能でした。
また、stateを表示させると、80、128のどちらかが表示されます。

速度制御ができない原因としては、何が考えられるのでしょうか。
また、ReadEncM1関数等を用いたときに取得できるstateについて、0~2bitはマニュアルに記載されていますが、それ以外のbitは何を示すのでしょうか。
よろしくお願いいたします。

ION Studioからは制御できるということは、Arduino側の問題の可能性が高く、動かしている実際のプログラムを書いていただくことはできますか?
制御できてるサンプルと、速度がマックスになるプログラムと両方書いてもらえると、どこが問題であるか特定しやすくなるとおもいます。

PWM指定
//See BareMinimum example for a list of library functions

//Includes required to use Roboclaw library
#include <SoftwareSerial.h>
#include “RoboClaw.h”

//See limitations of Arduino SoftwareSerial
SoftwareSerial serial(10,11);
RoboClaw roboclaw(&serial,10000);

#define address 0x80

//Velocity PID coefficients.
#define Kp 1.0
#define Ki 0.5
#define Kd 0.25
#define qpps 44000

void setup() {
//Open Serial and roboclaw serial ports
Serial.begin(9600);
roboclaw.begin(9600);

//Set PID Coefficients
roboclaw.SetM1VelocityPID(address,Kd,Kp,Ki,qpps);
roboclaw.SetM2VelocityPID(address,Kd,Kp,Ki,qpps);
}

void displayspeed(void)
{
uint8_t status1,status2,status3,status4;
bool valid1,valid2,valid3,valid4;

int32_t enc1= roboclaw.ReadEncM1(address, &status1, &valid1);
int32_t speed1 = roboclaw.ReadSpeedM1(address, &status3, &valid3);
Serial.print(“Encoder1:”);
if(valid1){
Serial.print(enc1,HEX);
Serial.print(" “);
Serial.print(status1,HEX);
Serial.print(” ");
}
else{
Serial.print("invalid “);
}
Serial.print(“Speed1:”);
if(valid3){
Serial.print(speed1);
Serial.print(” ");
}
else{
Serial.print("invalid ");
}
Serial.println();
}

void loop() {
roboclaw.ForwardM1(address,127);
for(uint8_t i = 0;i<100;i++){
displayspeed();
delay(10);
}

roboclaw.ForwardM1(address,63);
for(uint8_t i = 0;i<100;i++){
displayspeed();
delay(10);
}
roboclaw.ForwardM1(address,0);
for(uint8_t i = 0;i<100;i++){
displayspeed();
delay(10);
}
}

速度制御
setup関数はPWM指定の場合と同じです。
void loop() {
roboclaw.SpeedM1(address,100000);
for(uint8_t i = 0;i<100;i++){
displayspeed();
delay(10);
}

roboclaw.SpeedM1(address,60000);
for(uint8_t i = 0;i<100;i++){
displayspeed();
delay(10);
}
roboclaw.SpeedM1(address,0);
for(uint8_t i = 0;i<100;i++){
displayspeed();
delay(10);
}
}

使用している関数ぐらいしか違いがない気がします…

コードありがとうございます。
当社でも動作を確認しましたが、動作しましたので、ご確認いただきたい点がございます。

  • BasicmicroMotionStudio でPWM settingsでモータとエンコーダの動作をご確認いただいていると思いますが、PWM最大・最小のときにM1 Speedの値はいくらになっていますでしょうか。

  • 9600bpsに設定していただいておりますが、displayspeedをdelay(10)毎に読み出すとバッファが溢れる場合がありますので、もう少し速い速度で転送いただいた方が良いと思います。

もう少し、エラーになる状況を当社でも確認していきますが、
原因をひとつずつ確認していくため、お手数をおかけいたしますが、ご確認いただけると助かります。

よろしくお願いいたします。

似たような現象を再現できました。

  • Motion Studio で、PWM SettingsのControlで、Motor1を上(正側)へ動作させたときに、M1 Encode/M1 Speed がマイナスになりませんでしょうか?
  • もしマイナスになるようでしたら、General Settings I/OのEncode 1 Mode の Invert のチェックを入れて、メニューDevice から Write Settingsで、設定を書き込んでください。
  • 再度、電源を入れ直し、Motion Controlは接続しない状態で、Arduinoから通信してください。

現象は2つの状態で確認しました。

  • エンコーダが逆向きに設定されているとき、最大速度で動作する。Encoder 1 Mode 設定にInvertが付いておらず、逆向きに制御するため最大速度で回り制御不能となる。
  • ArduinoとMotion Controlを両方から接続し、設定変更など両方から制御した場合に、不安定な動作をする。

もし上記の状況でないようでしたら、お手数ですがMotion ControlからPWM SettingでControlした時の、速度とエンコーダの情報と、シリアルモニタで表示される、次の数行をいただけますでしょうか。
Encoder1:00 82 Encode2:00 80 Speed1 5E Speed2:0

よろしくお願いいたします。

教えていただきありがとうございます。
ご連絡が遅くなってしまい申し訳ございません。

Motion Studioを用いてPWM Settingでの最大、最小時の速度を計測しました。
最大:約25万
最小:約-26.7万
と表示されておりました。
また、Motor1を正側へ動作させた際のエンコーダの値、速度確認しましたが、どちらもプラスの値が表示されておりました。

教えていただいたことを参考にしながら試行錯誤を行った結果、特定の条件下でのみ速度制御ができました。
・アドレス 128固定
・ボーレート 115200以上
・Enable Multi-Unit Modeのチェックを外す

この条件でのみ速度制御ができました。Multi-Unit Modeにチェックが入っていたのは数日前まで速度制御を用いずに3台のRoboClawを動かしていたためでした。
この条件下でのみしか制御できなかった点はとても疑問が残ります。
また、一見設定が同じでも速度制御ができないこともあり、釈然としません。
この状態だと、3台のRoboClawを制御するためには、モータだけで3種類のシリアル通信を用意しないといけないのでキツイ面がありますね…

調整を行ったところ、アドレスを変更でき、かつMulti-Unit Modeが使えそうという状況になりました。
内容としては、
・うまく行った時の設定を保存し、見た目の設定は全く同じでも各モータドライバに保存した設定を書き込む
・プルアップ抵抗をRoboClawのLogic電源と接続していたが、マイコンの電圧出力ピンと接続するように変更

このような形になります。

特に後者の項目については、今までもエンコーダの値を取得する等は問題なくできていたので、問題だったのか怪しいです。

しかし、お陰様で複数のモータドライバで速度制御を行うことができました。
ありがとうございました!