Windows 10 IoT Coreã«é¢ããèšå€§ãªæ°ã®äŸãšèšäºããããããŸããŸãªããã€ã¹ãç°¡åãã€äŸ¿å©ã«äœæããæ¹æ³ã«ã€ããŠèª¬æããŠããŸãã ãã ããå®éã«ã¯ããããŒããŠã§ã¢ãã§ã®äœæ¥ã¯ãããŸãç¥ãããŠããªãå€ãã®ãã¥ã¢ã³ã¹ã«åžžã«é¢é£ä»ããããŠããããã®ç¥èã¯å®è·µã«ãããããŸããã Raspberry Pi2ããã³Windows 10 IoT Coreã§GPIOãæäœããæ©èœã®äžéšã«ã€ããŠèª¬æãããšåæã«ãInsider PreviewããŒãžã§ã³ã§å©çšå¯èœãªæ°ãããªã¢ãŒãã¯ã©ã€ã¢ã³ãæ©èœã«ã€ããŠã説æããŸãã
ãã¹ãŠã¯ãã¢ã¯ã»ã¹å¶åŸ¡ã·ã¹ãã ïŒACSïŒã®ãªãŒããŒããã«ãŒãçªå·ãååŸããå¿ èŠããããšããäºå®ããå§ãŸããŸããã ã»ãšãã©ãã¹ãŠã®ãªãŒããŒã¯ã ãŠã£ãŒã¬ã³ãã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠãã®ããŒã¿ãéä¿¡ã§ããŸãã 3æ¬ã®ã¯ã€ã€ã§æ§æãããŠããŸãïŒãŠããããéä¿¡ããä¿¡å·ããŒããšã°ã©ãŠã³ããéä¿¡ããä¿¡å·ã ã¹ã¿ã³ãã€ã¢ãŒãã§ã¯ãåä¿¡å·ç·ã«5Vãèšå®ãããŸãã ããŒã¿ã¯ãéããã«ã¹ã§éä¿¡ãããŸãã 50ãã200ÎŒsã®ãã«ã¹å¹ ã300ãã3000ÎŒsã®åšæïŒ
ããŒã¿ã¯åžžã«ãªãŒããŒããã³ã³ãããŒã©ãŒãžã®äžæ¹éè¡ã§ãã ãããæ°ã¯ç°ãªãå Žåãããããã®è§£éãç°ãªãå ŽåããããŸãã éä¿¡ã®çµäºã¯ã50ã250ããªç§ã®ã¿ã€ã ã¢ãŠãã«ãã£ãŠæ±ºå®ãããŸãã
ãã®ãããªãã©ã¡ãŒã¿ãŒã®æ¡æ£ã¯ãæç¢ºãªæšæºãæããªããæŽå²çã«éçºããããã€ã³ã¿ãŒãã§ãŒã¹ã§ããããã«çºçããŸããã
wiegand26ãããã³ã«ãåããããã€ã¹ãæã«å ¥ããŸããããã®äžã®å°å ã«ã¯26ããããå«ãŸããŠããããã®ãã¡2ãããã®ããªãã£ããããŸãã
ãã®ã¿ã¹ã¯ã¯ããã¢ã¹ã¿ã³ãã®äœæã®äžéšãšããŠäžããããããããã©ãããã©ãŒã ã詊ãããšãã§ããŸããã ãããã£ãŠãWindows 10 IoT CoreãæèŒããRaspbery Pi2ã圹ã«ç«ã¡ãŸããã
GPIOã®åé¡
ãã®åé¡ã解決ããã«ã¯2ã€ã®æ¹æ³ããããŸãã
- ãã³ã®é»å§ã倿Žãããšãã«å²ã蟌ã¿ã䜿çšãã
- ãã³ããŒãªã³ã°ã䜿çšãã
æãåçŽãªãã®ãæåã®éžæè¢ã®ããã«æããŸããã ãã³ãæ£ããåæåãããšãäžå®ã®ããŒãªã³ã°ã§ããã»ããµãŒãããŒãã§ãããéåæåŒã³åºãã®ã¿ãåŠçã§ããŸãã ããã®ã³ãŒãã¯éåžžã«ç°¡åã§ãïŒ
var gpio = GpioController.GetDefault(); var data0 = gpio.OpenPin(data0Pin); var data1 = gpio.OpenPin(data1Pin); // Check if input pull-down resistors are supported if (data0.IsDriveModeSupported(GpioPinDriveMode.InputPullUp)) data0.SetDriveMode(GpioPinDriveMode.InputPullUp); else data0.SetDriveMode(GpioPinDriveMode.Input); if (data1.IsDriveModeSupported(GpioPinDriveMode.InputPullUp)) data1.SetDriveMode(GpioPinDriveMode.InputPullUp); else data1.SetDriveMode(GpioPinDriveMode.Input); var ticksPerMillisecond = TimeSpan.TicksPerMillisecond; var tenMs = ticksPerMillisecond / 1000; //1 data0.DebounceTimeout = TimeSpan.FromTicks(tenMs); data0.ValueChanged += data0_ValueChanged; data1.DebounceTimeout = TimeSpan.FromTicks(tenMs); data1.ValueChanged += data1_ValueChanged;
ããã«DebounceTimeoutã«ã€ããŠèšãå¿ èŠããããŸãã ååãšããŠãé倧ãªå¹²æžã®ãªãã€ã³ã¿ãŒãã§ãŒã¹ã®éåžžã®åäœäžã«ã¯ãããŠã³ã¹ãããªããããéåžžã¯ããã§ã¯å¿ èŠãããŸããã ããããäžè¬çãªã±ãŒã¹ã§ã¯ãã©ã®èªè ãšã©ã®æ¡ä»¶ã§ãããæ©èœããã®ãããããªããšããäºå®ã®ãããç§ã¯ãã®ã¿ã€ã ã¢ãŠãã詊ãããšã«ããŸããã
ããããè¯ãããšã¯äœããããŸããã§ããã äŸã§ã¯ãDebounceTimeoutã¯ããªç§åäœã§æå®ãããŠããŸãããç§ã®å Žåã¯ãã€ã¯ãç§ãå¿ èŠã§ãã ã©ã®å€ãèšå®ããŠããValueChangedã€ãã³ãã¯è¡šç€ºãããŸããã ãããã£ãŠãã¿ã€ã ã¢ãŠãã¯åçŽã«ãªãã«ãªãããã¹ãŠãæ£åžžã«æ©èœãå§ããŸããã
data0.DebounceTimeout = TimeSpan.FromTicks(0); data0.ValueChanged += data0_ValueChanged; data1.DebounceTimeout = TimeSpan.FromTicks(0); data1.ValueChanged += data1_ValueChanged;
ããŒã¿ã¯æ¬¡ã®ããã«èªã¿åãããŸããã
private void data0_ValueChanged(GpioPin sender, pioPinValueChangedEventArgs e) { if (e.Edge == GpioPinEdge.FallingEdge) { UpdateValue(0); } } private void data1_ValueChanged(GpioPin sender, pioPinValueChangedEventArgs e) { if (e.Edge == GpioPinEdge.FallingEdge) { UpdateValue(1); } }
次ã«ãããã±ãŒãžã宿ããç¬éã«åé¡ã解決ããæãæ¥ãŸããã äžã§æžããããã«ãéä¿¡ã®çµããã¯ãå°ãªããšã50 msã®éãäž¡æ¹ã®ä¿¡å·æ¥ç¹ã«ãã«ã¹ããªãããšã§ãã ããã§ã¯ãã¿ã€ããŒãå®å šã«é©åãã亀æããããã©ããã宿çã«ãã§ãã¯ãã亀æãããŠããªãå Žåã¯ãåŸãããçµæãããã«éä¿¡ããŸãã
ãã®ã¢ãããŒãã¯ããŸããããŸããã§ããã ã³ãŒãã¯UIãªãã§æ©èœããã¯ãã ã£ãã®ã§ãThreadPoolTimerã䜿çšããŸããã ãã®ã¿ã€ããŒã®æ©èœã¯ããã³ãã©ãŒãæ°ããã¹ã¬ããã§åŒã³åºããããã³ã«ã§ãã ãã³ãã©ãŒãã¿ã€ããŒæéããé·ãå®è¡ããããšãå¥ã®ãã³ãã©ãŒã䞊è¡ããŠèµ·åãããæ¬¡ã«å¥ã®ãã³ãã©ãŒãèµ·åãããŸãã ããã«ããã®å Žåãæ°ããåä¿¡ãéå§ããã«ã¯ãã¿ã€ããŒãã³ãã©ãŒã§ããŒã¿ããªã»ããããå¿
èŠããããŸãã ãããã£ãŠãããã¯éèŠãªã»ã¯ã·ã§ã³ã§ãããè€æ°ã®ã€ã³ã¹ã¿ã³ã¹ã§åæã«å®è¡ããªãã§ãã ããã ãããã£ãŠãçãã¿ã€ããŒééã¯äœ¿çšã§ããŸããã
ã¿ã€ããŒãã³ãã©ãŒã®å®è¡äžãããŒãããã®ValueChangedã€ãã³ãã®çºçã忢ãããããããã¯ãä»ãããã³ãã©ãŒåæãšåæ§ã«ãé·ãééã䜿çšã§ããªãããšã倿ããŸããã ãããã®ã€ãã³ãã¯ãã¿ã€ããŒãã³ãã©ãããåªå
é äœãäœãããã§ãã ããã«ãå®éšã¯ãã€ãã³ãã䞊ãã§ãã³ã°ãããåã«éãã«ç Žæ£ãããããšã瀺ããŸããã
ãããã£ãŠãäœãèšã£ãŠããã¿ã€ããŒã䜿çšãããšãGPIOããã®ã€ãã³ãã倱ããããã®çµæãããŒã¿ã倱ãããŸããã ã¿ã€ããŒæéãéžæããValueChangedã§èšç®ãåé åžããããšã«ãããããããæžããããšãã§ããŸãã ãããããã®ãããªã¢ãããŒãã§ã¯çè«çã«ã絶察çãªä¿¡é Œæ§ãéæããããšã¯ã§ããŸããã ããã«ãValueChangedã®å®è¡ãã€ãã³ãã®ã¹ããããšããŒã¿æå€±ã«ã€ãªããããšã倿ããŸããã
ã¿ã€ããŒã®ä»£ããã«ã¹ããªãŒã ã䜿çšããããšã«ããŸããã åæã®ããã«ãValueChangedã«å°çãããããã远å ããããã¥ãŒã䜿çšãããŸããã ã¹ã¬ããã¯ãã°ããã¹ãªãŒããããã®æéå ã«äº€æããã£ããã©ããã確èªããããã§ãªãå Žåã¯ããã¥ãŒããããããéžæããçµæãåéããŠéä¿¡ããŸãã
ãããããããäœãèµ·ãããŸããã§ããã ã¹ã¬ããã®å®è¡äžã«ValueChangedãåŒã³åºãããªããšä»®å®ããããšãã§ããŸãããã¹ã¬ãããã¹ãªãŒãããŠãããšãã«åŒã³åºãããªããšããäºå®ã¯ãç§ã«ãšã£ãŠé©ãã§ããã Thread.Sleepã®ä»£æ¿ãšããŠãTask.Delayã䜿çšããŸããã ä»ã®ã¿ã¹ã¯ãåæã«å®è¡ãããŠãããã©ããã¯ããããŸããïŒããã¥ã¡ã³ãã«ãããšãDelayã¯ã¿ã€ããŒã§å¥ã®ã¿ã¹ã¯ãéå§ããŸãïŒããGPIOããã®ã€ãã³ãããã¹ãŠããããã¯ããŸãã
äžè¬ã«ãWindows 10 IoTçšã®GPIOãã©ã€ããŒã¯ãã€ãã³ãã®åªå 床ãã·ã¹ãã äžã§äœããããéåæã§äœ¿çšããããšã¯ã»ãŒäžå¯èœãªæ¹æ³ã§èšè¿°ãããŠããŸãã
皲劻
GPIOã®æäœæ¹æ³ãåŠç¿ããéçšã§ãWindows 10 IoT Coreã§äœ¿çšã§ããå¥ã®é«éãã©ã€ããŒãããããšãããããŸããã LightningãšåŒã°ããGPIOã ãã§ãªããADCãI2CãPWMãSPIã§ãåäœããŸãã ããã€ã¬ã¯ãã¡ã¢ãªã¢ã¯ã»ã¹ãïŒãã€ã¬ã¯ãã¡ã¢ãªã¢ã¯ã»ã¹ïŒã«ãããäœæ¥é床ãéæãããŸãã
ãã©ã€ããŒã¯ãã¬ãã¥ãŒæ®µéã«ãããŸãããWindows 10ããŒãžã§ã³ã®IoT Core Insider Previewã«æ¢ã«å«ãŸããŠããŸãã ããã䜿çšããã®ã¯ãæšæºãã©ã€ããŒã®é床ãååã§ãªã人åãã§ãã ããã§åªå 床ã®é«ãValueChangedãååŸããããšãæãã§ããŸããã
äžèšã®ãªã³ã¯ã«ã¯ãäœ¿çšæ¹æ³ã«é¢ããæç€ºãå«ãŸããŠããŸãããæ©èœããŸããã åé¡ã¯NuGetããã±ãŒãžã§ãã ãã¹ãŠãã€ã³ã¹ããŒã«ãããŠããŸãããåå空éMicrosoft.IoT.Lightning.Providersã«å°éããããšã¯äžå¯èœã§ãã ããã«ãåé¡ã¯å
æã§ããªããšããå¯äžã®èšåã¯ã ãã®èšäºã§èŠã€ããŸããã èè
ã¯ãLEDã®å¶åŸ¡æ¹æ³ãæããŠããŸãã ç¹ã«ãPWMã®é
ãåäœã«çŽé¢ããLightningã䜿çšããŠç¶æ³ãä¿®æ£ããŸããã
次ã®ããã«ãªããŸãã
Third, you'll need to reference the Lightning SDK. According to the documentation, you just reference via NuGet. Unfortunately, this doesn't work as of v1.0.3-alpha. I had to download the Microsoft.IoT.Lightning.Providers C++ source, add the Microsoft.Iot.Lightning.Providers.vcxproj project to my solution, and then make a project reference. Incidentally, I contacted some folks at Microsoft, and they said a new nuget will be published shortly with binaries that will fix this issue.
ãã®èšäºã§èª¬æãããŠããæ¹æ³ã圹ã«ç«ã¡ãŸããã ãŸãããœãŒã¹ãããŠã³ããŒããããããžã§ã¯ããã¡ã€ã«ããœãªã¥ãŒã·ã§ã³ã«è¿œå ããŠãåç §ãäœæããŸããã ãããŠãLightningã®ValueChangedã€ãã³ããå®è£ ãããŠããªãããšã倿ãããšããç§ã¯é©ããŸãã...
ãã®åŸãéåæã¢ãããŒãã䜿çšãããšããèãããããããã«ãŒãå ã®ãã³ãããŒãªã³ã°ããããšã«ããŸããã
æŽæ°ïŒåé¡ã解決ããéçšã§ãéçºè ã«ValueChangedã«ã€ããŠè³ªåããŸããã 圌ãã¯ããã«ãã¹ãŠãããã ãããšçããã ãããŠåœŒãã¯çŽæãæãããã
ããã«ãMicrosoft.IoT.Lightning.Providers 1.0.0 ã NuGetã«ç»å Žããåå空éMicrosoft.IoT.Lightning.Providersã衚瀺ãããããã«ãªããŸããã
åé¡è§£æ±º
ãã®çµæããã³ã®ããŒãªã³ã°åšæã10ÎŒsã®ãµã€ã¯ã«ãäœæããããšã§åé¡ã解決ããŸããã æåã¯é床ãè¶³ããªãã®ã§ã¯ãªãããšããæžå¿µããããŸããããæšæºã®ãã©ã€ããŒã§ããã¹ãŠãååã«é«éã§åäœããããšã倿ããŸããã
ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
_data0 = gpio.OpenPin(data0Pin, GpioSharingMode.Exclusive); _data1 = gpio.OpenPin(data1Pin, GpioSharingMode.Exclusive); if (_data0.IsDriveModeSupported(GpioPinDriveMode.InputPullUp)) _data0.SetDriveMode(GpioPinDriveMode.InputPullUp); else _data0.SetDriveMode(GpioPinDriveMode.Input); if (_data1.IsDriveModeSupported(GpioPinDriveMode.InputPullUp)) _data1.SetDriveMode(GpioPinDriveMode.InputPullUp); else _data1.SetDriveMode(GpioPinDriveMode.Input); _task = Task.Run(() => TaskHandler());
ä»ã®ã¹ã¬ããã®å®è¡ããããã¯ããªãããã«ãã«ãŒãã¯ã¿ã¹ã¯å ã§å®è¡ãããŸãã
private void TaskHandler() { var ticksPerMillisecond = TimeSpan.TicksPerMillisecond; var mks = ticksPerMillisecond / 1000; //1 while (!_stopTask) { Task.Delay(TimeSpan.FromTicks(mks*10)).Wait(); var dt0 = _data0.Read(); var dt1 = _data1.Read(); ..... } }
å®å®ããŠåäœããŸãããã«ãŒãã1ç§éã«1åãããªãŒããŒã«å±ããªããšããæ¡ä»¶ã§åäœããŸãã
GitHubã§æ°é±é以å ã«ãèªè ãRaspberry Pi2ã«æ¥ç¶ããããã®ãã¹ãŠã®æé ãå«ããã®ãããžã§ã¯ããæçš¿ããäºå®ã§ãã
ãªã¢ãŒãã¯ã©ã€ã¢ã³ã
Windows 10 IoT Coreã䜿çšããå€ãã®éçºè
ã¯ããªã¢ãŒããã¹ã¯ããããæ¬åœã«äžè¶³ããŠããããšã«æ³šç®ããŠããŸãã ã¢ãã¿ãŒãŸãã¯ãã¬ããåžžã«æå
ã«ãããšã¯éããããããã䜿çšããããšã¯å¿
ããã䟿å©ã§ã¯ãããŸããã æåŸã«ããã®ã®ã£ããã¯è§£æ¶ãããããŒãžã§ã³10.0.14295.1000以éããªã¢ãŒãã¯ã©ã€ã¢ã³ããç»å ŽããŸãã ã çŸåšããã®ããŒãžã§ã³ãšæ°ããããŒãžã§ã³ã¯Insider PreviewãšããŠå©çšã§ããŸãã
ãã¹ãŠãéåžžã«ç°¡åã«æ©èœããŸãã Windows 10 IoT CoreåŽã§ã¯ãWebã€ã³ã¿ãŒãã§ãŒã¹ã§ãªã¢ãŒãã¯ã©ã€ã¢ã³ãæ¥ç¶ãæå¹ã«ããå¿
èŠããããŸãã
ã¯ã©ã€ã¢ã³ãèªäœãã€ã³ã¹ããŒã«ãã
èµ·åããŠWindows IoT Coreã«æ¥ç¶ããŸã
èª¬ææžã«ã¯ããã¹ãŠãRaspberry Pi 2ããã³3ãMinnowboard Maxããã³Dragonboardã§æ£åžžã«æ©èœããããšãèšèŒãããŠããŸãã åæã«ãGPUããµããŒããããŠããªããããPi2ã®ããã©ãŒãã³ã¹ã¯ãããã«äœäžããŸãã
Rapberry Pi2ãå
¥æããŸããã
ããããªé å»¶ããããŸãããç§ã®æèŠã§ã¯ããããã¯é倧ã§ã¯ãããŸããã åæã«ããã¹ãŠãå®å®ããŠåé¡ãªãæ©èœããŸãã
çµè«
äžèšã®ãã¹ãŠãèŠçŽãããšãWindows 10 IoT Coreã¯ããã€ã¯ãã³ã³ãããŒã©ãŒã«æ £ããŠãã人ãæåŸ ããããã«åžžã«æ©èœãããšã¯éããªãããšã«æ³šæããŠãã ããã ããã§ããããã¯æ¬æ Œçãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ããããããŒããŠã§ã¢ãããããªãæœè±¡åãããŠããŸãã
- GPIOããã®ã€ãã³ãã®åªå 床ã¯éåžžã«äœãã§ãã ãŸããã€ãã³ãã®ã¡ã«ããºã ã¯å®å šã«ã¯æããã§ã¯ãããŸããã
- å²ã蟌ã¿ã®æäœã«çŽæ¥é¢ä¿ããªãéåæããã°ã©ãã³ã°ã®åé¡ã
- æ¢åã®æ©èœãåžžã«ååã§ãããšã¯éããããã¬ãã¥ãŒã®åœ¢åŒã§è¡šç€ºãããæ©èœãåžžã«æ£ããæ©èœãããšã¯éããŸããã ããã¯ãã¹ãŠéåžžã«æ¥éã«çºå±ããŸããã
- Windows 10 IoT Coreã®ããã©ãŒãã³ã¹ã¯ãã©ã³ã¿ã€ã ã«ææãªã¿ã¹ã¯ã«ååã§ãã åæã«ã皲劻ã®åœ¢ã®åšåº«ããŸã ãããŸãã
- ãªã¢ãŒãã¯ã©ã€ã¢ã³ãã衚瀺ããã䜿ãããããå€§å¹ ã«åäžããŸããã