无法打开 Windows 10 Iot Core 中的 (GPIO) 引脚 6

Cannot open (GPIO) Pin 6 in Windows 10 Iot Core

我想让 RainbowHAT 的红色 LED 发光。这需要我向 BCM 6 引脚发送高信号。

(缩写)来源

Class常数:

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);

我为我的 class 全局常量 GPIO_NUMBER_RED 尝试了值 6(BCM)、31(引脚编号)和 22(接线引脚编号),但我总是得到错误:

    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 以 "reset" 可能访问此 Pin 的其他应用程序 - 但没有成功。

解决方案

如果不在 Constructor 中调用 gpioController,而是在另一个将在 Init 之后调用的方法中,一切正常。

现在的问题是,为什么不能在 init 中执行?

我已经下载了 repo 并查看了代码。我不确定为什么需要在 MainPageViewModel 的构造函数中添加 Init 方法。但是不建议在模型的构造方法中添加单例实例,因为模型是用来绑定视图来显示数据的。当你复用GPIO管脚资源时,你应该在另一个页面中释放和处置它。另外,GpioPin在你不需要使用的时候应该手动配置。您可以尝试在RainbowHAT的构造函数中移动Init方法,如下代码。

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;
    }

解决方案 #2

在@michaelxu-msft 指出我没有使用 Singelton 模式之后,我删除了它,瞧,现在我可以从我的构造函数中调用 Init。我得研究一下原因。