Не удается открыть (GPIO) контакт 6 в Windows 10 Iot Core - PullRequest
1 голос
/ 26 мая 2019

Я хочу, чтобы красный светодиод моего RainbowHAT загорелся. Это требует, чтобы я послал высокий сигнал на вывод BCM 6.

(Shortend) Источник

Константа класса:

private static readonly int GPIO_NUMBER_RED = 22;

Вызывается в конструкторе:

    var gpioController = GpioController.GetDefault();

    redPin = gpioController.OpenPin(GPIO_NUMBER_RED);
    redPin.Write(GpioPinValue.High);
    redPin.SetDriveMode(GpioPinDriveMode.Output);

Я попробовал значения 6 (BCM), 31 (Номер контакта) и 22 (Номер контакта проводки) для моей глобальной константы класса GPIO_NUMBER_RED, но всегда получаю ошибку:

    WinRT information: Pin ' is not available. It is reserved by the system or in use for another function.

Расположение выводов

https://pinout.xyz/pinout/rainbow_hat

Полный источник

GitHub

Информация о пакете

    <Capabilities>
        <Capability Name="internetClient" />
        <DeviceCapability Name="lowLevel"/>
    </Capabilities>

Я также перезапустил Pi, чтобы «сбросить», может быть, другое приложение, которое получает доступ к этому Пину - безуспешно.

Ответы [ 3 ]

0 голосов
/ 29 мая 2019

Я скачал репо и просмотр кода.Я не уверен, почему вам нужно добавить метод Init в конструкторе в MainPageViewModel.Но не рекомендуется добавлять экземпляр синглтона в метод конструктора модели, так как модель используется для привязки к просмотру для отображения данных.Когда вы повторно используете ресурс булавки GPIO, вы должны освободить и разместить его на другой странице.Кроме того, GpioPin следует утилизировать вручную, когда вам не нужно использовать.Вы можете попытаться переместить метод Init в конструкторе RainbowHAT, как показано в следующем коде.

RainbowHAT.cs (обновление)

    /// <summary>
    /// Private singelton instance.
    /// </summary>
    private static RainbowHAT instance;

    /// <summary>
    /// Default instance of RainbowHAT.
    /// </summary>
    public static RainbowHAT Default
    {
        get
        {
            if (instance == null)
            {
                instance = new RainbowHAT();
            }

            return instance;
        }
    }

    private RainbowHAT()
    {
        gpioController = GpioController.GetDefault();

        // Ensure that we have a valid gpio connection
        if (gpioController == null)
        {
            throw new OperationCanceledException("Operation canceled due missing GPIO controller");
        }

        Init();
    }


    public void PerformAction(RainbowHATAction action)
    {
        switch(action)
        {
            case RainbowHATAction.TurnOnRed:
                redPin.Write(GpioPinValue.High);
                break;

            case RainbowHATAction.TurnOffRed:
                redPin.Write(GpioPinValue.Low);
                break;

            case RainbowHATAction.LEDsOn:
                apa102.TurnOn();
                break;

            case RainbowHATAction.LEDsOff:
                apa102.TurnOff();
                break;

            default:
                break;
        }
    }

MainPageViewModel.cs

    public MainPageViewModel()
    {
        // Setup timer.
        ThreadPoolTimer.CreatePeriodicTimer
            (ClockTimer_Tick,
            TimeSpan.FromSeconds(1)
       );

        // Setup callback
        rainbowHAT.CaptiveButtonPressed += CaptiveButtonPressed;
    }
0 голосов
/ 29 мая 2019

Solution # 2

После того, как @ michaelxu-msft указал, что я пропустил, использовал шаблон Singelton, я удалил его и вуаля, теперь я могу вызвать Init из моегоКонструктор.Я должен выяснить, почему.

0 голосов
/ 26 мая 2019

Решение

Если вызывать не gpioController в конструкторе, а в другом методе, который будет вызываться после инициализации, все работает нормально.

Теперь, вопрос в том, почему это невозможно сделать в init?

...