2020年7月9日木曜日

Arduino IDE + DRV8835 + ステッピングモーター



Seeed Xiaoと秋月のDRV8835基板を使って、さくっと動かします。

モーターはオリジナルマインドから中古で買ったオリエントモーターの42mmサイズバイポーラー。定格17V。

XIAOとDRV8835の結線は以下の通り。

XIAODRV8835その他の接続相手
GNDGND外部電源のGND, Volumeのmin側
5V出力Vcc, MODE
3.3V出力Volumeのmax側
3AIN1
4AIN2
5BIN1
6BIN2
7Volumeの中間
AOUT1モーターの黒
AOUT2モーターの緑
BOUT1モーターの青
BOUT2モーターの赤
VM外部電源の+側(5-17V)


DRV8835をステッピングモーター用に使う場合には、MODEをHIGHにします。こうすると、AIN2, BIN2 = HIGHのときだけ出力が有効になり、LOWにすると出力の電流がカットされます。AIN1に1個パルス(LOW->HIGH->LOW)を入れると正転、BIN1だと逆転します(モーターの配線や仕様によって変わりますので注意)。

今回、両手が塞がる用途でモーターを使うので、ミシン用のフットペダルを用意しました。3.5mmφのモノラル用ミニプラグ出力で踏まないと0Ω、踏むと約10kΩになります。GND - ペダルの片方 - XIAOの7ピン - 10kΩの抵抗 - 3.3V出力、という風につなぎました。こうするとXIAOへの電圧は0-約1.65Vの間で変化します。これをアナログポートで読み取ります。

ところで、リファレンスやググると出てくるサンプルコードを見るとスピード指定関数setSpeedの引数が rpm になっているけど、試したところではpps(1秒あたりのパルス数)みたいです。本家ArduinoでStepperクラスを使ったことないけど(あるいは忘れている)、少なくともXIAOでは。

ということで、ソースコードはこんな感じ。


#include <Stepper.h>

Stepper myStepper(200, 3, 5);

bool running = false;

void setup() {
  Serial.begin(115200);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop() {
  int value = analogRead(7) / 2 - 5;
  if (value < 0) {
    if (running) {
      digitalWrite(4, LOW);
      digitalWrite(6, LOW);
      running = false;    
    }
    delay(50);
  } else {
    if (!running) {
      digitalWrite(4, HIGH);
      digitalWrite(6, HIGH);
      running = true;    
    }

    Serial.println(value);
    
    myStepper.setSpeed(value) ;
    myStepper.step(value / 10);
  }
}


0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。