如何将Arduino连接的触摸屏数据发送至电脑?UE5赛车模拟器仪表盘开发
Arduino触摸屏数据传输到电脑(记录/显示)
1. 硬件准备与接线
- 确认触摸屏(如ILI9341/XPT2046)与Arduino的连接:按模块手册完成SPI/I2C引脚接线(CS、DC、MOSI、CLK等引脚对应Arduino的SPI引脚)。
2. Arduino端代码(读取触摸数据并发送)
以XPT2046触摸屏为例,使用XPT2046_Touchscreen库:
#include <XPT2046_Touchscreen.h> #include <SPI.h> #define CS_PIN 10 XPT2046_Touchscreen ts(CS_PIN); void setup() { Serial.begin(115200); ts.begin(); } void loop() { if (ts.touched()) { TS_Point p = ts.getPoint(); // 输出校准后的触摸坐标(需先完成触摸屏校准) Serial.print("X:"); Serial.print(p.x); Serial.print(", Y:"); Serial.println(p.y); } delay(50); }
3. 电脑端记录/显示数据
方式1:Arduino串口监视器
- 打开Arduino IDE的串口监视器,设置对应波特率(115200),即可实时查看触摸坐标。
- 点击监视器右下角的「保存」按钮,可将数据导出为TXT文件。
方式2:Python脚本(实时显示+保存到CSV)
使用pyserial库,先安装:pip install pyserial
import serial import csv from datetime import datetime ser = serial.Serial('COM3', 115200, timeout=1) # 替换为你的串口端口 with open('touch_data.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['Timestamp', 'X', 'Y']) while True: line = ser.readline().decode('utf-8').strip() if line: if 'X:' in line and 'Y:' in line: x = line.split(',')[0].split(':')[1] y = line.split(',')[1].split(':')[1] now = datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(f"[{now}] X:{x}, Y:{y}") writer.writerow([now, x, y])
适配UE5赛车模拟器的Arduino触摸屏连接与数据传输
1. 核心方案选择
有线:USB串口(推荐,稳定低延迟)
适合固定安装的模拟器,直接用USB线连接Arduino与PC。
无线:蓝牙/WiFi
- 蓝牙:用HC-05模块连接Arduino,PC端配对后视为虚拟串口。
- WiFi:用ESP32(自带WiFi)作为Arduino主控,与PC建立TCP/UDP连接。
2. 触摸屏操作数据传到UE5
Arduino端代码(发送触摸指令)
假设触摸屏上有「加速」「刹车」「左转」「右转」四个按钮,读取触摸区域后发送对应指令:
#include <XPT2046_Touchscreen.h> #include <SPI.h> #define CS_PIN 10 XPT2046_Touchscreen ts(CS_PIN); // 定义按钮区域坐标(需根据触摸屏实际尺寸校准) #define ACCEL_MIN_X 200 #define ACCEL_MAX_X 300 #define ACCEL_MIN_Y 400 #define ACCEL_MAX_Y 480 void setup() { Serial.begin(115200); ts.begin(); } void loop() { if (ts.touched()) { TS_Point p = ts.getPoint(); // 校准后的坐标判断,假设已完成触摸屏校准 if (p.x >= ACCEL_MIN_X && p.x <= ACCEL_MAX_X && p.y >= ACCEL_MIN_Y && p.y <= ACCEL_MAX_Y) { Serial.println("ACCEL"); // 发送加速指令 delay(200); // 防重复触发 } // 同理添加刹车、左转、右转的判断与指令发送 } delay(50); }
UE5端接收数据(蓝图实现)
- 安装支持串口的插件(如
Serial Communication Plugin),或使用C++编写串口逻辑。 - 蓝图步骤:
- 用
Open Serial Port节点打开对应串口(波特率115200)。 - 用
Read Serial Buffer节点监听串口数据。 - 解析收到的字符串,比如判断是否为"ACCEL",触发赛车的加速逻辑。
- 用
3. UE5赛车数据传到Arduino触摸屏显示
UE5端发送数据
在蓝图中,获取赛车的速度、转速等数据,编码为统一格式后发送:
// 示例蓝图逻辑: - 获取赛车速度值(如120km/h) - 拼接字符串:"SPEED:" + 速度值 + ",RPM:" + 转速值 - 用`Write Serial String`节点发送到串口
Arduino端接收并显示
#include <XPT2046_Touchscreen.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_ILI9341.h> #define TFT_CS 9 #define TFT_DC 8 Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); XPT2046_Touchscreen ts(10); int speed = 0; int rpm = 0; void setup() { Serial.begin(115200); tft.begin(); tft.setRotation(3); tft.fillScreen(ILI9341_BLACK); } void loop() { // 读取UE5发送的数据 if (Serial.available() > 0) { String data = Serial.readStringUntil('\n'); // 解析数据,格式示例:"SPEED:120,RPM:6000" if (data.indexOf("SPEED:") != -1) { speed = data.substring(data.indexOf("SPEED:")+6, data.indexOf(",")).toInt(); } if (data.indexOf("RPM:") != -1) { rpm = data.substring(data.indexOf("RPM:")+4).toInt(); } // 更新触摸屏显示 tft.fillRect(0, 0, 320, 50, ILI9341_BLACK); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(2); tft.setCursor(10, 10); tft.print("Speed: "); tft.print(speed); tft.print(" km/h"); tft.setCursor(10, 30); tft.print("RPM: "); tft.print(rpm); } }
关键注意事项
- 确保Arduino与PC/UE5的串口波特率完全一致。
- 触摸屏需先完成校准,确保坐标判断准确(多数触摸库自带校准函数)。
- 复杂数据建议用JSON格式传输,避免解析混乱。
内容的提问来源于stack exchange,提问作者Alvi Rahman
相关产品推荐
相关产品推荐

