· 

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

 

.NET IoTってのがあるらしい。で、そいつでデバイスいじれるってのがちょっとすごいよね。で、ちょっと触ってみちゃう。"Use a GPIO device"と"Use an I2C device"。こちら(https://dotnet.microsoft.com/ja-jp/apps/iot)が本家。
取り組み内容はこちら(https://learn.microsoft.com/en-us/dotnet/iot/usb)。
まずは"Use a GPIO device"ってことでLED Blink(Lチカってやつやね)をやるんだけど、幸か不幸か使っているボードが↑のサイトと全く同じだから、本当にただそのままやっただけ。
mkdir study2
cd study2
dotnet new console
dotnet add package System.Device.Gpio
dotnet add package Iot.Device.Bindings
code .
ってやってVSCodeで(VSCode使う必要すらないけど)Program.csをこうする。
  1. using System.Device.Gpio;
  2. using Iot.Device.Ft232H;
  3. using Iot.Device.FtCommon;
  4. Console.WriteLine("Blinking LED. Press Ctrl+C to end.");
  5. Ft232HDevice ft232h = new Ft232HDevice(FtCommon.GetDevices()[0]);
  6. GpioController controller = ft232h.CreateGpioController();
  7. int pin = Ft232HDevice.GetPinNumberFromString("D7");
  8. controller.OpenPin(pin, PinMode.Output);
  9. bool ledOn = true;
  10. while (true)
  11. {
  12.     controller.Write(pin, ledOn ? PinValue.High : PinValue.Low);
  13.     Thread.Sleep(1000);
  14.     ledOn = !ledOn;
  15. }
で、うちのLinuxPCのおまじないを唱えて、実行。
そすっと、
うまくいった。

次いってみよー
で、次はBME280(I2C環境センサ)の制御なんやけど、さすがにうちでも何でもかんでもあるわけではない。でDevice Bindingsの中でうちにあるI2Cなものと言ったら、、、VL53L0X(赤外線測距センサ)があるので、これやってみる。ちなみにDevice BindingsのページからVL53L0Xのリンクをつつくと制御例がでてくるんだけど、これって、ハード的にどう接続しているつもりかわからんなーって。きっとRaspberry Piを想定しているんやろうな。TutorialがRaspberry Piでやってたからきっとそうだ。今回はLinuxPC-->FT232H-->VL53L0Xって接続なので、その部分だけが工夫のしどころ(というかBME280の例とのマージが必要なところ)。
cd ..
mkdir study3
cd study3
dotnet new console
dotnet add package System.Device.Gpio
dotnet add package Iot.Device.Bindings
code .
ってやってVSCodeでProgram.csをこうする。
  1. using System.Device.I2c;
  2. using Iot.Device.Vl53L0X;
  3. using Iot.Device.Ft232H;
  4. using Iot.Device.FtCommon;
  5. Console.WriteLine("Hello VL53L0X!");
  6. Ft232HDevice ft232h = new Ft232HDevice(FtCommon.GetDevices()[0]);
  7. I2cConnectionSettings i2cSettings = new I2cConnectionSettings(0, Vl53L0X.DefaultI2cAddress);
  8. using I2cDevice i2cDevice = ft232h.CreateI2cDevice(i2cSettings);
  9. using Vl53L0X vL53L0X = new Vl53L0X(i2cDevice);
  10. Console.WriteLine($"Rev: {vL53L0X.Information.Revision}, Prod: {vL53L0X.Information.ProductId}, Mod: {vL53L0X.Information.ModuleId}");
  11. Console.WriteLine($"Offset in ?m: {vL53L0X.Information.OffsetMicrometers}, Signal rate fixed 400 ?m: {vL53L0X.Information.SignalRateMeasuementFixed400Micrometers}");
  12. vL53L0X.MeasurementMode = MeasurementMode.Continuous;
  13. while (!Console.KeyAvailable)
  14. {
  15.     try
  16.     {
  17.         var dist = vL53L0X.Distance;
  18.         if (dist != (ushort)OperationRange.OutOfRange)
  19.         {
  20.             Console.WriteLine($"Distance: {dist}");
  21.         }
  22.         else
  23.         {
  24.             Console.WriteLine("Invalid data");
  25.         }
  26.     }
  27.     catch (Exception ex)
  28.     {
  29.         Console.WriteLine($"Exception: {ex.Message}");
  30.     }
  31.     Thread.Sleep(500);
  32. }
そして、実行する。
おお。うまくいったー。すっげー簡単なんやけど、、、あれ?これやったら、Arduino+PC上のターミナルソフトで良くね?
以下私見
Arduino
○ ある程度正確なタイミング制御ができる
○ 資料が豊富
○ 小規模なスタンドアロンツールが作れる
× SRAM、Flash、EEPROMの容量が小さい(R4なら十分なので「×」ではないかも)
× PCとの双方向通信が必要な場合にプロトコルの実装が面倒

.NET IoT
○ 揮発不揮発メモリがほぼ無限(いや、本当は有限)
○ バックに巨大企業がついている
× タイミングがカス
× それなりの規模のシステムになる(.NEt IoTがインストールできないといけない)

まぁ良し悪しやね。

「タイミングがカス」説を少し検証してみる。日曜技術者としては思い込み記事や引用だけの記事はできるだけ排除し、実際に自分で確認して記述することを重要視しているので。
では、LED Blinkのタイミングを測定してみようではないか。
まずは、"Use a GPIO device"のコードを利用して、Thread.Sleep()の引数を10に変更する。期待値としては10msでトグルで1周期20msだが、
1周期=21.0652msになってますね。やっぱり「タイミングがカス」は事実なのか?いやコードの実装があまりにも拙いでしょ。Arduinoでも正確なタイミングが必要な時はタイマ割り込みを使うよね。おなじ感じでもうちょっとうまい方法があると思う。

スライサーで玉ねぎの薄切り作ってたら親指の薄切りを作りそうになった。痛い。凹む。色々やる気を失った。