がじぇっとるねさす

ホビーとエレクトロニクスを繋げるサイト

がじぇるね工房

作品タイトル:GR-PEACH で .NET Micro Framework

表示名:瀬尾 佳隆

GR-PEACH で .NET Micro Framework

コンセプト・作品説明
はじめまして、瀬尾佳隆と申します。

普段は仕事でもプライベートでも、マイクロソフトの技術を使った開発をしています。
組込みは、本稿で紹介する .NET Micro Frameworkを通して触れるようになったレベルですが、クラウドが一般的な技術になりIoTが単なるバズワードではなくなってきたことで、これからは組込みに触れる機会が増えそうです。

本稿ではそんな私から、組込みやGR-PEACHに馴染みのある皆さんに .NET Micro Frameworkを紹介します。開発環境の作り方から基本的なプログラミングまで順に紹介しますので、ぜひご自身のGR-PEACHとPCとを使って .NET Micro Framework 開発を体験してみてください。
####

NET Micro FrameworkとVisual Studio

GR-PEACH の特徴といえば、最初に挙がるのは「大容量RAMと高性能CPU」だと思います。

もう一つ大きな特徴として「マルチプラットフォームであること」が挙げられます。

GR-PEACHは、

  • mbed
  • Arduino
  • .NET Micro Framework
  • TOPPERS/ASP

の4種類のプラットフォームに対応しています。

http://gadget.renesas.com/ja/product/peach.html から引用

 

「mbedやArduinoは使い慣れているけど、.NET Micro Frameworkはよく知らない」という方もいると思います。

 

.NET Micro Frameworkは名前から分かるように通り、マイクロソフトの .NETファミリーの一員です。

PC用の .NET Frameworkに対して、.NET Micro Frameworkでは “適切に” 機能制限が行われています。例えば、Webアプリ実行環境であるASP.NETや高機能なデータアクセスなど、組込み用途には必須とは言えない機能は .NET Micro Frameworkには含まれていません。このおかげで実行時のメモリー容量を抑えることができます。

 

一方で、センサーやアクチュエーターの入出力を簡単に行う機能やネットワーク関連の機能が充実しています。簡単に組込みデバイスを開発することができ、IoTで活用しやすいプラットフォームです。

 

開発環境を整えるための費用が気になるかもしれません。個人での自習や評価では、無償公開されているVisual Studio Community 2015(https://www.visualstudio.com/)を利用できます。機能的には有償のVisual Studio Professionalと同等で機能制限はありません。

クラウドの利用については、Visual Studio Dev Essentials(https://www.visualstudio.com/products/visual-studio-dev-essentials-vs)というサービスに無償登録することで毎月25ドル分のMicrosoft Azureのクレジット(利用権)が提供されます。自習や検証などの範囲であれば毎月のクレジットのみで追加費用をかけずに利用できると思います。

 

なお業務ではVisual Studio CommunityやVisual Studio Dev Essentialsは使用できません。有償のVisual Studio Professional または Enterpriseを使用してください。

####

開発環境の作り方

それでは開発環境を整える手順を紹介します。以下の手順通りにツール等をダウンロードして、インストールしてください。難しい手順は特にないはずです。ただし、以下の手順2については少し注意が必要です。

 

1.Visual Studioのインストール

個人利用ならばVisual Studio Community (https://www.visualstudio.com/)のインストーラーをダウンロードして、実行してください。業務での利用の場合は有償版を購入してインストールしてください。

2.オプション設定の変更

Visual Studioのインストールが完了したら一度起動して、メニューの [ツール]-[オプション]を選択します。オプション画面が開くので、[拡張機能と更新プログラム]タブで[拡張機能を自動的に更新する]のチェックを外してください。


 

現在、.NET Micro Frameworkの最新バージョンは 4.4ですが、GR-PEACHを含む多くの .NET Micro Framework対応ボードには 4.3 QFE2が移植されています。上記のチェックが有効なままだと、この後インストールする .NET Micro FrameworkのSDKが自動的に4.4に更新されてしまい、GR-PEACH用の正しい実行ファイルを作れなくなります。正しい実行ファイルを作るために上記の手順を忘れずに実施してください。

 

3..NET Micro Framework SDK v4.3 (QFE2) のインストール

Visual Studioの標準のインストーラーには、.NET Micro Framework開発の機能は含まれていません。そこでVisual Studio本体のインストールに続いて、.NET Micro FrameworkのSDKをインストールします。http://netmf.codeplex.com/releases/view/611040 からSDK v4.3をダウンロードしてください。

 

ZIPファイルを展開するといくつかのファイルがあります。

 

 

SDKの本体は “MicroFrameworkSDK.MSI” です。これをインストールしてください。

 

 

さらにZIPファイル内の “netmfvs14.vsix” をインストールしてください。これで Visual Studioに .NET Micro Framework用の項目が表示されるようになります。

 

 

 

 

 

 

####

.NET Micro Framework ファームウェアのインストール

次にGR-PEACHに、.NET Micro Frameworkのファームウェアをインストールします。

 

注意)Windows 10 Anniversary Update 環境(以下、Windows 10 AU)でGR-PEACHを利用する場合は、Windows Updateで更新プログラム KB3176934を適用する必要があります。

何らかの理由でWindows 10 AUにKB3176934を適用できない場合は、GR-PEACHのファームウェアを更新する必要があります。その際には、Windows 10 AU以外のPCでアップデート作業を行わなければなりません。注意してください。

https://developer.mbed.org/teams/Renesas/wiki/How-to-update-firmware-for-GR-PEACH

本稿は、GR-PEACHの20160811版ファームウェアを “適用していない” GR-PEACHを使って以下のPCとの組み合わせで動作確認を行いました。

  • Windows 8.1 PC
  • Windows 10 AU + KB3176934適用なしPC
  • Windows 10 AU + KB3176934適用済みPC

記事中の画面キャプチャーについてはWindows 8.1を使用しました。

1..NET Micro Frameworkファームウェアのダウンロード

GR-PEACH用の .NET Micro Frameworkファームウェアは http://netmf.codeplex.com/releases/view/611040 で公開されています。サイト上の最新のハードウェアをダウンロードしてください。

なおv4.4からは公式サイトがcodeplexからgithubに変更になりました。 今後のバージョンアップの際にはhttp://netmf.github.io/ を参照するようにしてください。

 

2.ファームウェアをGR-PEACHにコピー

ダウンロードしたZIPファイルを展開したら、USBケーブルでGR-PEACHをPCに接続します。ファームウェアをインストールする際は、GR-PEACHの外側のコネクターに接続します。

 

 

GR-PEACHが外付けドライブとして見えるので、展開したファームウェアをGR-PEACHのエクスプローラーにドロップしてください。コピーに少し時間がかかりますが、完了するとエクスプローラーが自動的に閉じてすぐに開きます。コピーしたファイルは消えますが、正しい動作です。
これでファームウェアのインストールは完了です。

 

3..NET Micro Frameworkの起動確認

.NET Micro FrameworkではGR-PEACHの内側のUSBコネクターを使います。USBケーブルを内側のコネクターに接続すると .NET Micro Frameworkのファームウェアが起動します。

 

 

4.ファームウェアの動作確認

実際に .NET Micro Frameworkのファームウェアが動作しているのを確認してみます。前の手順でインストールした.NET Micro Framework SDKに “.NET Micro Framework Deployment Tool” (mfdeploy) というツールが同梱されています。これを使って動作確認します。

GR-PEACHの内側のUSBコネクターを使ってPCに接続した状態で、mfdeployを起動してください。[Device]で “USB” を選択すると、”GR_PEACH_GR_PEACH” と表示されるはずです。さらに[Ping]ボタンをクリックするとウィンドウ下の領域に “Ping...TinyCLR” と表示されれば .NET Micro Frameworkは正常に動作しています。

 

 

 

####

基本的な開発手順(1)~まずはLチカのコード

開発環境が整いました。早速基本的な開発手順を紹介します。

1.新規プロジェクトの作成

Visual Studioを起動して、新しいプロジェクトを作成します。[ファイル]-[新規作成]-[プロジェクト]の順で操作してください。ダイアログが開くので、[Visual C#]-[Micro Framework]-[Console Application]を選択してください。プロジェクトの名前や場所(フォルダー)は任意のものでかまいませんが、以下では説明のために、プロジェクト名を “MFConsoleApplication1” とします。少し待つとプロジェクトのひな型が完成します。

 

 

 

2.参照設定の追加

上記の手順で作ったプロジェクトでは、組込み開発をする上で必須と言ってよいライブラリが参照されていません。これを追加しましょう。

ソリューションエクスプローラー(デフォルトではウィンドウ右上に表示されているはずです)の [参照] で右クリックして、[参照の追加] を選択してください。ダイアログが開いたら “Microsoft.SPOT.Hardware” を選択します。

Microsoft.SPOT.Hardwareでは、GPIOやI2Cデバイスの定義などが含まれています。これで「組込み開発をする上で必須」なライブラリが利用できるようになります。

 

 

 

Lチカのソースコードは以下の通りです。自動生成されたProgram.csを以下のコードで置き換えてください。

 

using System.Threading;
using Microsoft.SPOT.Hardware;

namespace MFConsoleApplication1
{
    public class Program
    {
        private const Cpu.Pin UserPin = (Cpu.Pin)0x6c;

        public static void Main()
        {
            var led = new OutputPort(UserPin, false);

            while (true)
            {
                led.Write(false);
                Thread.Sleep(1000);
                led.Write(true);
                Thread.Sleep(1000);
            }
        }
    }
}

組込み開発に慣れた方なら読めそうですが、簡単にコードの説明をしましょう。

 

GR-PEACHのピンはCpu.Pin型で表現されます。ユーザーLED (LANコネクターの外側にあるLED)のピン番号は0x6c、内側にあるマルチカラーLEDのピン番号は0x6d (赤)、0x6e(緑)、0x6f(青)なので、これらのポートを使ってみることにもチャレンジしてみてください。

各ピンをGPIOの出力に使用するにはOutputPortクラスを使用します。コンストラクターの第1引数がピン番号、第2引数は出力ポートの初期値(falseならばLED消灯)を指定します。

スリープを挟みながらOutputPortのWriteメソッドでLEDを点灯(true)、消灯(false)することで “Lチカ” が完成します。

 

.NET Micro Frameworkではmainメソッドがアプリケーションのエントリーポイントとして用意されています。Lチカのような単純な処理の場合は、上のようにmainメソッド内にすべて記述することもありますが、一般的には別のメソッドを定義して、mainからそれらのメソッドを呼び出すようにします。

####

基本的な開発手順(2)~Lチカの実行

コードが書けたので、GR-PEACHにアプリケーションを転送して実行してみます。

1.GR-PEACHの内側のUSBコネクターにUSBケーブルを使ってPCに接続します。

2.Visual Studioのソリューションエクスプローラー(デフォルトだとVisual Studioの右上の領域)で、プロジェクト名を右クリックして [プロパティ] を選択してください。なおプロジェクト名とはソリューションエクスプローラーの2行目(”C#” アイコンの行)です。

 

 

3.[.NET Micro Framework]タブの[Transport]で“USB”を選択してから[Device]で “GR_PEACH_GR_PEACH” を選択してください。これでアプリケーションがGR-PEACHに転送される準備ができました。

なおUSB接続してから間もないと、[Device] に何も表示されないことがあります。その場合は、[Transport]で一度 “Emulator” を選択してから改めて “USB” を選択しなおしてください。

 

 

4.Visual Studioのメニューで、[デバッグ]-[デバッグの開始]を選択してください。アプリケーションがGR-PEACHに転送されてから自動的にリブートされます。各モジュールのロードが終わると転送されたアプリケーションが実行されます。

 

####

基本的な開発手順(3)~データ取得

Lチカ(=出力)ができたので、次はデータの取得(=入力)を見てみます。

センサーデータの値を取得する方法は3通りあります。

  • OutputPort・・・デジタルデータを定期的に取得したい場合に利用します。タイマーを使ってポーリングします。
  • InterruptPort・・・デジタルデータを取得したい場合に利用します。OutputPortとの違いは、値が切り替わるタイミングでシステムからイベントが発行される点にあります。システムから自動的に通知を受けられるので、データ取得のためのポーリングは不要です。
  • AnalogPort・・・アナログデータを読み出したい場合に利用します。データを取得するためにタイマーを使ってポーリングします。

 

ここではGR-PEACH本体のみを使って、InterruptPortでボタンのオン・オフを取得する方法を紹介します。マイクロソフトらしいイベントドリブンなプログラミングです。

 

プロジェクトの作り方、Microsoft.SPOT.Hardware ライブラリの参照設定、GR-PEACHへの転送や実行の方法は、先ほどのLチカと同様です。

ここではソースコードを紹介します。(以下では説明のため、プロジェクト名は “MFConsoleApplication2” とします)

 

using System;
using System.Threading;
using Microsoft.SPOT.Hardware;
 
namespace MFConsoleApplication2
{
    public class Program
    {
        // GR-PEACH
        private const Cpu.Pin ButtonPin = (Cpu.Pin)0x60; 
        private const Cpu.Pin UserPin = (Cpu.Pin)0x6c;
 
        private static OutputPort _led;
 
        public static void Main()
        {
            var button = new InterruptPort(ButtonPin, true, Port.ResistorMode.Disabled, Port.InterruptMode.InterruptEdgeBoth);
            button.OnInterrupt += button_OnInterrupt;
 
            _led = new OutputPort(UserPin, false);
 
            Thread.Sleep(Timeout.Infinite);
        }
 
        static void button_OnInterrupt(uint data1, uint data2, DateTime time)
        {
            var isPressed = data2 == 0;
            _led.Write(isPressed);
        }
    }
}

InterruptPortのコンストラクターは4個の引数を取ります。

 

var button = new InterruptPort(<ポート番号>, <グリッチフィルターの設定>, <プルアップ/ダウン抵抗>, <イベント対象の方向>);

 

第4引数は6種類の値のいずれかを取るのですが、最初のうちは、

  • InterruptEdgeBoth ・・・信号の立ち上がり、および立ち下がり時の両方でイベント発行
  • InterruptEdgeHigh ・・・信号の立ち上がり時にイベント発行
  • InterruptEdgeLow ・・・信号の立ち下がり時にイベント発行

の3種類について覚えておくといいと思います。

 

上のコードでは、buttonの状態に変化があった時(OnInterruput)に、システムからbutton_OnInterruptメソッドが呼び出されます。

GR-PEACHでは、button_OnInterruptメソッドの第2引数のdata2で信号の状態を知ることができます。data2が0ならばボタンは押されている状態、1ならばボタンは離されている状態を表します。

 

上のプログラムでは、ボタンを押している間はLEDが点灯し、離すとLEDが消灯するのが分かります。

####

拡張ライブラリ

組込みに慣れている人ならば、本稿で紹介したような .NET Micro Frameworkのコードは、(C#の細かい文法が分からなくても)読んで概要を理解できると思います。他の言語と大きく変わるものではないことが分かります。

そこで、改めて組込みのコードを見てみると、

  • LEDの点滅
  • 環境センサーのデータを定期的に取得
  • 取得したデータを定期的にクラウドにアップロード

など、ループやスリープを多用することに気付きます。

 

システムでやりたいこと(ビジネスロジック)と、ループやスリープなどの構造上の記述とが混在することで、コードの見通しが悪くなったり、バグの原因になったりします。

例えばエラーが発生したことを知らせるために、「200ミリ秒間隔でLEDを3回点滅させる」ことを “PulseDebugLed(200, 3);” のように記述できれば、本来行うべき処理のコードがずいぶん理解しやすくなります。

 

そこで、私が開発したGR-PEACH用のライブラリを紹介します。

https://github.com/netmf-lib-grfamily/GrFamilyLibrary

 

まずは試してみたいという方はビルド済みのDLLのみをダウンロードすれば、すぐに利用できます。(https://github.com/netmf-lib-grfamily/GrFamilyLibrary/tree/master/DLLs

またライブラリのすべてのソースコードを公開していますので、手元でビルドして利用することもできます。

ソースコードは .NET Micro Frameworkを理解する手助けになると思います。また市販のモジュールに対応したクラスのソースも含んでいるので、GPIOやI2Cなどのモジュールを使用する際の参考にもなると思います。

 

利用は簡単です。

1.拡張ライブラリのDLLの取得

ビルド済みDLLをダウンロードするか、全ソースコードを取得の上でビルドしてください。

2.プロジェクトで必要なライブラリを参照設定

Microsoft.SPOT.Hardware の参照設定の他に、GR-PEACHのライブラリGrFamily.MainBoard.Peachも参照設定します。
他に、I2C接続のモジュールを利用する場合はGrFamily.Module.ModuleBaseを、ネットワークに接続する場合はGrFamily.Utility.NetworkUtilityをそれぞれ参照設定してください。その他のライブラリについては同梱されているReadmeやヘルプファイルを参照してください。

 

 

拡張ライブラリを使うと、実際にどのくらいコードが簡単になるのか次に紹介します。例として、ボタンとLEDを使用するコードを書いてみます。

####

拡張ライブラリを使った1行プログラミング

.NET Micro Frameworkと拡張ライブラリとを使ってコードを書いてみましょう。

GR-PEACH上のボタンとLEDとを利用するものですが、従来の言語や開発環境と比べて、より簡単に開発できます。

 

プロジェクトの作り方やGR-PEACHへの転送方法などは、ここまで紹介したものと同様です。参照設定は、Microsoft.SPOT.HardwareおよびGrFamily.MainBoard.Peachを追加します。

以下では説明のため、プロジェクト名を “MFConsoleApplication3” とします。

 

ソースコードは以下のように入力してください。

 

using System.Threading;
using GrFamily.MainBoard;

namespace MFConsoleApplication3
{
    public class Program
    {
        public static void Main()
        {
            var peach = new Peach();
            peach.Button.ButtonPressed += (sender, state) => peach.PulseDebugLed(200, 3);

            Thread.Sleep(Timeout.Infinite);
        }
    }
}

アプリケーションで実現したい処理は、

peach.Button.ButtonPressed += (sender, state) => peach.PulseDebugLed(200, 3);

の1行です。

「Peachのボタンが押されたら、DebugLedを200ミリ秒間隔で3回点滅させる」と、自然に読めるコードになります。

 

すべてのシステムを1行で書けるわけではもちろんありませんが、上の例と同じように読みやすいコードになるのが想像できると思います。

 

####

おわりに

本稿を通して、.NET Micro Frameworkの面白さと、C#を使うことで簡単に読みやすいコードが書けることを紹介しました。

 

GR-PEACHで.NET Micro Frameworkを使うと、ネットワーク接続も簡単にできます。詳細は別の機会にしますが、Microsoft Azureや他社のクラウドサービスを利用してIoTを実現することも可能です。

 

これを機に、GR-PEACHと.NET Micro Frameworkを使った組み込み開発をぜひ始めてみてください。

 

瀬尾 佳隆

 

・普段は仕事でもプライベートでも、マイクロソフトの技術を使った開発をしています。2009年からマイクロソフト MVPを連続受賞しています。2016年1月からは、MVP for Visual Studio and Dev Tech / MVP for Windows Developmentの2部門で受賞しています。

 

・実は組込みはそれほど詳しくありません。運よくIoTの波に乗れただけなのに周囲から「組込みの人」と言われるようになり、難しいことを聞かれたりしないかと緊張の毎日です。

 

・とはいえ、Lチカでテンションが上がるので、組込みが好きであることは間違いありません。

 

・乃木坂46 / AKB48Gとミュージカル、仏像 / 屏風絵が好きです。「振れ幅が大きい」とよく言われますが、本人としては一本筋が通っているつもりです。

 

 

Twitter   https://twitter.com/seosoft

Facebook  https://www.facebook.com/seosoft

Blog      https://yseosoft.wordpress.com/

フォローする

share

ページトップへ