Sky-Watcher の モータープロトコル解説

AZヌンチャクをEQ6で使う話があって、EQ6の通信ログをもらいました。
EQ6を壊してしまうといけないので、今年(2020年)1月~2月にかけてプロトコルを解析した資料があったので、復習がてら整理して載せることにしました。
万人の役に立つ情報ではないですが、なにせ本家のドキュメントがあまりにも不親切なので、必要な人には役に立つかなと思います。
(このサイトは2か国語にしてますが、このページは面倒なので日本語のみです。)

免責事項と注意点

この資料は自分の手元にあるAZ GTi(1台のみ)とPC版SyncScanProとの通信ログを解析しながら、SkyWatcher社のモータープロトコルのドキュメントを自分なりに理解したもので、当然間違っている可能性もあります。また本ページ作成時に転記間違いがあるかもしれません。
このページに掲載している情報を元にした結果のいかなる直接的、間接的損害について、当方は一切の保証は致しません。本ページ掲載情報の利用は自己責任で行ってください。
実際の作成にあたっては元にSkyWatcher社のドキュメントを正として、こちらは参考程度にして頂くようお願い致します。

基本的な情報

単純なシリアル通信です。ボーレート9600、データ8 bit、パリティ無し、ストップビット1、フロー制御無し。
シリアル通信の電圧は3.3Vですが5Vでも動きます。間違えてRS232Cレベルの電圧をかけると壊れてしまう可能性があるので、注意してください。

通信は文字(テキスト)によるプロトコルです。クライアント(ハンドコントローラ等)から、マウント(AZ GTiなど)にメッセージを送り、返事を受け取ります。マウント発でメッセージを送ることは(たぶん)ありません。

コマンドを送る時は 「:」 で始まるメッセージで、返事は「=」で始まります。エラーの時の返事は「!」で始まります。メッセージ終わりは全て「\r(0D)」です。

「:」の後の1文字がコマンドコード、その次の1文字が「1」か「2」でこれはAxis(軸)番号です。

接続開始時

まずはクライアント(SyncScanPro、ハンドコントローラ、ヌンチャクなど)とAZ GTiの通信開始時の通信です

モーターボードバージョン問合せ
(–>Mountへ) :e1\r
(<–Mountから) =0314A5\r

(–>Mountへ) :e2\r
(<–Mountから) =0314A5\r

拡張情報要求 ExtendenInquire (AZGTiが赤道儀モード対応かどうか、に使ってます)
(–>Mountへ) :q1010000\r
(<–Mountから) =098000\r

拡張情報設定 ExtendedSetting(ディアルエンコーダON/OFFとか)
(–>Mountへ) :W1050000\r
(<–Mountから) =\r

(–>Mountへ) :W2050000\r
(<–Mountから) =\r

オートガイドスピード設定
(–>Mountへ) :P12\r
(<–Mountから) =\r

(–>Mountへ) :P22\r
(<–Mountから) =\r

CPR値取得 Inquire CPR
(–>Mountへ) :a1\r
(<–Mountから) =00A41F\r

(–>Mountへ) :a2\r
(<–Mountから) =00A41F\r

TI-Freq値の取得  Inquire Timer Inturpput Freq
(–>Mountへ) :b1\r
(<–Mountから) =0024F4\r

(–>Mountへ) :g1\r Inquire Highspeed Ratio
(<–Mountから) =01\r

(–>Mountへ) :g2\r Inquire Highspeed Ratio
(<–Mountから) =01\r

後々、モーターを動かすのに必要な情報は、青字で書いたそれぞれのモータのCPR値と、TI-Freqと書かれている値です。これはマウントによって異なるようで、AZGTi と EQ6では全く違う値でした。ご注意ください。
(2020/9/18 追記)
AZ-GTi ではこの値は1なので気付かなかったのですが、EQ6のログを頂いて、それを解析した結果、この値も取得が必須ということが判明しました。
ちなみにEQ6の場合、値は 0x10(=10進法で16)でした。
この値もモーターの速度計算に使います。

値のデコード

このプロトコルでの値のエンコードはリトルエンディアンです。

例えばモーター1のCPR値は
=00A41F\r
です。
これは
0x00 + 0xA4 * 256 + 0x1F * (256)^2
= 0 + 164 * 256 + 31 * 256 * 256
= 2073600
となります。

また、TI-Freq は
=0024F4\r
なので、
0x00 + 0x24 * 256 + 0xF4 * (256)^2
= 0 + 36*256 + 244 * 256*256
= 9216 + 15990784
= 16000000
となります。

モーター速度の計算

モーターの駆動速度は恒星時基準になってましたが、下記の値を使うことで太陽時、月時等に変えることができます。
1周するのに要する時間 (スケッチでは 「baseSecPR」 回転あたりの基準秒数)は
 恒星時 23:56:04.091 = 86164.091(秒)
 太陽時 24:00:00.000 = 86400.00(秒)
 月時 23:03:39.014 = 83019.014(秒)

ここでは恒星時を例にして計算します。

コマンドで送るTI値は N 倍速で動かすとき、

TI = (1/N) * ((baseSecPR / CPR) * TMR_Freq)
また高速モードの時は
TI = (1/N) * ((baseSecPR / CPR) * TMR_Freq) * (High_Speed_Ratio)
(2020/9/18追記: AZ GTi は High_Speed_Ratio=1 なので気付かなかった)


となります。
実際は整数値に丸めて、マイナスのときは絶対値を取ります。(マイナス=逆方向のときは、別の方法で指示します。)

※ドキュメントでは上の式で 1/N とした所が N になっていて、どうやっても計算が合いません。
 『 T1_Preset = N * TMR_Freq * 360 / Speed_DegPerSec / CPR 』(ドキュメントの式)
式を見直して実際のデータと突き合せた結果、Nは分子じゃなくて分母にくる、という結論になりました。SkyWatcher社に問い合わせてますが返事がないままです。
(2020/9/18追記)
上記の「Nは分子じゃなくて分母じゃないか」という疑問を出したわけですが、これは私の勘違いであることが分かりました。
ドキュメントで出てくるNは、私は「N倍速駆動するとき」のNと思っていたのですが、式の中のNは「High Speed Ratio」です。


具体例
恒星時駆動 x1.0 のとき
TI = 1/1 * ((86164.091 / 2073600 ) * 16000000 = 664846.381 ≒ 664846

恒星時駆動 x0.5 のとき
TI = 1/0.5 * ((86164.091 / 2073600 ) * 16000000 = 1329692.762 ≒ 1329693

恒星時駆動 x8 のとき
TI = 1/8 * ((86164.091 / 2073600 ) * 16000000 = 83105.798 ≒ 83106

これをステップごとに表にしたものです。1桁目に若干の違いがあるのは、演算精度の問題です。

ステップ倍速(N)TI値16進表記メッセージ
00.51329691144A1D1D4A14
116648460A250E0E250A
28831060144A2A24401
3164155300A25151A200
43220776005128285100
56410388002894942800
6128519400144A4A1400
7400166200067E7E0600
86001108000454540400
980083100033F3F0300
AZGTiの場合のTI値の表

この一連の計算の結果のTI値がモーターを動かすときの値となります。
なお、上記の表はAZ GTiの場合のもので、他のマウントの場合はCPR値及びTI-Freq値が違いますので、この表の数字をAZ GTi以外のマウントにそのまま使うと、最悪故障する可能性があります。計算はマウント毎にCPR値及びTI-Freq値を取得して、それを元に計算し直してください。

なお、マウントによってはCPRの値と TMR_Freqの値が違うため、高速で動かす場合は計算結果のTI値が小さくなりすぎることがあります。(例えばEQ6マウントで、ステップ7~9で動かす場合)
その場合、TI値をN倍します。Nは「:g」コマンドで取得した High Speed Ratio で、EQ6の場合は16ですので、出てきたTI値を16倍して使います。
ちなみに High Speed モードかどうか(TIに倍率が掛かっているか)どうかは、後述の「方向をセットする」で指示することで判断しています。


ステップ倍速計算した
T1値
高速
モード
使用するTI値
高速はx16
16進表記メッセージ
00.501229123712370004D5D50400
11.004896617617000269690200
28.26694757500004B4B0000
317.222793636000024240000
438.751281616000010100000
588.5743677000007070000
6103.336866000006060000
7450.9241.375高速22000016160000
8708.59490.875高速1400000E0E0000
91102.2590.5625高速9000009090000
EQ6の場合のTI値 2020/9/18 追記
(倍速数は実測データから逆算)


モータを動かす

※マニュアル操作しか扱ったことが無いので、自動導入に使われる目標をセットしての自動セット(GoTo)は分かりませんので、ここでは扱ってません。

基本
モーターを動かす基本は、次の流れです。
1.モーターがBusyでないか確認する
2.方向と速度をセットする
3.STARTコマンドを送る

ただし、注意点があり
・逆方向に動かすときは、一旦STOPコマンドを送り、停止するのを待ってから、動かす
・高速モードで動いている時は、一旦STOPコマンドを送り、、以下同文(AZ GTiはSTOPを送らなくても速度変更できてしまいますが、急激な速度変更は架台に負荷をかける可能性があります。する場合は自己責任で。ちなみに高速モードのときは、架台側が自動的に加速・減速制御をしてるようです。

・GoToモードで動いているときは、動かさない

以下、モーター1番について説明します。モーター2番のときは、コマンドの後の数字を2に読み替えてください。

1.モーターがBUSYでないか確認する(状態取得)
コマンド 「:f1」(モータ2の時は「:f2」)
※コマンドは大文字小文字の区別があります

返事例 「=301」
1文字目 0x03 = 0000 0011
右端のビット 動作モードB0: 1=Tracking, 0=Goto
右から2番目のビット 回転方向 B1: 1=CCW, 0=CW
右から3番目のビット 項目モード B2: 1=Fast, 0=Slow
2文字目 0x00 = 0000 0000
右端のビット 動作中かどうか B0: 1=Running,0=Stopped
右から2番目のビット B1: 1=Blocked,0=Normal (何に使われているか分からない…)
3文字目 0x01 = 0000 0001
右端のビット 初期化が終わっているか B0: 0 = Not Init,1 = Init done
右から2番目のビット B1: 1 = Level switch on (何に使われているか分からない…)

2文字目のビット0が1の時は動作中なので、コマンドを送ってはいけない。
ただし、現在が停止中または低速移動中で、かつ同方向への速度変更については動作中でも可能。
それ以外のときは、STOPコマンド 「:K1」を送り、「:f」コマンドで停止するまで待機する。


2.方向をセットする

Set MotionMode コマンド「:G」を使う
例 「:G130」
セットする値は 「30」 = 0000 0011 0000 0000

1文字目 [3] = 0000 0011
B0: 0=Goto, 1=Tracking 動かすときは1にセット
B1: 0=Slow, 1=Fast(T) 128倍速より早く動かすときは1にセットすること

  0=Fast, 1=Slow(G) ※Gotoモードでは逆のようです。。。。
B2: 0=S/F, 1=Medium すいません、何か分かりません。0しか見たことないです。Goto時のコマンドかも。
B3: 1x Slow Goto すいません、何か分かりません。0しか見たことないです。Goto時のコマンドかも。

2文字目 [0]=0000 0000
B0: 0=CW、1=CCW モーターの回転方向を指定します。
B1: 0=Noth, 1=South すいません、何か分かりません。0しか見たことないです。Goto時のコマンドかも。
B2: 0=Normal Goto, 1=Coarse Goto すいません、何か分かりません。0しか見たことないです。Goto時のコマンドかも。

3. 速度をセットする
速度をセットするには「:I」コマンドを使います。
速度は「モーター速度の計算」で計算したTI値を使います。

ステップ倍速(N)TI値16進表記メッセージ
00.51329691144A1D1D4A14
116648460A250E0E250A
28831060144A2A24401
3164155300A25151A200
43220776005128285100
56410388002894942800
6128519400144A4A1400
7400166200067E7E0600
86001108000454540400
980083100033F3F0300
AZGTiの場合のTI値の表

例えば恒星時の16倍なら、(AZ GTiの場合は )TI値は41553、これは16進数で 0x00A251、このプロトコルでは「51A200」となるので、送るべきメッセージは「:I151A200」 となります。

※この表はAZ GTiのもので、他のマウントでは CPR値、TI-Freq値が異なるので、都度計算する必要があります。他のマウントのコードにこの表の値をそのまま使わないでください。

4.STARTコマンドを送る
上記で回転方向と速度がセットできたので、「:J」コマンドを送ると動き出します。
例 「:J1」

5.STOPコマンドを送る
Tracking時(Gotoで目標ステップまで自動で動かす、ではない場合)、モーターはSTOPを送らないと動き続けますので、注意してください。
ヌンチャクではレバーがニュートラルになった時にSTOPを送っています。停止させるときは 「:K」コマンドを送ります
例「:K1」

2軸同時に動かす場合

SyncScanで斜め上のボタンを押すような場合、2軸同時に動かすことになります。

※初期化時の InquireStatusというコマンドで取ってくる情報に 「Tow axes must start seperately B2: Support」というのがあり、AZGTiは関係ないようですが、ドキュメントの文言からして、ここのビットが1のときは、別々に動かす必要があるかもしません。(ヌンチャクではこのビットは無視しました)

軸は二つありますが、架台とのシリアル通信は1チャンネルしかないので、交互に通信するような感じです。
これはステップ9(800倍速)で右斜め上ボタンを押した時の通信内容です。

(–>Mountへ) :f1\r 軸1 状態確認
(<–Mountから) =101\r
(–>Mountへ) :f2\r 軸2 状態確認
(<–Mountから) =101\r
(–>Mountへ) :G130\r 軸1 回転方向と高速モードセット
(<–Mountから) =\r
(–>Mountへ) :G230\r 軸2 回転方向と高速モードセット
(<–Mountから) =\r
(–>Mountへ) :I13F0300\r 軸1 速度セット
(<–Mountから) =\r
(–>Mountへ) :I23F0300\r 軸2 速度セット
(<–Mountから) =\r
(–>Mountへ) :J1\r 軸1 START
(<–Mountから) =\r
(–>Mountへ) :J2\r 軸2 START
(<–Mountから) =\r
(–>Mountへ) :K1\r 軸1 STOP(ボタンを離した時)
(<–Mountから) =\r
(–>Mountへ) :K2\r 軸2 STOP(ボタンを離した時)
(<–Mountから) =\r


その他の情報

ここで扱ったのはモータープロトコルで、
・HandControllerポートからシリアル通信で送る
・Wifi経由でUDP通信で送る
・SyncScanAppから架台へUDP通信で送る

の時に使われるものです。上記のどの経路からも送れてしまうので、気を付けて使わないとバッティングする可能性があります。稀にバッティングの結果、AZGTiがハングアップして、電源を入れ直ししないと戻りませんが、幸い壊れたことはありません(汗)

AZ GTiにはこれ以外に(SyncScanAppをサーバとして、それに対して)TCP通信できる別のコマンド体系が用意されています。こちらは赤経、赤緯を指定しての移動とかもできるみたいです。こちらはまだちゃんと調べたことがないのですが、SyncScanAppを起動していないと使えないようです。

赤道儀モード対応(9/16追記)

AZ GTiは(自己責任で)ファームウェアアップデートによって赤道儀モードにすることもできます。
Extended Inquireコマンド「:q」で状態を取得すると、
:q1010000 に対して
購入時の経緯台オンリーの時の返事
=018000  ”1″のところは 0000 0001
赤道儀選択可能な時の返事
=098000  ”9″のところは 0000 0101
仕様書によると返事2文字目のビット3は
B3: Support EQ/AZ mode
となっているので、この時SyncScanAppアプリは赤道儀選択可能になるようです。

ただ、SyncScanAppアプリで赤道儀を選択しても、経緯台を選択しても、選択時にはコマンドは何も送られません。これはつまり、経緯台か赤道儀かを判断して制御するのはアプリ側で、架台側では何もしていない事を意味します。
ついでにいうと、アライメント決定時にも何もコマンドが送られないので、アライメント情報を持ってるのはアプリ側、ということになります。
架台側は、アプリからの要求に応じてエンコーダポジションを返すのと、モーターを動かすのみのようです。

追尾について(9/16追記)

経緯台モード、赤道儀モードでの追尾についても、アプリ側に頭脳があるようです。

まず経緯台モードの時は、頻繁に(おそらく1Hz)で、アプリからポジションを問い合わせて、こまめに両方のモーターに指示を出して追尾させています。
現在の架台の状態、方位、高度から対象物の位置をリアルタイム計算するには、アライメントの情報を持っていないとできません。
これをヌンチャクに実装するには、アライメントもヌンチャクでやらないといけないことになり、ちょっと無理なので諦めました。ハンドコントローラをつないだ時は、ハンドコントローラは全部やってるのでしょう。

一方、赤道儀モードの追尾は簡単です。
操作が終了してアイドルになる時に、赤経モーターを恒星時 x1倍速で動かして、そのまま放置するだけです。SyncScanAppもそのようにしています。 太陽時駆動なら、ベースとなる速度が微妙に違うだけで、やってることは同じです。

※南半球の時は、「放置速度」が逆方向になるので注意

赤経モーター追尾時は、ボタンを押していない時はx1倍駆動、ステップ1(x0.5倍駆動)の時は、順方向なら 1+0.5=1.5倍速に、逆方向なら 1-0.5=0.5倍速になります。逆方向にステップ1(x -1)で動かすと、1-1=0 でモータが停止します。
要は全ての速度に恒星時駆動速度が足された値になります。

ステップ経緯台モード・赤緯軸赤道儀モードの
赤経(北半球の時)
4x81+8= x9
3x41+4= x5
2x21+2= x3
1x11+1=x 2
0x0.51+0.5=x 1.5
停止x01+0= x1
0(逆方向)x -0.51-0.5= x0.5
1(逆方向)x -11-1 = x0(停止)
2(逆方向)x -21-2= x -1
3(逆方向)x -41-4= x -3
4(逆方向)x -81-8= x -7

AZヌンチャク 製作方法

AZ Nunchuk
AZ ヌンチャク

2020年に入ってAZ GTiを買ってから、この値段で自動導入があるのか!と感動して使ってました。ただ、望遠鏡をのぞきながらアプリのボタンを操作するのがやりにくくて、このアイデアを思いつきました。

使い勝手が良かったので、いくつか作って売ってみてもよいかな、と考えたのだけれど、「任天堂の製品を改造して売る」というのは、任天堂さんの知的所有権を侵害することになるので、法的に販売ができない。、、、ということで、ここに作り方を公開して、ついでにスケッチのソースも公開して、皆さん個人に自由に工作してもらおうということにしました。

製作に必要なもの 

  1. Nintendo Wii 用ヌンチャク (正規品の方が良い。理由は後述)
  2. arduino pro mini、もしくはその互換品
    ※ ProMiniには3.3V版と5V版がある。AZ GTiのシリアルと、ヌンチャク電源は3.3vなので仕様的には3.3V版がベターだが、AZ GTiシリアルもヌンチャク電源も5Vで問題無く動作するので、どちらでもよい。
  3. 圧電ブザー 発信回路無し、ワイヤー付きのもの。直径20㎜以内。
  4. RJ12 6P4C 4極プラグ

  5. Y字特殊ドライバー(ヌンチャクが任天堂正規品の場合に必要)
  6. はんだごて、ハンダ
  7. モジュラープラグ用圧着工具

はじめに

ヌンチャクには任天堂正規品と海外サイトなどで買える互換品がありますが、いろいろ試してみた結果、正規品を使う事をお勧めします。理由は以下の記事中で随時指摘します。

Arduinoにスケッチを書きこむ

AZ ヌンチャクのスケッチはここにアップしました。
github.com/naokiueda/az-nunchuk

「とりあえず動かした」レベルのコードで、とても他人様にお見せできるようなコードではないのですが、いずれコードは綺麗に整理するとして、まずは動いているものをアップします。

Arduino Pro MiniはUSBシリアル変換チップが載っていませんので、スケッチを書き込むには別途USBシリアル変換ケーブル等が必要になります。
こちらのサイトなどを参考にしてください。

ヌンチャクの分解

任天堂ヌンチャクの分解にはY字型の特殊ドライバーが必要です。(互換品は通常のプラスドライバーです)

ヌンチャクのY字ネジと特殊ドライバー
ネジを2か所外すと、上蓋はジョイスティック付近の何か所かのツメで止まってるだけなので、ツメを折らないよう丁寧に外します。

AZ GTi側のコネクタを付ける

AZ GTiとの接続はRJ11/RJ12の6P6C/6P4Cモジュラプラグです。モジュラケーブルを買ってきてそれを切って使ってもいいのですが、ワイヤーの芯が固いものが多く、ヌンチャク本体に基盤を押し込める際に折れたことが多かったので、使うなら柔らかいケーブルを推奨します。

ここでは市販のモジュラケーブルを使うのではなく、ヌンチャクについているケーブルを流用して作ります。ヌンチャクのケーブルはゲームに使うだけあって、柔軟性もちょうどよいです。

太いモジュラコードは、ワイヤーが固くて使い難かった。
フラットタイプは柔らかすぎた。

ケーブル先のWiiコネクタをカットして、RJ11/12 6P4Cコネクタに付け替えます。まずカットして6㎜外皮を剥きます。すると、シールド線が出ているのでこれをカットします。

ヌンチャク本体側には赤、黒、黄、緑、白の5本が出ていますが、ケーブル内は黒を除いた4本です。(黒はシールド線につながっています)
この4本を真っすぐ、平行に並ぶように形を整えます。正規のモジュラケーブルと違って柔らかいワイヤーなので、まっすぐにしていないとコネクタにセットするときに曲がってしまってなかなか入りません。
また、後々分かりやすいように
黄色ー赤ー緑ー白
の順にすることをお勧めします。赤=電源となってミスが起きにくいです。

赤をDC12V、白をGndにした方が分かりやすい。 

これをプラグに挿入して、モジュラ圧着ペンチで固定します。
この順序で以下のようになっています。
黄 (AZ GTiの)Tx
赤 DC12V
緑(AZ GTiの)Rx
白 Gnd

順序は変わってもよいですが、後の手順で間違えないようにしてください。

なお、ヌンチャクを正規品ではなくコピー品を使う場合、ケーブルの色はまちまちなので、カットする前に必ずテスターで確かめるなどして間違えないようにします。

圧着ペンチでかしめる
ジャック側完成

ちなみにAZ GTiのハンドコントローラポートのピンアサインはこのように書かれています。

出典:AZ GTi Instruction Manual V102 Page 8

本体側のはんだ付け

ヌンチャクからケーブルと基板を外します。

次にワイヤーをほぼ中央になるようにカットします。
あまりどちらかに偏って切ってしまうと、基板がうまく入らないことになります。

これをArduinoに直接ハンダ付けします。(ピンヘッダを使うとケースに入らなくなってしまうので)
配線は以下の通りです。
今回のスケッチでは、圧電ブザーは3番ピンにアサインしています。

ハンダ付けは、ケーブルを数本ずつ、マスキングテープ等で固定して順番にやると付けやすいです。

上記の写真は実は失敗例です。ジョイスティック側のワイヤーが、コネクタ側のワイヤーの束の中をくぐってしまってます。それぞれの束は完全に分離できるほうが、ケース内に基盤を配置するときの自由度が上がります。

基板が中でカタカタしないよう、タカチの難燃性スポンジ付き両面テープで基板が当たる場所をカバーします。

ケーブルのブーツをはめて、次にArduinoを入れ、最後にヌンチャクの基盤をいれると、入りやすいです。配線が絡まっておらず、極端に短い配線が無い限り、Auduinoの入る余裕はたっぷりあります。

最後にブザーと基板を同様にスポンジ付き両面テープで動かないように押さえます

これで蓋をしめれば完成です。

任天堂正規品でない場合の注意点

筐体内部のケーブルが非常に短いので、うまく調整しないと入らない。あらかじめ配置を考えてからカットするか、ワイヤーを伸ばすかしたほうが無難です。

また、どの色のワイヤーが どの信号のものか、あらかじめテスター等で確認しておく必要があります。

ピン配線はこのようになっています。中央の白ワイヤーはGNDとつながっているようです。
それぞれがジョイスティック基板のどこと接続されているか、コネクタを切断してしまう前に導通確認してください。
これはテスト用にArduino nanoでI2C通信のピンアサイン確認をしているところ

また互換品は正規品と違ってシールド線がありません。まあ、改造してここを通るのはもはやI2C通信ではなくシリアル通信となるので、問題はないのですが。。

また互換品は何種類も買って調べましたがケーブルとブーツがどれも溶着されていました。正規品ではれば、ケーブルを抜いて、例えば別のモジュラケーブルを差し替えて使うとかもできそうです。

互換品をAZ GTi対応に改造したもの

互換品バージョン

互換品バージョン

開発裏話

任天堂ヌンチャクにたどり着くまで、ジョイスティクと上下左右にボタンが付いたものを作ってみたり、タカチのケースにジョイスティックを付けてヌンチャクもどきをつくってみたりいろいろしてみたけど、やはり任天堂ヌンチャクが一番使いやすい。この形は意匠特許がでていたはずで、さすが、握りやすい。

そこで任天堂ヌンチャクを使う方向で決定して、最初は間に挟むコネクタ型で試作してみた。

こちらは試作品達。ヌンチャクとの間に挟むコネクタ型。

ヌンチャク本体を加工せずに「アダプタ」型にした試作品達。

ただ、どうしてもケースが間にぶらぶらするのが嫌で、なんとかヌンチャク本体のみで完結できるように模索開始。

まず、ヌンチャクの本体の隙間が非常に小さい。海外でヌンチャクの改造記事がいくつかあったけど、マイコンを入れるのに筐体の内側を削るなどしていた。あまり物理的な加工はしたくない。。。

そこで、

・直接DC12Vで動く
・3.3Vか5Vでシリアル通信ができる
・I2C通信ができる(ヌンチャクとはI2C通信)
を条件にマイコンを物色。

そこで見つけた親指大のこのArduinoを見つけて取り掛かる。
https://www.iot-experiments.com/attiny85-development-board/

ちょっと特殊なところがある(int a=0; とか、宣言で初期化をやるとエラーになるなど。。。)けど、なんとかコーディング。スケッチの焼き方もちょっと特殊。

で、焼こうとすると、使えるメモリが小さすぎて、スケッチが入りきらない!!SkyWatcherのモータープロトコル対応でちょっと大きくなってしまったからなあ。。

コード書く時にテストで使ってたArduino nano だと長すぎて入らない。。

そこで探してきたのが Arduino Pro Mini
これだとヌンチャク内部に入れれるし、入れる方法も何通りもあった!

というわけで Arduino Pro Miniに決定した。

あと、ヌンチャクは任天堂の正規品と、AliExpress等で売ってる互換品(激安)がある。
互換品は安いけど、次の3つの理由で正規版を使うことを推奨。中古だと安いし。
・互換品はヌンチャク内部のケーブルワイヤーが短い。うまく配分してカットしないと、はんだ付けした基盤が入らない(失敗多数)
・互換品はケーブルブーツとケーブルが接着されてしまっている。失敗したときに「買ってきたモジュラケーブルに差し替え」というリカバリーがやりにくい

・4種類くらい、計20個くらい買ったけど、そのうち数個、ジョイスティックを動かすと「0~255」にならないといけないところが「254,255、0、1、~253」とか「3、4~255、0,1,2」とずれているものがあって、上限/下限まで動かすと反対の動作になったりした。
(一応、これでも動くように対応してある)

使い勝手について

やはり自分が使いたいものを作ったので、とても使いやすくて、よいです。

特に赤道儀モードにしたときは、ヌンチャク自体が追尾指令を出すので、SyncScanAppがなくても動きます
アプリは自動導入したいときだけ使う感じで、後は切ってます。ISSの日面通過撮影などはヌンチャクを太陽追尾モードにしておいて、アプリは全く使わなくなりました。

分かってる不具合

SyncScanAppが送っているコマンドはモーター制御コマンドです。ヌンチャクもモーター制御コマンドを送っています。
まれに、同時にコマンドを送ると、AZ GTiのモータがハングアップして、電源入れ直し(とアライメントやり直し)が必要になってしまいます。
特にアプリから
・経緯台モードで追尾している時
・赤経・赤緯などリアルタイム情報表示をしている時
はアプリからほぼ1秒おきにコマンドが送られています。この時にヌンチャクを操作するとバッティングする可能性が高いです。

ヌンチャクを使う時は
・アプリの追尾はOFFで
・アプリの情報表示はOFFで
・アプリのボタンで操作中はヌンチャクの操作をしない、逆も同じ
・Gotoで目標導入中はヌンチャクの操作をしない
これらさえ気を付ければ問題なく使えます。

余った部品セット、あります

ちなみに改造に必要な部品(余ったもの)が5セットあったので、ヤフオクに出してみます。Arduinoはプログラム済みです。よかったら工作に挑戦してみてください。

売り切れました