前提・実現したいこと
ストロベリー・リナックス製のドライバL6470と使って、秋月電子にて購入したステッピングモータ42SHD4404-24を動かそうとしています。
マイコンはarduinoMEGAで、スケッチは北の国からさんのアップされているスケッチを少しいじって、
4つのモータをデイジーチェーンでつないで動かしています。
しかし、これまで使っていたステッピングモータSM-42BYG011-25では正常に回っていたものが、上記のモータに替えたら動作が不安定になりました。(4つのうち1つしか回らない。ほかは回らないときがある)
どうすれば正常に回るようになるか教えていただきたいです。
発生している問題・エラーメッセージ
4つのモータのうち、1つしか回らない。ほかは回らないか意図しない動きになる。
該当のソースコード
arduino
1 2#include <SPI.h> 3#include <MsTimer2.h> 4#include <stdio.h> 5#include <SoftwareSerial.h> 6#include <Wire.h> 7#include <DFRobot_QMC5883.h> 8#include <A4988.h> 9 10//RunMotor PIN-difinitions 11#define PIN_SPI_MOSI 51 12#define PIN_SPI_MISO 50 13#define PIN_SPI_SCK 52 14#define PIN_SPI_SS 53 15#define PIN_BUSY 44 16#define PIN_BUSY2 46 17#define PIN_BUSY3 45 18#define PIN_BUSY4 47 19 20//Joystick difinitions 21const int analogInPinUD = A0; // UDアナログ入力ピン(定数) 22const int analogInPinLR = A1; // LRアナログ入力ピン(定数) 23int UD = 0; // Up-DownのAD値(変数) 24int LR = 0; // Left-RightのAD値(変数) 25 26//MODE switch difinitions 27const int DIN_PIN_run_auto = 2; 28const int DIN_PIN_beforeLift = 3; 29const int DIN_PIN_AfterLift = 22; 30const int DIN_PIN_run_manual = 4; 31 32//LinearActuator difinitions 33#define PIN_LinearA_1 10 34#define PIN_LinearA_2 11 35 36//LiftMotor difinitions 37const int MOTOR_STEPS = 400; 38const int DIR = 8; 39const int STEP = 9; 40float rpm = 135; //0.88sm/sec 140以上は微脱調 41int microsteps = 1; 42#define MOTOR_ACCEL 400 43#define MOTOR_DECEL 400 44A4988 stepper(MOTOR_STEPS, DIR, STEP); 45 46 47void setup(){ 48 Serial.begin(115200); 49// MODE switch setting 50 pinMode( DIN_PIN_run_auto, INPUT_PULLUP ); 51 pinMode( DIN_PIN_beforeLift, INPUT_PULLUP ); 52 pinMode( DIN_PIN_AfterLift, INPUT_PULLUP ); 53 pinMode( DIN_PIN_run_manual, INPUT_PULLUP ); 54// RunMotor setting 55 pinMode( PIN_SPI_MOSI, OUTPUT); 56 pinMode( PIN_SPI_MISO, INPUT); 57 pinMode( PIN_SPI_SCK, OUTPUT); 58 pinMode( PIN_SPI_SS, OUTPUT); 59 pinMode( PIN_BUSY, INPUT_PULLUP); 60 pinMode( PIN_BUSY2, INPUT_PULLUP); 61 pinMode( PIN_BUSY3, INPUT_PULLUP); 62 pinMode( PIN_BUSY4, INPUT_PULLUP); 63 SPI.begin(); 64 SPI.setDataMode(SPI_MODE3); 65 SPI.setBitOrder(MSBFIRST); 66 digitalWrite(PIN_SPI_SS, HIGH); 67// LinearActuator setting 68 pinMode( PIN_LinearA_1, OUTPUT); 69 pinMode( PIN_LinearA_2, OUTPUT); 70 71// Serial setting 72// EspSerial2.begin(9600); 73 74// RunMotor setting 75 L6470_resetdevice(); //1台目のL6470リセット 76 L6470_resetdevice2(); //2台目のL6470リセット 77 L6470_resetdevice3(); //3台目のL6470リセット 78 L6470_resetdevice4(); //4台目のL6470リセット 79 L6470_setup(); //1台目のL6470を設定 80 L6470_setup2(); //2台目のL6470を設定 81 L6470_setup3(); //3台目のL6470を設定 82 L6470_setup4(); //4台目のL6470を設定 83 L6470_getstatus(); //1台目のフラグ解放 84 L6470_getstatus2();//2台目のフラグ解放 85 L6470_getstatus3();//3台目のフラグ解放 86 L6470_getstatus4();//4台目のフラグ解放 87 88 MsTimer2::set(25, fulash);//シリアルモニター用のタイマー割り込み 89 MsTimer2::start(); 90 91} 92 93void loop(){ 94 95 int runspeed = 10000; 96 L6470_run(0,runspeed); 97 L6470_run2(0,runspeed); 98 L6470_run3(1,runspeed); 99 L6470_run4(1,runspeed); 100 delay(5000); 101 L6470_softstop();//回転停止、保持トルクあり 102 L6470_softstop2();//回転停止、保持トルクあり 103 L6470_softstop3();//回転停止、保持トルクあり 104 L6470_softstop4();//回転停止、保持トルクあり 105 delay(2000); 106 Serial.println("run"); 107} 108 109void L6470_setup(){ 110/////////SM-42BYG011-25 setting 111//L6470_setparam_acc(0x005); //[R, WS] 加速度default 0x08A (12bit) (14.55*val+14.55[step/s^2]) 112//L6470_setparam_dec(0x005); //[R, WS] 減速度default 0x08A (12bit) (14.55*val+14.55[step/s^2]) 113//L6470_setparam_maxspeed(0x25); //[R, WR]最大速度default 0x041 (10bit) (15.25*val+15.25[step/s]) 114//L6470_setparam_minspeed(0x02); //[R, WS]最小速度default 0x000 (1+12bit) (0.238*val[step/s]) 115//L6470_setparam_fsspd(0x027); //[R, WR]μステップからフルステップへの切替点速度default 0x027 (10bit) (15.25*val+7.63[step/s]) 116//L6470_setparam_kvalhold(0x50); //[R, WR]停止時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 117//L6470_setparam_kvalrun(0xFF); //[R, WR]定速回転時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 118//L6470_setparam_kvalacc(0xFF); //[R, WR]加速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 119//L6470_setparam_kvaldec(0xFF); //[R, WR]減速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 120//L6470_setparam_stepmood(0x01); //ステップモードdefault 0x07 (1+3+1+3bit) 121 122/////////42SHD4404-24 setting 123L6470_setparam_acc(0x005); //[R, WS] 加速度default 0x08A (12bit) (14.55*val+14.55[step/s^2]) 124L6470_setparam_dec(0x005); //[R, WS] 減速度default 0x08A (12bit) (14.55*val+14.55[step/s^2]) 125L6470_setparam_maxspeed(0x25); //[R, WR]最大速度default 0x041 (10bit) (15.25*val+15.25[step/s]) 126L6470_setparam_minspeed(0x002); //[R, WS]最小速度default 0x000 (1+12bit) (0.238*val[step/s]) 127L6470_setparam_fsspd(0x027); //[R, WR]μステップからフルステップへの切替点速度default 0x027 (10bit) (15.25*val+7.63[step/s]) 128L6470_setparam_kvalhold(0x50); //[R, WR]停止時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 129L6470_setparam_kvalrun(0xFF); //[R, WR]定速回転時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 130L6470_setparam_kvalacc(0xFF); //[R, WR]加速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 131L6470_setparam_kvaldec(0xFF); //[R, WR]減速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 132L6470_setparam_stepmood(0x01); //ステップモードdefault 0x07 (1+3+1+3bit) 133} 134 135void L6470_setup2(){ 136L6470_setparam_acc2(0x005); //[R, WS] 加速度default 0x08A (12bit) (14.55*val+14.55[step/s^2]) 137L6470_setparam_dec2(0x005); //[R, WS] 減速度default 0x08A (12bit) (14.55*val+14.55[step/s^2]) 138L6470_setparam_maxspeed2(0x25); //[R, WR]最大速度default 0x041 (10bit) (15.25*val+15.25[step/s]) 139L6470_setparam_minspeed2(0x02); //[R, WS]最小速度default 0x000 (1+12bit) (0.238*val[step/s]) 140L6470_setparam_fsspd2(0x027); //[R, WR]μステップからフルステップへの切替点速度default 0x027 (10bit) (15.25*val+7.63[step/s]) 141L6470_setparam_kvalhold2(0x50); //[R, WR]停止時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 142L6470_setparam_kvalrun2(0xFF); //[R, WR]定速回転時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 143L6470_setparam_kvalacc2(0xFF); //[R, WR]加速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 144L6470_setparam_kvaldec2(0xFF); //[R, WR]減速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 145L6470_setparam_stepmood2(0x01); //ステップモードdefault 0x07 (1+3+1+3bit) 146} 147 148void L6470_setup3(){ 149L6470_setparam_acc3(0x005); //[R, WS] 加速度default 0x08A (12bit) (14.55*val+14.55[step/s^2]) 150L6470_setparam_dec3(0x005); //[R, WS] 減速度default 0x08A (12bit) (14.55*val+14.55[step/s^2]) 151L6470_setparam_maxspeed3(0x25); //[R, WR]最大速度default 0x041 (10bit) (15.25*val+15.25[step/s]) 152L6470_setparam_minspeed3(0x02); //[R, WS]最小速度default 0x000 (1+12bit) (0.238*val[step/s]) 153L6470_setparam_fsspd3(0x027); //[R, WR]μステップからフルステップへの切替点速度default 0x027 (10bit) (15.25*val+7.63[step/s]) 154L6470_setparam_kvalhold3(0x50); //[R, WR]停止時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 155L6470_setparam_kvalrun3(0xFF); //[R, WR]定速回転時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 156L6470_setparam_kvalacc3(0xFF); //[R, WR]加速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 157L6470_setparam_kvaldec3(0xFF); //[R, WR]減速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 158L6470_setparam_stepmood3(0x01); //ステップモードdefault 0x07 (1+3+1+3bit) 159} 160 161void L6470_setup4(){ 162L6470_setparam_acc4(0x005); //[R, WS] 加速度default 0x08A (12bit) (14.55*val+14.55[step/s^2]) 163L6470_setparam_dec4(0x005); //[R, WS] 減速度default 0x08A (12bit) (14.55*val+14.55[step/s^2]) 164L6470_setparam_maxspeed4(0x25); //[R, WR]最大速度default 0x041 (10bit) (15.25*val+15.25[step/s]) 165L6470_setparam_minspeed4(0x02); //[R, WS]最小速度default 0x000 (1+12bit) (0.238*val[step/s]) 166L6470_setparam_fsspd4(0x027); //[R, WR]μステップからフルステップへの切替点速度default 0x027 (10bit) (15.25*val+7.63[step/s]) 167L6470_setparam_kvalhold4(0x50); //[R, WR]停止時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 168L6470_setparam_kvalrun4(0xFF); //[R, WR]定速回転時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 169L6470_setparam_kvalacc4(0xFF); //[R, WR]加速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 170L6470_setparam_kvaldec4(0xFF); //[R, WR]減速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256) 171L6470_setparam_stepmood4(0x01); //ステップモードdefault 0x07 (1+3+1+3bit) 172} 173 174 175void fulash(){ 176//long a=L6470_getparam_abspos(); 177//long b=L6470_getparam_speed(); 178//long c=L6470_getparam_abspos2(); 179//long d=L6470_getparam_speed2(); 180//long e=L6470_getparam_abspos3(); 181//long f=L6470_getparam_speed3(); 182//long g=L6470_getparam_abspos4(); 183//long h=L6470_getparam_speed4(); 184//char str[15]; 185//snprintf(str,sizeof(str),"1pos=0x%6.6X ",a); 186//Serial.print(str); 187//snprintf(str,sizeof(str),"1spd=0x%5.5X ",b); 188//Serial.print(str); 189//snprintf(str,sizeof(str),"2pos=0x%6.6X ",c); 190//Serial.print(str); 191//snprintf(str,sizeof(str),"2spd=0x%5.5X ",d); 192//Serial.println(str); 193//snprintf(str,sizeof(str),"3pos=0x%6.6X ",e); 194//Serial.print(str); 195//snprintf(str,sizeof(str),"3spd=0x%5.5X ",f); 196//Serial.println(str); 197//snprintf(str,sizeof(str),"3pos=0x%6.6X ",g); 198//Serial.print(str); 199//snprintf(str,sizeof(str),"3spd=0x%5.5X ",h); 200//Serial.println(str); 201 /* Serial.print("0x"); 202 Serial.print( L6470_getparam_abspos(),HEX); 203 Serial.print(" 0x"); 204 Serial.print( L6470_getparam_speed(),HEX); 205 Serial.print(" 0x"); 206 Serial.print( L6470_getparam_abspos2(),HEX); 207 Serial.print(" 0x"); 208 Serial.println( L6470_getparam_speed2(),HEX); 209 */ 210} 211
試したこと
L6470_setparam_kval**の設定値が重要とのことで以下のトライをしてみました。
・0xFF:1つは回る、他の3つは回らない。
・0x80:4つ回る、しかしすぐに3つのモータが止まる
・0x10:4つ回るが、その後1つのモータが止まった後、急加速をしてまた止まって意図しない回り方をする
・0x01:4つとも回らない
電源環境を同じにして、ドライバのモータ配線だけをそれまで使っていたモータ(SM-42BYG011-25)に戻すと、正常に動作します。
これまでに使っていたモータと不具合がでているモータの差分は定格電圧がそれぞれ12Vと5Vの差があるが、計測してみると印加電流は0.2A程度であり、定格電流は守れているはずです。
またオシロにてモータに印加するパルスを見ていますが、モータが回らないときパルスが入ってきていないようです。
補足情報(FW/ツールのバージョンなど)
ドライバへの印加電圧は14Vです。
電池を使って駆動しています
回答1件
あなたの回答
tips
プレビュー