Netduino Get
話題の、.NET Micro Frameworkが動きC#でプログラミングができる、Netduinoをスイッチサイエンスさんから購入しました。初回販売分が残暑見舞い特別価格の2,800円(Arduino Duemilanoveより安い!)ということで速攻でGetしてしまいました。ということで、2日ほどですが触ってみた感想を記載します。
Netduinoの特徴
開発環境のインストールなどは、他の方が書いているので、今回は手抜きをしてNetduioの特徴をさらっと...
- Visual Studio 2010 Expressを使用でき、インテリセンスなどの補助機能でコード入力が楽ちん。mbedのクラウド開発環境も新鮮ですが、高機能IDEの使い心地も捨てがたい
- Visual Studioのデバック機能を使って、ソースコードレベルのデバッグが可能。Arduinoやmbedのprintfデバックから開放されて嬉しい
- Arduinoとピン互換のため、Arduino用のシールドが使える
- 同じくNETMFが動くFEZ Dominoに比べると、CPUはちょっと遅くなりますが(72MHz vs 48MHz)、RAM容量が多いため(96KB vs 128KB)ユーザーエリアが60KBと広い
- 何よりお安い(同類のFEZ Dominoに対して半分以下で、通常価格でもArduino並みの安さ!)
- ライブラリ(ファームとして提供される部分)の機能は、FEZ Dominoの方が豊富。FEZは、MSが提供していないUSB HostやSDカードなど、便利な機能がライブラリとして提供されているのに対して、Netduino提供ライブラリはA/D変換,PWMなど、現状は最低限の機能のみ。ただし、FEZのライブラリはソースが非公開でGHIの開発に依存してしまうが、Netduinoはライブラリもオープンソースなので、今後のコミュニティーによる開発に期待
- コードの実行速度はあまり期待できない(NETMFは中間コードを逐次翻訳するインタープリター方式で、PCで動くFull .NETのようにJITコンパイル機能がないため)。NETMFはC++で書いたNativeコードを呼び出すRLP(Runtime Loadable Procedures)という機能があるのですが、FEZ DominoやNetduinoではメモリー量の制約から現状は未サポート。そのため、FFTのような数値演算系の処理はFEZ Dominoでは手が出ないと思いますが、NetduinoならライブラリにNativeコードとして組み込むことで(力技ですが)処理性能を必要とするプロジェクトに対応できるかも
FEZ Dominoのドライバを移植
Netduinoは入出力ピンの配置がArduino互換ですが、使用しているMCUや実行環境が異なるためArduino用のライブラリコードは使えません。手っ取り早く周辺装置を動かす手段として、同じくNETMFを使いかつArduinoとピン互換になっているFEZ Dominoのドライバを拝借することにしました。FEZ Dominoのドライバ(ファームに組み込まれていない部分)はNETMF用のC#で書いてあり、最小限の変更で動作することが期待できます。
先ずは、Arduinoでもおなじみの16x2キャラクタLCDを動かしてみます。手順は以下です;
- FEZ DominoのWebページからLCD & Keypad Shieldを探してドライバをダウンロード
- 新規のプロジェクトを起こし、Program.csと同じフォルダにドライバファイル(FEZ_Shield_KeypadLCD_Red.cs)を格納
- ソリューションエクスプローラーで
プロジェクト名を右クリック→追加→既存の項目から、ドライバファイルを指定してVSに登録 - ドライバファイルを開くといくつかエラーが出るので、エラー発生箇所を修正
- Programs.csをコーディング
4項の修正箇所は以下です;
①namespaceの変更
using GHIElectronics.NETMF.Hardware;
↓
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
cpuピン指定のパラメーター名をFEZ(GHI)からNetduino(SecretLabs)に変更するため、namespaceを変更します。
②OutputPortのピン識別子の変更
LCD_RS = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di8, false);
↓
LCD_RS = new OutputPort(Pins.GPIO_PIN_D8, false);
GHIElectronics.NETMF.Hardwareで定義しているFEZ用のPin指定から、SecretLabs.NETMF.Hardware.Netduino名前空間で定義している識別子に変更します。同様に、D9, D7~D4も変更
③ADCのクラス名を変更
AnKey = new AnalogIn((byte)FEZ_Pin.AnalogIn.An0)
↓
AnKey = new AnalogInput(Pins.GPIO_PIN_A0);
今回は使用していませんが、KeyPadの値を読み取るためにADCを使っています。FEZとNetduinoでクラス名が異なるため修正します。ピン指定もOutputPortと同様に修正します。
Keypadやバックライトの制御は使っていないのですが、あえて削除はせず、エラーが出る部分だけ修正しました。コード全体はここです。
続いて、5項のProgram.csをコーディングします。コードは以下です。
using System.Threading; using GHIElectronics.NETMF.FEZ; namespace NetLCD { public class Program { public static void Main() { FEZ_Shields.KeypadLCD.Initialize(); while (true) { FEZ_Shields.KeypadLCD.Print("Hello World"); Thread.Sleep(2000); FEZ_Shields.KeypadLCD.SetCursor(1, 0); FEZ_Shields.KeypadLCD.Print("Hello Netduino"); Thread.Sleep(2000); FEZ_Shields.KeypadLCD.Clear(); Thread.Sleep(2000); } } } }
ドライバは、GHIElectronics.NETMF.FEZという名前空間で定義されているため、2行目のusingで指定します。最初は名前空間を変えようかと思ったのですが、名前空間もAPIの一部と考え、APIを拝借したGHIに敬意を表してそのままにしてあります。同様にドライバのクラス名がFEZ_Shields.KeypadLCDのため、この名前もそのままにしてあります。
このドライバは、static classとして定義してあるため、コンストラクタを呼んでインスタンスを起こす必要がなく、10行目のように、FEZ_Shields.KeypadLCD.メソッド名で処理を呼び出します。
最後にLCDとの結線は以下となります(ドライバの中で決め打ちになっています):
- RS --> D8
- E --> D9
- RW --> GND
- LCD_D4 --> D4
- LCD_D5 --> D5
- LCD_D6 --> D6
- LCD_D7 --> D7
めでたく動作しました。
Arduino Ethernet Shieldの使用
つぎは、FEZ DominoでもやったArduino Ethernet Shieldを動かすネタです。Ethernet Shieldは純正品ではなく、NKC Electronicsの互換品を使っています。このShieldはArduino Megaでも使えるように、SPIの信号をICSPコネクタから取る作りになっています。NetduinoはICSP接続用のヘッダピンが実装されていないため、手持ちの部品を半田付けしました。
Ethernet ShieldのドライバはFEZ Domino用を使います。こいつは、FEZ Domino+Arduino Ethernt Shieldで動作した実績があります。LCDドライバと同様に、以下の変更を加えます。
①namespaceの変更
using GHIElectronics.NETMF.Hardware;
↓
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;
②CS信号用OutputPortのピン識別子の変更
SPI.Configuration config = new SPI.Configuration((Cpu.Pin)FEZ_Pin.Digital.Di10, false, ....
↓
SPI.Configuration config = new SPI.Configuration(Pins.GPIO_PIN_D10, false, ......
ドライバ全体のファイルをここに置きます。
Program.csのコードは以下で、最小限のHttpクライアント動作を行います。
using System; using System.Text; using System.Threading; using Microsoft.SPOT; using GHIElectronics.NETMF.FEZ; namespace NetEthernet { public class Program { static byte[] IpAddress = { 192, 168, 0, 111 }; static byte[] Subnet = { 255, 255, 255, 0 }; static byte[] Gateway = { 192, 168, 0, 1 }; static byte[] Mac = { 00, 0xXX, 0xXX, 0xXX, 0xXX, 0xXX }; //自分のMACアドレスを設定 static byte[] RemoteServer = { 192, 168, 0, 10 }; public static void Main() { FEZ_Shields.Ethernet.Initialize(IpAddress, Subnet, Gateway, Mac); while (true) { httpGet(); Thread.Sleep(2000); } } // FEZ Ethernet Sheild用ドライバーを使用したHttpページの取得 static void httpGet() { FEZ_Shields.Ethernet.uSocket socket = new FEZ_Shields.Ethernet.uSocket(FEZ_Shields.Ethernet.uSocket.Protocol.TCP, 80); Encoding enc = Encoding.UTF8; socket.Connect(RemoteServer, 80); string request = "GET /index.html HTTP/1.0\r\n\r\n"; socket.Send(enc.GetBytes(request), request.Length); int length; while ((length = socket.AvilableBytes) > 0) { byte[] buff = new byte[length]; socket.Receive(buff, length); String printStr = new String(enc.GetChars(buff)); Debug.Print(printStr); } socket.Close(); } } }
基本動作のみの検証になりますが、ちゃんと動いています。
おわりに
FEZ Domino用のドライバ2例は、エラーが出た箇所を修正するだけで苦もなく動作してくれ、FEZ DominoとNetduino間の移植性の高さを実感しました。修正が必要な箇所は、GHI, SecretLabs固有ライブラリの差分が染み出す部分ですが、今回の例では僅かでした。
FEZ Dominoをいじった際は、GHI提供のライブラリをチュートリアル通りに動かすだけでしたので、正直ワクワク感が少なかったです。Netduinoでは人様が作ったドライバですが、自前で移植作業を行うことで、開発してる感が増しワクワク感がありました。Netduinoは、ファーム(NETMFのネイティブドライバ類)もオープンソースですので、コミュニティーの成果を借用したりして(あわよくば自分でも何か作って)、内部がいじれるようになればもっと面白くなる予感があります。
これからますます盛り上がってくれるとよいなと期待です。
2010/9/24 修正
GHIのライセンス条件からドライバコードの公開はNGのため、Netduinoへの移植版のダウンロードリンクは削除しました。
2010/10/2 更新
GHI提供ドライバがApacheライセンスになっています(ドライバファイルのソースに記載があります)。改変と再配布(Web公開含む)がこれで許されたと考えられますが、FEZ Ethernet Shieldのドライバは本日時点ではアクセスできなくなっているこもあり、コードの公開はやめておきます。Netduinoフォーラムでも独自のEthernet Shield用ドライバの開発が進んでいますので、Netduinoユーザーはこちらに期待しましょう。
« FEZ DominoでArduino用Ethernet Shieldを動かしてみた | トップページ | .NET Micro FrameworkでSPIを使う »
「dotNet MF」カテゴリの記事
- .Net Micro Frameworkで配列を高速コピーする(2010.10.02)
- .NET Micro FrameworkでSPIを使う(2010.09.28)
- Netduino Get(2010.08.21)
- FEZ DominoでArduino用Ethernet Shieldを動かしてみた(2010.08.08)
- .NET Micro Framework 4.1を導入(2010.08.07)
この記事へのコメントは終了しました。
コメント