Integración IoT: Control Remoto de Arduino mediante Apps UWP Windows 10
Componentes y suministros
| Arduino UNO | ×1 |
| Módem Bluetooth SparkFun BlueSMiRF Silver (usé versión Gold) | ×1 |
Sobre el proyecto
Nota: Ver actualizaciones en comentarios al final.
Una app Windows 10 UWP construida sobre la librería Remote-Wiring permite interactuar con un Arduino ejecutando Firmata. Se desarrolla una app similar al ejemplo "Blinky" de Windows Remote Arduino, pero con funciones añadidas: GPIO (entrada Y salida) y E/S analógica. Funcionalmente igual a la versión Windows 8.1 del blog previo, pero desde contexto Universal Windows Platform (UWP). Objetivos: Windows 10 escritorio, Windows 10 Phone y Raspberry Pi 2 (Windows 10 IoT) - este último en progreso.
Detalles en mi blog: embedded101.com. Ejemplo "Blinky" original: ms-iot.github.io.
Apps Universales vs Apps Universal Windows Platform
Las Universal Apps (UA) alcanzaron madurez en Windows 8.1: mismo solution para escritorio Intel, Surface ARM y Windows Phone ARM, compartiendo código (event handlers, cómputo, datos). XAML específico por target. Se compilaban subproyectos por separado.
Con paradigma "One Windows" en Windows 10, mismo código (incluyendo XAML) para todos los targets. Un solo proyecto, recompilado para cada target. Nombre nuevo: Universal Windows Platform (UWP) apps.
Todas las plataformas Windows 10 soportan UWP. Hay SDKs de extensión por plataforma (IoT: GPIO, I2C, SPI; Mobile: telefonía, etc.). UWP proporciona capa API base garantizada.
[1] Configurar comunicación Bluetooth con Arduino
Omitir si ya hecho en actividad Win 8.1.
USB o Bluetooth para comunicación Firmata. En Windows 10 ambos; en 8.1 solo Bluetooth. Usaremos Bluetooth. Usé SparkFun Bluetooth Mate Gold (alcance 100m vs 10m Silver; handshaking por defecto distinto). Ambos tienen UART TTL para configurar modo y comunicar con puerto serie Arduino.
Configuración por defecto UART TTL:
- Baud rate: 115,200
- 8 bits, sin paridad, 1 bit stop
- Control de flujo por hardware habilitado (en Silver: None)
- Perfil Puerto Serie (SPP): FireFly-WXYZ (WXYZ = últimos 4 dígitos MAC BT)
- Clave: 1234
Guarda hasta 8 emparejamientos. Documentación: rn-bluetooth-um.pdf.
Firmata usa 57600 baudios; cambiamos Firmata a 115200 (más fácil). Control de flujo hardware se maneja conectando RTS a CTS.
Monté socket para módulo Bluetooth en Proto Shield. Header 6 pines en pines UART TTL, doblados 90° para enchufar verticalmente. Cable a PIO6 (realmente PIO4) para reset de fábrica.
[2] Configurar Firmata
Omitir si ya hecho.
Importante: Pines UART 0 y 1 del Arduino Uno no disponibles al programar por USB. Desconectar módulo Bluetooth al programar.
- Crear nuevo sketch Standard Firmata en Arduino IDE.
- Buscar "57600" y reemplazar por "115200". Guardar como "Firmata_115200". Programar Uno. Listo.
[3] Configurar pila software Universal App Firmata
Ligeramente distinto a Win 8.1.
Pila de 3 capas:
- Remote-Wiring API: propiedades, métodos, eventos alto nivel (GPIO, etc.). Habla protocolo Firmata.
- Firmata: comunica hacia abajo vía protocolo serie.
- Serial: capas de transporte Bluetooth y USB-Serie (USB no en Win 8.1).
Fuentes:
Ambas contienen versiones Win 8.1 y Win 10. Usé Visual Studio 2015 RC.
- Clonar repositorio (no descargar ZIP):
git clone --recursive https://github.com/ms-iot/windows-remote-arduino-samples.git - Estructura:
windows-remote-arduino-samples/remote-wiring/Microsoft.Maker.win10/source(necesario para Win 10). - Abrir solution en
Microsoft.Maker.win10. - Compilar para Win32, ARM (y x64 si máquina 64-bit). 3 builds (3 capas).
[4] Crear app UWP HW LED
Atajo para quienes hicieron actividad Win 8.1 previo.
Versión inicial: botón software enciende LED hardware, otro lo apaga. LED en GPIO pin 5.
- Añadir nuevo proyecto C# Windows Blank Universal App a la solution (NOTA: solo UN proyecto UWP, mismo XAML y C# para desktop y mobile; diferencia en compilación). Nombre:
wrauwp. - En
package.appmanifest(ver código, no GUI), añadir capacidades Bluetooth e Internet:
<Capabilities>
<Capability Name="internetClient" />
<DeviceCapability Name="bluetooth.rfcomm">
<Device Id="any">
<Function Type="name:serialPort"/>
</Device>
</DeviceCapability>
</Capabilities>
- Referenciar las 3 capas: Firmata, RemoteWiring, Serial.
- Atajo: Si ya hiciste Win 8.1, copiar XAML grid de ese proyecto a
MainPage.xamly saltar a pruebas.
Para los que continúan:
- Modificar XAML Grid UI: dos botones (On/Off) deshabilitados inicialmente.
- En
MainPage.csdeclaraciones:BluetoothSerial bluetooth; RemoteDevice arduino; const int LED_PIN = 5; - En constructor:
bluetooth = new BluetoothSerial("FireFly-748B"); arduino = new RemoteDevice(bluetooth); bluetooth.ConnectionEstablished += OnConnectionEstablished;(reemplazar SPP por el tuyo). - Implementar
OnConnectionEstablished: habilitar botones en hilo UI yarduino.pinMode(LED_PIN, PinMode.OUTPUT); - Añadir handlers botones:
OnButton_Click → arduino.digitalWrite(5, PinState.HIGH); OffButton_Click → arduino.digitalWrite(5, PinState.LOW); - Compilar prueba en x86, x64, ARM.
[5] Desplegar y probar apps universales
Probar en escritorio
- Proyecto app como Startup.
- Target x86, Local Machine. Rebuild.
- Conectar LED hardware a Arduino Pin 5 (con GND, VCC, resistencia).
- Encender Arduino, emparejar Bluetooth con PC (clave 1234).
- Ejecutar app. Permitir conexión Bluetooth. Probar funcionalidad. Depurar con breakpoints.
- Repetir para x64.
- Apagar Bluetooth en PC.
Probar en Windows 10 Phone
- Encender teléfono, Settings/Bluetooth ON, emparejar módulo (1234).
- Target ARM, Device. Rebuild.
- Conectar teléfono por USB al PC y desplegar app.
Probar en Raspberry Pi 2 (EN PROGRESO)
- Remote debugger ya instalado/activo en RPI2 con Win 10 IoT.
- Obtener IP RPI2 (ej. Windows IoT Core Watcher).
- Propiedades proyecto → Debug: Target Remote Machine, No authentication, IP address.
- Rebuild y desplegar en RPI2.
Problema actual: Bluetooth no soportado en RPI2 aún. Dejar comentarios si tenéis ideas/éxito. Actualizaré cuando avance.
[6] Mejorar UI
Añadir botones Connect/Disconnect y ProgressRing.
- Modificar XAML Grid: 4 botones (Connect, Off, On, Disconnect) + ProgressRing.
- En
OnConnectionEstablished: desactivar ProgressRing. - Handlers nuevos botones:
ConnectButton_Click → bluetooth.begin(115200, SerialConfig.SERIAL_8N1);mostrar ProgressRing.DisconnectButton_Click → bluetooth.end();resetear botones. - Quitar
bluetooth.begindel constructor (ahora en Connect). - Gestión estado botones On/Off mutuamente excluyentes.
- Desplegar y probar en todos los targets.
[7] Añadir entrada pulsador
Entrada GPIO en Arduino Pin 6, estado mostrado en UI. Primero polling, luego evento DigitalPinChanged.
- Añadir TextBox en XAML para mostrar estado pulsador.
- Declarar
const int PB_PIN = 6;. EnOnConnectionEstablished:arduino.pinMode(PB_PIN, PinMode.INPUT); - Añadir
DispatcherTimerpolling 250ms. Handler lee pin y llamaPushbutton_Pressed. Pushbutton_Pressedactualiza TextBox solo si cambia valor.- Circuito pulsador (pull-down con resistencia) o usar board de desarrollo.
- Añadir LED simulado en UI (Ellipse) que cambia color (rojo/gris) según estado pulsador.
- Mejorar con evento DigitalPinUpdated: Comentar código timer. Añadir delegado evento en
OnConnectionEstablished. Handler asíncrono conDispatcher.RunAsyncpara actualizar UI desde hilo evento. - Compilar, desplegar, probar.
[8] Añadir entrada analógica
Barra de progreso en UI para mostrar nivel potenciómetro (pin A0 = pin 14).
- Añadir ProgressBar en XAML (Max 255, verde).
- Declarar
const int ANALOG_PIN = 14;. EnOnConnectionEstablished:arduino.pinMode(ANALOG_PIN, PinMode.ANALOG);(usar número pin real, no índice analógico). - En timer tick:
int PinValue = arduino.analogRead(ANALOG_PIN-14); analogBar.Value = PinValue;(índice analógico = pin - 14). - Compilar, probar variando potenciómetro.
- Versión event-driven: Comentar timer. Añadir handler
Arduino_AnalogPinUpdatedasíncrono con Dispatcher. Actualiza ProgressBar.
[9] Añadir salida PWM
Queda como ejercicio: implementar salida analógica PWM para atenuar LED via slider.
- Pines PWM: 3, 5, 6, 9, 10, 11
arduino.pinMode(PWM_PIN, PinMode.PWM)arduino.analogWrite(byte, ushort)(0-255)
Código
WindowsRemoteArduino_Win10.zip (C#) - Versión extendida de "Blinky": Entrada, Salida, Entrada Analógica, UI mejorada. Solo descarga.
Esquemáticos

Proceso de manufactura
- Construya un Mando Universal Profesional para Raspberry Pi con LIRC
- Construye una Puerta con Reconocimiento Facial Segura usando Windows IoT y Raspberry Pi
- Monitorización Precisa de Temperatura y Humedad con SHT15 en Windows 10 IoT Core
- Instalación de Windows 10 IoT Core en Raspberry Pi 3 Model B+: Guía Paso a Paso
- Extensión de GoPiGo v2 en Windows 10 IoT Core para Raspberry Pi 3
- Mando universal Android con Arduino, 1Sheeld y control IR
- Crea Animaciones y Juegos en LCD 16×2 con Arduino UNO
- Construye un tarro inteligente IoT con ESP8266, Arduino y sensor ultrasónico: Monitorización en tiempo real
- Aplicaciones y Dispositivos Esenciales para Equipos de Cadena de Suministro Remotos
- Dominando el Diseño de PCB para Internet de las Cosas: Guía Completa
- Cisco lanza monitorización IoT gestionada en cloud para entornos IT y OT