この記事ではジョイスティックの値からジョイスティックの原点からの距離と角度を求める方法について解説していこうと思います。要は直交座標系から極座標系に変換する方法ということです。
ソースコードはmbed用です。また、使用しているジョイスティックはsparkfun社の下記の画像のものです。留年に大きく関わるテストで寝坊したような奴なので厳密には正しくない表現や文章が文法的に間違ってるところがあるかもしれませんが部活の講習とmarkdown記法の練習のためにこの記事を書いているので許してください><
#はじめに
ジョイスティックとはスティックを傾けることによって方向入力を行うことができる機器です。
sparkfun社のジョイスティックではHORZピンがx軸、VERTピンがy軸、SELピンがスティックの押し込みに対応しています。
また、HORZピンとVERTピンは原点で$\frac{V_{cc}}{2}[V]$,それぞれ矢印方向に傾けると$V_{cc}[V]$,矢印の反対方向に傾けると$0[V]$が連続的に出力されます。
#原点からの距離の計算
まず、次の画像に示すように単位円内部$\Bigl((x^2+y^2<1)の範囲\Bigr)$の任意の点P$(x,y)$を考えます。
ここで、点Pの原点からの距離$r$は三平方の定理から
r=\sqrt{x^2+y^2}
で求められます。この式の$x,y$にジョイスティックで読み取った値を代入するだけで原点からの距離(ジョイスティックをどれだけ傾けたか)がわかります。
ここで、問題点があります。それは、HORZ,VERTピンがはじめにで述べたように出力されるため、原点で$(x,y)=(0.5,0.5)$となり単位円と対応しないということです。とりあえず原点で$(x,y)=(0,0)$となるように$x,y$の値をそれぞれ0.5で引くと、原点での問題の解決はしますが、矢印方向,矢印の逆方向に傾けた時の値の絶対値が0.5になってしまいます。なので、この値を2倍すると、単位円の値と対応させることができます。
#x軸正方向とのなす角の計算
上記の画像に示すように、x軸正方向と単位円内部の点Pとのなす角$θ$を計算していきます。
まず、$arctan$関数を用いて計算すると、次式のようにして求められます。
\theta=arctan\Bigl(\frac{y}{x}\Bigr)
一見この数式にジョイスティックで読み取った値を代入すれば求められるように感じます。しかし、$arctan$関数の値域からこの数式の値域は($-\frac{\pi}{2}<\theta<\frac{\pi}{2})$であり、この数式では点Pのx座標が負の値である時に$\theta$が180度位相がズレた値が出てきてしまうため不便です。
そこで、$atan2$関数というものを使います。この$atan2$関数が生み出された背景には、前述したような$arctan$関数の使い勝手の悪さがあることもあり、$atan2$関数では$arctan$関数で求めれない、点Pのx座標が負の値や0であるときの角度を求めることができます。詳細はwikipediaに書いてありますが、x座標が負の値の時などの分岐処理をこの関数が勝手にしてくれています。
従って
\theta=atan2(y,x)
という計算式でx軸正方向とのなす角を求めることができます。
#終わりに
何か分からないことやこの記事に誤りがあれば連絡してください。