
↑代り映えしない絵柄です せめてRaspberry Pi PicoにかえてRP2040₋Zeroを使用
USB接続、0.96インチOLED
USB接続にはバッチファイルがあるとよい
■USB接続が通常―Wi-Fi接続との違い
Wi-Fi接続は楽で良いのですが、リアルなコクピットを作る場合は有線接続が通常かと思われますので、パソコンにRaspberry Pi PicoをUSB接続してOLED表示を試すことにしました。
USBはシリアル通信ですが、FlightGearは対応していませんから、パソコンでチェンジするPC-ブリッジプログラムが間に1枚かます必要があります。
【構成の比較】
| USB接続 |
Wi-Fi接続 |
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) |
|

↑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の助けを借りて作成しています。
《関連》