Управление Arduino-роботом через Firmata и геймпад Xbox One
Компоненты и материалы
| Геймпад Xbox One + беспроводной адаптер для Windows | 1 шт. |
| Bluetooth-модуль (HC-05/HC-06 или BlueSMiRF Silver) | 1 шт. |
| Arduino UNO | 1 шт. |
Приложения и сервисы
- Windows 10 IoT Core / UWP-приложение (посредник между Firmata и геймпадом)
О проекте
Куплен дешёвый набор робота-платформы (шасси, 2 мотора-редуктора, Arduino Uno, драйвер L298N, шилд). Изначально для автономной работы, но задача — ручное управление с геймпада Xbox One через Firmata.
Сборка механики
Инструкция на китайском, но интуитивно понятна. Два держателя батареек: один для Arduino, второй (9В) для моторов через L298N. Общий GND обязателен.
Подключение моторов к L298N
- ENA → D10 (PWM), IN1 → D9, IN2 → D8 — левый мотор;
- ENB → D5 (PWM), IN3 → D7, IN4 → D6 — правый мотор;
- Питание моторов 9В, общий GND с Arduino;
- Джампер питания логики (5В) не снимать (питание < 12В).
Направление: IN1/IN2 (или IN3/IN4) — LOW/LOW = стоп, HIGH/LOW = вперёд, LOW/HIGH = назад. Скорость — PWM на ENA/ENB (0–255).
Bluetooth
HC-06: RX↔TX (перекрёстно), 5В, GND от Arduino.
Firmata на Arduino
Загружаем стандартный пример StandardFirmata (из Arduino IDE). Baud rate понижен до 9600 для стабильности HC-06.
Тест через Windows Remote Arduino Experience
- Сопрячьте HC-06 с Windows.
- В приложении выберите COM-порт Bluetooth.
- PWM: включите пин 5, значение 128.
- Digital: переключите пин 6 на HIGH — мотор завращается.
- Меняйте направление (пин 6 LOW, пин 7 HIGH) и скорость.
UWP-приложение — связующее звено
Приложение на C# (XAML) подключается к Arduino через Firmata по Bluetooth, опрашивает геймпад Xbox One и преобразует стики в команды моторам.
Логика танкового управления: левый стик — левый мотор, правый — правый. Вверх = вперёд, вниз = назад. Мёртвая зона 0.15. Макс. PWM ограничен 75% (192).
Ключевые моменты кода:
- Пакет NuGet
Microsoft.Maker.Firmata; - Bluetooth capability в манифесте;
- Методы
ArduinoDigitalWriteиArduinoAnalogWriteс фильтрацией дубликатов (защита от флуда в шине); - Цикл опроса геймпада каждые 3 мс.
Код
XAML (MainPage.xaml)
<StackPanel Orientation="Vertical">
<Button Name="btnStart" Click="btnStart_Click" FontSize="50" Width="400" Content="Start" />
<Button Name="btnController" Content="Controller" FontSize="50" Width="400" IsEnabled="False" Click="btnController_Click" />
<TextBlock Name="tbRead" FontSize="20" Foreground="Gray" />
</StackPanel>
C# (MainPage.xaml.cs) — основные фрагменты
private BluetoothSerial _bluetooth;
private RemoteDevice _arduino;
private UwpFirmata _firmata;
private Gamepad _gamepad;
private double _speedLimit = 0.75, _actionPoint = 0.15;
// Пины: Left PWM=5, Dir=6/7; Right PWM=10, Dir=9/8
// ... инициализация Bluetooth, Firmata, события геймпада ...
private async void btnController_Click(...) {
DisableEnableButtons(false);
while (true) {
await Task.Delay(3);
if (_gamepad == null) continue;
var reading = _gamepad.GetCurrentReading();
// Левый мотор
if (Math.Abs(reading.LeftThumbstickY) < _actionPoint) { StopLeft(); }
else if (reading.LeftThumbstickY >= _actionPoint) { ForwardLeft(reading.LeftThumbstickY); }
else { BackwardLeft(-reading.LeftThumbstickY); }
// Правый мотор — аналогично
}
}
private void ArduinoDigitalWrite(byte port, PinState state) { /* ignore duplicates */ }
private void ArduinoAnalogWrite(byte port, ushort value) { /* ignore duplicates */ }
Схемы
Схема подключения L298N, Arduino, Bluetooth и батареек (см. фото в статье).
Производственный процесс
- Надежная система учета рабочего времени на Arduino с RFID и Python
- Универсальный Android-пульт на Arduino, 1Sheeld и ИК-управлении
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- Удаленное IoT-управление самодельной манипулятором
- Точное измерение частоты и коэффициента заполнения на Arduino UNO
- Измерение расстояния в реальном времени: Ардуино-сонар с визуализацией в Processing
- Бесшовное управление яркостью светодиодов с помощью Bolt IoT и Arduino UNO
- Умная робо-рука на Arduino: простое DIY-руководство
- Управление телевизором через Alexa и Arduino IoT Cloud — пошаговое руководство
- Сборка компактного FM-радио на Arduino Nano и RDA5807M