Я хочу открыть штифт PWM для моего зуммера. Но если я попытаюсь вызвать метод pwmController.OpenPin(6)
, приложение вылетит с System.Runtime.InteropServices.SEHException
.
Я уже перепроверил образцы источников, такие как ms-iot-образцы. Но я не вижу, в чем мои проблемы.
Идея заключалась в том, что некоторые разрешения отсутствуют, но если я попытаюсь добавить, например, <iot:Capability Name = "lowLevelDevices" />
, я больше не смогу собрать приложение.
Источник
private PwmPin buzzerPin;
private PwmController pwmController;
public RainbowHAT()
{
// ... do something else
InitAsync();
}
private async void InitAsync()
{
Logger.Log(this, "Init");
// Setup PWM controller.
if (LightningProvider.IsLightningEnabled)
{
LowLevelDevicesController.DefaultProvider = LightningProvider.GetAggregateProvider();
}
var pwmControllers = await PwmController.GetControllersAsync(LightningPwmProvider.GetPwmProvider());
if (pwmControllers == null || pwmControllers.Count < 2)
{
throw new OperationCanceledException("Operation canceled due missing GPIO controller");
}
pwmController = pwmControllers[1];
pwmController.SetDesiredFrequency(50);
// Setup buzzer
buzzerPin = pwmController.OpenPin(13); <-- CRASH
buzzerPin.SetActiveDutyCyclePercentage(0.05);
buzzerPin.Start();
}
Еще пробовал следующий совет, чтобы уменьшить минимальную требуемую версию Windows, но и это не помогает.
ШИМ-контроллеру нужна поддержка Lightning. Поэтому вам нужно установить драйвер контроллера как Драйвер с прямым отображением памяти. Здесь — пример ШИМ на Raspberry Pi.
Вам также необходимо изменить код следующим образом:
private async void InitAsync()
{
Logger.Log(this, "Init");
// Setup PWM controller.
if (LightningProvider.IsLightningEnabled)
{
var pwmControllers = await PwmController.GetControllersAsync(LightningPwmProvider.GetPwmProvider());
if (pwmControllers == null || pwmControllers.Count < 2)
{
throw new OperationCanceledException("Operation canceled due missing GPIO controller");
}
pwmController = pwmControllers[1];
pwmController.SetDesiredFrequency(50);
// Setup buzzer
buzzerPin = pwmController.OpenPin(13);
buzzerPin.SetActiveDutyCyclePercentage(0.05);
buzzerPin.Start();
}
}
ПРИМЕЧАНИЕ. Драйверы молнии все еще являются экспериментальными. В настоящее время, когда драйвер DMM включен (Lightning), доступ к контроллерам I2C прерывается.
Идеально. Спасибо!