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

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

ただいまの
回答率

87.48%

2台のステッピングモーターの制御について

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,077

score 10

前提・実現したいこと

初めて質問します。
電子工作も初心者です。よろしくお願いします。

現在、1つのarduino unoで2台のステッピングモーターを制御しています。
その中で、1台目のステッピングモーターが稼働している状況で2台目のステッピングモーターが回りだして動きが次第に2つ目のモーターにシフトしていくような動きにグラデーションがあるような動作をさせたいです。

また、ステッピングモーターの加速減速を滑らかにしたいと思っています。

発生している問題・エラーメッセージ

そもそものやり方が分からないため、エラーメッセージ等はありません。
今までタイマー割り込みなどが有効ではないかと思いMs.Timerを試しましたが上手くいかず、そもそもタイマー割り込みが正解なのかも分からないです。

該当のソースコード

/*デイジーチェン接続 
Arduino11番ピン(MOSI)- 6番ピン(SDI) L6470(一台目) 3番ピン(SDO) - (SDI)L6470(二台目)(SDO) - 12番ピン(MISO) Arduino
SCK 共通
SS - CS共通
*/
#include <SPI.h>
#include <MsTimer2.h>
#include <stdio.h>

// ピン定義。
#define PIN_SPI_MOSI 11
#define PIN_SPI_MISO 12
#define PIN_SPI_SCK 13
#define PIN_SPI_SS 10
#define PIN_BUSY 9
#define PIN_BUSY2 8






void setup()
{
 delay(1000);

  pinMode(PIN_SPI_MOSI, OUTPUT);
  pinMode(PIN_SPI_MISO, INPUT);
  pinMode(PIN_SPI_SCK, OUTPUT);
  pinMode(PIN_SPI_SS, OUTPUT);
  pinMode(PIN_BUSY, INPUT_PULLUP);
  pinMode(PIN_BUSY2, INPUT_PULLUP);
  SPI.begin();
  SPI.setDataMode(SPI_MODE3);
  SPI.setBitOrder(MSBFIRST);
  Serial.begin(38400);
  digitalWrite(PIN_SPI_SS, HIGH);

     L6470_resetdevice(); //1台目のL6470リセット
     L6470_resetdevice2(); //2台目のL6470リセット
     L6470_setup();  //1台目のL6470を設定 
     L6470_setup2();  //2台目のL6470を設定 
     L6470_getstatus(); //1台目のフラグ解放
     L6470_getstatus2();//2台目のフラグ解放

 MsTimer2::set(25, fulash);//シリアルモニター用のタイマー割り込み
 MsTimer2::start();





delay(2000);

//1台目正転
L6470_move(1,800);//1台目を正転方向に800ステップ (現在1/4マイクロステップ設定なので、フルステップの200ステップ分になる)
L6470_busydelay(1000);//1台目の動作終了から1秒待つ

//2台目正転
L6470_move2(1,800);//2台目を正転方向に800ステップ ()
L6470_busydelay2(1000);//2台目の動作終了から1秒待つ

//同時正転
for(int i=0;i<3;i++){
L6470_move(1,800);
L6470_move2(1,800);
L6470_busydelay(300);
}
delay(2000);

//同時逆転
for(int i=0;i<3;i++){
L6470_move(0,800);
L6470_move2(0,800);
L6470_busydelay(300);
}
delay(3000);

//同時 順次 正逆転
L6470_move(1,800);
L6470_move2(1,800);
L6470_move(0,800);
L6470_move2(0,800);
L6470_move(1,800);
L6470_move2(1,800);
delay(3000);

//交互に順次動作
for(int i=0;i<4;i++){
L6470_move(0,200);
L6470_busydelay(0);
L6470_move2(0,200);
L6470_busydelay2(0);
}
delay(3000);

//1テンポ遅れて順次動作
L6470_move(0,200);
L6470_busydelay(0);
for(int i=0;i<3;i++){
L6470_move2(0,200);
L6470_move(0,200);
}
L6470_move2(0,200);
L6470_busydelay2(0);
delay(3000);

//連続回転
L6470_run(1,0x1234);//69step/sの速度で正転
delay(5000);
L6470_run2(1,0x5678);//332step/sの速度で正転
delay(6000);


//回転停止
 L6470_softstop();//1台目回転停止
 L6470_softstop2();//2台目回転停止
delay(5000);

//指定座標に移動
 L6470_goto(0x4321);//座標0x004321に最短でいける回転方向で移動[B]
 L6470_goto2(0x8765);//座標0x008765に最短でいける回転方向で移動[B]
 L6470_busydelay(0)//      ↓
, L6470_busydelay2(3000);//2台とも動作が完了してから3秒待つ

 //原点座標に移動
 L6470_gohome();//座標原点0x000000に移動[B]
 L6470_gohome2();

 //原点につき次第 消磁
 L6470_hardhiz();
 L6470_hardhiz2();
}








void loop(){
}

void L6470_setup(){
L6470_setparam_acc(0x30); //[R, WS] 加速度default 0x08A (12bit) (14.55*val+14.55[step/s^2])
L6470_setparam_dec(0x30); //[R, WS] 減速度default 0x08A (12bit) (14.55*val+14.55[step/s^2])
L6470_setparam_maxspeed(0x2a); //[R, WR]最大速度default 0x041 (10bit) (15.25*val+15.25[step/s])
L6470_setparam_minspeed(0x1200); //[R, WS]最小速度default 0x000 (1+12bit) (0.238*val[step/s])
L6470_setparam_fsspd(0x027); //[R, WR]μステップからフルステップへの切替点速度default 0x027 (10bit) (15.25*val+7.63[step/s])
L6470_setparam_kvalhold(0x28); //[R, WR]停止時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvalrun(0x28); //[R, WR]定速回転時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvalacc(0x28); //[R, WR]加速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvaldec(0x28); //[R, WR]減速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)

L6470_setparam_stepmood(0x02); //ステップモードdefault 0x07 (1+3+1+3bit)
}

void L6470_setup2(){
L6470_setparam_acc2(0x30); //[R, WS] 加速度default 0x08A (12bit) (14.55*val+14.55[step/s^2])
L6470_setparam_dec2(0x30); //[R, WS] 減速度default 0x08A (12bit) (14.55*val+14.55[step/s^2])
L6470_setparam_maxspeed2(0x2a); //[R, WR]最大速度default 0x041 (10bit) (15.25*val+15.25[step/s])
L6470_setparam_minspeed2(0x1200); //[R, WS]最小速度default 0x000 (1+12bit) (0.238*val[step/s])
L6470_setparam_fsspd2(0x027); //[R, WR]μステップからフルステップへの切替点速度default 0x027 (10bit) (15.25*val+7.63[step/s])
L6470_setparam_kvalhold2(0x28); //[R, WR]停止時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvalrun2(0x28); //[R, WR]定速回転時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvalacc2(0x28); //[R, WR]加速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)
L6470_setparam_kvaldec2(0x28); //[R, WR]減速時励磁電圧default 0x29 (8bit) (Vs[V]*val/256)

L6470_setparam_stepmood2(0x02); //ステップモードdefault 0x07 (1+3+1+3bit)
}


void fulash(){


long a=L6470_getparam_abspos();
long b=L6470_getparam_speed();
long c=L6470_getparam_abspos2();
long d=L6470_getparam_speed2();
char str[15];
snprintf(str,sizeof(str),"1pos=0x%6.6X ",a);
Serial.print(str);
snprintf(str,sizeof(str),"1spd=0x%5.5X ",b);
Serial.print(str);
snprintf(str,sizeof(str),"2pos=0x%6.6X ",c);
Serial.print(str);
snprintf(str,sizeof(str),"2spd=0x%5.5X ",d);
Serial.println(str);

 /* Serial.print("0x");
  Serial.print( L6470_getparam_abspos(),HEX);
  Serial.print(" 0x");
  Serial.print( L6470_getparam_speed(),HEX);
  Serial.print(" 0x");
  Serial.print( L6470_getparam_abspos2(),HEX);
  Serial.print(" 0x");
  Serial.println( L6470_getparam_speed2(),HEX);
  */
}


http://spinelify.blog.fc2.com/blog-entry-81.html
現在、こちらのサイトをのスケッチを使わせていただき、数値を変えたりしながら使っています。

試したこと

タイマー割り込み

補足情報(FW/ツールのバージョンなど)

arduino1.8.6を使用しています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2018/12/07 19:33 編集

    具体的な動作がわからないため答えようがありません。もっと具体的に詳しく説明してください。動きがシフトしていく?グラデーション?

    キャンセル

  • coco_bauer

    2018/12/08 16:57

    モーターの回転にシフトとかグラディエーションとかいう用語を使うのを見たことがありません。 どういう意味で使っているのでしょうか?」

    キャンセル

回答 1

0

質問を私なりに解釈しての回答です。
恐らく2つのステッピングモーターで初めは1台目がある回転数で回転していて2台目は停止している。
時間が経つにつれ1台目が徐々に減速して2台目が徐々に加速。これを繰り返す。

まずしなければならない事はソースからステッピングモータードライバーがL6470なので、これを2つデージーチェーンで結線。L6470の他のピンも適切に結線。
デージーチェーンでSPI通信の場合、それぞれのモーターに与えるコマンドは出来れば1回で出力。
詳しくはデータシートを読んで理解。

それより前にすべきは1台だけ結線してモーターが適切に動くようにパラメーターの設定が必要です。これを参考にして2台接続に変更するのが分かりやすいと思います。
また滑らかに回すには1/8ステップとか1回転のステップ数を増やすと”カクカク”と動くのが滑らかになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る