« .NET Micro Framework 4.1を導入 | トップページ | Netduino Get »

FEZ DominoでArduino用Ethernet Shieldを動かしてみた

.NET Micro Frameworkが使えるプロトタイピングボードFEZ Dominoはシールドのピン配置がArduino互換です。さらに、FEZ Domino用Ethernet ShieldはArduinoと同じW5100チップを使っています。FEZ DominoのMCU(LPC2388)にEthernet Interface機能があるのにわざわざEthernt/TCP-IPチップを使うのは無駄のようにも見えますが、Arduino用Ethernet Shieldが流用できるのではないかという期待が出てきます。

そこで、FEZ DominoでArduino用のEthernet Shieldが動作するかを実験してみました。使用したのはオフィシャルEthernet Shieldです。Arduino Ethernet Shield、FEZ用ドライバとも無修正で正常に動作しました。


ドライバファイルの入手

FEZ Domino用ドライバファイルをここからダウンロードします。現在のβドライバはC#のクラスライブラリとして提供されており、CLR(インタープリタ)で逐次中間コードを翻訳しながらの実行となるため、速度はあまり期待できません。将来的にはファームウェアに統合されたネイティブドライバが提供されるようですので、速度面はそちらに期待。

ドライバファイルに、2箇所ほどDebug.printがコメントアウトされれずに残っていたため、コメントアウトが必要でしたww


FEZ Dominoとの接続

Arduino Ethernet ShieldをFEZ Dominoに取り付けるだけです。

Domino-ArduinoEthSield1

Domino-ArduinoEthSield2

FEZ Domino用Ethernet Shieldは割り込み信号(Di2)を使っているとWebページに記載がありますが、Arduino Ethernet Shieldは割り込み信号の配線がありません(割り込みをつなぐための、半田ジャンパはあるみたい)。ForumのQAによると、現在のドライバでは割り込みは使用していないとのことなので、ジャンパ作業は不要です。


サンプルコード

Webサーバーからhttpページを取得してデバックコンソールに表示するサンプルを作ってみました。

using System;
using Microsoft.SPOT;
using System.Text;
using System.Threading;
using GHIElectronics.NETMF.FEZ;

namespace FezEthernet
{
    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();
        }
    }
}

サンプルは、socketをオープンし、socket.AvilableBytesで取得した受信データー量分のバッファを用意し、さらにstringクラスのインスタンスに情報をコピーしてDebug.printするというメモリー消費的には厳しいコードになっているため、情報量の多いwebページを取得するとメモリー枯渇になるかもしれません。ローカルPC上で動作するWebサーバーが返す1600byte程度のページは問題なく取得できます。

.NET Micro FrameworkにはSystem.Net.HttpWebRequestやSystem.Net.HttpWebResponseクラスがありますが、FEZ Dominoでは動作しませんでした(ビルドはできますが、実行時に例外を吐いてしまいます)。おそらく、FEZ用のドライバがuSocketクラスという固有のSocketインタフェースで実装しているためだと思います。今後の正式ドライバでは、NETMFが期待するSocketの実装になればこのあたりのHttpクラスも使えるようになるかもしれません。


その他

例によってEthernet Shieldが電源投入時に正しく動作しないことがあり、その場合はマニュアルリセットで動作しました(FEZ DominoはArduinoよりまじめにパワーオンリセット回路が作ってあり、ひょっとすると自分のEthernet Shieldはリセット対策のコンデンサを追加したため、その悪影響が出ているのかも?)。

今回の実験を行って思ったことですが、NETMFにはシリアルポート出力用のクラスがないため、テキスト情報を表示するようなケースがちと不便だと思いました。Debug.printでもよいのですが、必ず改行を入れてしまうため、せめて改行をしないオプションがあるとよいのですが。

サンプルでは、最初はバッファによるメモリ消費を節約しようと思い、socketからの受信データーを、256byteのバッファに分割して読み込むようにしました。Debug.printが引数としてstringクラスしか取らないため、256byte単位でstringに変換してprintするとそのたびに改行が入ってしまうため、最終的にはメモリーを消費してしまうのですが受信バッファの分割を行わないコードにしました。

Full NetのStreanReaderクラスを使ったサンプルでは、
Console.WriteLine(sr.ReadToEnd());
みたいに、「ストリームクラスを起こし、全部読み込んでから一気に表示」的な書き方になるのかと思いますが、NETMFではメモリーを喰わない工夫も必要かと思いました。まあ、NETMFでもグラフィックLCDにWPFを使って表示を行うような使い方では(NETMFがもともとターゲットにした領域でしょうか)、ROM/RAM共に数MBは必要になるため、そこまでケチらなくてもよいのかもしれません。

« .NET Micro Framework 4.1を導入 | トップページ | Netduino Get »

dotNet MF」カテゴリの記事

コメント

この記事へのコメントは終了しました。

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ