无法打开 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
完整来源
包裹信息
<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。我得研究一下原因。
我想让 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
完整来源
包裹信息
<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。我得研究一下原因。