So-net無料ブログ作成
スカイメモST Arduino ブログトップ

OnStepコントローラーを作る [スカイメモST Arduino]

OnStepというArduinoのスケッチがあることを知りました。リュウさんが、紹介され、使用法も公開してくれたおかげで、当方でもなんとか導入できるのではないかと考え、トライしてみることにしました。スカイメモSTのコントローラをOnstepに置き換える挑戦です。もちろん、能力の高い人には何でもないことでも、当方レベルのスキルではつまづく部分も多いだろうと覚悟しての挑戦です。
まず、Arduino mega 2560の互換品を購入し、Onstepのスケッチをコンパイルし書き込めるかどうかを、検証します。
早速、ここで、つまづきました。おなじみのnot declared のダメだし。どうしてなのか原因がわからず、試行錯誤した結果、Arduino IDEのヴァージョンが古いのが原因と判明しました。以前にMMD クオーツを修理した時のIDEを使用したので、コンパイルができなかったようです。最新ヴァージョンのIDEを使うと、あっさりとコンパイル、書き込みができました。
教訓1:Arduino IDEは、最新のものを使うべし。
ライブラリなども増えているので、特別の理由がない限り最新のヴァージョンを利用しましょう。
さて、娘のおさがりのNexus 7にOnStep アプリをインストールし、Arduinoの準備ができたので、DRV8825ステッピングモータードライバー、コネクタ、コンデンサ類を購入し、まずはブレッドボード上で動作を検証することにしました。
ところが、モーターが回らないんですね。モーター周りの配線など何度確認しても回らず。
そこで、初心に帰って、DRV8825の使用説明書(メーカーは違うが日本語だったので、ストロベリーリナックスさんのもの)を読んでみると、reset、sleep端子をhigh レベルにしないとモーターに電流が流れません(静止トルクが発生しません)と書いてありました。そこで、両方の端子に5Vを与えてみると、うれしいことにモーターが回りました(/^▽^)/。
DSCN3940_R.JPG
工作の過程で、一番うれしい瞬間です。しかし、Vref調整を怠っていたため、2個のDRV8825が討ち死にしました。面倒くさくて読み飛ばしていた(理解できていなかった)DRV8825のVref調整は必須です。そのために、まずはオームの法則の復習です。E=RIを何とか理解したぬきちさんのブログを参考にしてVrefを調整しました。
教訓2:部品の取扱説明書はきちんと読むべきである
教訓3:オームの法則を理解し、通電の前に必ずDRV8825のVref調整をすべきである
さて、電源にしている、DCワークの電流が大きすぎるのか、モーターを回してみると、モーターがかなり熱くなります。また4Aのヒューズもしばしば切れます。電流量を制限する必要があると考えて、抵抗を入れることにしました。当方のDCワークは、一度劣化したバッテリーを交換しているので、12V8.4Aのバッテリーが入っています。1.5A程度の電流があれば十分と考えて、5オームの抵抗を入れることにしました。手持ちの抵抗で最小のものは10オームなので、オームの法則から(学習が役に立っています(*^.^*))、10オームの抵抗を2つ並列に入れて、5オームの抵抗にしました。これで、モーターの過熱はなくなり、ヒューズも切れなくなりました。
ブレッドボードの回路を基板に移す時に、ブレッドボード型基板というのを使用しました。配線が楽で、間違いも起こしにくいので、当方レベルの初歩の工作者にはありがたいものでした。また、LEDも抵抗入りのものを購入しましたが、やはり工作の手間を減らせるので便利です。
DSCN3942_R.JPG
DSCN3943_R.JPG
OnStepのconfig.hは、ピンの接続を理解するためにも、赤道儀の設定をするためにも、通読する必要があります。
教訓4:面倒がらずにconfig.hはきちんと読む
なんとかケースに基板を収めることができましたが、不要な穴がいくつか開いてしまったのは、いつものことでご愛敬です。
スカイメモSTにこのコントローラをつないで、恒星時駆動することは確認できました。まず、オリジナルスカイメモSTの機能は確保できました。
赤緯モーターを取り付け、自動導入の検証をするために工作は続きます。

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

恥ずかしながら、なんとかモーターを回せるスケッチを書いてアップしたところ、親切にも、yosshi様から、簡潔なスケッチの書き方を教えていただきました。その道の先輩の教えはありがたいものです。早速、void loopを以下のように書き換えました。

void loop(){

int a; int b; int c; int d;


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

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

L6470_run(1,4500);

int a=1;}

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

L6470_run(1,450);

int b=1;}



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

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




while (digitalRead(5) == HIGH) {//5番ピンとつながってるスイッチがonになったら下記を実行

L6470_run(0,450);

int c=1;}

while (digitalRead(6) == HIGH) { //6番ピンとつながってるスイッチがonになったら下記を実行

L6470_run(0,4500);

int d=1;}

}

順調に作動しています(^-^)。

スカイメモ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につなげば、即座にスケッチを変更できます。

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

古いCOPALのモーターをあきらめ、実験用に購入した、秋月のバイポーラーモーター(1000円)を使用することにしました。結果的に、24stepから200stepに性能がアップしたので、古いモーターの再利用にこだわらないのはよい選択になったと思います。
そうすると、発信周波数=(180×8×200)/86164.09=3.34246PPS
速度数は、223となります。さっそくプログラムを変更します。
「Arduinoでは、BUSYピンを確認してコマンドを送信しているので、直前のコマンドの処理が終了してから次のコマンドを送信します。(runコマンドはBUSYがHIGHのままなので注意)特定の動作をさせるために、直前のコマンドの処理が終了してからdelay(time);を行う関数を用意しました」(北の国から電子工作(仮)から引用)ということなので、タクトスイッチを押したときには、runコマンドをhardstopし、次に加速、反転するようにスケッチを描きました。
Runコマンドに増速、停止のコマンドを割り込みで入れることも考えましたが、arduinoでは割り込みに使えるピンが2つであるとのことなので、20倍速、4倍速、停止、および反転20倍速、反転4倍速をコントローラーに入れるには不足です。そこで、タクトスイッチを押している間は、runコマンドを停止し、次に増速、停止、逆転をし、スイッチを放すともとのrunコマンドを行う愚直なスケッチとなりました。タクトスイッチの配線は、「週刊パタパタをarduinoで動かしてみた」を参考にさせていただきました。
DSCN3107_R.JPG

このブレッドボード上の回路をユニバーサル基板に移します。
ブレッドボード上で動作した回路をユニバーサル基板に移し、さらにタカチのケースに収めましたが、この過程も技量の未熟な当方にとっては平たんな道のりではありませんでした。配線間違い、半田付け不良、さらには使用しているPCのUSBが認識されなくなるなどのトラブルまで加わって、今まで動作していたモーターが沈黙し、解決に数日を費やしました。
DSCN3109_R.JPG
やっと動くようになった、コントローラーのパネルとモーターです。

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

L6470のRUNコマンドは、回転方向と速度数からなっており、L6470のデータシートによれば、回転速度は、
回転速度(ステップ/sec) = 速度数×2(-28乗)÷250ナノセカンド
の式で、得られると書いてありましたが、この計算が結構大変です。このときのステップは、マイクロステップではなく、本来のステップです。電卓を使って計算をしましたが、計算途中の値が表示できる桁数を超えてしまうので、ひとケタ間違ったり、まあいろいろ苦労しました。何度も計算しなおして、同じ値が出るようになったので、それを信用することにして先に進みます。
もともと付いていたCOPALモーターに、今回求めた回転速度20.055ステップ/secを適用すると当方の計算では、速度数は1346となりました。このへんの計算は「趣味汲々」さんのページを参考にさせていただきました。お礼申し上げます。

L6470ドライバーは、バイポーラーモーター用ですが、配線に注意すればたいていのユニポーラーモーターは回せると、FAQに書いてありました。しかし、四半世紀前の24ステップのモーターの再利用は、古い革袋に新しい葡萄酒を入れるのたとえそのものです。また、L6470ドライバーは、電源用のラインがコイルどおし共有になったタイプでは、回路的にショートしてしまい使用できないらしいのです。COPAL SP4-415は、そのタイプである可能性があります。
DSCN3113_R.JPG
DSCN3112_R.JPG
ここで方針転換し、当方の基本である、極力本体の加工は避ける方針を少し緩和することにしました。

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

Arduinoをはじめましたが、予想通り困難に直面しました。
  まずArduino公式サイトからWindows用のファイルをダウンロードし解凍します。
ArduinoをUSBでPCとつなぐと、ドライバーソフトウェアをインストールしようとしますが、失敗するらしい。たしかに失敗しました。そこで、デバイスマネージャーをひらいて、ダウンロードしたArduinoファイルの中にある、ドライバソフトウェアを参照して開き、手動での更新するとCOM3として認識されましたヽ(*^∇^*)ノ。
初日は、定番のHello Worldで終了しました。ここまでは順調です。
  翌日からは、Arduino言語の勉強です。諸先輩のプログラム(Arduino ではスケッチというらしい)プリントアウトし、Arduino 日本語リファレンスを参照しながら、その意味を自分なりに理解する作業から開始しました。数日で、何を言っているのかは、それなりに(ほんとうにそれなりですが (。-_-。 ))、わかるようになりました。そこから、諸先輩のスケッチをコピペしてあれやこれや試行錯誤しますが、コンパイルチェックが通りません。was not delaredエラー、ダメだしの嵐です。何が原因なのかもわからず、五里霧中です。
 昔、上司の命令で英語の投稿論文を書いた時のことを思い出しました。一からの英作文はできっこないので、類似した分野のネイティブの言い回しをストックし、切り張り、改変、作文、そして繰り返される上司のダメだし、やっと投稿できたと思ったら、さらに投稿先エディターからの質問、指導….。それでも明けない夜はないようで、すこしずつ経験値を獲得し、コピペ元を、「北の国から電子工作(仮)」spinelifyさんのページにしたところ、うまくいきました。コマンド集もコメント欄も大変参考になりました。お礼申し上げます。そしてついに、コンパイルチェックをパスして、ステップモーターをrun コマンドで回せるようになりました。ここまで約2週間の道のりでした。
DSCN3100_R.JPG
モーターが回っている記念写真です。

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

さて、どのマイコンにするかの選択です。きわめて技術に暗く、レベルの低い当方にとっては、いちばんハードルの低そうなものが第一選択です。
そこで、最近巷で流行っているArduinoを選ぶことにしました。これに、ストロベリーリナックスさんで取り扱っている、L6470ステッピングモータードライバーをつないで、制御しようというのが当方の基本プランです。
Arduinoは,
1.箱から取り出してUSBでパソコンにつなぎ、
2.ArduinoのソフトArduinoのホームページから手に入れ
3.スケッチを作る(プログラムをArduinoではこう呼ぶようです)。この時、あちこちのスケッチからコピペできるらしい。
4.それをコンパイルして書きこむ。何やら難しそうですが、Arduinoのファイルの左端の〆マーク(?)をクリックするだけのようです。

たったこれだけでマイコンプログラミングが出来るらしい(本当だろうか?)。

従来のマイコンには
①まず書き込み回路を作る(大変そう)
②↑安定してうごかない
③↑配線が間違ってたから直す(当方には間違いを発見できない可能性あり)
④↑そもそも参考にしてたサイトの回路が動かないから別のサイトを当たる
それでやっと書き込み回路が完成したら
⑤A/Dの設定方法がわからない
⑥PWMの設定方法がわからない(この2行は理解不能ヽ(゚ω、゚)ノ)
⑦割り込みって何?
という到底クリアできそうもないハードルがあるようです(以上、「研究の掃き溜めノート」さんからの引用、改変を多く含む)。

プログラミング言語にたいしては、当方には英語をはるかに超えたラテン語くらいの距離感がありますが、前に進むことに決定(本当に大丈夫だろうか)。
秋月電子さんからArduino互換ボード、ストロベリーリナックスさんから、L6470ステッピングドライバーキットと実験用のステッピングモーターを購入しました。
DSCN3094_R.JPG


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

Yオクで、スカイメモSTと思われる、赤道儀ジャンク品を落札しました。34750円。
box-s-a2q6gxcppx2gpnfzgn7gdrxzti-1001[1].jpg
オークションに出された方の画像をそのまま載せさせていただきました。
届いた赤道儀を見てみると、スカイメモSTは、赤緯軸のクランプがだめになっていることが多いそうですが(K-Astecさんのブログの情報)、この個体は大丈夫でした。赤経ウォームハンドル取り付け軸が若干曲がっている以外に、機械的な故障はなさそうですが、コントローラーがありません。
以前、壊してしまったスカイメモNSを、ビクセンMD5のモーターを移植して修理しましたが、今回は、もう少し、自分のスキルアップを図りたいところです。ということで、長い旅路になりそうですが、マイコンを使った、コントローラーの自作に挑戦することにしました。
まず赤道儀の構成を確認します。

赤道儀ウォ-ム 180枚(スカイメモST)       1:180

        赤道儀内部取り付けギアの減速比 (モ-タ-側)20-40/25-100(望遠鏡側)  1:8

        モ-タ- COPAL SP4-415(24ステップで1回転)     

        モ-タ-のギアユニット減速比1/50         1:50
でした。
        

スカイメモST Arduino ブログトップ