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

时间:2019-05-26 17:44:02

标签: uwp raspberry-pi gpio windows-10-iot-core

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

(最短)来源

类常量:

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

我为类全局常量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,以“重置”可能访问该Pin的其他应用程序-失败。

3 个答案:

答案 0 :(得分:0)

解决方案

如果不是在构造函数中调用gpioController,而是在Init之后将调用的另一种方法中,一切正常。

现在,问题是,为什么不能在init中做到这一点?

答案 1 :(得分:0)

我已经下载了仓库并查看了代码。我不确定为什么需要在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 :(得分:0)

解决方案2

@ michaelxu-msft指出我错过了使用Singelton模式之后,我将其删除并瞧瞧,现在可以从构造函数中调用Init了。我必须研究原因。