.NET Micro Framework

組み込み型アプリでの Microsoft .NET Framework

Colin Miller

コード サンプルのダウンロード

世界は、1980 年代初期の最初の状況依存型 C コード エディターから大きく進化しています。当初デスクトップ アプリ用に開発されたツールや言語は、サーバー、クラウドなどの環境を包含するように拡張されています。Microsoft .NET Framework と Visual Studio は、プログラマの効率が大きく向上する最先端のツールを提供します。.NET Framework のツールと言語は、機能豊富なライブラリやコラボレーション ツールを提供し、プログラマが起こしがちなミスを防止します。

しかし、このような進化の恩恵は、組み込み型デバイスに取り組む開発者にはもたらされてきませんでした。組み込み型ツールの市場には、PC、サーバー、クラウドのアプリ向けのツールに投入されたような投資を呼び込めるほどの十分な市場規模がありませんでした。しかし、多種多様な "インテリジェント デバイス" の出現により、このような不均衡に変化がもたらされはじめています。

.NET Micro Framework の登場により、小型デバイスなど、新たな製品が次々と開発されるようになりました。これが登場する以前は、コードを開発するために組み込み型開発の異なるスキルが必要でしたが、.NET のスキルを有する個人やチームであれば、だれでも開発できるようになりました。読者が .NET 開発者で、組み込み型の小型デバイスに自身のアプリを利用しようとお考えであれば、今回のコラムをお読みいただくことで、自身のスキルを活かして、モノのインターネット (IoT) やインテリジェント デバイスの発展に寄与できると納得していただけると思います。

なぜ重要なのでしょう。ある最新の調査によると、2017 年に出荷予定のプロセッサの 94% がこれまでの .NET アプリ環境をサポートするだけの処理能力を備えていないと推定されています。.NET Micro Framework があれば、この能力を拡張することができます。

.NET Micro Framework は、SPOT 腕時計プロジェクトで最初に開発されました。それ以来 7 年間 .NET ファミリーの一員です。.NET Micro Framework は、全 OS をサポートするには小さすぎる 32 ビット プロセッサで実行されます。実際のところ、これは実行エンジンと型システムを実行可能イメージに統合し、ハードウェアで直接実行される .NET です。

組み込み型アプリ用の 32 ビット MCU ベースの小型デバイスで実行するアプリを .NET 開発者が作成できるようにすることが、.NET Micro Framework の目標です。マイクロソフトは 2014 年の Build カンファレンスで OS プラットフォームの範囲について、ハイ エンドでは Windows Embedded Standard、小型デバイス エンドでは .NET Micro Framework で IoT 分野をカバーすると説明しました。

組み込み開発

インテリジェント デバイスとは、ローカルにコンピューティング能力があり、別のデバイスと通信でき、おそらくクラウドとも通信できるようなデバイスです。今回は、Windows Phone OS を実行するスマートフォンから制御できる小型のモバイル ロボットを作成します。Windows Phone アプリに使用する .NET のスキルを、ロボット側にもまったく同じように当てはめることができることを示すのが今回の目標です。このような環境にツールと言語がサポートされるのは画期的なことで、Phone アプリとロボット開発の間で開発環境がシームレスに切り替わります。

今回開発する Bert は四輪駆動のモバイル ロボットです (図 1 参照)。Bert は、Secret Labs から約 3,500 円で購入できる Netduino 2 ボードを搭載しています。シンプルなコントローラーにより、ロボットの両側にあるモーターを制御して前進および後進します。ただし、速度は制御できません。

Bert ロボット
図 1 Bert ロボット

通信については、シリアル インターフェイス経由で Netduino と通信する Bluetooth モジュールを搭載しています。Bert が何かに衝突しないように、または崖から転げ落ちないように、Bert の前面と背面に IR 近接センサーを取り付けています。そして、ちょっとした遊び心でヘッドライトと方向指示器も取り付けています。

Windows Phone のアプリはシンプルで、Build カンファレンスでプレゼンテーションを行ったデモを流用しています。このアプリは、適切なデバイスに接続し、スマートフォン内蔵の加速度計を使用して、Bluetooth 経由でコマンドを送信し、Bert を操作します。図 2 がインターフェイスで、図 3 はドロップダウン リストの選択肢です。[Enumerate] (列挙) をタップして、コマンドを送信する接続先のデバイスを選択します。コマンドは、画面に表示される方向を示す文字によって変化します。             

Windows Phone アプリのインターフェイス
図 2 Windows Phone アプリのインターフェイス

デバイスを選択するドロップダウン リスト
図 3 デバイスを選択するドロップダウン リスト

.NET Micro Framework は、.NET Micro Framework Porting Kit (bit.ly/1wp57qm、英語) を使用して、別のハードウェア プラットフォームに移植できます。このキットを使用すると、低レベルのインターフェイスが実行基盤となる特定のハードウェアに書き込まれます。その結果、従来の組み込みプログラミング作業に近くなります。さいわい、多くのベンダーがこの作業を既に行っています。今回のアプリで使用する Netduino ボードも、Netduino SDK でボードのコーディングを始めるために必要なものがすべて揃っています (bit.ly/1CQygzz、英語)。

Netduino は、STMicro 製の Cortex-M3 プロセッサと、192 ~ 384 KB のフラッシュ メモリ、60 ~ 100 KB の RAM を搭載し、Arduino シールドとピン互換です。.NET Micro Framework をサポートするその他のデバイスも、GHI Electronics、Mountaineer、Sparkfun、Adafruit、Amazon などのショップで見つかります。

Netduino ボードはオープン ソース ハードウェアなので、アプリを作成後に商品化する場合でもいくつか選択肢があります。アプリのサイズが小さい場合は Netduino ボードをそのまま使用するだけですが、サイズの大きなアプリをターゲットにする場合や、同じ PCB に追加の電子機器を組み込むような特殊要件がある場合は、オープン ソースの設計ファイルをボード メーカーに持ち込んで、カスタマイズすることができます。

今回は、手始めに Netduino ボードを使用するため、Netduino SDK をインストールしました。この SDK には、Visual Studio テンプレートと必要なライブラリ サポートをすべて備えた .NET Micro Framework SDK が含まれています。他の開発ボードを使用する場合は、別途 .NET Micro Framework SDK のインストールが必要になることがあります。SDK にはエミュレーターが付属しているため、ハードウェアを .NET Micro Framework と連携させる必要はありません。ただし、使用するセンサーが既に決まっている場合は、そのハードウェアを使用することで生産性が上がります。

組み込みアプリの作成

Netduino SDK (.NET Micro Framework SDK を含む) をインストール後、Visual Studio で他のプロジェクトを開始するのと同じ要領で、.NET Micro Framework 組み込みアプリの開発に着手します。[新しいプロジェクト] を選択し、開始するアプリの種類を選択します。図 4 に示すように、Bert のボードに対応する [Netduino 2 Application] を選択します。

.NET Micro Framework 組み込みアプリ開発の開始
図 4 .NET Micro Framework 組み込みアプリ開発の開始

プロジェクトを開始したら、まず、ロボットとスマートフォン間の通信リンクの作成に取りかかります。

多くの組み込みアプリと同様、Bert はバッテリで駆動します。つまり、消費電力を節約するコードを作成する必要があります。さいわい、.NET Framework と .NET Micro Framework では消費電力が考慮されています。実行するスレッドがなければ、.NET Micro Framework はプロセッサを自動的に低電力モードに移行します。また、割り込みを監視する効率の高いプロセッサを別途追加して、メイン プロセッサをさらに低電力状態にすることも一般的になりつつあります。.NET Framework がこの種のプログラミングに適しているかどうかはすぐにわかります。

このアプリのコードは外部イベントに応答するかたちで実行され、応答に必要なことだけを実行します。したがって、すべての実行コードは、以下に示すように、特定のイベント ハンドラー、またはほとんどの時間中断される特定のスレッドに配置します。

public class Program
  {
    public static void Main()
    {
      RunRobot myRunRobot = new RunRobot();
      myRunRobot.Start();
      while (true)
      {
        Thread.Sleep(Timeout.Infinite);
      }
    }
  }

RunRobot コンストラクターが IO インスタンスを初期化 (詳細後述) し、RunRobot.Start メソッドが実際の実行をトリガーする割り込みを初期化します。

public void Start()
  {
  // Enable interrupts on BT input on the HC-06 radio
  hc06.DataReceived += hc06_DataReceived;
  // Use onboard button to turn on/off accepting commands
  button = new InterruptPort(Pins.ONBOARD_SW1, false, Port.ResistorMode.Disabled,
    Port.InterruptMode.InterruptEdgeHigh);
  // Start monitoring for button presses
  button.OnInterrupt += new NativeEventHandler(button_OnInterrupt);
  }

Bluetooth の設定

Bert と Windows Phone アプリ間の Bluetooth 通信を設定するため、次の 3 つの手順を実行します。

  1. Bert ロボットの Bluetooth モジュールに接続する
  2. Windows Phone アプリからコマンドを送信する
  3. Bert でコマンドを受信する

Netduino は Arduino 互換なので、多くの接続に対して、必要な接続をすべて自動的に行うプラグイン可能なシールドが見つかる可能性があります。Arduino は、周辺機器の豊富なエコシステムを備えた人気のホビー用プラットフォームです。そのため、既存のモジュールを利用して、幅広いソリューションを作成できます。

接続の手間を省きたい場合は、GHI Electronics 社の Gadgeteer 製品を検討してください。このようなボードやコンポーネントでは、ウィザードを使用して、コンポーネントをプラグインする標準接続を決定できます (図 5 参照)。そのため、接続の設定に関する知識は不要です。モジュールのインターフェイスも同様に一般的なものです。Arduino と同様、Gadgeteer には、ソリューションの作成に使用する既存のモジュールの豊富なセットが用意されています。モジュールを接続したら、.NET Micro Framework で引き続きコーディングを行います。このような方法は、特に、アイデアのプロトタイプをすぐに作成する場合に便利です。

接続を示す Gadgeteer ウィザード
図 5 接続を示す Gadgeteer ウィザード

Bert の場合、Gadgeteer を使用しないで、独自のモジュールを集めました。Bluetooth モジュール (HC-06) は、4 つの接続 (VIN、GND、RX、TX) を備えたシリアル インターフェイスを使用します。VIN (電圧入力) を Netduino の 5 V 出力または 3.3 V 出力のどちらかに接続後、GND を GND 接続の 1 つに接続します。図 6 に示す Netduino の I/O 表を見ると、BT モジュールの RX (受信) を Netduino の TX (送信) に接続し、BT モジュールの TX を COM1 シリアル ポートの Netduino の RX に接続しているのがわかります。必要であれば、このようなモジュールを一般的なマイクロコントローラーに接続するための多くの例が Web 上に見つかります。

Netduino IO ピンの定義
図 6 Netduino IO ピンの定義

接続を行ったら、Netduino に電源を入れ、BT モジュールに電力を供給したら、デバイスとスマートフォンをペアリングします。BT モジュールの既定の名前は HC-06 なので、HC-06 とペアリングします。AT コマンドを使用して、名前を Bert に変更します。文字列 "AT+NAMEBert" を含むバイト配列を送信し、BT モジュールの名前を変更します。このインターフェイスを使用して、Bluetooth モジュールの構成 (通信ボーレートなど) を行うこともできます。

これで、スマートフォンを使用して、他の BT デバイスと同じ要領で Bert に接続でき、コマンドの送信を開始できるようになります。まず、内蔵の加速度計にアクセスし、妥当なレポート間隔を設定することで、処理能力が乏しい Bert がダウンしないようにします。

accelerometer = Accelerometer.GetDefault();
if (accelerometer != null)
{
  uint minReportInterval = accelerometer.MinimumReportInterval;
  desiredReportInterval = minReportInterval > 250 ? minReportInterval : 250; 
    // Slowing this way down to prevent flooding with commands
  accelerometer.ReportInterval = desiredReportInterval;
    // Add event for accelerometer readings
  accelerometer.ReadingChanged += new TypedEventHandler<Accelerometer,
    AccelerometerReadingChangedEventArgs>(ReadingChanged);
}

ReadingChanged イベント ハンドラーでコマンドを送信します (図 7 参照)。

図 7 Bert にコマンドを送信するためのイベント ハンドラー

AccelerometerReading reading = args.Reading;
if (reading.AccelerationX > .4)  // These are arbitrary levels
                                 // set to what seemed easy
{
                        // Send Right
  if( cmdSent != 'R')   // Don’t resend the same command over and over
  {
      // Update the phone display
    txtRight.Text = "On";
    txtLeft.Text = " L";
    txtForward.Text = " F";
    txtBack.Text = " B";
      // Send the command
    packet = Encoding.UTF8.GetBytes("R");
    cmdSent = 'R';
    SendData(packet);
  }

コマンドの受信と実行

次に、ロボット側でのコマンドの受信について考えます。BT モジュールは、Netduino の最初のシリアル ポートに接続しています。他のバージョンの .NET Framework と同様に、SerialPort のインスタンスとメッセージ バッファーを作成します。

SerialPort hc06;                 // The BT radio
byte[] cmdBuffer = new byte[32]; // The input buffer for receiving commands

次に、Bluetooth モジュールと通信するシリアル ポートを構成します (9600 ボーが既定の設定です。AT コマンドを使用してこの設定をリセットできますが、プログラムが簡単になるように今回の通信頻度はそれほど高くしていないため、既定値よりも高速にする必要はありません)。

// Set up the Bluetooth radio communication
hc06 = new SerialPort(SerialPorts.COM1, 9600, 
  Parity.None, 8, StopBits.One);
hc06.ReadTimeout = 1000;
hc06.Open();

次に、アプリ内のほとんどの処理をトリガーする DataReceived イベント ハンドラーを設定します。言い換えれば、Bert はコマンドを受信するまで休止状態に入ります。プロセッサは、モーターが適切な状態になるまで実行を続けた後、休止状態に戻ります。

// Enable interrupts on BT input
hc06.DataReceived += hc06_DataReceived;

着信するコマンドはイベント ハンドラーで処理します (図 8 参照)。

図 8 Bert の動きを開始するための着信コマンド

do
{
  try
  {
    count = hc06.Read(cmdBuffer, 0, 1);  // Should read one byte at a time
  }
  catch (Exception) { }        // Just eat exceptions
  if (count > 0)
  {
    cmd = (char)cmdBuffer[0];
    executeCmd(cmd);   // Execute command immediately
  }
} while (count > 0);

どのコードもデスクトップで作成するコードと大差ありません。

Bert の運転

今回使用するモーター コントローラーでは、車輪の回転方法を決定するために、車の論理状態で 4 つの入力を設定する必要があります。ロジックは以下のとおりです。

/*        
A2  A1  Motor 1         B2  B1  Motor 2
0   0   Shaft locked    0   0   Shaft locked
0   1   Clockwise       0   1   Clockwise
1   0   Anti-clockwise  1   0   Anti-clockwise
1   1   Shaft locked    1   1   Shaft locked 
*/

これらを書き込むには、OutputPort を作成し、図 6 に示した Netduino デジタル ピンの 1 本に結び付けます。完全な .NET Framework を実行するデバイスは通常、デジタル I/O ポートを個別に処理できないため、OutputPort は .NET Framework では一意のクラスです。.NET Micro Framework には、I/O の追加の種類や、電源管理などの今回のアプリ空間独特の別の問題に適した新しいクラスがあります。

// Motor controller output
A1 = new OutputPort(Pins.GPIO_PIN_D2, false);  
  // A is the left tires when viewed from the front
A2 = new OutputPort(Pins.GPIO_PIN_D3, false);
B1 = new OutputPort(Pins.GPIO_PIN_D4, false);  
  // B is the right tires when viewed from the front
B2 = new OutputPort(Pins.GPIO_PIN_D5, false);
Setting them is as simple as writing true or false:
switch (cmd)
{
  case 'F':
  {
    Debug.Print("Forward");
    A1.Write(false);   // Left forward = false/true
    A2.Write(true);
    B1.Write(true);    // Right forward = true/false
    B2.Write(false);
    break;
  }

慎重な運転

Bert 自身のため、または Bert の周囲の障害物や人間の安全のため、Bert が何かに衝突しないように、Bert の前面と背面にシャープ製の赤外線近接センサーを 取り付けました。このセンサーは、照射した IR ライトを反射する最も近い物体の距離に応じて 0.0 ~ 1.0 の値を返します。

前面に取り付けたセンサーは下向きで、Bert の前方 18 インチの地面を検知します。このように、1 台のセンサーを使用して物体を検知したり、たとえば、階段に接近した場合には段差を検知することも可能です。センサーから返される値はアナログ値です。つまり、.NET Framework 独自の別のクラス (AnalogInput クラス) のインスタンスを .NET Micro Framework に対して作成します。

AnalogInput foreRange;    // Forward range finder input
AnalogInput backRange;    // Rear range finder input
// Set up range finder for collision and edge avoidance
foreRange = new AnalogInput(Cpu.AnalogChannel.ANALOG_5, 100, 0, -1);
backRange = new AnalogInput(Cpu.AnalogChannel.ANALOG_4, 100, 0, -1);

このコンストラクターは、接続している特定のアナログ ポート、出力をより便利な値の範囲に変換するための乗数、利便性を目的として出力を変更するためのオフセット、および出力精度 (最大精度は -1) を受け取ります。センサーによる検知を定期的に行うために、センサー値の読み取りをタイマーでトリガし、できるだけプロセッサが休止状態になるようにします。スマートフォンからのコマンドを受け取り可能になったらタイマーを開始し、受け取れないときは停止します。

// Start timer for rangeFinders
Timer rangeReader = new Timer(new TimerCallback(rangeTimerHandler), 
  null, 0, 100);

汎用の割り込み

今回紹介する新しいクラスの最後は InterruptPort クラスです。このクラスにより、デジタル入力の変化を監視できるようになります。たとえば、立ち上がりエッジが低から高に変化するときにトリガーすることができます。Netduino ボード上のボタン用にこのクラスを使用し、Bert がスマートフォンからのコマンドに応答できるようにします。つまり、このボタンを押して初めて Bert はコマンドに応答するようになり、再度ボタンを押すとコマンドを無視するようになります。

// Use onboard button to turn on/off accepting commands
button = new InterruptPort(Pins.ONBOARD_SW1, false,
  Port.ResistorMode.Disabled,
  Port.InterruptMode.InterruptEdgeHigh);

Pins.ONBOARD_SW1 は、Netduino ボード上にあるスイッチ用の内部接続です。スイッチは、図 6 に示すどのデジタル ポートにも接続できます。2 つ目の引数は、エラー フィルターをこのスイッチの入力に割り当て、1 回のボタン押下で複数回トリガーされることを防ぐ必要があるかどうかを示します。

3 つ目のパラメーターは、スイッチにプル アップ抵抗またはプル ダウン抵抗があるかどうかを示します。つまり、ボタンが押されていない状態のとき、既定のポート位置が高か低かを定義します。最後のパラメーターは、立ち上がりエッジが高に変わるときに割り込みをトリガーするように設定しているため、Bert が発進後速やかに指を離します。InterruptPort のインスタンスを作成したら、割り込みハンドラーを割り当てることができます。

// Start monitoring for button presses
button.OnInterrupt += new NativeEventHandler(button_OnInterrupt);

割り込みハンドラーでは、Bert がスマートフォンから着信するコマンドの監視を開始するようにします (図 9 参照)。

図 9 コマンドの監視を有効にする割り込みハンドラー

private void button_OnInterrupt(uint data1, uint data2, DateTime time)
{
  cmdListenState = !cmdListenState;
  if (cmdListenState)
  {
    // Set up timer for rangeFinders
    rangeReader = new Timer(new TimerCallback(rangeTimerHandler), 
      null, 0, 100);
  }
  else
  {
    rangeReader.Dispose(); // Drop the timer because Bert isn't processing
                          // commands so he shouldn't be moving
  }
  led.Write(cmdListenState);  // The onboard LED indicates whether
                               // Bert is accepting commands
}

組み込みアプリと .NET Micro Framework

組み込みアプリは、通常、最低限の要件を満たすように製造されたハードウェアで、目的とする一連の機能を実行します。目的を定めた組み込みアプリを作成し、チューニングするには、高額な初期投資が必要です。こうした初期投資は、製品ライフサイクルの中で時間をかけて回収されます。

これまでの組み込み開発の最大の課題は、プロジェクトの完了までにかかる時間でした。組み込みプロジェクトの大部分は、コストがかかりすぎたり、市場に出す前に要件が変わるといった理由から放棄されてきました。

組み込みアプリの力学に影響する要素はたくさんあります。マイクロソフトが 7 年前に初めて .NET Micro Framework をリリースしたとき、組み込みアプリの大半は、コストの削減、必要なパフォーマンス要件の達成、電源要件の実現 (たとえば、バッテリで長時間実行する性能) などを目的に、8 ビット プロセッサでビルドされていました。

同時に、組み込み分野の多くは、ARM7 といった 32 ビット プロセッサをターゲットにするところまで成長しました。このようなプロセッサは、価格の引き下げが行われ、多くのアプリにとって十分なパフォーマンスが実現され、電力消費量も少なくなっています。新しい Cortex プロセッサは、多くの新しい組み込みアプリの注目を 32 ビット ファミリへと引き付け続けています。

近年、組み込みデバイス、ゲートウェイ、クラウド接続、データベース、ビジネス インテリジェンス アプリなど、多種多様なアプリを不可欠とするデバイスが増え続けています。このような新しいアプリが組み込みアプリの経済学を変化させます。

共通通信プロトコルに従うことがますます重要になります。このような新しいデバイスは、どちらかというと一般消費者向けになるため、長い開発サイクルを予定することは製品リスクの増加につながります。このようなアプリや今後 "インテリジェント デバイス" が隆盛になると、市場にリリースするまでの時間がますます重要になります。

このような新しい種類のアプリには、その広がり自体も影響します。この分野が広がりをみせれば、デスクトップ開発者とその専門知識 (大規模通信、データベースやビジネスの分析、クラウド プロトコルなど) と、組み込み開発者とその専門知識 (ハードウェアや低レベルのプログラミングなど) の両方が求められる可能性があります。ツールと言語は、同じスキル セットをアプリ全体で使用できるようにして、プロジェクトの効率を上げる効果があります。

これが、.NET Micro Framework を開発した背景です。このプラットフォームは当初、Microsoft SPOT 腕時計アプリを開発するための社内ツールとして作成しました (市場に登場するわずか 9 年前です)。このプラットフォームが他の社内プロジェクトにも役立つようになり、2007 年に汎用プラットフォームに整え、製品化しました。

組み込みアプリの原動力であるコスト、パフォーマンス、および電源効率が考慮されています。何千台ものセンサーを 1 つのビルドで配置するアプリについて考えると、コストの重要さが増します。同様に、パフォーマンスと電源の要件がアプリによって変わります。マイクロソフトは、.NET Micro Framework で対処できるアプリの範囲を強化し続けることに重点を置いて取り組んでいます。

配置とデバッグ

コードをデバイスに配置する場合、Windows Phone アプリと同様、デバイスに接続して F5 を押すだけです。ただし、設定がやや異なります。[プロジェクト] をクリックして表示される [プロパティ] ダイアログ ボックスには、トランスポート (USB、シリアル、または TCP/IP) を指定したり、デバイスを特定できる [.NET Micro Framework] タブがあります。既定の設定は USB です。.NET Micro Framework デバイスが自動的に特定されるため、複数のデバイスに接続していない限り、このダイアログ ボックスでの操作は必要ありません。この時点でソリューションがビルドされ、アセンブリがデバイスに配置されます。Visual Studio の [出力] ウィンドウで、この処理をすべて確認できます。実行が即座に開始されて、デバイスで実行されるコードのデバッグを開始できます。

また、アプリを、デスクトップ PC で実行されるエミュレーターに配置することもできます。違いは、Windows Phone にはバリエーションの数に比較的制限がある点です。そのため、Visual Studio で提供されているセットの中から最も近いエミュレーターを選択することになります。.NET Micro Framework の場合、マイクロソフトの汎用エミュレーターがあります。多くの場合、ハードウェアに対応する独自のエミュレーターの作成が必要になります。ハードウェアを準備する前にコーディングに着手する場合は、マイクロソフトの汎用エミュレーターが間違いなく役に立ちます。

以前は、ロボットと Windows Phone アプリ間の通信をデバッグするシナリオは JTAG デバッガーを使用して実行できました。JTAG デバッガーは開発環境とは切り離されていて、.NET 開発者にはなじみがありませんが、スマートフォンで行われていることと、組み込みデバイスで行われていることを別のツールで開発者が監視することになります。Visual Studio では、両方の監視を同時に実行できます。スマートフォンのコードをステップ実行することも、コマンドの送信にブレークポイントを設定することも、Bert がそのコマンドにどのように反応するかをステップインすることもできます。

まとめ

.NET Micro Framework を使って重要な組み込みアプリを作成する方法をすべて説明すると、書籍を 1 冊執筆できてしまいます。今回の目的は、開発者の .NET スキルを活かせば、組み込みアプリと .NET Micro Framework の習得にそれほど時間がかからないことをデモすることでした。

今回のプロジェクトでは、完全な .NET ライブラリに含まれていないクラスがいくつか必要です。また、完全な .NET Framework で使い慣れた機能を .NET Micro Framework では利用できない場合もありますが、Visual Studio 環境では、IntelliSense、ブレークポイント、ウォッチ ポイント、コール スタックなどの使い慣れた機能が完全にサポートされます。世の中には、.NET Micro Framework が適切なソリューションにならない組み込みアプリもあります。ただし、.NET Micro Framework は多くの組み込みアプリでうまく機能します。拡大が続き、コンピューター サイエンスの分野で重要性が高まっている組み込みアプリをより広くカバーできるように、プラットフォームの適用範囲を広げる努力が続いています。

これで、組み込みプログラマとして小さなプロジェクトを試す準備が整いました。

動作中の Bert

これで、開発スキルを活かして上手に楽しむ方法を習得しました。Windows Phone OS を実行するスマートフォンを使用して、小型のロボットを制御できるアプリを開発しました。Windows Phone アプリの開発で使用した .NET スキルは、ロボットでも同様に活用できます。2 つの開発の切り替えはシームレスに行われます。作業完了です。動作中の Bert をご覧ください (youtu.be/ypuqTju2w4c、英語)。.


Colin Miller はマイクロソフトのモノのインターネット チームの主席プログラム マネージャーです。連絡先は colin.miller@microsoft.com (英語のみ) です。彼は、マイクロソフトに勤務して 20 年になります。モノのインターネット、組み込み、デベロッパー ツール、リサーチ、MSN、Internet Explorer、Word などのプロジェクトに携わってきました。

この記事のレビューに協力してくれたマイクロソフト技術スタッフの Lorenzo Tessiore に心より感謝いたします。