« 前ページへ - 次ページへ »
マウスカーソルのすぐそばでIMEが有効になっているかの状態を一目で確認できるユーティリティ「IMEステータス」のVer 2.15の機能限定版となる無料版を「オールフリーソフト」で取り上げていただけました。

詳細な解説を書いていただいたことに、この場を借りてオールフリーソフトの管理人様にお礼を申し上げます。


(※スクリーンショットは完全版のものです)
2017年6月26日
マウスカーソルのすぐそばでIMEが有効になっているかの状態を一目で確認できるユーティリティ「IMEステータス」のVer 2.15を公開しました。このバージョンでは、Windows 8.1より前のOSでは、タスクトレイのアイコングループにおけるアプリのアイコンが見づらいとの指摘がありましたので、Windows 10より前のOSでは従来の黒縁のアイコンを表示するように修正しました。

 
※スクリーンショットはイメージです
2017年6月22日
ボタンやスクリーン、キーボードと言った、操作に必要なレイアウトのデザインが自由にできるリモートデスクトップアプリ「デスクトップPCコントローラー for Windows」および「デスクトップPCコントローラー for Windows 10」のスキン作成ソフトとクライアントソフトをアップデートしました。最新版では、コマンド実行時において、起動引数のためなどの空白文字が含まれていると異常終了する問題を修正しています。


2017年6月3日
大阪日本橋の電子パーツショップ・デジットの200円LCD「AM50288H」。かつては段ボールいっぱいに入っているのを見かけていたのですが、最近では残りもわずかとなってきました。そんなじわじわ売れゆくLCDを見て、昔紹介したプログラミング記事を改良したい気持ちに駆られたので、今回は題名の通りのプログラミングテクニックをご紹介します。このノウハウを使って「これはWindows IoT Coreで作ったライブラリーのソースだけど、Arduinoでも手を加えることなく、すぐに使えるよ」とPRすれば、より多くの開発者の注目を集められるかも!?

まずは、「AM50288H」を制御するC#コードをArduinoライブラリーとして動作することを意識して、C++言語で書き直してみます。VC++独自拡張の「#pragma once」を使用しない、「#include <arduino.h>」を追加する二点を守れば、ArduinoでもWindows IoT Coreでも動作するコードが記述できます。以下のコード例は一部割愛しているので、すべてのコードをご覧になりたい方はこのページの最下部にあるリンクから入手してください。
// libAM50288H.h
#ifndef __AM50288H_H__
#define __AM50288H_H__

#include <arduino.h>

class AM50288H
{
private:
    enum SegmentBit
    {
    }
    const static int Digits = 8;
    const static int Segments = 14;
    const static int DinsLen = 142;
    const SegmentBit segarray[Digits][Segments] = {
        {...},
        {...}
    };

    byte ple, pdin, psck = 0xFF;
    byte dins[DinsLen];

public:
    AM50288H();
    AM50288H(byte pinLE, byte pinDIN, byte pinSCK);
    ~AM50288H();

    void setPins(byte pinLE, byte pinDIN, byte pinSCK);
    void begin();
    void update();
    void clear();
};

#endif __AM50288H_H__

以下の写真はこのC++クラスをArduino IDEのスケッチに書きこみ、実行した例です(このスケッチも"sketch_am50288h.ino"としてサンプルに含まれています)。動作確認ができたら、Windows IoT Coreに組み込んでみましょう。


ArduinoはC++言語がベースなので、Windows IoT CoreではC++/CXランタイムライブラリとしてプロジェクトを作成します。プロジェクトを作ったら、先のクラスをプロジェクトに追加し、ランタイムライブラリの仕様内に収まるようにラッパークラスを作ります。ちなみに、C言語のenumはランタイムライブラリとの互換性がないため、橋渡しのためのC++/CXとしてのenumを必要に応じて用意する必要があるのですが、これにFlags属性を加える際は「 : unsigned int」の一文がないとエラーになる点に注意しましょう。
// AM50288H.h
#pragma once

#include "libAM50288H.h"

namespace Tnksoft {
namespace AM50288H {
    public enum class Mark
    {
    };

    [Platform::Metadata::Flags]
    public enum class SegmentPosition : unsigned int
    {
    };

    public ref class AM50288H sealed
    {
    private:
        ::AM50288H _am; //Arduino向けのオリジナルクラス
    public:
        AM50288H();
        void begin(byte pinLE, byte pinDIN, byte pinSCK);
        void update();
        void clear();
    };
}
}

// AM50288H.cpp
#include "AM50288H.h"

namespace Tnksoft {
namespace AM50288H {
    AM50288H::AM50288H()
    {
    }

    void AM50288H::begin(byte pinLE, byte pinDIN, byte pinSCK)
    {
        _am.setPins(pinLE, pinDIN, pinSCK);
        _am.begin();
    }

    void AM50288H::update()
    {
        _am.update();
    }

    void AM50288H::clear()
    {
        _am.clear();
    }
}
}

今回は「Tnksoft.AM50288」という名前空間でランタイムクラスを定義したので、プロジェクトプロパティの「Windowsメタデータファイル」の項目を変更するがあり、このライブラリーの場合は「$(OutDir)Tnksoft.AM50288H.winmd」となります。

ビルドに成功したら、このランタイムライブラリをDMAPドライバーで稼働するUWPアプリで参照すれば、機器の制御が簡単かつ高速に行えるようになります。


using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml;
using Tnksoft.AM50288H;

namespace AM50288HDemo
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();

            amh = new AM50288H();
            // GPIO5 = 29, GPIO6 = 31, GPIO13 = 33 on Raspberry Pi
            amh.begin(29, 31, 33);
        }
    }
}

サンプルソースのダウンロード(IoTプログラミングのページに移動します)
, | 2017年5月30日
過去に何度も取り上げているArduino Wiring on Windows 10 IoT Coreですが、ドライバーの開発における勉強の過程で、「Arduino APIは所詮C++ラッパー。別にバックグラウンドアプリでなくても使えるのではないか」と思い、UWPプロジェクトでArduino関数を使う方法を試してみました。

まずはVisual StudioでUWPアプリプロジェクトを作成します。しかし、メインアプリの開発にC++/CXを使うのは相当な困難が伴いますので、GUI部分はC#言語で開発し、C++/CXランタイムコンポーネントでGPIOを制御することにしました。

そのため、Visual C++ユニバーサルWindowsランタイムライブラリプロジェクトを追加することにします。このプロジェクトに「Windows Desktop Extensions for the UWP」と「Windows IoT Extensions for the UWP」参照を追加し、NuGetより「Microsoft.IoT.Lightning」を登録します。

コンポーネントにはマニフェストの概念がないため、低レベルアクセスのパーミッションはC#アプリのappxmanifestに追加することになります。具体的な追加方法は過去の当該記事をご覧ください。

続いてC++/CXプロジェクトでラッパークラスを作ります。Windows IoT CoreのArduino APIはMicrosoft.IoT.Lightningに含まれる「Arduino.h」をインクルードするだけで、C++/CXファイルからでも簡単に呼び出すことができます。

namespace ArduinoLibrary
{
public enum class GpioPin
{
    P2 = 3, P3 = 5, P4 = 7, ...
};

public ref class Arduino sealed
{
public:
    static void pinMode(GpioPin pin, PinMode mode);
    static PinValue digitalRead(GpioPin pin);
    static void digitalWrite(GpioPin pin, PinValue state);
};
}

#include <arduino.h>
#include "ArduinoFunctions.h"

using namespace Platform;
using namespace ArduinoLibrary;

void Arduino::pinMode(GpioPin pin, PinMode mode)
{
    ::pinMode((byte)pin, (uint8_t)mode);
}

PinValue Arduino::digitalRead(GpioPin pin)
{
    return (PinValue)::digitalRead((byte)pin);
}

void Arduino::digitalWrite(GpioPin pin, PinValue state)
{
    return ::digitalWrite((byte)pin, (uint8_t)state);
}

C#から呼び出す例です。
private async void RuntimeTest()
{
    await Task.Run(() => {
        Arduino.pinMode(GpioPin.P5, PinMode.OUTPUT);
        Arduino.pinMode(GpioPin.P6, PinMode.OUTPUT);
        Arduino.digitalWrite(GpioPin.P5, PinValue.LOW);
        Arduino.digitalWrite(GpioPin.P6, PinValue.LOW);

        while (true) {
            uint m = Arduino.millis();
            Arduino.digitalWrite(GpioPin.P5, PinValue.HIGH);
            Arduino.delay(10);

            while (Arduino.millis() - m < 10000) {
                Arduino.digitalWrite(GpioPin.P6, PinValue.HIGH);
                Arduino.delayMicroseconds(50);
                Arduino.digitalWrite(GpioPin.P6, PinValue.LOW);
            }

            Arduino.delay(10);
            Arduino.digitalWrite(GpioPin.P5, PinValue.LOW);

            Arduino.delay(500);
        }
    });
}

……と、ここまで書いておいてなんですが、この方法だとWindowsランタイムが頻繁に介入するため、実際に動かしてみると、速度やタイミングが不安定で、ダイレクトメモリーマッピングの恩恵をあまり受けられないのが実情です。そのため、以下のようにGPIOを制御するルーチンはできる限りランタイムライブラリにまとめた方が良いでしょう。
void Arduino::frequencyTest1()
{
    ::pinMode(GPIO5, DIRECTION_OUT);
    ::pinMode(GPIO6, DIRECTION_OUT);
    ::digitalWrite(GPIO5, LOW);
    ::digitalWrite(GPIO6, LOW);

    while (true) {
        unsigned long m = millis();
        ::digitalWrite(GPIO5, HIGH);
        ::delay(10);

        while (millis() - m < 10000) {
            ::digitalWrite(GPIO6, HIGH);
            ::delayMicroseconds(50);
            ::digitalWrite(GPIO6, LOW);
        }

        ::delay(10);
        ::digitalWrite(GPIO5, LOW);

        ::delay(500);
    }
}


おまけ:inoファイルをC++/CXプロジェクトに追加する方法
inoファイルをVisual C++にC言語と見なさせることで、ランタイムライブラリでもinoファイルを直接プロジェクトに追加することができます。任意の名前を持つinoファイルをプロジェクトに追加したら、ソリューションエクスプローラーより、inoファイルのプロパティを開きます。ここより「全般」の「項目の種類」に「C/C++コンパイラ」を選択し、「C/C++詳細設定」の「必ず使用されるインクルードファイル」に「Arduino.h」を追加します。

inoファイルのコンパイル方法指定 Arduino.hを自動インクルード
これにより、inoファイルに特別な定義を追加せずとも、Arduino IDE同様の記述ができるようになるため、Arduino向けのプログラムの移植がより容易になります。

// C++/CX file
void setup();
void loop();

void Arduino::frequencyTest2()
{
    setup();
    while(true) loop();
}

// test.ino
void setup()
{
    pinMode(GPIO5, OUTPUT);
    pinMode(GPIO6, OUTPUT);
    digitalWrite(GPIO5, LOW);
    digitalWrite(GPIO6, LOW);
}

void loop()
{
    unsigned long m = millis();
    digitalWrite(GPIO5, HIGH);
    delay(10);

    while (millis() - m < 10000) {
        digitalWrite(GPIO6, HIGH);
        delayMicroseconds(50);
        digitalWrite(GPIO6, LOW);
    }

    delay(10);
    digitalWrite(GPIO5, LOW);

    delay(500);
}

以前紹介したバックグラウンドアプリと通信する方法だと、リソースが不足したときにOSがバックグラウンドアプリを止めてしまう可能性があります。そのため、アプリが動いている間はGPIO制御の動作も保証されるという点を考慮すると、フォアグラウンドアプリとして埋め込む利点は十分にあると思います。

ちなみにArduino UnoとRaspberry Piを接続して簡易的な性能テストをしてみましたが、C++/CXにAPIを埋め込む方法と、inoファイルに記述した関数を呼び出す方法に目立つ性能差はありませんでしたので、どちらを採用するかは開発者の好みでよいかと思います。サンプルプログラムにはテスト内容やinoファイルまで今回紹介した内容一式がすべて含まれているので、オシロスコープなどの高度な計測ができる機器で試されたら、結果を私にも教えてください。

サンプルソースのダウンロード(IoTプログラミングのページに移動します)
, | 2017年5月19日
何度もこのブログで言及していますが、Windows IoT Coreで「DMAP Driver」とLightning APIを使うとGPIOの処理速度が劇的に上がります。Lightning APIのソースコードはGithubで公開されているので、このコードを読み解くことで、なぜ高速な処理ができるのかがわかります。

ざっくり解説すると、LightningライブラリーではWin32 APIでGPIOコントローラーのレジスタを取得し、その値を直接書き換えることで迅速なアクセスを実現しています。また、C++/CXよりArduino言語の方がより高速なのは、C++/CXではウィンドウズランタイムが介入しているのに対し、Arduino言語はC++言語としてコンパイルされた上で、ライブラリ内のWin32 APIに直にアクセスしているためであることが理解できます。


前回紹介したサンプルプログラムはLightning APIを使用していないため、ドライバー制御ソフトはDMAP Driverでは動作しません。そこで今回はDMAP Driver環境で動くドライバー制御ソフトのソースコードを紹介したいと思います。

DMAP Driverコントローラーの作成は、Lightning APIの移植という形で実現しています。ただし、オリジナルのソースにはWinRT関連の命令が含まれているため、命令の一部をDeviceIoControl()に置き換えるといった最適化を独自に施しています。

また、Raspberry Piでは検証済みではありますが、MinnowBoard MAXについてはソースコードの移植のみで動作確認ができていないため、このハードウェアで使う場合はいくらかの修正が必要になります。

たとえば「BcmGpioControllerClass」はその名の通り、Raspberry Piに搭載されているBroadcom社のBCMシリーズのチップを低レベルで制御するためのGPIOクラスなので、BayTrailチップでは「BtFabricGpioControllerClass」に置き換えなくてはいけません。

こちらはRaspberry PiにおいてGPIO6への入力を調べるコード例です。関数のはじめが小文字であったり、WinRT APIにはあるPullDownに相当する定数が無いなど、Arduinoを意識した構成であるのが特徴的です。

BcmGpioControllerClass bgc;
ULONG state;
bgc.setPinMode(6, INPUT);
/* "setPinMode"は以下の関数と同義
setPinFunction(6, 0); // Use as GPIO
setPinDirection(6, DIRECTION_IN);
setPinPullup(6, FALSE);
*/
bgc.getPinState(6, state);
if(state == HIGH){}


DMAP対応版サンプル制御プログラムは前回とほぼ同じ振る舞い(可変抵抗で左右に移動、タクトスイッチでタッチのシミュレート)をします。ただし、GPIOの反応が相当速くなったことに伴い、タクトスイッチの反応もかなり敏感になっているため、いわゆるチャタリングが発生しやすくなっています。そのためinterruptによるハンドリングではなく、ループ内で非常に短い間隔での切り替えを排除したスイッチのチェックを行っています。


もちろん、デバイスマネージャーで「Direct Memory Mapped Driver」を有効にしておかないと動作しません。

サンプルソースのダウンロード(IoTプログラミングのページに移動します)
, | 2017年5月10日
前回は独自に開発したドライバーをWindows IoT Coreにインストールする方法を紹介しました。今回はそのドライバーを制御するためのソフトを作るテクニックを独学した成果をご紹介します。

デスクトップに比べ、OSへのドライバー導入は敷居が低いですが、UWPからのアクセスは至難の業です。そこで今回はCUIベースのアプリでGPIOからのデータを受け取り、ドライバーを動かすことで結果としてUWPに反映させたいと思います。


[コンパイルのための下地作り]
Windows IoT Core Project Templatesを導入すると、Visual C++の新規プロジェクトに「Blank Windows IoT Core Console Application」が追加されるので、このプロジェクトを選択します。


続いてWinRT APIを使えるようにします。C++プロジェクトのプロパティーで「Windowsランタイム拡張機能の利用」を「はい(/ZW)」に、「最小リビルドを有効にする」を「いいえ(/Gm-)」にします。次にWinRT APIが定義されている「Platfowm.winmd」と「Windows.winmd」を含めるため「追加の#usingディレクトリ」にそれぞれのファイルが含まれるフォルダー「$(VC_ReferencesPath_VC_x86)\store\references;$(UniversalCRTSdkDir)UnionMetadata(※開発環境によってパスが異なる場合があります)」を指定します。

こちらは任意ですが、「pch.h」ファイルが不要であれば、「プリコンパイル済みヘッダー」「プリコンパイル済みヘッダーファイル」の2カ所を削除します。


Inbox DriverによるGPIO制御はC#でのプログラムとほぼ同じです。もちろん、C++/CXとの言語の壁はありますので、こちらについては「C#と比較するC++/CX基礎知識」の項目をご覧ください。
auto gpio = GpioController::GetDefault();
auto pin = gpio->OpenPin(6);
pin->SetDriveMode(GpioPinDriveMode::InputPullDown);
auto pv = pin->Read();

インストールしたドライバーはCM_Get_Device_Interface_List()で対象のGUIDを保有するドライバーを検索し、取得したIDをCreateFile()で開き、そのハンドルを取得することで操作することができるようになります。

ここで気をつけておきたいのは、デバイス列挙APIが含まれる「cfgmgr32.h(およびcfgmgr32.lib)」はARM向けのWindows SDKには含まれていないという点です。Raspberry Piで利用するのであれば、Windows Driver Kitをあらかじめインストールしておきましょう。

[スクリーンサイズを取得する]
Raspberry Piにおける開発ではもう一つ問題があります。HIDデバイスではXとY座標は画面のサイズにかかわらず、取得される数値は相対値(プロファイルにもよりますが、基本的には0~65535の間)になります。


[HIDデバイスに送る座標値例]

そのため、座標を適切な値に変換するには画面のピクセルサイズを知る必要があります。が、Raspberry Piではスクリーンサイズを取得するWin32 APIは機能しません。例えば、「GetSystemMetrics(SM_CXSCREEN)」を呼んでも常に0が返ります。

管理人はシステムファイルを解析することでこの問題を解決しています。Raspberry Pi向けWindows IoT CoreはRaspbianと同様にconfig.txtにシステムデータが格納されています。サンプルプログラムではこのファイルから読み取ったファイルにある「hdmi_group」と「hdmi_mode」の値をRPiconfigによる定義と照らし合わせてスクリーンサイズを推測しています。

[制御プログラムをGUIアプリから呼び出す]
本当はRaspberry Piの起動時に自動で実行させたかったのですが、schtasksコマンドを使ってタスクを登録しても動作せず、開発者のコミュニティーでも回答が得られなかったので、苦肉の策として、UWPから直接起動させるという方法をとりました(ほかに良い方法があればFacebookのコミュニティーで教えてください)。

もちろんUWPアプリですから、セキュリティー云々の理由で、プロセスの実行は基本的に禁止されています。が、Windows 10 IoT Coreの10.0.10586以降であれば、あらかじめ所定のレジストリに実行ファイルのパスを登録し、ホワイトリストにしておくことで、「ProcessLauncher.RunToCompletionAsync」メソッド(Windows IoT Core Extensionを参照に追加することで使用できます)により起動させることができます。

以下はデスクトップPCのPowershellにおける、レジストリへの登録例です。
reg.exe ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\EmbeddedMode\ProcessLauncher" /v AllowedExecutableFilesList /t REG_MULTI_SZ /d "c:\data\tnkHidInjectTest.exe\0"

サンプルプログラムでは、制御ソフトにおいてミューテックスとイベントハンドラによる多重起動防止の機能を追加しており、また、起動時のコマンドライン引数に「e」が含まれていたら、制御プログラムのプロセスを終了させてます。これは、「kill.exe」をホワイトリストに追加する手間を省くためと、きちんとプロセスを終了させるためです。

[コンソールアプリをデバッグする]
対象の機器のIPアドレスなどを自動取得してくれるUWPデバッガーと違い、C++コンソールアプリはちょっとした手間が必要となります。

まずはブラウザーか、Windows 10 IoT Core DashboardよりWindows Device Portalを開き、「Debug」の欄で「Start Visual Studio Remote Debugger」の「Start」ボタンを押します。


正常に動作すれば、リモート先のIPアドレスが表示されます。表示されない場合はリモートデバッグツールを導入する必要がありますが、これは適当なUWPアプリを作ってデバッグを実行すると、勝手に環境を整えてくれます。

また、リモートデバッグを実行している間はGUIアプリのリモートデバッグはできません。もしリモートデバッガーを止めてもGUIのデバッグができないようであれば、デバイスポータルの「Process」を表示して「msvsmon.exe」のプロセスを止めましょう。

対象のプロジェクトのデバッグを設定します。「リモートコマンド」はビルドしたファイルのコピー先を、「作業ディレクトリ」「追加の配置ファイル」にはその実行ファイルのあるフォルダーのパスを指定します。「リモートサーバー」はデバイスポータルのリモートデバッガーで表示された成功メッセージに記載されているアドレスを、「接続」では「認証なしでリモート接続する」、「デバッガーの種類」は「ネイティブのみ」をそれぞれ指定します。


これにより、Visual StudioからF5キー一発(「ビルド構成」の「配置」へのチェックを忘れずに!)で、ブレークポイントやウォッチリストが使えるデバッグ作業が行えるようになります。

サンプルプログラムのソースでは、起動しているGUIアプリに「tnksoft」のキーボード入力を転送するとともに、タクトスイッチを押すとA/Dコンバーターの定番「MCP3002」によってSPI経由で取得した可変抵抗の抵抗値をX座標に変換した場所で、タッチ操作をシミュレートします。また、ダウンロードできるソースコードにはX軸とY軸の値の両方を使ってマウスカーソルを移動させる例も追加しています。

 

サンプルソースのダウンロード(IoTプログラミングのページに移動します)
, | 2017年5月8日
ボタンやスクリーン、キーボードと言った、操作に必要なレイアウトのデザインが自由にでき、GPU支援による快適な転送を実現したリモートデスクトップアプリ「デスクトップPCコントローラー for Windows 10」のクライアントソフトをアップデートしました。Ver 1.2ではオーディオデバイスが見つからなかったときにクライアントがエラーを起こす問題を修正しています。


2017年5月7日
タクトスイッチをマウスクリック、タッチパネル信号を受信したらタッチ操作。電子パーツからの信号よりGUIを操作したいとは思うものの、Windows IoT CoreのGUIアプリはUWPベースのため、SendInputなどの入力操作をシミュレートするAPIはサポートされていません。マイクロソフトは何らかの対応を検討しているようですが、2017年4月の時点では代替APIは実装されていません。

現時点でマイクロソフトが提案しているのはソフトウェアドライバーを組み込むという方法です。Windows IoT CoreはGUIアプリではUWPベースのものしか作れませんが、CUIであればWin32 APIを使ったプログラムを動かすことができます。ちなみに、マイクロソフトが公開しているソースを読む限り、Arduino Wired ProjectのGPIO処理がほかの言語に比べて異様に早いのは、ウィンドウズランタイムを介さずに、I/O制御のWin32 APIを直接実行しているためのようです。

マイクロソフトはGitHubでソフトウェアドライバーのサンプルを公開しています。このプログラムにはキーボード入力、マウス操作、マルチタッチのHIDデバイスのシミュレートが一通り行え、趣味の電子工作であれば十分実用的なので、このドライバーを使った制御方法をご紹介します。

まずはドライバーのビルドから始めましょう。基本的に、Windows Driver Kitをインストールしてから、プロジェクトを読み込んでARM向けにコンパイルすれば、Visual Studio以外の開発ツールをインストールしているなどの特殊な状況でない限り、ドライバーファイルはすぐにできます。ただし、Windows 10向けのドライバーが開発できるのはVisual Studio 2015のみで、今のところVS2017はサポートしていません。これだけのために開発環境を導入するのは面倒だという方は、管理人が独自にビルドしたドライバーを用意していますので、こちらをダウンロードしてください。

次にドライバーのインストールです。デスクトップOSではセキュリティーを理由に、電子署名のないドライバーはテストモードでないと動作しないなど、導入の壁は高い一方で、趣味の電子機器制御を前提にしたWindows IoT Coreは導入の制約がかなり緩いです。

まずはデスクトップOSよりパワーシェル(PowerShell)を管理者権限で起動したら、デバイスへのアクセスの許可を与えるコマンドを実行します。一度有効にしたら次回以降はこのコマンドの入力は不要です。「192.168.0.5」はWindows IoT Coreの保有するローカルアドレスを指していますので、Windows IoT Coreの環境に応じて適時置き換えてください。
net start WinRM
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 192.168.0.5


続いて、デバイスに接続します。コマンドを実行するとパスワードが要求されるので、WinIoTのログインパスワードを入力してください(初期設定では、アカウント名が「administrator」でパスワードが「p@ssw0rd」)。
Enter-PSSession -ComputerName 192.168.0.5 -Credential administrator


接続に成功すると約30秒くらいで次のコマンドの入力ができるようになります。

続いてIoTデバイスにドライバーファイルをコピーします。エクスプローラーのアドレスに「\\192.168.0.5\C$」と入力すると、IoTのディレクトリーを開くことができます。ここから「C:\Windows\System32\Drivers」に移動し、「HidInjector.inf」と「HidInjector.sys」をコピーします(Raspberry Pi2の場合)。

パワーシェルに戻り、以下のコマンドを入力してドライバーのインストールを実行します。
cd C:\Windows\System32\Drivers
devcon install HidInjector.inf root\\HidInjector

メッセージの最後に「Drivers installed successfully.」と表示されればインストールは完了です。しばらくすると自動で再起動されますが、始まらない場合は「shutdown /r /t 0」と入力して手動で再起動してください。

デバイスの確認はパワーシェルより以下のコマンドで行えます。なお、起動直後は「Enter-PSSession」の実行が再度必要です。
devcon hwids root\\HidInjector
(※結果例)
ROOT\DEVCON\0000
    Hardware IDs:
        root\\HidInjector
1 matching device(s) found.


ちなみにこちらがアンインストールするコマンドになります。
devcon -remove root\\HidInjector


もしドライバーの問題でブートができなくなってしまい、OSの再インストールをせざるを得ない際は、以下の方法でSDカードをフォーマットします(マイクロソフトのFAQサイトからの引用。通常のフォーマットではドライバーのデータが残ることがあり、問題が解決しないことがあります)。
diskpart
list disk (このリストで表示されたSDカードのディスク番号を書き留める)
select disk <number>(<number>をSDカードのディスク番号に置き換える)
clean
create partition primary
format fs=ntfs quick
, | 2017年5月3日
マウスカーソルのすぐそばでIMEが有効になっているかの状態を一目で確認できるユーティリティ「IMEステータス」のVer 2.14を公開しました。このバージョンでは、アイコンを固定した際にウィンドウを全画面にしたときに画面外にはみ出る問題を修正するとともに、マルチスクリーン時でのウィンドウ最大化では、一番適切と判断した画面に移動するように改善されています。

2017年4月26日
« 前ページへ - 次ページへ »