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

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

ただいまの
回答率

87.78%

esp32とL6470を使ってステッピングモーターを動かしたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 675

score 21

ESP32とL6470のステッピングモータードライバを使ってステッピングモーターを動かしたいのですが、現状ピクリとも動きません。

詳しい方がいらっしゃいましたら、ご教授ください。

使用ハード:
・ESP32-wroom-32d
・L6470(秋月電子で販売しているドライブキットです。 https://akizukidenshi.com/catalog/g/gK-07024/)
・DC電源 24V 2.7A
・ステッピングモーター 3V 1.3A 1.8° 

各サイトを参考にしてプログラムを書いてみましたが、全く動く気配がありません。
作成したソースを載せます。

#include <Arduino.h>
#include <SPI.h>

#define PIN_SPI_STATUS 32//busy,sync pin
#define PIN_SPI_MOSI 23
#define PIN_SPI_MISO 19
#define PIN_SPI_SCK 18
#define PIN_SPI_SS 5

void Stepper_L6470_Send(unsigned char val) {
  while ( !digitalRead(PIN_SPI_STATUS) ) {
  }//busy status check
  digitalWrite(PIN_SPI_SS, LOW);
  SPI.transfer(val);
  digitalWrite(PIN_SPI_SS, HIGH);
}

void Stepper_L6470_Send_u(unsigned char val) {
  digitalWrite(PIN_SPI_SS, LOW);
  SPI.transfer(val);
  digitalWrite(PIN_SPI_SS, HIGH);
}

void Stepper_L6470_transfer(int add,int bytes,long val){
  int data[3];
  Stepper_L6470_Send(add);
  for(int i=0;i<=bytes-1;i++){
    data[i] = val & 0xff;  
    val = val >> 8;
  }
  if(bytes==3){
    Stepper_L6470_Send(data[2]);
  }
  if(bytes>=2){
    Stepper_L6470_Send(data[1]);
  }
  if(bytes>=1){
    Stepper_L6470_Send(data[0]);
  }  
}

void Stepper_L6470_Reset() {
  Stepper_L6470_Send_u(0x00);
  Stepper_L6470_Send_u(0x00);
  Stepper_L6470_Send_u(0x00);
  Stepper_L6470_Send_u(0x00);
  Stepper_L6470_Send_u(0xc0);
}

void Stepper_L6470_setup() {
  Stepper_L6470_Send(0x09);
  Stepper_L6470_Send(0x1F);
  Stepper_L6470_Send(0x0A);
  Stepper_L6470_Send(0x1F);
  Stepper_L6470_Send(0x0B);
  Stepper_L6470_Send(0x1F);
  Stepper_L6470_Send(0x0C);
  Stepper_L6470_Send(0x1F);
}

void Stepper_L6470_Move(int dir, long n_step) {
  Stepper_L6470_transfer(dir, 3, n_step);
}

void setup() {
  delay(2000);
  Serial.begin(9600);
  pinMode(PIN_SPI_STATUS, INPUT);
  pinMode(5,OUTPUT);//PIN_SPI_SS//追記
  SPI.begin(PIN_SPI_SCK, PIN_SPI_MISO, PIN_SPI_MOSI, PIN_SPI_SS);
  SPI.setDataMode(SPI_MODE3);
  SPI.setBitOrder(MSBFIRST);
  //reset device
  delay(200);
  Stepper_L6470_Reset();//device reset

  //setup device
  delay(200);
  Stepper_L6470_setup();
}

void loop() {
  Stepper_L6470_Move(0x41, 200);
  delay(1000);

  uint8_t res;
  Stepper_L6470_Send(0xD0);
  digitalWrite(PIN_SPI_SS, LOW);
  res = SPI.transfer(0x00);
  digitalWrite(PIN_SPI_SS, HIGH);
  Serial.printf("%X", res);
  digitalWrite(PIN_SPI_SS, LOW);
  res = SPI.transfer(0x00);
  digitalWrite(PIN_SPI_SS, HIGH);
  Serial.printf("%X", res);
  digitalWrite(PIN_SPI_SS, LOW);
  res = SPI.transfer(0x00);
  digitalWrite(PIN_SPI_SS, HIGH);
  Serial.printf("%X", res);
}

試したこと

getsutasの値を取得してみましたが、0が戻って来るのみでステータス情報も取得できていません。

追記

esp32とステピンクドライバーとの接続は、
esp32---L6470端子
GPIO23---5ピン  GPIO23---7ピン
GPIO19---7ピン  GPIO19---5ピン
GPIO18---6ピン
GPIO5---8ピン
GPIO22---1ピン

L6470のロジックボード電圧は、内部レギュレータの3vを使うように、ジャンパピンの1-2をつなげています。
基盤上のLEDは光っています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

スケッチを見るかぎり、
・Stepper_L6470_ResetCMD()とは?
・Stepper_L6470_setup()とは?
・初期設定をしていない
といった問題があります。

getsutasの値を取得してみましたが

getsutasなんてありませんよ。
STATUSレジスタの値を取得してみた、或いは、GetStatusをしてみた、でしょうけど、
それが出来ないというのは一番先に来ます。
つまり、それはどんな状況でも通用するコマンドだからです。
(勿論ちゃんと配線、給電が出来ている事が前提です。)

ただし、このスケッチ中にGetStatusをしているコードが書かれていません。
なので、どこが悪いのかは判りません。
スケッチに問題はあるけど、配線にも問題があるかも。

<追記>
ちょっと繋いでみたので書いておきます。

・モータ用電源も、接続する必要がある。※ジャンパー次第なのかもしれません。
ジャンパーを2つ付けた状態では、モータ電源を繋がないと動きません。
また、モータ電源を切った途端に通信は終わります。

・コードは
SPI.begin(PIN_SPI_SCK, PIN_SPI_MISO, PIN_SPI_MOSI, PIN_SPI_SS);
の前に、
pinMode(5,OUTPUT);//PIN_SPI_SS
といれたら、getStatusは取得出来ました。

・getStatusは、ビジーウェイト関係無しに、いつでも取得出来る命令です。
なので、busyピンの状態を見ない
Stepper_L6470_Send_u(0xD0);
が適当です。
 
・getStatusの戻り値(レジスタ)は16ビットです。なので、3バイト取り込む必要はありません。
まぁ、問題は無いですけど。

※上記で通信は出来ます。ただし、初期設定はしていないのでモータは動かないでしょう。
モータを動かす「前に」、初期設定をする必要があります。
・kvalの4つ。
・ストール電流、過電流の値
これは、今回の条件では必須です。

あとは、加速度とかも、最高速/最低速とかも設定しておいた方が良いです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/02/05 02:01

    早速のご回答ありがとうございます。
    ご指摘頂いた通り、コピペ出来ていないとろろがありましたので、修正、追記致しました。
    給電ができているか、とのことですが、確認する方法はありますでしょうか?

    キャンセル

  • 2021/02/05 02:52 編集

    普通、テスターとかで確認するでしょ。全く動いていないようなら。

    ESP32ってprintf出来るんだ。知らなかった。
    1バイト多いけど、GetStatus部は出来ていそう。

    ※↑に追記しておきます。

    キャンセル

  • 2021/02/05 09:34

    データシートを見直してみたら、デフォルト値と使用条件はそれほど違っていなかった。
    24V*0.16=4.16V
    自分の中では*0.4ぐらいだと思っていた。(24V*0.4=9.6V)
    なので、そのままでも動く「可能性」はありますね。

    それでも、普通、モータを動かす前に必ず設定する箇所ですから。

    キャンセル

  • 2021/02/06 00:03

    動きました!!
    ありがとう御座います!!

    ストール電流、過電流の値と、pinMode(5,OUTPUT);//PIN_SPI_SSの設定をしたら動きました!

    ストール電流、過電流の値の計算方法がまだよく分かっていませんが、もう少し考えてみます。

    キャンセル

0

esp32とステピンクドライバーとの接続は、

#define PIN_SPI_STATUS 32//busy,sync pin
#define PIN_SPI_MOSI 23
#define PIN_SPI_MISO 19
#define PIN_SPI_SCK 18
#define PIN_SPI_SS 5


ドライバ側

PIN シンボル 機能
1 #BUSY/SYNC 動作表示/同期表示
5 SDO SPIデータOUT
6 CK SPIクロック
7 SDI SPIデータIN
8 #CS SPIチップセレクト

GPIO23---5ピン
GPIO19---7ピン
GPIO18---6ピン
GPIO5---8ピン
GPIO22---1ピン 

なによりもまず、ESP32のGNDとドライバのGNDはちゃんと繋ぎましょう。電力供給系ではないから、一つでもlowレベルがあればなんとかなったりすることもあるけれど。

MOSI(GPIO23)はMaster Out / Slave In の意なので、SDI(7Pin)に
MISO(GPIO19)はMaster In / Slave Out の意なので、SDO(5Pin)に
繋ぐべきではないでしょうか? 
(ポリティカルコレクト的に今後Slaveとか言えなくなったらどうするんだろう? MISOは理由なんかなくMISOだ、とか言うのだろうか)

GPIO22は32のTypoでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/02/06 00:00

    回答ありがとうございます。
    解決出来ました!!ありがとうございます!!
    GPIO22はおじゃるとおり、32のうちミスです。

    キャンセル

  • 2021/02/06 06:55

    > GPIO23---5ピン
    > GPIO19---7ピン
    これは合っていた、ということですか?

    キャンセル

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

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

関連した質問

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