マイコン工作 2
2.Arduino nanoでC9用リモートフォーカサ
惑星の観測ではC9.25を多用しています。眼視の時はまだ手動でも何とかなりますが、高倍率の場合や拡大撮影の時には
手動ではブレが大きいので、これを作りました。
中身はArduino nanoの格安中華製互換品(300円位)でDRV8825というこれも中華製互換品(250円位)のモータドライバを制御して、
SPG20-1332というギヤ付のステッピングモータを回します。このモータは、電源が入っていなければ手でも回す事ができます。
ステッピングモータのSPG20-1332は、以前秋月電子で購入したものですが、同じようなスペックのモータ(SPG27-1101)が350円で売っています。
箱に付いているダイアルはボリュームを回すもので、このボリュームを左右に回せばボリュームの回転量によって、モータも右・左に回しています。
ボリュームの回転を止めれば、ステッピングモータも止まりますので、フォーカスノブを回す感覚で操作出来るようにしています。
使い方はシンプルで、ボリュームを中央にセットし、C9のフォーカスノブでおおよそのピントまでは手動で合わせます。
後は、フォーカスノブの変わりにボリュームのダイヤルを回せば、ステッピングモータでフォーカスノブを回転させます。
念のため、ボリュームの右端と左端ではモータが回転し続けるようにしているので、ピントが大きくずれていても対応出来るようにしています。
フォーカスノブが硬質ゴムなので、その後ろに穴を開け、そこにネジとナットで芯を出してステッピングモータを取り付けました。
モータの固定は、フォーカスノブを止めている金具のネジ穴を流用して長いネジで取り付けています。
モータとコントローラは100円ショップのLANケーブルを電線代わりに使用し、電源はモバイルバッテリを使用しています。
プログラムはこんな感じです
#include "I2CLiquidCrystal.h"
const int LED_PIN = 13;
int EN = 3;
int CW = 10; //DIR
int CL = 9; //STEP
int M0 = 8;
int M1 = 7;
int M2 = 6;
int vr_pin = 0;
int vr = 0;
int vr_old = 0;
int pos = 0; // -180°~180° 現在位置 15stepで+1°
int mstp = 0; // -180°~180° 現在位置 15stepで+1°
int value = 0;
int wt = 0;
I2CLiquidCrystal lcd(20, (bool)true);
// SPG20-1332
// 1回転ステップ数 480
// 基本ステップ角度 0.75 °
// 1/2 microstepで960step/回転
// 1/4 microstepで1820step/回転
// 1/16microstepで15step/°
void setup()
{
Serial.begin(9600); // set up Serial library at 9600 bps
lcd.begin(16, 2);
pinMode(EN, OUTPUT);
pinMode(CW, OUTPUT);
pinMode(CL, OUTPUT);
pinMode(M0, OUTPUT);
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(vr_pin, INPUT_PULLUP);
pinMode( LED_PIN, OUTPUT );
vr = analogRead(vr_pin); //-512~512
vr_old = vr;
// vr -180~180の場合は、その角度で停止
// 180の場合、15step*180の位置
// vrが180以上か-180以下の場合は、vrの値で回転し続ける
//MODE2 MODE1 MODE0 STEP MODE
//0 0 0 Full step (2-phase excitation) with 71% current
//0 0 1 1/2 step (1-2 phase excitation)
//0 1 0 1/4 step (W1-2 phase excitation)
//0 1 1 8 microsteps/step
//1 0 0 16 microsteps/step
//1 0 1 32 microsteps/step
//1 1 0 32 microsteps/step
//1 1 1 32 microsteps/step
digitalWrite( EN, HIGH ); // “L” でイネーブル、“H” で全出力OFF
digitalWrite( M0, LOW ); // 1/16 microstep
digitalWrite( M1, LOW );
digitalWrite( M2, HIGH );
}
void loop()
{
vr = 0;
for (value = 0 ; value <= 5; value += 1)
{
vr = vr + analogRead(vr_pin);
delayMicroseconds(500);
}
vr = (vr / 6) - 511;
if (abs(vr - vr_old) > 2 || abs(vr)>505)
{
Serial.println(vr);
move();
vr_old = vr;
delayMicroseconds(1000);
}
if (abs(vr) < 10)
{
digitalWrite( LED_PIN, HIGH );
} else {
digitalWrite( LED_PIN, LOW );
}
}
void move()
{
if (pos > 0)
{
if (vr > 0) {
mstp = vr - pos;
} else {
mstp = vr + (0 - pos);
}
} else {
if (vr > 0) {
mstp = vr - pos;
} else {
mstp = vr + (0 - pos);
}
}
pos = pos + mstp;
Serial.print("mstp=");
Serial.println(mstp);
Serial.print("pos=");
Serial.println(pos);
if (mstp > 0 || (mstp == 0 && vr > 0))
{
digitalWrite( CW, HIGH ); // 正転/逆転切り替え端子Lで正転、Hで逆転
} else {
digitalWrite( CW, LOW ); // 正転/逆転切り替え端子Lで正転、Hで逆転
}
if (abs(pos) >= 1 && abs(pos) <= 100)
{
wt = 2;
}
if (abs(pos) >= 101 && abs(pos) <= 200)
{
wt = 4;
}
if (abs(pos) >= 201 && abs(pos) <= 505)
{
wt = 8;
}
if (abs(pos) > 505)
{
mstp = 4;
wt = 4;
}
if (abs(mstp) < 50)
{
Serial.print("move=");
Serial.println(mstp * wt);
digitalWrite( EN, LOW ); // “L” でイネーブル、“H” で全出力OFF
delayMicroseconds(500);
for (value = 0 ; value < abs(mstp * wt); value += 1)
{
digitalWrite( CL, HIGH ); //
delayMicroseconds(1000);
digitalWrite( CL, LOW ); //
delayMicroseconds(1000);
}
digitalWrite( EN, HIGH ); // “L” でイネーブル、“H” で全出力OFF
delayMicroseconds(500);
}
}
|
|
画像掲示板へ
|
マイコン工作へ