「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>Windows 10 IoT]]

* 目次 [#afd73fd3]
#contents

*概要 [#r83f0bc8]
Windows 10 IoT Coreの評価を実施中。

*基本 [#x1829430]
**Headモード、Headlessモード [#vb07d84b]

***Headモード [#zb49acc7]
-GUI有りモード

***Headlessモード [#e8ef7773]
-GUI無しモード
-リソース消費を抑えることが出来る。

***切替方法 [#e24c9190]
以下のコマンドで切り替え可能。

-Headlessモードに変更
 setbootoption.exe headless
 shutdown /r /t 0

-Headlessモードに変更
 setbootoption.exe head
 shutdown /r /t 0

-参考
--Headed/Headless devices | Windows IoT~
https://developer.microsoft.com/en-us/windows/iot/docs/headlessmode

**ドライバの種類 [#x7c0a154]
***Inboxドライバ [#tf570855]
-プラグ・アンド・プレイに対応した機器をパソコンに接続すると、~
Windowsに同梱されるドライバの中から自動的にドライバが選択され組み込まれる。

-このため、すぐに周辺機器が使えるようになる。

-この、Windowsに同梱されているドライバを、Inboxドライバと呼ぶ。

***DMAPドライバ [#d07f25ae]
-DMAP : Direct Memory Mapped
-[[Inboxドライバ>#tf570855]]よりもGPIOパフォーマンスの向上を実現する開発用ドライバ

-以下のケースでは、安全にDMAPドライバを使用できる。
--信頼できるアプリケーションのみのマシン上で使用する。
--Lightningプロバイダ(Microsoft.IoT.Lightning.Providers.*)経由でのみ使用する。
--または、「[[Arduino Wiring sketches>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Arduino%20Wiring%20sketches]]」のみ使用する。
---Arduino Wiring for Windows 10 IoT Core | Windows IoT~
https://developer.microsoft.com/en-us/windows/iot/Docs/ArduinoWiring

-悪意のあるアプリはH/W、Securityの問題を引き起こす可能性がある。

*準備 [#a112e823]

**開発用PC [#p56a97c1]
-OSは、Windows 10とする。
-企業内なら、開発用NWへの接続が許可されているもの。

**IoT機器 [#wa4465fe]
***本体 [#i2baa07c]
Raspberry Pi 3 MODEL B

***電源 [#x4c3a174]
micro USB(Androidと同じ)

**周辺機器 [#k9059277]
***ストレージ [#c7bfbb17]
-microSDメモリーカード(Raspberry Pi 3に挿す)
-microSD から メモリーカード への 変換アダプター(開発用PCに挿す)

***ネットワーク [#i5f96c0d]
スイッチとして機能する機器(開発用PCとRaspberry Pi 3を接続する)

-有線LANの場合: L2スイッチとLANケーブル
-無線LANの場合: プライバシー・セパレータ機能を搭載したWifiルーター

***入出力 [#qe08c680]
-モニタとHDMI ケーブル。
-USB マウス, USB キーボード

*セットアップ [#a7892242]

**Windows 10 IoT Coreのインストール [#d214299e]
***Windows 10 IoT Core Dashboardのダウンロード [#mb138c4c]
-Downloads | Windows IoT~
https://developer.microsoft.com/ja-jp/windows/iot/downloads

--Get Windows 10 IoT Core Dashboardをクリック
--setup.exeがダウンロードされるのでダブルクリックして実行
--Windows 10 IoT Core Dashboardをインストールする。

***microSDにWindows 10 IoT CoreのOSイメージを書き込む。 [#z083771f]
-インストール後、そのままWindows 10 IoT Core Dashboardが起動する。
-「microSD から メモリーカード への 変換アダプター」を開発用PCに挿す。
-[新しいデバイスのセットアップ]で以下の入力を行う。

-[ダウンロードとインストール]をクリックしてmicroSDにOSイメージを書き込む。
--はじめに、Windows 10 IoT Coreがダウンロードされる。
--次に、microSDにOSイメージを書き込まれる(フラッシング)。~
この際、コマンド・プロンプトで進捗表示がされる。
--書き込みが完了すると「SDカードは準備が完了しています」と表示される。

-この画面で表示されている「3.デバイスを検索します」の「自分のデバイス」ボタンを押下し、~
「Dashboard」と「Raspberry Pi 3」との通信を許可しておく。~
Windows10IoTCoreDashboard.exeのインバウンドが許可される。

***Raspberry Pi 3へ機器を接続 [#j4cd151e]
-電源
--micro USB(Androidと同じ)

-周辺機器
--OSイメージを書き込んだ microSD を挿す。
--有線接続の場合、LANケーブルに接続する。

--入出力
---USB マウス、USB キーボード
---モニタ(HDMI ケーブル)

**Windows 10 IoT Coreの初期設定をする。 [#t0d354c2]
***起動時 [#fe32df20]
-言語を選択する(日本語を選択)。

-無線LANの場合、
--Wifiを選択可能
--IPアドレスはDHCPで自動配布される。

-有線LANの場合、
--起動前にLANケーブルを接続しておく。
--IPアドレスはAPIPAのアドレスになっている。

***[[その他、適宜>#bbd556e0]] [#f4416a6f]

**Windows 10 IoT Core Dashboardから接続・操作する。 [#bbd556e0]
-開発用PC側のIPアドレスの設定
--無線LANの場合、DHCPで自動配布されるアドレスで通信可能なので設定は不要。
--有線LANの場合、APIPAのアドレスを確認し、開発用PCのアドレスを設定・変更する。
---IPアドレス       : 169.254.x.x
---サブネットマスク : 255.255.0.0

-Windows 10 IoT Core Dashboardを起動する。
-「自分のデバイス」からRaspberry Pi 3を選択、

***Device Portal [#v88f9fcc]
-接続
--右クリック、[Device Portalで開く]を選択する。
--Administratorのログイン・アカウント情報を入力する。
--ログイン後、Device Portalが表示される。

-操作
--Device Portalから操作する。
--HOME:タイムゾーンの変更
--PROCESS: 電源(再起動など)
-,etc.

***SMB [#o74961ed]
-接続
--右クリック、[ネットワーク共有を開く]を選択する。~
上手く行かない時は、「\\[Raspberry Pi 3のIPアドレス]\C$」を直打ち。
--Administratorのログイン・アカウント情報を入力する。
--「\\[Raspberry Pi 3のIPアドレス]\C$」が開く。

-操作
--[[イベント・ログ]]のファイルなどを取出し、確認できる。

***[[PowerShell]] [#z7b42565]
-接続
--右クリック、[PowerShellを起動]を選択する。
--Administratorのログイン・アカウント情報を入力する。

-操作
--コマンドやコマンドレットを実行できる。

--[[Headモード、Headlessモードの切換>#vb07d84b]]

--IPアドレスの設定(APIPAアドレスなら、必要に応じて変更すると良い)
 ipconfig /all
 netsh interface ip show config
 netsh interface ip set address "Ethernet" static [IPアドレス] [サブネットマスク] [デフォゲ]

--Administratorのパスワードを設定/変更
 net user Administrator [パスワード]

--ローカルコンピュータの新しい NetBIOS 名を設定
 setcomputername [新しいマシン名]

*開発環境 [#m85a98cc]
**開発用PCの準備 [#b3444611]
Windows 10がインストールされた開発用PCを準備する。

**開発環境のセットアップ [#x26cd015]
***[[Visual Studio]] 2017をインストールする。 [#n79e7b25]
-ターゲットがCreators Updade対象になっているようで、[[Visual Studio]] 2015ではなく2017が必要。
-インストール時に、ユニバーサル Windowsアプリ開発ツールをインストールすること。

-参考
--VisualStudio 2017がリリース、さっそくインストールしてみた | 純規の暇人趣味ブログ~
https://jyn.jp/visualstudio-2017/

***開発者モードを有効にする。 [#l04592a7]
-[Windows] Windows 10 で開発者モードにする~
https://www.ipentec.com/document/document.aspx?page=windows-windows-10-set-developer-mode

***Windows SDKのインストール [#m891396f]
Windows 10 用のWindows SDKをダウンロードしてインストールする。~

-Windows 10 用のWindows SDKをダウンロード

--Windows 10 SDK – Windows アプリ開発~
https://developer.microsoft.com/windows/downloads/windows-10-sdk

--以下から選択可能だが、ここでは1台だけの構築なのでEXEを選択する。
---.EXE をダウンロードする
---.ISO をダウンロードする

-Windows 10 用のWindows SDKをインストール
--winsdksetup.exeをダブルクリックしてインストーラを実行。
--インストーラーが起動したら既定値でインストールする。

-インストールが完了したら、OSを再起動する。

**“Hello World”的にサンプルを実行する準備 [#n996cedb]

***サンプル・プログラムをGitHubからDownloadZIPする。 [#ca16fca5]

-ms-iot/samples: Windows 10 IoT Core Samples~
https://github.com/ms-iot/samples

-解凍して、HelloWorldとHelloBlinkyを入手する。

***HelloWorldする。 [#yd263ef0]
-HelloWorld.slnをダブルクリックしてVS 2017を起動する。
-[Debug]ボタンのドロップダウンから[リモート コンピューター]を選択。
-以下の入力を行う。
--アドレス: IPアドレスを手打ち(自動検出できなかった場合)
--認証モード: ユニバーサル(暗号化されていないプロトコル)
--[選択]ボタンを押下する。
-[Debug]ボタンを押下する。

-Hello Worldのメッセージが表示される。

***HelloBlinkyする。 [#g7e13525]
-HelloWorld.slnと同じ手順で、HelloBlinky.slnをDebug実行する。
--(2回目なので、)自動検出されているRaspberry Pi 3を選択する。
--GPIO pinsの初期化が正しく行われた旨のメッセージが表示される。

**サンプル・プログラムをデプロイして起動する。 [#z26ae788]

***デプロイ [#n2a432aa]
-[ソリューション構成]を「Release」に変更し、
-[ビルド]から「xxの配置」を選択する。
-[配置が完了しました]・・・の[完全パッケージ名]をメモしておく。

***スタートアップアプリに指定 [#g120712c]
-Windows 10 IoT Core Dashboardから[[PowerShell>#z7b42565]]で接続する。

-以下のコマンドを実行する。
 iotstartup list

-アプリが配置されていることを確認する。

-以下のコマンドを実行してスタートアップアプリに登録する。
 iotstartup add headed 完全パッケージ名の先頭部分

-shutdown /r /t 0で再起動すれば、次回起動時から自作のIoTアプリが起動する。

-元のIoT Coreメイン画面に戻すには、以下でスタートアップアプリを切り替える。
 iotstartup add headed IoTCoreDefaultApp

*いろいろな処理を実装する。 [#m9b9f8bf]

**空のプロジェクトから実装を始める。 [#p73c6d25]

***プロジェクトの新規作成 [#q6a301ad]
-[新規作成]-[プロジェクト]
-[テンプレート]-[Visual C#]
--GUI有りのIoTアプリ~
[Windows ユニバーサル]-[空白のアプリ]を選択
--GUI無しのIoTアプリ~
[Windows IoT Core]-[Background Application (IoT)]を選択

-Background Application (IoT)の利用には以下のインストールが必要。
--Windows IoT Core Project Templates for VS 201x - Visual Studio Marketplace
---https://marketplace.visualstudio.com/items?itemName=MicrosoftIoT.WindowsIoTCoreProjectTemplates
---https://marketplace.visualstudio.com/items?itemName=MicrosoftIoT.WindowsIoTCoreProjectTemplatesforVS15

***UWP バージョンを選択する [#q1ab8a0d]
[ターゲットバージョン]と[最小バージョン]を選択する。

-UWP バージョンの説明
--ターゲットバージョン :一般ユーザー向けのコードを新しく開発する場合、常に最新ビルドの Windows (14393) を使う。
--最小バージョン :エンタープライズ アプリを開発する場合は、最小バージョンで古いバージョンをサポートすることを検討する。

-参考
--UWP バージョンの選択 - UWP app developer | Microsoft Docs~
https://docs.microsoft.com/ja-jp/windows/uwp/updates-and-versions/choose-a-uwp-version

***Debug実行 [#m0aa48fb]
-この状態だと、[[選択したUWP バージョン次第で>#q1ab8a0d]]、ローカルでのDebug実行も可能。~
しかし、以降、H/Wに関する処理を実装していくとローカルでのDebug実行はできなくなる。

-[[HelloWorld.sln>#yd263ef0]]、[[HelloBlinky.sln>#g7e13525]]と同じ手順でコレをDebug実行する。
--[ターゲットCPU]を[x86]から[ARM]に変更してから、
--[リモート コンピューター]でDebug実行する。

-空のウィンドウが表示されることを確認する。

***Writing apps開発の設定を行う [#o7187b4c]

-参照設定で[Universal Windows]-[拡張]-[Windows IoT Extension for the UWP]をチェックする。

-NuGetから「Direct Memory Mapped Driver」の「Microsoft.IoT.Lightning」をインストールして参照設定を追加。

-以下の「Direct Memory Mapped Driver」の「Microsoft.IoT.Lightning」を利用するための設定を行う。

--[[[Device Portal>#v88f9fcc]]]からドライバを切替える。
---[Devices]をクリックしてページを切り替える。
---[Default Controller Driver]を[Direct Memory Mapped Driver]に設定する。
---「Warning: This option will reduce Windows security~
in exchange for performance using an in development driver.」と表示される。
---[Update Driver]をクリックしてドライバ設定を更新する。
---リブートするかどうかのメッセージが表示されるのでリブートする。

--以下のコードをマニフェストファイル(Package.appxmanifest)に追加。

---Capabilities要素に以下を追加する。
 <Capabilities>
     <!-- アプリケーションがカスタムデバイスにアクセスできるようにする -->
     <iot:Capability Name="lowLevelDevices" />
     <!-- LightningインターフェースのデバイスGUID ID -->
     <DeviceCapability Name="109b86ad-f53d-4b76-aa5f-821e2ddf2141"/>
 </Capabilities>

---package要素に上記のiot名前空間を追加する。
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:iot="http://schemas.microsoft.com/appx/manifest/iot/windows10"
  IgnorableNamespaces="uap mp iot">

--参考
---Writing apps | Windows IoT~
https://developer.microsoft.com/en-us/windows/iot/docs/buildingappsforiotcore
---Using Microsoft.IoT.Lightning.Providers library and sample code | Windows IoT~
https://developer.microsoft.com/en-us/windows/iot/docs/lightningproviders
>Option 2: Referencing the library

**Lチカを実装する。 [#g55fff11]
Apple PiのLEDのGPIO numberについては、下記を参照のこと。

-Yahoo!ブログ > ボクにもわかる電子工作 > 5分で動作確認。~
本日発売のRaspberry Pi用 IoT拡張ボードApple Pi ( Linux ) ~
https://blogs.yahoo.co.jp/bokunimowakaru/55431206.html
>LEDの制御(青色LED1=GPIO 5、白色LED2=GPIO 6)

 using System.Threading.Tasks;
 using Windows.Devices;
 using Windows.Devices.Gpio;
 using Microsoft.IoT.Lightning.Providers;
 
 namespace App1
 {
     /// <summary>
     /// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
     /// </summary>
     public sealed partial class MainPage : Page
     {
         /// <summary>
         /// GpioPin #5は青色
         /// GpioPin #6は白色
         /// </summary>
         private readonly int LED_PIN = 6;
 
         /// <summary>GpioPin</summary>
         private GpioPin _gpioPin;
 
         /// <summary>Lチカを実装する。</summary>
         public MainPage()
         {
             this.InitializeComponent();
 
             // LightningProviderが利用可能かどうかチェックする。
             if (LightningProvider.IsLightningEnabled)
             {
                 // LowLevelDevicesAggregateProviderを取得
                 LowLevelDevicesController.DefaultProvider = LightningProvider.GetAggregateProvider();
             }
 
             // GpioControllerを取得
             GpioController gpioCtrl = GpioController.GetDefault();
 
             if (gpioCtrl == null)
             {
                 return;
             }
 
             // GpioControllerでGpioを取得
             this._gpioPin = gpioCtrl.OpenPin(LED_PIN);
             // GpioPinでGpioPinをコントロール。
             this._gpioPin.SetDriveMode(GpioPinDriveMode.Output);
             this._gpioPin.Write(GpioPinValue.High);
 
             this.loop();
         }
 
         /// <summary>
         /// UIをハングさせないよう、asyncなloop内でawaitを使用する。
         /// System.Threading.Threadが無いので、こうなる。
         /// </summary>
         private async void loop()
         {
             while (true)
             {
                 // GpioPinでGpioPinをコントロール。
                 await Task.Delay(1000);
                 this._gpioPin.Write(GpioPinValue.Low);
                 await Task.Delay(1000);
                 this._gpioPin.Write(GpioPinValue.High);
             }
         }
     }
 }

**LCDに文字を表示する。 [#t5995e43]

-電子工作 - .NET 開発基盤部会 Wiki > 周辺機器 > LCD(液晶ディスプレイ)> ST7032i ~
-電子工作 - .NET 開発基盤部会 Wiki > 周辺機器 > LCD(液晶ディスプレイ)> I2C LCD AQM0802~
https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C#b226d3e8

 using System.Text;
 using System.Threading.Tasks;
 using Windows.Devices;
 using Windows.Devices.I2c;
 using Microsoft.IoT.Lightning.Providers;
 
 // 空白ページの項目テンプレートについては、https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x411 を参照してください
 
 namespace App1
 {
     /// <summary>
     /// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
     /// </summary>
     public sealed partial class MainPage : Page
     {
         /// <summary>
         /// Raspberry Pi 3で GPIO端子の I2C機能を有効化する方法 (ラズパイ3の GPIO端子の I2C機能を有効にして各種センサーを繋げる方法まとめ)
         /// Raspberry Pi 3で GPIO端子の I2C機能を有効化する方法
         ///  (ラズパイ3の GPIO端子の I2C機能を有効にして各種センサーを繋げる方法まとめ)
         /// http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_gpio_enable_i2c/
         /// </summary>
         private readonly byte _Lcd_Addr = 0x3e;
  
         /// <summary>I2cDevice</summary>
         private I2cDevice _Lcd;
  
         public MainPage()
         {
             this.InitializeComponent();
             this.Loaded += MainPage_Loaded;
         }
  
         /// <summary>Loaded</summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
         private async void MainPage_Loaded(object sender, RoutedEventArgs e)
         {
             await this.InitLcd();
             await this.DisplayLcd();
         }
  
         /// <summary>
         /// LCDを初期化する。
         /// 電子工作 - .NET 開発基盤部会 Wiki > 周辺機器 > LCD(液晶ディスプレイ)> ST7032i
         /// 電子工作 - .NET 開発基盤部会 Wiki > 周辺機器 > LCD(液晶ディスプレイ)> I2C LCD AQM0802
         /// https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C#b226d3e8
         /// </summary>
         private async Task InitLcd()
         {
             // LightningProviderが利用可能かどうかチェックする。
             if (LightningProvider.IsLightningEnabled)
             {
                 // LowLevelDevicesAggregateProviderを取得
                 LowLevelDevicesController.DefaultProvider = LightningProvider.GetAggregateProvider();
             }
  
             // I2cControllerを取得
             I2cController i2cCtrl = await I2cController.GetDefaultAsync();
  
             if (i2cCtrl == null)
             {
                 return;
             }
  
             // I2cControllerでLCDを取得。
             this._Lcd = i2cCtrl.GetDevice(new I2cConnectionSettings(this._Lcd_Addr));
  
             // 初期化
             await WriteLcdCmd(0x38, 1); // 行数の設定
             await WriteLcdCmd(0x39, 1); // 拡張コマンドの設定開始
             await WriteLcdCmd(0x14, 1); // 内部OSC周波設定
             await WriteLcdCmd(0x70, 1); // コントラスト設定
             await WriteLcdCmd(0x56, 1); // パワー/アイコン コントラスト設定
             await WriteLcdCmd(0x6c, 250); // Follower設定
             await WriteLcdCmd(0x38, 1); // 拡張コマンドの設定終了
             await WriteLcdCmd(0x0c, 1); // ディスプレイ オン
             await WriteLcdCmd(0x01, 2); // ディスプレイ クリア
         }
  
         /// <summary>LCDに表示する</summary>
         /// <returns>Task</returns>
         private async Task DisplayLcd()
         {
             await WriteLcdCmd(0x01, 2); // ディスプレイ クリア
  
             // 一行目を指定して
             await WriteLcdCmd(0x80, 1); // Set DDRAM Address
             await WriteLcdDisplay("RzPi3"); // Write data to RAM
  
             // 二行目を指定して
             await WriteLcdCmd(0xc0, 2); // Set DDRAM Address
             await WriteLcdDisplay("ApplePi"); // Write data to RAM
         }
  
         /// <summary>LCDにコマンドを送る</summary>
         /// <param name="cmd">byte</param>
         /// <param name="waitTime_msec">int</param>
         /// <returns>Task</returns>
         private async Task WriteLcdCmd(byte cmd, int waitTime_msec)
         {
             // I2cDeviceでLCDをコントロール。
             // 10 bit 書くので2 byte で先頭は空なので 0.
             this._Lcd.Write(new byte[] { 0, cmd });
             await Task.Delay(waitTime_msec);
         }
  
         /// <summary>LCDに表示する</summary>
         /// <param name="msg">string</param>
         /// <returns>Task</returns>
         private async Task WriteLcdDisplay(string msg)
         {
             byte[] bytesMSG = Encoding.ASCII.GetBytes(msg);
  
             // I2cDeviceでLCDをコントロール。
             foreach (byte b in bytesMSG)
             {
                 // 10 bit 書くので2 byte で先頭は・・・
                 this._Lcd.Write(new byte[] { 0x40, b }); // 先頭0x40は?
             }
             await Task.Delay(1);
         }
     }
 }

*参考 [#u312157d]
**電子工作 [#k0189bc1]
-電子工作 - .NET 開発基盤部会 Wiki~
https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C

**Build Insider [#e0e6c4b2]
-Raspberry Pi 2電子工作をWindows 10 IoT Coreで始めよう! - Build Insider~
http://www.buildinsider.net/small/windowsiot/01

**MS [#f1df4e4b]
***ms-iot/samples: Windows 10 IoT Core Samples [#m46c22ac]
https://github.com/ms-iot/samples

***Windows 10 IoTCore ハンズオントレーニング [#xec2e2c3]
-1章 Windows 10 IoTCore 概要~
http://download.microsoft.com/download/F/C/4/FC488185-8F87-4B40-B9EF-0850110A50A2/IoT_Core_1.pdf
-2 章 Windows 10 IoT Core のインストール~
http://download.microsoft.com/download/F/C/4/FC488185-8F87-4B40-B9EF-0850110A50A2/IoT_Core_2.pdf
-3章 UWP アプリの開発~
http://download.microsoft.com/download/F/C/4/FC488185-8F87-4B40-B9EF-0850110A50A2/IoT_Core_3.pdf
-4章 UI をもたないデバイスへのリモートアクセス~
http://download.microsoft.com/download/F/C/4/FC488185-8F87-4B40-B9EF-0850110A50A2/IoT_Core_4.pdf
-5 章 センサーデータをクラウドへ集約~
http://download.microsoft.com/download/F/C/4/FC488185-8F87-4B40-B9EF-0850110A50A2/IoT_Core_5.pdf

----
Tags: [[:インフラストラクチャ]], [[:Windows]], [[:IoT]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS