亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

自制 FlightGear 飞行模拟升降舵配平轮:Arduino Nano + Python UDP 桥接方案

项目动机

FlightGear 官方 Wiki 的串口通信教程已过时,无法直接将 Arduino 串口数据映射为模拟器属性。本项目提供一套「Arduino 采集电位器 → Python 脚本转发 UDP → FlightGear Generic Protocol 解析」的完整工程化方案,成本仅约 $15,体积如信用卡大小,适合桌面飞行模拟爱好者。

硬件清单

软件环境

电路连接

元件引脚Arduino 引脚备注
电位器中间抽头A6模拟输入,两端分别接 5V/GND
电位器两端并联 100µF—正极接抽头,负极接 GND,滤除抖动
OLED VCC5V
OLED GNDGND
OLED SDAA4硬件 I2C
OLED SCLA5

Arduino 固件要点

#include 
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);

const int POT_PIN = A6;
int p, w, m;          // 原始值、映射后配平值(-100~100)、仪表针角度(0~90)
u8g_uint_t needleAngle;

void setup() {
  Serial.begin(9600);
  u8g.setFont(u8g_font_chikita);
  u8g.setColorIndex(1);
}

void loop() {
  p = analogRead(POT_PIN);           // 0~1023
  w = map(p, 0, 1023, 100, -100);    // 配平值:向上+100,向下-100
  m = map(p, 0, 1023, 90, 0);        // 仪表针角度:0°~90°

  // 串口发送浮点数(每行一个值,Python 端按行读取)
  float val = (p - 512.0) / 512.0;   // -1.0 ~ +1.0
  Serial.println(val, 4);

  // OLED 绘制仪表盘
  needleAngle = (m < 45) ? m + 135 : m - 45;  // 几何修正
  u8g.firstPage();
  do { drawGauge(needleAngle); } while (u8g.nextPage());

  delay(10);  // 约 100Hz 采样率
}

Python 桥接脚本 arduinoElevatorTrim.py

#!/usr/bin/env python3
import serial, sys
from socket import *

HOST = "localhost"
PORT = 21567
ADDR = (HOST, PORT)
SERIAL_PORT = "COM4"   # Linux/Mac 通常为 /dev/ttyUSB0
BAUD = 9600

sock = socket(AF_INET, SOCK_DGRAM)
ser = serial.Serial(SERIAL_PORT, BAUD, timeout=1)
print(f"Listening on {SERIAL_PORT} -> UDP {ADDR}")

prev = ""
while True:
    line = ser.readline().decode().strip()
    if line and line != prev:
        sock.sendto(line.encode(), ADDR)
        prev = line

FlightGear 协议文件 arduinoElevatorTrim.xml

放入 <FlightGear根目录>/data/Protocol/ 目录:

<?xml version="1.0"?>
<PropertyList>
  <generic>
    <input>
      <line_separator>\n</line_separator>
      <var_separator>,</var_separator>
      <chunk>
        <name>Elevator trim</name>
        <node>/controls/flight/elevator-trim</node>
        <type>float</type>
      </chunk>
    </input>
  </generic>
</PropertyList>

启动流程

  1. 上传 Arduino 固件,打开串口监视器确认输出 -1.0000 ~ +1.0000 连续变化。
  2. 关闭串口监视器(释放 COM 口),运行 Python 脚本:
    python arduinoElevatorTrim.py
  3. 启动 FlightGear 时追加参数(无空格):
    --generic=socket,in,30,localhost,21567,udp,arduinoElevatorTrim
  4. 进入驾驶舱,观察升降舵配平指示器随电位器转动同步移动。

常见故障排查

资源链接

制造工艺

  1. Arduino 数字骰子:LCD 显示随机点数的电子骰子
  2. DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
  3. 模拟指针风格 POV 时钟:Arduino Nano + 17 LED + 霍尔传感器
  4. Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
  5. 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
  6. DIY Arduino 加湿器控制器:继电器安全控制高压电路
  7. Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
  8. DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
  9. Arduino + TEA5767 打造 FM 收音机:Nokia 5110 显频谱/信号强度/立体声
  10. Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里
  11. Arduino RGB 颜色混合器 – 分步制作教程
  12. 用 Arduino UNO 自制迷你钢琴 — 图文教程

现象原因对策
Python 报 PermissionError / FileNotFoundError串口被占用或端口名错误关闭 IDE 串口监视器;用 python -m serial.tools.list_ports 确认端口名
FlightGear 配平不动UDP 端口未监听 / 协议文件路径错用 netstat -an | findstr 21567 检查;确认 XML 在 Protocol 目录
旋转方向反了map() 映射区间顺序交换 map(p,0,1023,100,-100) 后两参数为 -100,100
OLED 显示乱码/不亮I2C 地址或驱动型号不匹配修改 U8GLIB_SSD1306_128X64 构造参数,参考 U8glib 例程