質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

3871閲覧

ステッピングモータを替えたら動作が意図通りにならなくなった

ISO130

総合スコア8

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2020/10/01 13:38

編集2020/10/02 04:35

前提・実現したいこと

ストロベリー・リナックス製のドライバ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です。
電池を使って駆動しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2020/10/01 23:40

> スケッチは北の国からさんのアップされているスケッチを少しいじって、 特に隠す理由がないのなら、スケッチ全体も示して下さい。以前のモーターで動いていたので問題ないとは思いますが、念の為。 それと、回路図も。特にドライバのロジック部電源はどのように供給していますか? > デイジーチェーン SPIでデイジーチェーンはないと思いますが...その用語は確かですか? 本来は4つのモーターをそれぞれ個別に制御している、はずですね。では、モーターを一つだけ(ドライバを切り離す/モーターを切り離す/スケッチ上ひとつしか制御しない)にしたらそれぞれどうなるでしょうか。 > モータが回らないときパルスが入ってきていないようです。 それはまぁ当たり前ですが、停止時はそれぞれの巻線に一定の電流が流れるモードに入っていると思います。そうなっていますか?
ISO130

2020/10/02 04:49

ありがとうございます。 スケッチの全体を更新しました。 回路図は用意していますが、ドライバの電源回路概要は ・電池→4又分岐→セラミックス抵抗(電流計測用)→ドライバ(+ー共に) ・PC_USB→arduinoMEGA→ブレッドボード→ジャンパワイヤ→ドライバ(+ー共に) デイジーチェーンは下記で言葉を使用していたため使いました http://spinelify.blog.fc2.com/blog-entry-81.html モーターを一つだけ(ドライバを切り離す)にして動作しましたが、動き(kval**の値を20)は正常でした。ただし、kval**の値をFFにすると動きませんでした。(これもなぜでしょうか?) なお、異常動作をしたモータでは試せていません。 焦って色々やっているうちにドライバを壊してしまったかもしれずです。 停止時(動かないとき)は2V程度電圧がかかっていました。 お手数をおかけしますが、お伺いできると幸いです。
nac_tnk

2020/10/02 06:41

いやいや、全2重のSPIではデイジーチェーンも良くありますよ。 このドライバ自体、デイジーチェーンはサポートしています。 ※WEB上に、このドライバは通常のSPI接続(複数のスレーブ)は出来ないようなコメントも散見しましたけど、それも問題無く出来ます。(私が試したのは3台ですけど、それ以上でも問題無いと思います ) スケッチの方はまだ見ていませんけど、電源じゃないですか? 以前のモータなら0.66A程度で良いですけど、今回のを4台だと3.4A*4=13.6Aですよ。 取りあえず、電源を万全にしてからテストした方が良いです。 また、 > kval**の値をFFにすると 何故そんな馬鹿な事をするのでしょうか? 新モータは5Vで1.7A(/相)です。それに14Vを加えたら4.7A(/相)近く流れます。 4台だと4.7A*8(相)になります。 ※勿論A相、B相の両者が100%になる事はないですし、4台同時に動作させるのかどうかの問題もあります。けれども電源は十分に余裕のある物を用意した方が良いです。 モータ電圧5Vなら、255*5/14=91程度が基準(定格)です。 後は停止時や減速時等は値を下げましょう。 ※過電流はデフォルトで8→3.4A程度だと思うので、現在、過電流保護が働いているのかも。 →その辺りの設定を使う前に全てちゃんと設定すべき。
nac_tnk

2020/10/03 07:39

スケッチもちょっと見てみたけど、こっちもダメダメな可能性が高い。 送受信する部分の関数が無いから判断のしようがないなぁ、なんて思ってたんだけど、もしかしたらこれって、載せていないのではなく作っていないんじゃないの?=単に元をコピーして番号付けただけじゃないの? ちゃんと送受信のプロコトルを考えて関数を組まないと駄目だよ。 例えば、それまで、a,b,cの3バイトの命令だったら1台接続なら a b c で済むけど、4台のデイジーチェーンで、2台目のみ操作したいのなら 00a0 00b0 00c0 とする必要があります。 ちゃんとステッパーの数分のバイト数を送信して、CS操作。 で、その時のシフトレジスタ値をそれぞれのドライバが読む訳だから。
ISO130

2020/10/04 14:46

L6470_****** の関数群ですが、L6470_commands* でL6470_getstatus*、L6470_send*、L6470_getparam*内の記述を変更しています。 例えばL6470_send*であれば以下のように各L6470_commands*内で記述しています void L6470_send(unsigned char add_or_val){//1台目に送信 digitalWrite(PIN_SPI_SS, LOW); // ~SSイネーブル。 SPI.transfer(0); // アドレスもしくはデータ送信。 SPI.transfer(0); // アドレスもしくはデータ送信。 SPI.transfer(0); // アドレスもしくはデータ送信。 SPI.transfer(add_or_val); // アドレスもしくはデータ送信。 digitalWrite(PIN_SPI_SS, HIGH); // ~SSディスエーブル。 } void L6470_send2(unsigned char add_or_val){//2台目に送信 digitalWrite(PIN_SPI_SS, LOW); // ~SSイネーブル。 SPI.transfer(0); // 0送信。 SPI.transfer(0); // 0送信。 SPI.transfer(add_or_val); // アドレスもしくはデータ送信。 SPI.transfer(0); // 0送信。 digitalWrite(PIN_SPI_SS, HIGH); // ~SSディスエーブル。 } void L6470_send3(unsigned char add_or_val){//3台目に送信 digitalWrite(PIN_SPI_SS, LOW); // ~SSイネーブル。 SPI.transfer(0); // 0送信。 SPI.transfer(add_or_val); // アドレスもしくはデータ送信。 SPI.transfer(0); // 0送信。 SPI.transfer(0); // アドレスもしくはデータ送信。 digitalWrite(PIN_SPI_SS, HIGH); // ~SSディスエーブル。 } void L6470_send4(unsigned char add_or_val){//4台目に送信 digitalWrite(PIN_SPI_SS, LOW); // ~SSイネーブル。 SPI.transfer(add_or_val); // アドレスもしくはデータ送信。 SPI.transfer(0); // 0送信。 SPI.transfer(0); // アドレスもしくはデータ送信。 SPI.transfer(0); // アドレスもしくはデータ送信。 digitalWrite(PIN_SPI_SS, HIGH); // ~SSディスエーブル。 }
ISO130

2020/10/04 15:11 編集

電源のご指摘の件、ありがとうございます。 L6470のデータシートも改めて見ましたが、ご指摘のとおり、過電流保護が入っているようです。 そのためFFだとご指摘の電流量が入ってしまったと思われます。 FFにした背景なのですが、以前のモータで空転定常回転時に電流計測をモータと電池の間に噛ませたセラミックス抵抗の両端電圧を測ることで計測してみたところ(電池で14V印加)、定格0.66A(0.33A×2相)流れていると思ったら0.05Aしか流れていなかったため、もっとトルクがほしいこともあり電圧を上げた(以前のモータの定格は12Vでしたが、その時は24Vの電池を使った)経緯がありました。ということで、今回も同じように電圧を上げてみた次第です。(聞きかじりの情報で、定格電流を守れば定格電圧より上げて駆動することでトルクが上げることができると読んだのもあり。) しかしながら今回のモータのデータシートより、モータのresistanceは2Ωとのことなので、14V印加で7A流れるという計算になりますから、確かにNGですね。  といっても、上記の通り以前のモータでは電流量が大変小さかったのもあり、どのようにして電流量を上げてトルクを出せるようにするか知りたく。。。 恥を忍んでお伺いしますが、トルクを高くする適切な電圧の与え方をお伺いできると大変勉強になります。
nac_tnk

2020/10/04 18:56

基本的に、そんな感じにnop命令(0)を入れていく手法で良いと思います。 ただ、それだと台数が増える分、無駄な時間を要します。 なので、busyピン無し(コマンドでの状態取得)のSPI接続の方をお勧めします。 使用ピン数は-1になります。 ※北の国からさんも、「タイマー割り込みでの」操作ではbusyピン操作でしか出来なかった旨が書かれています。 (私自身その原因までは探っていませんけど)普通にloop関数での操作ならbusyピンは無くて大丈夫でしょう。 多くのL6470ライブラリはBUSYピンは仕様していません。 電流を上げればトルクは上がるでしょう。けれども効果は、期待したほどでは無いかもしれません。 定格(+α)で回してトルクが足りなければ、モータを変える事が最善だと思います。 ただ、今回のモータ変更でトルクが下がるという事は無いでしょうから、トルクが下がったと感じるのなら設定の問題のような気がします。 具体的な適した設定は、その組み合わせで試したことが無いので判りません。 ※そのモータは、秋月のページでは5V定格になっていますけど、本来は3.4V定格だと思われます。(データシートの方) なので、5V設定時には更に電流が流れるかもしれませんから注意した方が良いです。 ※どんなに電圧を上げても高速で回せばトルクは無くなります。
ISO130

2020/10/06 14:04

ありがとうございました。 モータのことをもっと勉強したいと思います。 BUSYピンのことも教えていただきありがとうございました。
guest

回答1

0

ベストアンサー

まずは、モータの電流が増えたため、電源が電圧降下を起こしてCPUが暴走している、あるいはリセットされた、ということはないでしょうか。
どういう電源構成なのかわかりませんが、CPUへの供給電源を完全に別にするなりやってみればどうでしょうか

投稿2020/10/01 16:12

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ISO130

2020/10/01 16:21

Arduinoへの電源供給はPCから入れています。 モータへの電源供給は電池から4つに分岐してドライバに入れています。 ということで電源はマイコンとモータで別にしているつもりです。
y_waiwai

2020/10/01 16:25

電源の配線が伸びていたり、モータへの線と近接してませんか。 モータというのは強力なノイズ源となります 電源ラインにノイズ乗って暴走というのも考えられます 電源を別、というのは、供給線を別、ということも含まれます
ISO130

2020/10/02 04:51

配線を遠ざけるなどノイズ対応をしてみたいと思います。 なお、ドライバの電源回路概要は ・電池→4又分岐→セラミックス抵抗(電流計測用)→ドライバ→モータ(+ー共に) ・PC_USB→arduinoMEGA→ブレッドボード→ジャンパワイヤ→ドライバ電源(+ー共に) でございます。 お手数をおかけしますが、お伺いできると幸いです。
y_waiwai

2020/10/02 05:07

これは言葉だけではどうしようもないですね 電源のプラスからたどっていって電流がどう流れて電源のマイナスに至るのかを考えていき、モータ電源とCPU電源の接点を極力減らすように考慮する必要があります モータは、起動時には定格の数十倍の電流が瞬間的に流れますんで、この電流経路の一部でも、CPUの電源経路とかぶってたりすると、いとも簡単に暴走します CPUがモータドライバを駆動してる関係上、双方分離は無理なので、ドライバのグランド一点だけを双方の電源の接点とします #いわゆる一点アースですな モータが大型化すると、この一点アースでもダメってことになります。 この場合はフォトカプラで分離しなければならないってことになりますね
ISO130

2020/10/04 15:10

勉強になります。ありがとうございます。 今回の問題は電圧設定とノイズの問題が起きていると皆様のご回答から推測しています。 電圧の設定は適切なものにするとして、ノイズの方はご指摘のグランドのとり方をもう少し勉強してみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問