« 自作コントローラの導入補助機能の検証 | メイン | 初めての拡大撮影(木星) »

2016年5月24日 (火)

自作コントローラの導入補助機能のエラーの原因究明

自作コントローラの目標天体導入補助機能で、暴走や方向音痴状態になることの原因を探るため、ブレッドボードでエミュレータを作成し、検証してみた結果について、以後同様のことを避ける目的で詳細を書いておきます。

まずは、現象の再現です。

20160523_3370_2赤経移動量

20160523_3371赤緯移動量

アークトゥルス→M51の導入 手元操作ボックスでの、移動量の計算値

アークトゥルス= 赤経14h15m40s=213.91° 赤緯+19°10'57"=+19.17°= 70.83°
M51           = 赤経13h29m54s=202.47° 赤緯+47°12'00"=+47.20°= 42.80° 移動量        = 赤経-11.44° 赤緯-28.03°

手元操作ボックスが送信した赤経移動量(ステップ数)

赤経移動量の計算値 = (1144× ( 2048(step/0.1°) + 5(step/0.1°)) ÷ 10 = 234863 = 0x0003956F

手元操作ボックスが送信した赤緯移動量(ステップ数)

赤緯移動量の計算値 = 2803°× ( 2048(step/0.1°)  ÷ 10 = 574054 = 0x0008C266

本体コントーラが指示した赤経移動量

その差 (234863 - 169327)÷2053 ÷10 = 3.19°

本体コントーラが指示した赤緯移動量

その差 (574054 - 508518)÷2048 ÷10 = 3.20°

前回検証した誤差量3.2°に一致します。

また、おおぐま座η→M51の導入について、上記と同様に検証したところ、本体コントーラが指示した移動量に「-」が!!
移動量の±は、回転方向で表していますので、移動量は絶対値を使っており、負の数にはならないばずなのですが、これが暴走の原因です。

20160523_3372

長々と書きましたが、結論は、暴走、方向音痴とも再現する現象で、プログラムミスに原因があることは明白です。

どうも、本体コントーラが受け取ったbyteデータをlong型の整数に戻すときの式に型変換上の問題があることが分かったのですが、どう書いたら、正しく計算するのかがなかなか分かりませんでした(つまりはC言語の型変換が理解できていないと言うはずかしい結果)。

試行錯誤した結果、手元操作ボックスからの指示データ(4byteデータ)を受け取って、ステップ量に戻す式

step = val[0]*0x1000000 + val[1]*0x10000 + val[2]*0x100 + val[3];
※変数の型はstep・・・long、c[]・・・unsigned charです。

の赤字部分に問題がありました。

ここの部分だけ、型変換時に符号拡張があり、0x80以上の値では、負数に変換されてしまっています。
unsigned charの符号拡張では負数にはならないと思っていたのですが、char型、byte型でも同様の結果です・・・・わかりません。

とにかく、下の式のようにlong型にキャストすることで対応できました。

step = (long)val[0]*0x1000000 + (long)val[1]*0x10000 + (long)val[2]*0x100 + (long)val[3];

結局プログラムミスに原因があったのですが、あやまった記述方法でも数値範囲によっては正しく動作するため、誤認していたのでした。

型変換の理屈はとんと理解できていませんが、上記式の「val[2]×0x100」が問題をおこしていたみたいです。

なにはともあれ、これでめでたく導入補助機能の問題点も解決したはずです。 いよいよ、次の撮影が楽しみになってきました。

トラックバック

このページのトラックバックURL:
http://app.blog.bbiq.jp/t/trackback/562191/33835231

自作コントローラの導入補助機能のエラーの原因究明を参照しているブログ:

コメント

コメントを投稿

コメントは記事の投稿者が承認するまで表示されません。