我想让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
完整来源
包裹信息
<Capabilities>
<Capability Name="internetClient" />
<DeviceCapability Name="lowLevel"/>
</Capabilities>
我还重新启动了Pi,以“重置”可能访问该Pin的其他应用程序-失败。
答案 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了。我必须研究原因。