← 記事一覧

TAKUMUS / BLOG

ArduinoでDVDドライブのステッピングモーターを回す(スイッチでキャリブレーションする)

DVDドライブのモーターの回路は↓で紹介しています。
ステッピングモーター制御ライブラリを作りたい(その4)「28BYJ-48とDVDのモーターをArduinoで回す。」blog.takumus.comステッピングモーター制御ライブラリSuteppaについては↓です。
Arduinoでステッピングモーターを制御するライブラリ「Suteppa」blog.takumus.com

DVDドライブのモーターがSuteppaを使って回せる!という事は紹介しました。そこで今回はもっと実用的なデモを行います。

私が手に入れたDVDドライブの仕様

f:id:takumus:20161016124250p:plain

キャリブレーションの前に、まず私の手元にあるDVDドライブの仕様を調べましょう。以下のようになっています。
 センサー部分が上下に動くように、軸がネジ状になっています。また、一番下に一番端に来たことを調べるためのスイッチが付いていました。
 一番下から上まで大体488ステップ(1-2相励磁で)必要なことも分かりました。ではこの仕組みをそのまま利用してセンサーを上下させてみたいと思います。

キャリブレーションする

ステッピングモーターが現在の角度を把握できない(ロータリーエンコーダーなしで)という事はご存知だと思います。そんなステッピングモーターを制御するにはまず初期角度を設定する必要があります。こういった処理をキャリブレーションと言います
 今回は、とりあえず最大まで回してスイッチに触れたらそこをhomeとする。みたいなキャリブレーションを行いたいと思います。

スイッチへの食い込み?

注意しなければならないことがあります。既にスイッチに深く食い込んでしまった状態でキャリブレーションを行うと、キャリブレーション開始と同時にその地点がhomeになります。モーターの力とスピードでスイッチを押した時と、元々押されたスイッチとで、homeにずれが生じます。

スイッチへの食い込み対策

それを解決する方法として思いついたのが、まずスイッチ方向へゆっくり近づくのは同じですが、スイッチを押したら少し逆回転させ、再びスイッチを探す。というものです。確実にスイッチをモーターの力とスピードで押す。こうすることで正確なキャリブレーションが行えます。

スイッチへの食い込み対策の利点

この方法を取る利点はもう一つあります。キャリブレーションは正確に行うため、基本低速で行うべきなのです。しかし、バーがスイッチから遠かった場合、スイッチに到達するまでとても時間がかかります。そこで今回の方法のように2度スイッチを押すことで、1度目のキャリブレーションを高速化し、スイッチを押したら2度目はその場所から少し戻り、ゆっくりキャリブレーションをするという事が出来ます。

ソース

dvd_stepper.cpp
#include <Arduino.h>
#include "Suteppa.h"

#define IN1 9
#define IN2 10
#define IN3 11
#define IN4 12
#define SW 2

Suteppa s;
void step(int d)
{
	static const int hs[8] = {0b1000,0b1100,0b0100,0b0110,0b0010,0b0011,0b0001,0b1001};
	static int i;
	i += d;
	if(i > 7) i = 0;
	if(i < 0) i = 7;
	byte b = hs[i];
	digitalWrite(IN1, bitRead(b, 0));
	digitalWrite(IN2, bitRead(b, 1));
	digitalWrite(IN3, bitRead(b, 2));
	digitalWrite(IN4, bitRead(b, 3));
}
void calibrate()
{
	s.rotate(Suteppa::RELATIVE, -999, false);
	while(digitalRead(SW) && s.tick());
	s.setHome();
}
void setup()
{
	pinMode(IN1, OUTPUT);
	pinMode(IN2, OUTPUT);
	pinMode(IN3, OUTPUT);
	pinMode(IN4, OUTPUT);
	pinMode(SW, INPUT_PULLUP);

	//初期化
	s.init(4096, step);

	//キャリブレーション用速度。最初は早く
	s.setSpeed(2000);
	//キャリブレーション
	calibrate();

	//一度スイッチから離して
	delay(100);
	s.rotate(Suteppa::RELATIVE, 20);
	delay(100);
	
	//キャリブレーション用速度。二回目は丁寧にゆっくり
	s.setSpeed(4000);
	//もう一度キャリブレーション
	calibrate();

	//スムージング有効
	s.beginSmooth(50, 2000);
	//通常速度は早めに
	s.setSpeed(1200);

	delay(100);
}
void loop()
{
	//中心から+100の位置
	s.rotate(Suteppa::ABSOLUTE, 488/2+100);
	delay(10);
	//中心から-100の位置
	s.rotate(Suteppa::ABSOLUTE, 488/2-100);
	delay(10);
	//行ったり来たりするだけ。
}
gist.github.com

動画

 右側にスイッチがあります。一度右端に行って、ちょこっと戻る動作が確認できると思います。これがキャリブレーションです。その後は、紙で作った矢印とマーカーの位置から、正確に動いていることが分かると思います。
 Arduinoをリセットしてキャリブレーションからやり直させる。というのを何度か行っています。 www.youtube.com

No comments yet