← 記事一覧

TAKUMUS / BLOG

ステッピングモーター制御ライブラリを作りたい(その5)「脱調防止できるのか実験!」

その1はこちらです。

前回のDVDのステッピングモーターで脱調防止実験を行います。実験は現在開発中のライブラリを用いて行いますが、すいません!前回、ライブラリの説明も次回行うと言いましたが、ボリュームがたっぷりになってしまうので、ライブラリの説明自体は今回は省略させてもらいます。が一応貼っておきます。
https://github.com/takumus/Suteppagithub.com

回路

前回同様です。

ソース

実験用ソースは一応貼りますが、ライブラリの解説がないと分かりにくいので、今回はソースの説明はしません。次回ライブラリの解説をするときにこのソースの解説も行う予定です。長いので最後に貼ります。

いざ実験

まず、このお手本をご覧ください。

2000マイクロ秒 通常モード(お手本)

YouTube


 このお手本は、ライブラリによる脱調防止機能をオフにして撮影しています。ステップとステップの時間は2000マイクロ秒です。この時点では脱調防止機能オフでも正確な位置決めが出来ています。これと同じ動きを少し早くしてやってもらいます。

1300マイクロ秒 通常モード

YouTube


 こちらは1300マイクロ秒にしたバージョンですが、途中で脱調していることが分かると思います。お手本と同じ動きをしているつもりなのですが、脱調しているためぐちゃぐちゃになっています。

ここからが本番です

通常モードでは1300マイクロ秒で脱調してしまいました。ここからは脱調を防止したライブラリを使用したスムーズモードでの実験となります。

1300マイクロ秒 スムーズモード

YouTube


 どうでしょうか。通常モードでは脱調してしまった1300マイクロ秒を難なく突破です。スムーズモードは動画ではわかりにくいですが加減速をしています。最高速度はしっかりと1300マイクロ秒に達しています。

スムーズモードについての詳しい説明は、その2で行っています。S字加速を使用した方式ですので是非ご覧ください。

950マイクロ秒 スムーズモード

YouTube


どこまでいけるかと思い下げていくと、950が限界のようです。ですが、スムーズモードだとここまで高速に動けることが分かります。

おまけ

スムーズモードが動画だと分かりにくいので、加減速をより強調した設定にして動かしてみました。この動画だと加減速がはっきりわかると思います。

YouTube


次回

ライブラリの説明とソースコードの説明を行います。

ソース

stepper_test01.c
#include <Arduino.h>
#include "Suteppa.h"
const int IN1 = 9;
const int IN2 = 10;
const int IN3 = 11;
const int IN4 = 12;
const int MAX = 495;
int d_hs[8] = {
	B1000, 
	B1100,
	B0100,
	B0110,
	B0010,
	B0011,
	B0001,
	B1001
};
Suteppa s;

void step(int d);
int findBegin(int step);
void setup()
{
	pinMode(IN1, OUTPUT);
	pinMode(IN2, OUTPUT);
	pinMode(IN3, OUTPUT);
	pinMode(IN4, OUTPUT);
	pinMode(2, INPUT_PULLUP);
	//一回転のステップ数, 加減速に使うステップ数, 開始速度, 最大速度, ステップ用関数
	s.init(MAX, 50, 2000, 1000, step);
}
void loop()
{
	//----------------------------------------------//
	//キャリブレーション
	//----------------------------------------------//
	//スムーズオフ
	s.setSmooth(false);
	//速度を2000マイクロ秒に
	s.setMax(2000);
	//先頭まで戻る
	s.rotate(Suteppa::RELATIVE, -9999, findBegin);
	//先頭を見つけたら、もう一度繰り返す
	delay(100);
	s.rotate(Suteppa::RELATIVE, 20);
	delay(100);
	s.rotate(Suteppa::RELATIVE, -20, findBegin);
	delay(1000);

	//----------------------------------------------//
	//耐久テストセットアップ
	//----------------------------------------------//

	//スムーズ
	s.setSmooth(true);
	//開始速度
	s.setBegin(2000);
	//最大速度
	s.setMax(1500);
	//アクションごとの待ち時間
	int wait = 0;

	//----------------------------------------------//
	//耐久テスト開始
	//----------------------------------------------//
	while(true){
		s.rotate(Suteppa::ABSOLUTE, MAX/2 + 100);
		s.rotate(Suteppa::RELATIVE, -200);
		s.rotate(Suteppa::RELATIVE, 200);
		s.rotate(Suteppa::RELATIVE, -200);
		s.rotate(Suteppa::RELATIVE, 200);
		delay(1000);
		s.rotate(Suteppa::RELATIVE, -200);
		delay(1000);
		s.rotate(Suteppa::ABSOLUTE, MAX);
		s.rotate(Suteppa::RELATIVE, -MAX);
		s.rotate(Suteppa::ABSOLUTE, MAX);
		s.rotate(Suteppa::RELATIVE, -MAX);
	}
}
//先頭を見つける関数。
int findBegin(int step)
{
	if(digitalRead(2) == 0){
		s.setHome();
		return 1;
	}
	return 0;
}
//ステッピングモーターを回す関数
void step(int d)
{
	static int i;
	i += d;
	if(i > 7) i = 0;
	if(i < 0) i = 7;
	byte b = d_hs[i];
	digitalWrite(IN1, bitRead(b, 0));
	digitalWrite(IN2, bitRead(b, 1));
	digitalWrite(IN3, bitRead(b, 2));
	digitalWrite(IN4, bitRead(b, 3));
}
gist.github.com

その6(最後)はこちらです。

No comments yet