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

virt_flyのブログ

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

Raspberry Pi PicoとOLEDでPFD表示

↑代り映えしない絵柄です せめてRaspberry Pi PicoにかえてRP2040₋Zeroを使用

 

USB接続、0.96インチOLED

USB接続にはバッチファイルがあるとよい

 

■USB接続が通常―Wi-Fi接続との違い

 

Wi-Fi接続は楽で良いのですが、リアルなコクピットを作る場合は有線接続が通常かと思われますので、パソコンにRaspberry Pi PicoをUSB接続してOLED表示を試すことにしました。

 

USBはシリアル通信ですが、FlightGearは対応していませんから、パソコンでチェンジするPC-ブリッジプログラムが間に1枚かます必要があります。

 

【構成の比較】

 

Wi-Fi接続 USB接続
FlightGear
  ↓ UDP
PCブリッジ(Python)
  ↓ USB
Pico
  ↓
OLED
FlightGear
  ↓ UDP
Wi-Fi
  ↓
Rasopberry Pi Pico W
  ↓ I2C
OLED

 

■必要なものと手順

 

Pythonの利用が前提です。Raspberry Pi PicoはMicroPythonの使用が前提です。

 

【ハード】

 

・Raspberry Pi Pico、同互換機…マイクロコントローラーのRaspberry Pi Pico,ならびに互換機RP2400₋Zeroを使用

 

・OLEDディスプレイ…手持ちの0.96インチ4ピンI2C対応 ドライバSSD1306またはSSD1315

 

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

 

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

 

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

 

RP2040-ZeroでOLED表示

↑FlightGearが動くPCとUSB接続したRP2040₋ZeroでミニPFD

 

【ソフト】

 

・fgdata.xml

 

プロトコルを記述したこのfgdata.xmlファイルは、前回と同じもの。詳しくは、前回を参照のこと。このファイルを、FlightGearのデータファルダ内のProtocolサブフォルダに置く(C:/Users/virt_fly/FlightGear/Downloads/fgdata_2024_1/Protcol/fgdata.xml)のも同様です。


・main.py

 

Picoにインストールするmain.pyです。

 

import sys from machine import Pin, I2C
import ssd1306
import time
import math

# ---------- OLED ----------

WIDTH = 128
HEIGHT = 64

i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
oled = ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c)

speed = 0
alt = 0
heading = 0
pitch = 0
roll = 0

# ---------- 速度テープ ----------

def draw_speed_tape():

  center = int(speed/10)*10

  for i in range(-3,4):

    v = center + i*10
    y = 32 - i*8

    if 10 < y < 56:
      oled.text(str(v),0,y,1)

  oled.text(">",24,32,1)
  oled.text("SPD",8,56,1)

# ---------- 高度テープ ----------

def draw_alt_tape():

  center = int(alt/10)*10

  for i in range(-3,4):

    v = center + i*10
    y = 32 - i*8

    if 10 < y < 56:
      oled.text(str(v),96,y,1)

  oled.text("<",88,32,1)
  oled.text("ALT",88,56,1)

# ---------- 方位テープ ----------

def draw_heading():

  center = int(heading/10)*10

  for i in range(-6,7):

     h = (center + i*10) % 360
     x = 64 + i*10

     if 5 < x < 120:

       if h % 30 == 0:
         oled.text(str(h), x-6, 0, 1)

       else:
         oled.pixel(x,6,1)

  oled.text("^",62,10,1)
  oled.text("HDG",54,16,1)

# ---------- 水平儀 ----------

def draw_horizon():

  cx = 64
  cy = 36

  r = math.radians(-roll)

  length = 80

  x1 = int(cx - length*math.cos(r))
  y1 = int(cy - length*math.sin(r) + pitch)

  x2 = int(cx + length*math.cos(r))
  y2 = int(cy + length*math.sin(r) + pitch)

  oled.line(x1,y1,x2,y2,1)

  # 機体マーク
  oled.line(cx-6,cy,cx+6,cy,1)

# ---------- メインループ ----------

while True:

  try:

    line = sys.stdin.readline().strip()

    parts = line.split(",")

    speed = float(parts[0])
    alt = float(parts[1])
    heading = float(parts[2])
    pitch = float(parts[3])
    roll = float(parts[4])

  except:
    pass

  oled.fill(0)

  draw_heading()
  draw_speed_tape()
  draw_alt_tape()
  draw_horizon()

  oled.show()


・FlightGearの起動オプション

 

(起動はGUIに書き込んでOK)
 

--generic=socket,out,10,127.0.0.1,5501,udp,fgdata

 

・fg-pc_bridge.py

 

FlightGear側Pythonプログラムであるfg-pc_bridge.pyは、 C:/Users/virt_fly/desktopに置くのも楽です。なお、CMD(コマンドプロンプト)から起動してもよいのですが、FlightGearの起動と同時に自動起動するバッチファイルを用意した方が楽でしょう。次項に記します。

 

import socket
import serial

# PicoのCOMポート
ser = serial.Serial("COM10",115200)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("127.0.0.1",5501))

print("Bridge start")

while True:

  data, addr = sock.recvfrom(1024)

  ser.write(data)

 

※注意 PicoのCOMポートとfg-pc_bridge.pyで指定するCOMポートが一致しているかあらかじめ確認が大事です。Picoやその互換機によりCOMポートは異なるため、違っていればポート番号を書き改めることが必要です。

 
・start_fg.bat

 

バッチファイルです。C:/Users/virt_fly/desktopに置きます。このバッチファイルをダブルクリックすれば、FlightGearの起動と同時に先のパイソンプログラムfg-pc_bridge.pyも自動起動します。

 

@echo off
echo Checking FlightGear bridge...

tasklist | find /i "python.exe" | find /i "fg-pc_bridge.py" >nul

if %errorlevel%==0 (
  echo Bridge already running
) else (
  echo Starting bridge
  start /min python C:\Users\virt_fly\desktop\fg-pc_bridge.py
)

echo Starting FlightGear...

"C:\Program Files\FlightGear 2024.1\bin\fgfs.exe" ^
--fg-root="C:/Users/virt_fly/FlightGear/Downloads/fgdata_2024_1" ^
--fg-aircraft="C:/Users/virt_fly/FlightGear/Custom Aircraft" ^
--aircraft=F1M2 ^
--airport=RJBB ^
--runway=24L ^
--generic=socket,out,30,127.0.0.1,5501,udp,fgdata

 

 

※ここで示したプログラムはCopilotとChatGPTの助けを借りて作成しています。

 

 

《関連》