· 

.NET IoTをやってみる(3)

.NET IoTってのがあるらしい。で、そいつでデバイスいじれるってのがちょっとすごいよね。で、ちょっと触ってみちゃう。ちと脱線して正確なタイミングでデバイスを操作するにはどうするかを考える。うまくいかなかったので見る価値のない記事。
で、
dotnet timer micro second
あたりでググるとまぁまぁ出てくるんだけど、もうかなり完成された何かを提供しているものと、質問サイトへの質問かなんかが引っかかって、いい感じに説明したものがない。とりあえず世界的な独占的超巨大企業ドキュメントを探るとSystem.Timers名前空間にTimerクラスってのがあるらしい(https://learn.microsoft.com/ja-jp/dotnet/api/system.timers.timer?view=net-8.0)ので、まずはこちらを参考にする。
で、読んでいくと、設定できるタイマーの単位はミリ秒なので、マイクロ秒が設定できるかはあやしい。いちおう、引数の型はDoubleなのでマイクロ秒を設定できないわけではないと思うが、どんなもんなのか。
では、こんなコードでどうでしょう。

  1. using System;
  2. using System.Timers;
  3. using System.Device.Gpio;
  4. using Iot.Device.Ft232H;
  5. using Iot.Device.FtCommon;
  6. public class study4{
  7.     private static System.Timers.Timer? aTimer;
  8.     private static Ft232HDevice? ft232h;
  9.     private static GpioController? controller;
  10.     private static int pin;
  11.     private static int ledOn=0;
  12.     private static PinValue[] pin_state={PinValue.High,PinValue.Low};
  13.     public static void Main(){
  14.         Console.WriteLine("Blinking LED. Press Ctrl+C to end.");
  15.         ft232h = new Ft232HDevice(FtCommon.GetDevices()[0]);
  16.         controller = ft232h.CreateGpioController();
  17.         pin = Ft232HDevice.GetPinNumberFromString("D7");
  18.         controller.OpenPin(pin, PinMode.Output);
  19.         SetTimer(10);
  20.         Console.WriteLine("\nPress the Enter key to exit the application...\n");
  21.         Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now);
  22.         Console.ReadLine();
  23.         aTimer.Stop();
  24.         aTimer.Dispose();
  25.     }
  26.     private static void OnTimedEvent(Object source, ElapsedEventArgs e)
  27.     {
  28.         ledOn^=1;
  29.         controller.Write(pin, pin_state[ledOn]);
  30.     }
  31.    private static void SetTimer(Double intvl)
  32.    {
  33.         // Create a timer with a two second interval.
  34.         // Hook up the Elapsed event for the timer.
  35.         aTimer=new System.Timers.Timer(intvl);
  36.         aTimer.Elapsed += OnTimedEvent;
  37.         aTimer.AutoReset = true;
  38.         aTimer.Enabled = true;
  39.     }
  40. }

で、やってみる。警告が出るorz。
ちょっとよくわからん。参考サイトとそう変わらんので、たぶん参考サイトのそのままでも同じ警告が出るはず。まぁ動いているようなので気にせず。結果、
、、、がっかりだよ。周期もDutyもおかしい。そして、中には
あきらかに狂ってるでしょ。いやー世の中そんなに甘くないよねー。それにしてもなんなんやろ。何かを間違えちゃったのか、それともそもそも10msなんて扱えないのか。

もちっとやりたかったけど閃輝暗点来たので中断。