FlightGearのデータを外部表示させよう(2) | virt_flyのブログ

virt_flyのブログ

フライトシミュレーターソフトのFlightGearで仮想飛行を楽しむブログです。

 

FlightGearシミュレータとOLED表示

↑FlightGearの航空機の速度、高度、方位の変化がOLED上に刻々と示されていきます

OLED画面に速度・高度・方位

 

前回の当ブログでは、フライトシミュレーターであるFlightGearのデータを引き出して、Ambientへの送信にとりくみました。

 

FlightGearの飛行中の各計器の示す値をよく見えるようにしたいというのに、Ambientにグラフ表示させていてもしかたがありません。

 

今回は、とりあえずOLEDに数値表示ができないかを試すことにしました。

 

■構成

構成は次のようなものです。

 

 FlightGear

 ↓ UDP

 Wi-Fi

 ↓

 Rasopberry Pi Pico W

 ↓ I2C

 OLED

 

■必要なものと手順

 

注意事項やPythonの利用が前提という点は、前回同様です。

 

【ハード】

 

今回は、小型ののOLEDディスプレイに表示ということなので、機器の用意が必要になります。

 

・Raspberry Pi Pico W…Wi-Fi機能付きマイクロコントローラー

 

・OLEDディスプレイ…手持ちの0.96インチ4ピンI2C対応

 

・他…工作用にブレッドボード、ジャンパー線など

 

OLEDとPico Wとの配線は次の通り

 

OLED Pico W
VCC 3.3V(Pin 36)
GND GND(Pin 38など)
SCL GP1(Pin 2)
SDA GP0(Pin 1)

 

Raspberry Pi Pico WとOLEDでFlightGearの飛行データを表示

↑一部隠れていますが、ブレッドボードに組まれた回路

 

【ソフト】

 

・fgdata.xml

 

プロトコルを記述したこのxmlファイルについても、前回とまったく同じものを使います。省略しますので、前回を参照こと。このファイルを、FlightGearのデータファルダ内のProtocolサブフォルダに置くのも前回同様です。

 

・main.py

 

Pico Wに書き込むMicroPythonプログラム(main.py)は、Wi-Fi接続とUDP受信の設定を記述しています。Pico Wへの書き込みはThonnyが便利です。

 

import socket
import network
from machine import Pin, I2C
import ssd1306
import time

# WiFi
ssid = "Wi-Fiネットワーク名"
password = "パスワード"

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

while not wlan.isconnected():
  time.sleep(0.5)

print("IP:", wlan.ifconfig()[0])

# OLED
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

# UDP sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("0.0.0.0", 5501))

oled.fill(0)
oled.text("Waiting FG...", 0, 0)
oled.show()

while True:
  data, addr = sock.recvfrom(1024)
  text = data.decode().strip()
  values = text.split(",")

  if len(values) >= 3:
    spd = values[0]
    alt = values[1]
    hdg = values[2]

    oled.fill(0)
    oled.text("SPD {:>6}".format(spd), 0, 0)
    oled.text("ALT {:>6}".format(alt), 0, 16)
    oled.text("HDG {:>6}".format(hdg), 0, 32)
    oled.show()

 

・起動オプション

 

FlightGearの起動オプションには、送信先であるPico WのIPを記述します。

実行は、CMD(コマンドプロンプト)にて次の通り入力して行います。なお、path

や飛行機名、空港名、Pico WのIPは例です。

 

"C:\Program Files\FlightGear 2024.1\bin\fgfs.exe" ^
--fg-root="C:/Users/自分のフォルダ名/FlightGear/Downloads/fgdata_2024_1" ^
--fg-aircraft="C:/Users/自分のフォルダ名/FlightGear/Custom Aircraft" ^
--aircraft=F1M2 ^
--airport=RJBB ^
--runway=24L ^
--generic=socket,out,10,192.168.0.xxx,5501,udp,fgdata

 

ちなみに、Pico WのIPの確認は、Thonnyのシェルにて以下の通り入力し実行すれば、シェルに表示されます。

 

import network
wlan = network.WLAN(network.STA_IF)
wlan.ifconfig()

 

■リアルに変化するOLED画面

 

結果、OLED画面では流れるように数字が変化していきます。その数字はFlightGear画面のHUDの目盛りから読み取れるものとまさに一致しており正確です。

 

これはいいですね。もっと見やすく大きくて計器風のディスプレイをならべたら、フライトシミュレーターの実体化ができそうじゃありませんか。

 

 

《追記》

FlightGearの/protocolに置いたfgdata.xmlは、FlightGearのpropertyから目的の状態変数を取り出してUDPで送信するために書いたものです。速度と高度、方位を取り上げましたが、実際には速度には対気速度と対地速度、方位には磁方位と真方位の違いがあり、これはFlightGearでも同じ。今回fgdata.xmlには、試行錯誤の都合でgroundspeed-kt(対地速度)とtrue-heading-deg(真方位)を記述しました。気になる方は、当該箇所のそれぞれ2か所をairspeed-ktやheading-degに書き改めてください。