トップランディングコントローラ変換ハーネスの作成
ロータリーエンコーダの動作をエミュレーションするチップを作成し、PS用のアナログスティックを介してトップランディングの基板を操作できるようにします。
![]() |
上記は電源も専用に準備しました。出力の変換機さえ準備すればすぐに遊べる状態です。
![]() |
変換ハーネス部分のアップ。真ん中に見えるチップがALTERAのMAXIIというCPLD(自在にロジック構成を変更できるIC)です。
オプティマイズさんが発売している基板を使っています。この基板はレギュレータ搭載のために5V単一で動作する上に
レギュレータの3.3V出力をある程度回路に使え、それでもって1600円(チップ以外は自分で半田付け)という破格の価格で
趣味の小規模回路作成にはもってこいのボードです。
たぶんPICなどのマイコン使っても同様なことは可能でしょう。なので、アルゴリズム的な解説も加えようと思います。
自分がCPLD使ったわけはHDLが知ってる言語だったことと、雑誌の付録で触ったことのある系列だったことが主です。
ロータリーエンコーダのエミュレーション回路
まず、機体をコントロールできるように出力をロータリーエンコーダに見せかける回路を作ってやる必要があります。フリップフロップのクロックを制御して…とか考えたんですけど、WEB漁ってて、マイコンか何かでロータリーエンコーダを受ける側のプログラムを説明してるページを見てピンときました。
操作系のページで出したロータリーエンコーダの波形の図ですが、これを一部切り出してみます。
![]() |
赤いところですね。どっちもHiレベルです。ここで次のタイミングを考えると、Pulse+側が変化する場合が+方向、Pulse-側が変化する場合が−方向への移動をしているということになります。PULSE±が取り得る状態はHH,HL,LL,LHの4種類しかなく、それぞれに+/-の2方向への変化があるだけです。この取り得る値を全て表にすると、
現在の状態 | 回転方向 | 次の状態 |
LL | + | HL |
− | LH | |
LH | + | LL |
− | HH | |
HH | + | LH |
− | HL | |
HL | + | HH |
− | LL |
という組み合わせだけで表現できます。もう少しグラフィカルに書くと下記のようになります。
状態遷移図と呼ばれるものです。1がHi, 0がLowです
![]() |
これをVerilogHDLで書くとこうなります。
p1,p0が現在の状態、p1next,p0nextが次の状態、upcom, downcomが+方向か−方向かを決めている信号になります。
always @(p1 or p0 or upcom or downcom) case ({p1,p0,upcom,downcom}) 4'b0001 : {p1next,p0next} = 2'b10; // down 0->2 4'b1001 : {p1next,p0next} = 2'b11; // down 2->3 4'b1101 : {p1next,p0next} = 2'b01; // down 3->1 4'b0101 : {p1next,p0next} = 2'b00; // down 1->0 4'b0010 : {p1next,p0next} = 2'b01; // up 0->1 4'b0110 : {p1next,p0next} = 2'b11; // up 1->3 4'b1110 : {p1next,p0next} = 2'b10; // up 3->2 4'b1010 : {p1next,p0next} = 2'b00; // up 2->0 default : {p1next,p0next} = {p0,p1}; // hold endcase |
あとはp1nextとp0nextにp1,p0を入れ替えてやればロータリーエンコーダの出力を論理回路で再現することができます。遷移タイミングを早くするほど高速な回転として検出されます。
PS2パッドからの信号変換
PS2パッドとの通信についてはoffice D-sanさんのこちらのページIPを使わせてもらいます。これを使うことでジョイパッドと通信しパッドの入力情報を得ることが可能です。アナログジョイスティックについては、傾きに応じて0〜256(16進数でFF)の値が得られます。トップランディングの場合、ジョイスティックを元に戻したときには逆方向のパルスを同じだけ入れてやる必要があります。
それを解決するために、回路内部でカウンタを用意し、その値とアナログスティックの値を比較、カウンタをアナログスティックの値にあわせるようにプラス、マイナスのパルスを出すようにします。下記のようなブロックの構成になります。
![]() |
上下、左右、スロットルと操作系は3つあるので、psPAD以外のブロックはそれぞれ3つ必要です。あとはそれぞれのブロックを作るだけです。
以下、執筆中…