So-net無料ブログ作成

スカイメモSTを修理する(6) [スカイメモST Arduino]

モーターの赤道儀への組み込みでは、モーターの軸が本体ハウジングに干渉するため、50×50mm×3mmのアルミアングルを加工して、スペーサーとしました。
DSCN3130_R.JPG
DSCN3132_R.JPG
DSCN3134_R.JPG

赤道儀にモーターを組み込み、電源を入れると、ほぼ無音で滑らかに回りだしました。感激の一瞬です。増速、停止、逆転も予定通りに動作します。
DSCN3138_R.JPG
DSCN3139_R.JPG
DSCN3140_R.JPG
スケッチは「北の国から電子工作(仮)」)」spinelifyさんのスケッチのvoid setupに以下のようにピンの定義を書きくわえ、void loopの運転部分を書き換えたものです。
void setup()
{
delay(166);

pinMode(2,INPUT) ;
pinMode(3,INPUT) ;
pinMode(4,INPUT) ;
pinMode(5,INPUT) ;
pinMode(6,INPUT) ;

pinMode(PIN_SPI_MOSI, OUTPUT);
pinMode(PIN_SPI_MISO, INPUT);
pinMode(PIN_SPI_SCK, OUTPUT);
pinMode(PIN_SPI_SS, OUTPUT);
pinMode(PIN_BUSY, INPUT);
SPI.begin();
SPI.setDataMode(SPI_MODE3);
SPI.setBitOrder(MSBFIRST);
Serial.begin(9600);
digitalWrite(PIN_SPI_SS, HIGH);

L6470_resetdevice(); //L6470リセット
L6470_setup(); //L6470を設定


}

void loop(){


L6470_busydelay(50); //busyフラグがHIGHになってから、指定ミリ秒待つ。
L6470_run(1,223);//恒星時運転連続回転

//一度押すと、20倍速
while (digitalRead(2) == HIGH) { //2番ピンとつながってるスイッチがonになったら下記を実行

delay(50);
L6470_hardstop();
L6470_busydelay(50);

L6470_run(1,4500);//Run(DIR,SPD),0x51:正転,0x50:逆転L6470_send(0x00);//SPD値(20bit)ここから下の3行でスピードの20bitを表現しているらしい
}
if (digitalRead(2) == LOW){
delay(50);
L6470_hardstop();//HradStop_急停止、保持トルクあり
L6470_run(1,223);//恒星時運転連続回転
}

//押している間、4倍速
while (digitalRead(3) == HIGH) {//3番ピンとつながってるスイッチがonになったら下記を実行

delay(50);
L6470_hardstop();
L6470_busydelay(50);
L6470_run(1,900);
}
if (digitalRead(3) == LOW){
delay(50);
L6470_hardstop();//HradStop_急停止
L6470_run(1,223);//恒星時運転連続回転
}


//押している間、停止
while (digitalRead(4) == HIGH)
{//4番ピンとつながってるスイッチがonになったら下記を実行
delay(10);
L6470_hardstop();
L6470_busydelay(50);
}
if (digitalRead(4) == LOW){
delay(50);

L6470_hardstop();//HradStop_急停止
L6470_run(1,223);//恒星時運転連続回転
}

//押している間、逆転4倍速
while (digitalRead(5) == HIGH) {//5番ピンとつながってるスイッチがonになったら下記を実行
delay(50);
L6470_hardstop();
L6470_busydelay(50);
L6470_run(0,900);
}
if (digitalRead(5) == LOW){
delay(50);
L6470_hardstop();//HradStop_急停止
L6470_run(1,223);//恒星時運転連続回転
}



while (digitalRead(6) == HIGH) {//6番ピンとつながってるスイッチがonになったら下記を実行押している間、逆転20倍速

delay(50);
L6470_hardstop();
L6470_busydelay(50);
L6470_run(0,4500);
}
if (digitalRead(6) == LOW){
delay(50);
L6470_hardstop();//HradStop_急停止
L6470_run(1,223);//恒星時運転連続回転

}
}//ここまで

delay時間が必要なのかどうか不明で、またその値の取り方は、まったくもって適当に決めましたが、arduinoとL6470とのSPI通信にかかる時間も必要だと思われ、諸先達のスケッチを参考にして、暫定的にこの値としました。結果、順調に動いたので、このまま運用となりました。コントロール用レジスタの値はデフォルトのままですが長時間の運転でも、モーターの過熱はないようです。
電源は、arduino本体とL6470それぞれに必要です。DCワークを電源として、arduinoへは,USBコードをシガーライターアダプタを介して電源として利用し、L6470へはDCワークから直接12Vを供給することにしました。USBをPCにつなげば、即座にスケッチを変更できます。

nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

yosshi

当方初心者です。ポンセットマウント用コントローラを作成し、使用しております。自信がありませんが以下。一応滑らかになりました。
①LOOP内では、常に上から下へと言語を監視し実行しているようです。(15マイクロ秒程度?15はどうかと思いますが、実行速度は非常に早いようです)
A)従ってL6470_run(1,223);//恒星時運転連続回転は、全体でも1行ですむはずです。LOOPのすぐ下に1行書くだけで良いはず。
B)digitalRead(2から6) == は常にLOWですから、始終2~6の間でHardstop();を繰り返します。そこで振動しているはずです。

void loop(){
int a;int b;int c;int d;int e;//変数を6個定義します。
L6470_run(1,223);//恒星時運転連続回転
//2から6全て同様なプログラムで
while (digitalRead(6) == HIGH) {//6番ピンとつながってるスイッチがonになったら下記を実行。押している間、逆転20倍速

L6470_run(0,4500);
int e=1;//highになったら”1”を代入
}
if (digitalRead(6) == LOW && e==1){//lowかつe=1の場合のみstopする。e=0の場合はstopコマンドはスルーする。
L6470_hardstop();//HradStop_急停止
int e=0; //stopを1回実行したらe=0にする。
} 
②delayコマンドを多用すると、恒星時運転=計算とずれてきますので注意して下さい。(遅れる)
 
by yosshi (2014-08-17 22:31) 

udo20

yossi様、コメントありがとうございます。自称初心者と謙遜なさっておられますが、当方と比べると、使用できる言語の数、言い回しの簡潔さ、中学一年生の英語と高校生の語学力以上の差があるようです。大変参考になります。何十年か前に受けていた、英語の通信添削の先生の解答を見るような気分ですね。プログラムを自由に更新できるのが、このシステムの長所でもありますので、ご教示いただいた内容をなんとか自分のものにして、Ver.2の形にしていきたいと思います。
by udo20 (2014-08-18 22:16) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0