IoT 集成:基于 Windows 10 UWP 应用的 Arduino 远程控制
项目概述
利用 Windows Remote Arduino 库,开发通用 Windows 平台(UWP)应用,经蓝牙与运行 Standard Firmata 的 Arduino UNO 通信,实现 GPIO 输入/输出、模拟输入读取、PWM 输出等功能。目标平台覆盖 Win 10 桌面、手机及 Raspberry Pi 2(Win 10 IoT,进行中)。本文详细记录从蓝牙配对、Firmata 修改、库编译、UWP 工程创建、UI 设计到多目标部署的完整流程。
硬件准备
- Arduino UNO ×1
- SparkFun BlueSMiRF Silver/Gold 蓝牙模块 ×1(TTL UART,波特率 115200,硬件流控)
- 原型扩展板、排针、杜邦线等
关键步骤速览
1. 蓝牙模块配置
- 默认串口参数:115200 8N1、硬件流控、SPP 名
FireFly-XXXX、配对码 1234 - 通过 FTDI 基板用串口终端配置,或短接 PIO4 引脚三次恢复出厂
- 模块焊接排针插入扩展板,RTS 接 CTS 解决流控
2. Firmata 固件修改
Arduino IDE 打开 StandardFirmata,将波特率 57600 全局替换为 115200,上传至 UNO(上传时需拔下蓝牙模块,避免占用 RX/TX)。
3. 编译 Windows Remote Arduino 库
- 克隆仓库:
git clone --recursive https://github.com/ms-iot/windows-remote-arduino-samples.git - 使用 VS 2015 打开
Microsoft.Maker.win10解决方案,分别生成 Win32/ARM/x64 配置下的三层库:Serial、Firmata、RemoteWiring
4. 创建 UWP 应用工程
- 新建 C# 空白 UWP 项目,单一项目多目标编译
Package.appxmanifest声明bluetooth.rfcomm设备能力- 引用上述三层库输出的 .dll
- XAML 界面:连接/断开按钮、LED 开/关按钮、进度环、推钮状态文本框、模拟输入进度条、软件 LED 椭圆
5. 核心 C# 代码模式
// 连接建立回调(UI 线程启用按钮、设置引脚模式)
private void OnConnectionEstablished() {
Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
OnButton.IsEnabled = OffButton.IsEnabled = true;
arduino.pinMode(LED_PIN, PinMode.OUTPUT);
arduino.pinMode(PB_PIN, PinMode.INPUT);
arduino.pinMode(ANALOG_PIN, PinMode.ANALOG);
progressRing.IsActive = false;
});
}
// 按钮事件:数字输出
private void OnButton_Click(...) => arduino.digitalWrite(LED_PIN, PinState.HIGH);
private void OffButton_Click(...) => arduino.digitalWrite(LED_PIN, PinState.LOW);
// 连接/断开按钮
private void ConnectButton_Click(...) => bluetooth.begin(115200, SerialConfig.SERIAL_8N1);
private void DisconnectButton_Click() => bluetooth.end();
// 数字输入:事件驱动替代轮询
arduino.DigitalPinUpdated += Arduino_DigitalPinUpdated;
private async void Arduino_DigitalPinUpdated(byte pin, PinState value) {
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
if (pin == PB_PIN) UpdatePushbuttonUI(value);
});
}
// 模拟输入:事件驱动
arduino.AnalogPinUpdated += Arduino_AnalogPinUpdated;
private async void Arduino_AnalogPinUpdated(byte pin, ushort value) {
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
if (pin == ANALOG_PIN - 14) analogBar.Value = value; // 注意:事件参数为模拟索引 0~5
});
}
6. 多目标部署测试
- 桌面:x86/x64 本地调试
- 手机:ARM 配置,USB 部署
- Raspberry Pi 2:远程调试器 + IP 地址部署(蓝牙支持尚在进行中)
进阶功能预留
PWM 模拟输出(引脚 3,5,6,9,10,11)留待读者实现:pinMode(PWM_PIN, PinMode.PWM) + analogWrite(byte, ushort 0~255),配合滑块控制 LED 亮度。
资源链接
- 博客详解:Windows 10 IoT & Remote Arduino
- 示例代码包:
WindowsRemoteArduino_Win10.zip(项目附件) - 原理图见项目附件(Schematics 部分)
制造工艺
- 树莓派 LIRC 通用红外遥控器专业构建指南
- Windows IoT + 树莓派打造人脸识别智能门锁
- Windows 10 IoT Core 上基于 SHT15 的精准温湿度监测
- 树莓派 3 Model B+ 安装 Windows 10 IoT Core 完整步骤指南
- 在树莓派 3 上扩展 GoPiGo v2 的 Windows 10 IoT Core 应用
- 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
- Arduino UNO 驱动 16x2 LCD 实现动画与小游戏
- 智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
- Python 3 控制 Arduino UNO - 串口通信点亮内置 LED 入门教程
- 远程供应链团队必备:高效协作的 App 与设备指南
- 掌握物联网 PCB 设计:综合指南
- 思科推出云管理物联网监控方案服务IT与OT环境