Microsoftの最新フライトシミュレーターは、もはや手放せません。美しいビジュアル、天候や時間帯を自由にコントロールできる、自由に設定可能な世界。最新版を動かすには高性能PCが必要です(フライトシミュレーターのパフォーマンスベンチマークの記事をご覧ください)。しかし、もし妥協できるなら、1989年に発売されたMicrosoft Flight Simulator 4をWebブラウザでシミュレートすることも可能です。Raspberry Pi 3または4はシミュレーションを実行するのに十分なパワーを備え、GPIOも搭載しています。少しのPythonコードで、シミュレーター体験のための実際の操作インターフェースとして使用できます。
フライトコントローラーを作るために必要なもの
- Raspberry Pi 3以上
- マイクロスイッチアーケードスタイルのジョイスティック
- プッシュボタン10個
- 4 x ネジ端子(4極)
- 45 メス-オスジャンパー線
- 4フィートのワイヤー
- ブレッドボード
- コントロールを取り付けるためのケース。これが理想的です
- 小型ドリルビットと段付きドリルビットを備えた電動ドリル
- 熱収縮チューブやワイヤーストリッパーなどのはんだ付け機器
- マルチメーター
Raspberry Piフライトコントローラーの配線とハードウェア
1.ケースに、コントロールを配置する場所に印を付けます。すべてのコンポーネントを配置するスペースが確保され、快適に使用できることを確認するために印を付けます。
2.小さいドリルビットを使って、部品用の下穴を開けます。段付きドリルビットに交換し、部品のサイズに合わせて穴を開けます。頻繁に作業を中断してサイズを確認します。また、Raspberry Piへの配線用に1/2インチの穴も開けます。
3.すべてのコンポーネントをテストフィットします。
4.ジョイスティックをケースから取り出し、はんだ付けする前にしっかりと固定されていることを確認してください。作業スペースを準備し、はんだごてを温めておきます。
5.ジョイスティックのケース周囲に4つのスイッチがある場合は、各スイッチのCOMコネクタを探します。COMコネクタに少量のはんだを塗布します。ジョイスティックに5ピンのコネクタが1つしかない場合は、COM / GNDピンに少量のはんだを塗布します。
6.電線を1/4インチほど端から被覆を剥がし、剥き出しの電線を螺旋状にねじります。電線に少量のはんだを塗布します。ジョイスティックのCOM / GNDピンに電線をはんだ付けします。5ピンのジョイスティックでコネクタが1つしかない場合は、手順9に進んでください。
Tom's Hardware の最高のニュースと詳細なレビューをあなたの受信箱に直接お届けします。
7.次のCOMピンに移動し、COMピンまでの配線の長さを測ります。測定値にさらに1.2cm追加し、ワイヤーストリッパーを使って配線を露出させます。配線を切らないでください。
8. 電線が露出したら、少量のはんだを流し込み、COMピンに慎重にはんだ付けします。残りのCOMピンについても、この手順を繰り返します。
9.ジョイスティックをケースに取り付け、ネジで固定します。プッシュボタンもケースに取り付け、固定します。
10.ジョイスティックのCOM/GNDピンから最初のボタンの片方の脚まで配線します。配線の長さをさらに1/2インチ追加し、スリーブを剥がします。ただし、配線は切らないでください。むき出しの配線とボタンの片方の脚に少量のはんだを流し込みます。さらに少量のはんだを使って、配線をボタンの脚に接続します。すべてのボタンの片方の脚に対して、 この作業を繰り返します。
11.ワイヤーを約15cmほど余裕を持たせるように切り詰めます。ワイヤーの端を被覆を剥がし、むき出しのワイヤーをねじり、ワイヤーに少量のはんだを流し込みます。
12. 4本のジャンパー線のメス側を切り取ります。スリーブを剥がし、裸線を螺旋状にねじります。それぞれのジャンパー線を、裸銅線にフローハンダ付けします。オプションとして、熱収縮チューブを使用してジャンパー線をピンに固定し、ショートを防ぐこともできます。
13.ジョイスティックの各スイッチのNO(ノーマリーオープン)端子にフローハンダを流し込みます。5ピンのシングルコネクタジョイスティックを使用する場合は、4つのコネクタに少量のフローハンダを流し込みます。ジャンパー線を各端子に接続します。
14.ジャンパー線10本のメス端子を切断し、スリーブを剥がして撚り合わせ、それぞれのむき出しの線に少量のはんだを流し込みます。電気的なショートを防ぐために、熱収縮チューブを使用できます。
15.少量のはんだを使用して、ジャンパー線をそれぞれの予備のプッシュ ボタンの脚に接続し、熱収縮チューブを脚の上にスライドさせて、チューブを加熱して所定の位置に収縮させます。
これで接続は15個になりました。ジョイスティックのすべてのボタンと方向、そしてジョイスティックのすべてのCOMピンと各ボタンの片方の脚に接続する単一のGND接続です。
16.マルチメーターを導通モードに設定し、片方のプローブをCOM/GND接続の一方の端に、もう片方のプローブを先端のむき出しの電線に当てます。ビープ音が鳴れば、すべてが接続されたことが確認できます。
17. 4つのネジ端子をブレッドボードに挿入し、ジョイスティックからジャンパー線を取り出し、上、下、左、右の位置を確認します。 ジャンパー線がネジと一直線になるようにブレッドボードに配線します。
18.各ボタンのジャンパー線すべてについてこれを繰り返し、最後に専用のネジ端子を持つGND接続部を接続します。使用するネジ端子は15個、予備の端子は1個です。
19.メス-オスのジャンパー線を2本用意します。これらを繋いで長いジャンパー線を作ります。接続部分に熱収縮チューブを巻き付け、加熱して固定します。熱収縮チューブの代わりにテープを使用することもできます。この手順を繰り返し、15本のジャンパー線を延長します。
20.電線のオス側をネジ端子にねじ込み、ケースの穴に通します。それぞれの電線が何に接続されているかをメモしておきましょう。ラベルプリンターを使用しましたが、テープとペンでも代用できます。
21.図に従って、ボタンを Raspberry Pi の GPIO に接続します。
22. Pi アクセサリを接続し、Raspberry Pi をデスクトップで起動します。
Raspberry Piフライトコントローラーのソフトウェア設定
23.ターミナルを開き、キーボード入力をシミュレートする Python モジュール pynput をインストールします。
sudo pip3 install pynput
24.プログラミング メニューから Thonny を開きます。
25.キーボード シミュレーション用の pynput、GPIO ピンを操作するための gpiozero、プロジェクトのペースを制御するための time の 3 つのモジュールをインポートします。
from pynput.keyboard import Key, Controller
from gpiozero import Button
from time import sleep
26. pynput コードと仮想キーボード間の 接続を作成します。
keyboard = Controller()
27. 各ボタンとジョイスティックは Raspberry Pi の GPIO に物理的に接続されているため、各ボタンの場所と、各ボタンの用途を示す参照を Python に伝える必要があります。
Up = Button (27)
Down = Button(17)
Left = Button(10)
Right = Button(22)
F1 = Button(9)
F2 = Button(11)
F3 = Button(5)
F4 = Button(6)
F5 = Button(13)
F6 = Button(19)
F7 = Button(26)
F8 = Button(21)
Gear = Button(20)
View = Button(16)
28. コードを継続的に実行する無限ループを作成します。
while True:
ループ内では、一連の条件文とテストを開始し、ループが実行されるたびに各ボタン/ジョイスティックの方向の状態を確認します。ボタンが押された場合、そのテストのコードが実行されます。最初のテストは、ジョイスティックが押されたかどうかを確認します。押された場合、コードは0.1秒ごとに上矢印キーの押下をシミュレートします。
if Up.is_pressed: print("Up") keyboard.press(Key.up) sleep(0.1) keyboard.release(Key.up)
30. 次のテストでは、下方向が押されたかどうかを確認します。
elif Down.is_pressed: print("Down") keyboard.press(Key.down) sleep(0.1) keyboard.release(Key.down)
31.左と右の コードを入力します。
elif Left.is_pressed: print("Left") keyboard.press(Key.left) sleep(0.1) keyboard.release(Key.left) elif Right.is_pressed: print("Right") keyboard.press(Key.right) sleep(0.1) keyboard.release(Key.right)
32.推力キーをF1~F4に割り当てます。F1でエンジン出力を25%、F4で全開にします。これらはコントローラーの一番上のボタン列に割り当てます。
elif F1.is_pressed: print("Engine Power 25%") keyboard.press(Key.f1) sleep(0.1) keyboard.release(Key.f1) elif F2.is_pressed: print("Engine Power 50%") keyboard.press(Key.f2) sleep(0.1) keyboard.release(Key.f2) elif F3.is_pressed: print("Engine Power 75%") keyboard.press(Key.f3) sleep(0.1) keyboard.release(Key.f3) elif F4.is_pressed: print("Engine Power 100%") keyboard.press(Key.f4) sleep(0.1) keyboard.release(Key.f4)
33.ドラッグを作成するために使用されるフラップ コントロールを F5 ~ F8 にマップします。これはコントローラーの 2 行目です。
elif F5.is_pressed: print("Flaps Position 1") keyboard.press(Key.f5) sleep(0.1) keyboard.release(Key.f5) elif F6.is_pressed: print("Flaps Position 2") keyboard.press(Key.f6) sleep(0.1) keyboard.release(Key.f6) elif F7.is_pressed: print("Flaps Position 3") keyboard.press(Key.f7) sleep(0.1) keyboard.release(Key.f7) elif F8.is_pressed: print("Flaps Position 4") keyboard.press(Key.f8) sleep(0.1) keyboard.release(Key.f8)
34.最後の 2 つのボタンを着陸装置にマッピングし、ビューを変更します。
elif Gear.is_pressed: print("Gear Toggle") keyboard.press("g") sleep(0.1) keyboard.release("g") elif View.is_pressed: print("View Toggle") keyboard.press("s") sleep(0.1)
keyboard.release("s")
35.コードをflight.pyとして保存し、開始ボタンをクリックして実行します。
36.ウェブブラウザでhttps://s-macke.github.io/FSHistory/を開き、ブラウザウィンドウが選択されていることを確認してください。コントローラーを手に取り、推力100%を押し込むと、周囲の世界が1980年代のフライトシミュレーターに変わり、あなたが操縦する様子をご覧いただけます。
完全なコードリスト
from pynput.keyboard import Key, Controller
from gpiozero import Button
from time import sleep
keyboard = Controller()
Up = Button (27)
Down = Button(17)
Left = Button(10)
Right = Button(22)
F1 = Button(9)
F2 = Button(11)
F3 = Button(5)
F4 = Button(6)
F5 = Button(13)
F6 = Button(19)
F7 = Button(26)
F8 = Button(21)
Gear = Button(20)
View = Button(16)
while True: if Up.is_pressed: print("Up") keyboard.press(Key.up) sleep(0.1) keyboard.release(Key.up) elif Down.is_pressed: print("Down") keyboard.press(Key.down) sleep(0.1) keyboard.release(Key.down) elif Left.is_pressed: print("Left") keyboard.press(Key.left) sleep(0.1) keyboard.release(Key.left) elif Right.is_pressed: print("Right") keyboard.press(Key.right) sleep(0.1) keyboard.release(Key.right) elif F1.is_pressed: print("Engine Power 25%") keyboard.press(Key.f1) sleep(0.1) keyboard.release(Key.f1) elif F2.is_pressed: print("Engine Power 50%") keyboard.press(Key.f2) sleep(0.1) keyboard.release(Key.f2) elif F3.is_pressed: print("Engine Power 75%") keyboard.press(Key.f3) sleep(0.1) keyboard.release(Key.f3) elif F4.is_pressed: print("Engine Power 100%") keyboard.press(Key.f4) sleep(0.1) keyboard.release(Key.f4) elif F5.is_pressed: print("Flaps Position 1") keyboard.press(Key.f5) sleep(0.1) keyboard.release(Key.f5) elif F6.is_pressed: print("Flaps Position 2") keyboard.press(Key.f6) sleep(0.1) keyboard.release(Key.f6) elif F7.is_pressed: print("Flaps Position 3") keyboard.press(Key.f7) sleep(0.1) keyboard.release(Key.f7) elif F8.is_pressed: print("Flaps Position 4") keyboard.press(Key.f8) sleep(0.1) keyboard.release(Key.f8) elif Gear.is_pressed: print("Gear Toggle") keyboard.press("g") sleep(0.1) keyboard.release("g") elif View.is_pressed: print("View Toggle") keyboard.press("s") sleep(0.1) keyboard.release("s") sleep(0.1) else:
print("No buttons are pressed")