查看: 176|回复: 0

[未解决] 萌新求助 关于Windows remote arduino UWP app的问题

[复制链接]
  • TA的每日心情
    慵懒
    2019-11-29 21:33
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2019-11-22 11:31 | 显示全部楼层 |阅读模式
    前几天本人在网上看到了一篇关于用xbox one手柄控制arduino小车的文章https://www.hackster.io/svelde/control-arduino-rover-using-firmata-and-xbox-one-controller-70c51a?ref=user&ref_id=27558&offset=0,就也想把闲置的手柄利用起来,于是按部就班的给uno上载了standard firmata,也用网上的代码做了一个app,运行后点击连接总是提示无法找到蓝牙设备,希望得到大佬们的帮助。
    UWP app代码:
    using Microsoft.Maker.Firmata;
    using Microsoft.Maker.RemoteWiring;
    using Microsoft.Maker.Serial;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    using Windows.Gaming.Input;
    using Windows.UI.Core;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;


    namespace car_controller
    {
        /// <summary>
        /// 可用于自身或导航至 Frame 内部的空白页。
        /// </summary>
        public sealed partial class MainPage : Page
        {
            private BluetoothSerial _bluetooth;
            private RemoteDevice _arduino;

            private UwpFirmata _firmata = null;
            private Gamepad _Gamepad = null;
            // We never supply a PWM of more then 255 * 0,75
            private double _SpeedLimit = 0.75;
            // values below this absolte value stop the rover
            private double _ActionPoint = 0.15;

            private byte _LeftForward = 6;
            private byte _LeftBackward = 7;
            private byte _LeftValue = 5;
            private byte _RightForward = 9;
            private byte _RightBackward = 8;
            private byte _RightValue = 10;
            double sldrLeftSpeed;
            ushort LeftSpeed;
            double sldrRightSpeed;
            ushort RightSpeed;

            private Dictionary<byte, PinState> _CurrentPinStates
                                     = new Dictionary<byte, PinState>();

            private Dictionary<byte, ushort> _CurrentSpeedValues
                                       = new Dictionary<byte, ushort>();

            public MainPage()
            {
                this.InitializeComponent();
            }

            private void btnStart_Click(object sender,
                                        RoutedEventArgs e)
            {
                btnStart.IsEnabled = false;

                Gamepad.GamepadAdded += Gamepad_GamepadAdded;
                Gamepad.GamepadRemoved += Gamepad_GamepadRemoved;

                _bluetooth = new BluetoothSerial("JDY-30");
                _bluetooth.ConnectionLost += BluetoothConnectionLost;
                _bluetooth.ConnectionFailed += BluetoothConnectionFailed;
                _bluetooth.ConnectionEstablished +=
                                               OnConnectionEstablished;

                _firmata = new UwpFirmata();
                _arduino = new RemoteDevice(_firmata);
                _firmata.begin(_bluetooth);

                _bluetooth.begin(9600, SerialConfig.SERIAL_8N1);

                _arduino.DeviceReady += ArduinoDeviceReady;
            }

            private async void BluetoothConnectionLost(string message)
            {
                await Dispatcher.RunAsync(
                  CoreDispatcherPriority.Normal, () =>
                  {
                      tbRead.Text = "ConnectionLost" + message;
                      btnStart.IsEnabled = true;
                  });
            }

            private async void BluetoothConnectionFailed(string message)
            {
                await Dispatcher.RunAsync(
                  CoreDispatcherPriority.Normal, () =>
                  {
                      tbRead.Text = "ConnectionFailed" + message;
                      btnStart.IsEnabled = true;
                  });
            }

            private async void ArduinoDeviceReady()
            {
                await Dispatcher.RunAsync(
                  CoreDispatcherPriority.Normal, () =>
                  {
                      tbRead.Text = "Device Ready";
                  });
            }

            private void OnConnectionEstablished()
            {
                var action = Dispatcher.RunAsync(
                  CoreDispatcherPriority.Normal,
                  new DispatchedHandler(() =>
                  {
                      DisableEnableButtons(true);

                      ArduinoDigitalWrite(_LeftForward, PinState.LOW);
                      ArduinoDigitalWrite(_LeftBackward, PinState.LOW);
                      ArduinoDigitalWrite(_RightBackward, PinState.LOW);
                      ArduinoDigitalWrite(_RightForward, PinState.LOW);
                  }));
            }

            private void DisableEnableButtons(bool enabled)
            {
                // Disable all buttons. Otherwise
                //  the 'A' will press the one focussed.
                btnController.IsEnabled = enabled;
                btnStart.IsEnabled = enabled;
            }

            private async void Gamepad_GamepadRemoved(
                                             object sender, Gamepad e)
            {
                _Gamepad = null;

                await Dispatcher.RunAsync(
                  CoreDispatcherPriority.Normal, () =>
                  {
                      tbRead.Text = "Controller removed";
                  });
            }
            private async void Gamepad_GamepadAdded(
                                             object sender, Gamepad e)
            {
                _Gamepad = e;

                await Dispatcher.RunAsync(
                  CoreDispatcherPriority.Normal, () =>
                  {
                      tbRead.Text = "Controller added";
                  });
            }

            private async void btnController_Click(object sender,
                                                   RoutedEventArgs e)
            {
                DisableEnableButtons(false);

                while (true)
                {
                    await Task.Delay(TimeSpan.FromMilliseconds(3));

                    if (_Gamepad == null)
                    {
                        continue;
                    }

                    // Get the current state
                    var reading = _Gamepad.GetCurrentReading();

                    if (Math.Abs(reading.LeftThumbstickY) < _ActionPoint)
                    {
                        ArduinoDigitalWrite(_LeftForward, PinState.LOW);
                        ArduinoDigitalWrite(_LeftBackward, PinState.LOW);
                        ArduinoAnalogWrite(_LeftValue, 0);
                    }
                    else if (reading.LeftThumbstickY >= _ActionPoint)
                    {
                        ArduinoDigitalWrite(_LeftForward, PinState.HIGH);
                        ArduinoDigitalWrite(_LeftBackward, PinState.LOW);
                        sldrLeftSpeed = 255 * Math.Abs(reading.LeftThumbstickY) * _SpeedLimit;
                        sldrLeftSpeed = Math.Truncate(sldrLeftSpeed);
                        LeftSpeed = (ushort)sldrLeftSpeed;
                        ArduinoAnalogWrite(_LeftValue,LeftSpeed);
                    }
                    else if (reading.LeftThumbstickY <= -_ActionPoint)
                    {
                        ArduinoDigitalWrite(_LeftForward, PinState.LOW);
                        ArduinoDigitalWrite(_LeftBackward, PinState.HIGH);
                        sldrLeftSpeed = 255 * Math.Abs(reading.LeftThumbstickY) * _SpeedLimit;
                        sldrLeftSpeed = Math.Truncate(sldrLeftSpeed);
                        LeftSpeed = (ushort)sldrLeftSpeed;
                        ArduinoAnalogWrite(_LeftValue, LeftSpeed);
                    }

                    if (Math.Abs(reading.RightThumbstickY) < _ActionPoint)
                    {
                        ArduinoDigitalWrite(_RightForward, PinState.LOW);
                        ArduinoDigitalWrite(_RightBackward, PinState.LOW);
                        ArduinoAnalogWrite(_RightValue,0);
                    }
                    else if (reading.RightThumbstickY >= _ActionPoint)
                    {
                        ArduinoDigitalWrite(_RightForward, PinState.HIGH);
                        ArduinoDigitalWrite(_RightBackward, PinState.LOW);
                        sldrRightSpeed = 255 * Math.Abs(reading.RightThumbstickY) * _SpeedLimit;
                        sldrRightSpeed = Math.Truncate(sldrRightSpeed);
                        RightSpeed = (ushort)sldrRightSpeed;
                        ArduinoAnalogWrite(_RightValue,RightSpeed);
                    }
                    else if (reading.RightThumbstickY <= -_ActionPoint)
                    {
                        ArduinoDigitalWrite(_RightForward, PinState.LOW);
                        ArduinoDigitalWrite(_RightBackward, PinState.HIGH);
                        sldrRightSpeed = 255 * Math.Abs(reading.RightThumbstickY) * _SpeedLimit;
                        sldrRightSpeed = Math.Truncate(sldrRightSpeed);
                        RightSpeed = (ushort)sldrRightSpeed;
                        ArduinoAnalogWrite(_RightValue, RightSpeed);
                    }
                }
            }

            private void ArduinoDigitalWrite(byte port, PinState state)
            {
                // ignore duplicate commands
                var exists = _CurrentPinStates.ContainsKey(port);

                if (!exists
                       || _CurrentPinStates[port] != state)
                {
                    _CurrentPinStates[port] = state;
                    _arduino.digitalWrite(port, state);
                }
            }
            private void ArduinoAnalogWrite(byte port, ushort value)
            {
                // ignore duplicate commands
                var exists = _CurrentSpeedValues.ContainsKey(port);

                if (!exists
                      || _CurrentSpeedValues[port] != value)
                {
                    _CurrentSpeedValues[port] = value;
                    _arduino.analogWrite(port, value);
                }
            }
        }
    }

    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    Blynk与m5stack basic以及uiflow的交互玩法
    Blynk与m5stack basic以及
    Blynk与m5stack basic以及uiflow的交互玩法 [准备工作我们假设玩家已经熟悉下面的准备
    [Arduino物联网开发实战2]数据反馈
    [Arduino物联网开发实战2]
    [md]上一篇:(https://www.arduino.cn/thread-83177-1-1.html) 除了控制设备外,blin
    用蓝牙串口模块传递的数据控制继电器开关的问题
    用蓝牙串口模块传递的数据
    我用hc08串口模块传进1(开)、0(关)。但每次按1的时候继电器指示灯只是闪烁一下,
    DIY3D打印激光雕刻机
    DIY3D打印激光雕刻机
    说到激光雕刻机,有人可能会想到,大型机器肆意切削金属,或者木片的大型机器,它们无
    【原创】 drawbot平面关节scara机械臂写字机 画画机器人直播...
    【原创】 drawbot平面关节
    这个项目上个月就在做了,结构和代码反反复复改了多次,加上自己又太忙,一直没来得及
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表