« netduinoはじめてみました | トップページ | FEZ Panda - 仮想COMポート&SDカード »

Pandaの到着

 

TinyCLR.comFEZ Panda(GHI Electronics)が$19.95という価格で販売されていたので購入してしまいました(netduino買ったばかりなのに…)。
現在は$34.95で販売中ですが、品切れ(2010/10/20)のようです。

fezpanda1

9月下旬に発注して10月中旬に届いたので、約3週間での到着。
発送方法はUSPS First-Class Mail International Packageで、その送料が$7.46でしたので、合計$27.41。請求を見ると84.933円で計算されているので、2300円ちょいとお安いです。

TinyCLR - FEZ Panda

NETMFProjects – FEZ Panda

Microsoft .NET Micro Framework API Reference

GHI Electronics NETMF Documentation

 
 

 

パッケージにはFEZ Panda本体とUSBケーブルのみで、USBはminiB端子です。

fezpanda-set

 

裏面には名前の通りパンダの絵柄が…そもそも何故Panda?(笑)

fezpanda-ura

 

個人的にはUSBホストとmicroSDスロットが付いているFEZ Dominoが欲しかったのですが、このFEZ Pandaの特徴はなんといってもI/Oのパターンが出ていることです。

Arduinoピン互換を保ちつつ、沢山あるI/Oポートが無駄にならないのは良いかなと思いますが、対応したシールドがないので、シールドを作る場合はその辺工夫が必要です。TinyCLRのサイトでは、これらのIOを全て使うべくベースボード「FEZ Panda Base Board」があります。

また、これからFEZ Pandaを購入する方は、IO全てが利用可能なFEZ Panda本体(special edition)と、SDカードスロットや電源コネクタなど搭載したベースボード、エンクロージャがセットになった「FEZ Panda Tinkerer Kit」が現在$49.95とお安く買えます。FEZ Panda購入時にこれがあったら恐らく買ってたかも…

FEZ Pandaの中核はUSBizi100 Chipsetとなり、NXP社のLPC2387(ARM7コア)がベースとなってるチップセットです。
Microsoft .Net Micro Frameworkを使えるので、VisualStudio環境でC#を使用したプログラミングが可能です。netduinoとほぼ同様なプログラミング環境です。

 

●FEZ Panda仕様

  • Arduinoピン互換
  • 72Mhz 32-bit ARM7 LPC2387 プロセッサ
  • USBizi™ 100 Chipset
  • Flash : 約148KBのフリーエリア(512KB)
  • RAM : 約62KBのフリーエリア(96KB)
  • USBクライアント(デバッグ用、カスタム、またはキーボード、マウス、CDCクラス)
  • microSD(SDHC)カードのサポート(オプション)
  • TCP/IPのサポート(Ethernet Shield/WIZnet W5100)
  • プログラミング可能な入出力 : 60
  • PWM : 6
  • アナログ入力 : 8 (10bit)
  • アナログ出力 : 1 (10bit、オーディオ再生機能を持つ)
  • UART : 4 TTL
  • SPI : 2
  • I2C : 1
  • CAN : 2
  • JTAG : 1

 

panda_brd

下側の横並びの8個のIOは、microSDのインターフェイスコネクタとして、「Micro SD Card Expansion」が使用出来ます。

その上の2列10個のIO(UEXT)は、MP3デコーダ・GPS・3軸加速度センサーなどの専用コネクタを持ったコンポーネントを利用出来るようになっています。

他のIO(内側26個のIO)は自由に使えますが、上の2つについてもその機能を使用しないのであればユーザーが自由に使えます。

 

●開発環境

TinyCLRDownloadから各SDKをダウンロードします。

  • Microsoft Visual C# Express
    最新の2010をインストールしますが、2008との共存も可能です。
  • Microsoft NETMF 4.1 SDK
    netduinoの環境を既にインストールしている場合、古いバージョンが入っている旨のメッセージが出ます。自分の場合は古いのをアンインストールしてから、今回のバージョンをインストールしました。 今のところ、netduino共に問題はないようです。
  • GHI NETMF 4.1 SDK
    FEZシリーズ用のライブラリです。
  • TeraTerm
    ファームウェアをアップデートする時に使用します。自分は既にVersion4.66(SVN# 3922)を使用してますが大丈夫でした。
    まだの方はTinyCLR推奨の物をお使い下さい。
  • GHI NETMF USB Drivers xx-Bit Auto Installer
    USBドライバです。32bit版と64bit版がありますので、環境にあったものをダウンロードして下さい。

 

以上のインストールが終了したら準備完了です。

注意点として、各SDKをバージョンアップした場合は、プロジェクトの参照設定を再登録して下さい(削除してから同じ物を登録し直す)。これをやらないとエラーが出ます。
また、ファームウェアもアップデートして下さい。

ファームのアップデートについてはtodotaniさんの「PS3とLinux、電子工作も」から、「FEZ Domino Get」の「ファームウェアの更新」を参考にさせて頂きました。いつも詳しい解説ありがとうございますm(_ _)m

 

GHI NETMF USB Driversをインストールして、FEZ Pandaを接続すると、デバイスマネージャでは以下のようになります。

GHIUSBdriver

環境は Windows 7 Professional x64 で、USBドライバもx64を使用してます。

 

●プロジェクト作成

VC#を起動して「新しいプロジェクト」を選びます。

MSVCS_newproj

netduinoのSDKも入っているのでテンプレートがFEZシリーズと一緒に表示されます。

ここから「FEZ Panda Application」を選択し、名前を決めてOKを押します。

 

以下はデフォルトのソースコードで、ボード上のLEDを点滅させます。

using System;
using System.Threading;

using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;

using GHIElectronics.NETMF.FEZ;

namespace FEZ_Panda_Application1
{
    public class Program
    {
        public static void Main()
        {
            // Blink board LED
            bool ledState = false;

            OutputPort led = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.LED, ledState);

            while (true)
            {
                // Sleep for 500 milliseconds
                Thread.Sleep(500);

                // toggle LED state
                ledState = !ledState;
                led.Write(ledState);
            }
    }
}

 

デバッグ前にFEZ PandaとPCをUSBで接続して認識させておきます。

MSVCS_prop

プロジェクトのプロパティを開いて、「.Net Micro Framework」タブを選択します。

DeploymentのTransportを「USB」に設定すると、自動的にDeviceが「USBizi_USBizi」になります。
もし表示されない場合は、FEZ PandaとPCの接続が出来ているか確認してください。

デバッグを実行するとプログラムが転送され実行されますが、ブレークポイントを設定していれば、その場所で停止しトレースが行えます。

 

●IOにまとめて出力する

Arduinoでは当たり前に出来ていたことですが、例えばPortBにまとめてデータを出力したい場合、

PORTB = 0xFF; //全て出力設定(DDRB=0xFF)

とすれば(AVRのC言語と同じ)、PortBの全てのピンにまとめて出力できますが、netduinoでは出来ないようです。
というのも、netduinoにはLowLevelの名前空間がないため、Registerクラスが存在しません。

Registerクラスが使えるとGPIOレジスタへのアクセスが可能となり、前述のようなまとまった出力が可能となります。
FEZではRegisterクラスが利用出来ますので、これを使ってIOに出力してみようと思います(個人的にこれがやりたかった)。

今回はFEZ PandaのIO51~IO58の連続したIOを使用しますので、実際のポート番号はP1.0~P1.15となります。

FEZPandaSch FEZ_Panda_sch.pdf

8本なのに16のポートがあるので、あれ?っと思うのですが、割り当てを見るとどうも飛び飛びとなっているようで、P1.0, P1.1, P1.4, P1.8…と、何故か連続していません。

他を探してもIOとポートがうまく連続しているところがなく、仕方なくビット幅を調整するための関数を作りました。これだとあまり意味がないのですが…

using System;
using System.Threading;

using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;

using GHIElectronics.NETMF.FEZ;
using GHIElectronics.NETMF.Hardware;
using GHIElectronics.NETMF.Hardware.LowLevel;

namespace FEZ_Panda_LEDs
{
    public class Program
    {
        private static Register FIO1DIR = new Register(0x3FFFC020);
        private static Register FIO1MASK = new Register(0x3FFFC030);
        private static Register FIO1PIN = new Register(0x3FFFC034);

        public static void Main()
        {
            // Blink board LED
            uint ledPat = 0;

            uint lCurrentDir = FIO1DIR.Read();
            uint lCurrentMask = FIO1MASK.Read();
            FIO1DIR.Write(lCurrentDir | 0x0000FFFF);
            FIO1MASK.Write(0xFFFF0000);

            FIO1PIN.Write(0x00000000);
            Thread.Sleep(500);

            while (true)
            {
                // LEDカウンタ
                for (uint i = 0; i <= 0xFF; i++)
                {
                    ledPat = makeOutputData(i);
                    FIO1PIN.Write(ledPat);
                    Thread.Sleep(40);
                }
                Thread.Sleep(1000);
                // 出力クリア
                FIO1PIN.Write(0x0000);
                Thread.Sleep(400);
                // LED点滅
                for (int i = 0; i < 3; i++)
                {
                    FIO1PIN.Write(0xFFFF);
                    Thread.Sleep(400);
                    FIO1PIN.Write(0x0000);
                    Thread.Sleep(400);
                }
                Thread.Sleep(400);
            }
        }

        // データ幅調整用(8bit to 16bit)
        public static uint makeOutputData(uint data)
        {
            uint ret = 0;
            uint pat = 0xC713;  // 判定対象となるビットパターン

            int p = 0;
            for (int i = 0; i < 16; i++)
            {
                if (((pat >> i) & 0x0001) == 1)
                {
                    if (((data >> p) & 0x0001) == 1)
                        ret |= (uint)(1 << i);
                    p++;
                }
            }

            return ret;
        }
    }
}

FIxxDIRという変数(xx=Port#)は入出力の方向、FIxxMASKはIOのマスク、FIxxPINはデータの入出力時に使用するアドレスをそれぞれ設定します。

LPC23xxシリーズのメモリマップ 0x3FFFC000 - 0x3FFFFFFF の空間は、fast GPIO registersとしてマッピングされています。

レジスタアドレスについてはLPC23xxのデータシートを見ると、DIRのP1は0x3FFFC020、MASKは0x3FFFC030、PINは0x3FFFC034となります。

 

panda_leds

 

FEZ Panda + LED

FEZ Panda側へはピンを挿しただけの状態ですが(汗、8個のLEDを接続して動作確認してみました。

プログラムでは最初に0~255までのループをして、そのカウントをLEDに反映してます。終了したら全てのLEDを3回点滅して、また最初に戻ります。

無事に意図した通りの結果となり満足ですが、ポートの並び順が連続してないところがちょっと残念でした。

今回のRegisterクラスにしろFEZシリーズはとても奥が深そうで楽しめそうですが、自分でライブラリを作る場合、あくまでもC#で記述していかないとならないのでしょうか…
個人的にあと1つマイクロ秒単位でのウェイトなどやりたいのですが、ざっと見たところ出来そうにないので(時間関数で待つ方法は別として)、ライブラリをCなどで作れたりするのか気になる部分です。

|

« netduinoはじめてみました | トップページ | FEZ Panda - 仮想COMポート&SDカード »

電子工作」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/204580/49867666

この記事へのトラックバック一覧です: Pandaの到着:

« netduinoはじめてみました | トップページ | FEZ Panda - 仮想COMポート&SDカード »