ラベル .NetMicroFramework の投稿を表示しています。 すべての投稿を表示
ラベル .NetMicroFramework の投稿を表示しています。 すべての投稿を表示

2013年6月20日木曜日

.NetMicroFramework

諸事情でNetduinoを買いました。正確に書くとNetduino Plus 2となります。
STM32F405RGを使用し、Microsoftの.NetMicroFrameworkが入っているため、Visual C#で開発することができます。
端的に説明すると、Arduinoのような使いやすさで、mbedのような高性能を、Windowsと同じようにコーディングできる。という感じでしょうか。
NetduinoはArduino形状なのでmbedほど使いやすいわけではないですが、EthernetやmicroSDソケットが搭載されていたり、比較的使いやすい形となっています。
VisualC#が標準の開発環境となるため、mbed等のように見づらく操作しづらく使いにくいIDEではなく、非常に高性能な予測入力が使用でき、インデントなども自動で行われ、カスタマイズも容易です。
もちろんソースコード内に日本語を記述でき、printDebugでも日本語や漢字を使用することができます。VisualC#でソースコードレベルでデバッグが可能なのでバグの発見や駆除も容易でしょう。

タイマ割り込みを使用したLチカ
Lチカ程度なら簡単に記述でき、タイマ割り込みを使用するのも宣言を含めて1行でできます。C#なので多重定義も使用でき、簡単に使用したい場合やより高度な設定をしたい場合でも同じ方法で初期化できます。

欠点を挙げるとすれば、Arduinoやmbedほど日本で普及しているわけではなく、情報量がさほど多くないことや、コードを書き込む際の安定性の問題があります(mbedのようにファイルをコピペする形式ではなく、VisualC#から転送する 昔使っていた時に頻繁にエラーが出ていた 最近どうなったかは知らない)。


Timerを使用することによりタイマ割り込みを使うことができますが、.NetMFWのタイマ割り込みはハードウェア処理ではなく、ソフトウェア処理のため、CPUリソースの許す限りいくつでも可能という利点があります。これはコードの動作を短い時間に区切って割り当て、常に時間を監視して、ちょうどいいタイミングが来たら関数を呼び出す、という動作をしているためです。そのため時間の正確性については微妙なところがあります。ただミリ秒やマイクロ秒といったものすごく短時間の精度が要求される場合は普通のマイコンに直接コードを書き込んだほうが安心できるでしょう。

Netduinoの入手ルートは現時点ではスイッチサイエンスが簡単です。
少し遊ぶ程度ならNetduino2でもいいですが、SDカードへのアクセスやEthernetを使おうと思うならNetduinoPlus2が最良の選択だと思われます。
他にも.NetMFWが動くボードはありますが、僕は使ったことがないので評価出来ません。

2011年9月9日金曜日

Netduinoでモールス符号

/* *** */

using System.Threading;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;

namespace NetduinoPlusApplication1
{
    public class Program
    {
        public static OutputPort LED;

        public static void Main()
        {
            LED = new OutputPort(Pins.ONBOARD_LED, false);

            int waittime = 100;

            while (true)
            {
                sendText("SOS", waittime);
            }
        }

        public static void sendText(string text, int sigtime)
        {
            for (int i = 0; i < text.Length; i++)
            {
                sendMorse(getMorse(text[i]), sigtime);
            }
            Thread.Sleep(sigtime * 7);
        }

        public static void sendMorse(string morse, int sigtime)
        {
            if (morse[0] != '0')
            {
                for (int i = 0; i < morse.Length; i++)
                {
                    LED.Write(true);
                    Thread.Sleep((morse[i] == '1' ? (sigtime) : (sigtime * 3)));
                    LED.Write(false);
                    Thread.Sleep(sigtime);
                }
            }
            Thread.Sleep(sigtime * 3);
        }

        public static string getMorse(char c)
        {
            switch (c)
            {
                case ('A'): return "12";
                case ('B'): return "2111";
                case ('C'): return "2121";
                case ('D'): return "211";
                case ('E'): return "1";
                case ('F'): return "1121";
                case ('G'): return "221";
                case ('H'): return "1111";
                case ('I'): return "11";
                case ('J'): return "1222";
                case ('K'): return "212";
                case ('L'): return "1211";
                case ('M'): return "22";
                case ('N'): return "21";
                case ('O'): return "222";
                case ('P'): return "1221";
                case ('Q'): return "2212";
                case ('R'): return "121";
                case ('S'): return "111";
                case ('T'): return "2";
                case ('U'): return "112";
                case ('V'): return "1112";
                case ('W'): return "122";
                case ('X'): return "2112";
                case ('Y'): return "2122";
                case ('Z'): return "2211";

                case ('1'): return "12222";
                case ('2'): return "11222";
                case ('3'): return "11122";
                case ('4'): return "11112";
                case ('5'): return "11111";
                case ('6'): return "21111";
                case ('7'): return "22111";
                case ('8'): return "22211";
                case ('9'): return "22221";
                case ('0'): return "22222";

                default: return "0";
            }
        }
    }
}
/* *** */
とりあえずアルファベットと数字だけ

しかしまぁ最近回線速度が酷く遅い
測定サイトだと下り5上り1位出てるから
遅いって言うほど遅くもないんだけど
なぜかページが開けない
どうやらアップリンクが捨てられてる時が有るらしいんだが
ウイルス対策ソフト?

2011年8月6日土曜日

.NetMicroFrameworkで2進数文字列を整数に

C#(.NetFull)だと
int num2 = Convert.ToInt32("1111101000", 2);
みたいにやるところだけど

.NetMicroFrameworkでは Convert.ToInt32が使えないみたい
ということで↓の方法を試してみた

        public static int ToInt(string input)
        {
            int i = 0;
            for (int c = 0; c < input.Length; c++) { i = (i << 1) + (input[c] == '0' ? 0 : 1); }
            return i;
        }

ビットシフトを使っただけ
だけど一応動作する
int i = ToInt("1100");
みたいなかんじで使えばおk
整数を2進数文字列にすることも簡単かも
応用して16進とかも
ただ16進になると三項演算子が使えないからちょっとめんどくさいかも

今は2進数だけだったからこれだけで

機会があったら他の進数も試してみます