Arduinoで複数モーターを各々に制御(正転、逆転、速度)

 

 Arduinoから複数のモータを各々にリアルタイムに制御(正転、逆転、速度制御)してみました。

 

 今回はL6470(2個)をデイジー・チェーン接続でSPI通信してステッピングモータを制御してます。

 

▼動作確認動画▼

 Processingで簡単な制御ソフトを作って、Arduino経由でモータ2個を制御してます。

 

 モータにはブラシモータ、ブラシレスモータ、ステッピングモータなど・・いろいろ種類がありますが、回転の正転、逆転、速度制御を全て自作で行うとなると、どれもハード、ソフトともに結構(私にとってはかなり)大変です。

 

 ただモータドライバICがいろいろ存在していて、モジュール品を使って回転制御を行う場合には、ハード・ソフトともに随分楽になります。

 

 ということで今回はArduino+L6470(2個)+ステッピングモータ(2個)の組合せで複数のモータを各々で制御する方法です。L6470を使用して1個のモータを制御する方法はこちらです。

 

スポンサーリンク
スポンサーリンク

複数のL6470を接続する

 

 複数モーターを別々で制御するには、モータの数分だけL6470が必要になります。Arduinoとの通信はSPI通信で行うのですが、複数のデバイスと通信する場合は、デイジー・チェーン接続という方法で行うことができるので、今回はその方法で制御してます。

 

▼結線図▼

 デイジー・チェーン接続する場合は、データI/O線を数珠つなぎになるように接続します。 

 

 Arduino(OUT)⇒(IN)L6470、1台目(OUT)⇒(IN)L6470、2台目(OUT)⇒Arduino(IN)といった感じです。

 

 3台目、4台目と増えていく場合でも同様に数珠つなぎに増やしていくだけです。結線図でみるとそれほどでもないのですが、実際にブレッドボードとワイヤーで接続したら結構なことになりました。

 ぐちゃぐちゃです

 

デイジー・チェーン接続のSPI通信の方法

 

 基本的にコマンドバイトを送信して、その後、決められた長さのデータ(設定値など)を送信して行います。

  

 CSピン「LOW」で通信開始。情報を送信してCSピンを「HIGH」にすると情報がデバイスに取り込まれます。8bit(1byte)送信するごとにCSピンのHIGH、LOWを行います。

 

 1台のモータを制御する場合は以上のように通信すればO.Kです。詳しくは以下参考。

 

 >>L6470とSPI通信

 

 でデイジーチェーン接続での複数通信する方法です。

 

スポンサーリンク

デイジーチェーン接続で複数台の通信イメージ動画

 CSピン「LOW」のまま複数byteを送信すると、先に送られたbyte情報がSDOピンを通して、次のデバイスへ順次シフトされていきます。(押し出されていくイメージです・・。)

 

 CSピンを「HIGH」にしない限り、続けて送られるデータはbyteごとに順次シフトしていきます。でCSピンを「HIGH」にしたところでデバイスに情報が取り込まれます。

 

 ですので2台の場合は2byteごとに、3台の場合は3byteごとにCSピンの「LOW」「HIGH」を行います。この方法で制御を行えば複数をほぼ同時に制御することが可能となります。

 

ソース

例えば1byte分の情報を2台のデバイスに送信する場合は

void send1_L6470(int8_t x , int8_t y) {
  digitalWrite(10, LOW);
  SPI.transfer(x);
  SPI.transfer(y);
  digitalWrite(10, HIGH);
}

 といった感じで送信すると、2台目には「x」byteの情報、1台目には「y」byteの情報がデバイスに送信され取り込まれます。

 

 2byte分の情報を2台のデバイスに送信する場合は、

void send2_L6470(int16_t x, int16_t y) {
  int8_t buf1[2];
  buf1[0] = x >> 8;
  buf1[1] = x & 0xff;
  int8_t buf2[2];
  buf2[0] = y >> 8;
  buf2[1] = y & 0xff;

  digitalWrite(10, LOW);
  SPI.transfer(buf1[0]);
  SPI.transfer(buf2[0]);
  digitalWrite(10, HIGH);

  digitalWrite(10, LOW);
  SPI.transfer(buf1[1]);
  SPI.transfer(buf2[1]);
  digitalWrite(10, HIGH);
}

 こんな感じで1byteごとに分解してから送信します。

 

 記事冒頭の動画はこの要領でモーターを制御してます。Arduinoでは、 Processing(パソコン)からのモータ速度情報をシリアル通信で受け取って、L6470へ制御信号をSPI送信する処理を行ってます。

 

 A4988ドライバと比べて見たのですが、個人的には複数のモーターを制御するのはL6470のほうが好きですね。

 

コメント