ステッピングモーターをリミットスイッチで停止する

電子工作ネタの前回の続きです。
alasixosaka.hatenablog.com
前々回はとりあえずステッピングモーターを動かし、
alasixosaka.hatenablog.com

前回は、CNCシールドにリミットスイッチを取り付けてスイッチの状態を読み取るところまでやりました。
今回は、リミットスイッチの状態を見てスイッチがONならモーターをストップすることをやってみます。
配線は、前回と前々回の足し合わせになるます。

f:id:alasixOsaka:20201213155836j:plain
CNCシールドのピン配置

CNCシールドのX軸の部分にモータードライバ―が接続されているので、その右側の4端子にモーターを接続します。端子の向きはどちらでも構わないようですが、向きによってモーターの回転方向が逆転します。
シールドのピン配置を見ると向かって上側がB2,B1となっているので2組目、下側がA2,A1となっているので1組目になるように、緑と赤を上の方に、青と黄色を下の方につながるようにつないだ。
また、リミットスイッチの3つの端子の内、2つをEND STOPSと書かれた端子のX+とX-に接続した。こちらの向きに特に意味はないようでどちら向きにつないでも同じことが起こる。
モーターを動かすために12Vの電源が必要なのでACアダプターからCNCシールドのターミナルに12Vを接続する。
これで配線は完成。
今回はもう少しテストらしくするために、モーターの軸をシャフトに接続してシャフトの回転に合わせてパーツが動くようにした。使ったのはこちら。
ja.aliexpress.com
Aliexpressで購入。
これを、同じくAliexpressで購入したアルミフレームに接続した。
ja.aliexpress.com
ステッピングモーターはこいつを使って固定した。
ja.aliexpress.com
シャフトは2種類あって、ねじが切ってある方をステッピングモーターにつなぐ。ステッピングモーターが回転すると、ねじが回転し真ん中の四角パーツが動くという仕組み。
もう1種類のシャフトにはフリーで動くパーツがあって、ねじ付きの方のパーツと連動して動かせるようになっている。何故かというと、四角いパーツは単体ではくるくる回転してしまうので、例えば物を載せて動かすといった使い方をする場合はクルクル回らないようにもう一つ別のパーツつないでおく必要がある。今回は、家にあった使っていないアクリル板に穴を開けて、ねじ止めした。ねじ付きのシャフトもフリーのシャフトもどちらも真ん中の四角いパーツにM4のネジ山が切ってあるのでM4のねじで固定することができる。下の写真のように組み立てた。下の方にアクリル板が見えるが今回は使わないので関係ない。
リミットスイッチは今回はテストということで、ステッピングモーターを固定する金具を使ってシャフトの両サイド付近に適当に固定した。写真では左側がアクリル板で隠れて見えてないが、左側にもリミットスイッチが固定されている。モーターが回転してパーツが動いていき、両端に近づいたところでリミットスイッチが入るので、これを検知してモーターを止めるようにした。

f:id:alasixOsaka:20201213161657j:plain
組み立て終えたところ

Arduinoのスケッチも前回と前々回を足し合わせたような感じのスケッチを使う。違うところは、リミットスイッチの状態を検知してスイッチがOffの間は無限ループで動き続けて、スイッチがOnになったところでループを抜け出す。そこで反転して戻るようにしたい。ただ、そのままではスイッチがOnになった状態なので、まず反転してスイッチOffのところまで動いて、また無限ループに入ってスイッチがOnになるまで動き続け、さらに反転してスイッチがOffになるまで動いて止まるようにした。

#define PIN_EN 8
#define PIN_DIR 5
#define PIN_STEP 2
#define PIN_Xlimit 9

void setup() {
  pinMode(PIN_EN, OUTPUT);
  pinMode(PIN_DIR, OUTPUT);
  pinMode(PIN_STEP, OUTPUT);

  pinMode(PIN_Xlimit, INPUT);
  
  digitalWrite(PIN_EN, LOW);
  digitalWrite(PIN_DIR, LOW);
  digitalWrite(PIN_STEP, LOW);
  
}

void loop() {
  int x;
  while(1){    //無限ループ、スイッチがOnになるとBreakで抜け出す
    digitalWrite(PIN_STEP, HIGH);
    delayMicroseconds(2000);
    digitalWrite(PIN_STEP, LOW);
    delayMicroseconds(2000);
    x = digitalRead(PIN_Xlimit);
    if(x==0) break;
  }
  digitalWrite(PIN_DIR, HIGH);    //反転
  while(x==0){   //スイッチがOffになるまでループ
    digitalWrite(PIN_STEP, HIGH);
    delayMicroseconds(2000);
    digitalWrite(PIN_STEP, LOW);
    delayMicroseconds(2000);
    x = digitalRead(PIN_Xlimit);
  }
  while(1){    //無限ループ、スイッチがOnになるとBreakで抜け出す
    digitalWrite(PIN_STEP, LOW);
    delayMicroseconds(2000);
    digitalWrite(PIN_STEP, LOW);
    delayMicroseconds(2000);
    x = digitalRead(PIN_Xlimit);
    if(x==0) break;
  }
  digitalWrite(PIN_DIR, LOW);  //反転
  while(x==0){      //スイッチがOffになるまでループ
    digitalWrite(PIN_STEP, HIGH);
    delayMicroseconds(2000);
    digitalWrite(PIN_STEP, LOW);
    delayMicroseconds(2000);
    x = digitalRead(PIN_Xlimit);
  }

  while(1){
  }
 
}

ここで問題発生。モーターが反転しない。

これで動くだろうと思ったら、モーターが反転せず同じ向きにしか進まない。配線を確かめたが特に間違っていない。仕方ないので、9番ピンの出力をテスターで確認したがちゃんとHighとLowのシグナルが出ている。配線にもプログラムにも問題がないので、ドライバーが壊れた可能性があるので、別のドライバーをZ軸のソケットに刺して、ピン番号をZ軸の合わせてDIRを7番、STEPを4番にして動かしてみたらちゃんと反転して動いた。なぜ壊れたか不明だが簡単に壊れるみたいなので今後気を付けないといけない。

どんな動作かは、下の動画を見て下さい。今回初めて動画をアップしてみました。スマホで取ったのであまり見栄えが良くないですが、どんな感じで動くかはわかると思います。これを何に使うかはまだ内緒です。
なんか3Dプリンターっぽい感じになっていますが、3Dプリンターではありません。もちろんCNCでもありません。

ステッピングモーターを動かす by Yamasho