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

2012年3月31日土曜日

Netduino

どうも、おひさしぶりです

最近はいろいろなマイコンの開発環境を入れようと思ってたんですけど
XPしか対応してなかったり
接続エラーだったり
挙句の果てにはメーカーページからアクセス制限食らったり
散々でした

ってことで 初心に戻ってNetduinoで遊ぼうかなぁと思っています
Plusが1個あるのでね

しかし Netduinoやってて思った
開発環境の整える手順はPICと同じなんですよね

PICはMPLABを入れてからコンパイラを入れますが
Netduinoの場合はVisual C#をインストールしてから.NetMicroFrameworkのSDKをインストールしてNetduinoSDKをインストールします

Arduinoはちょっと簡単すぎるような気もするけど
Arduinoで電子工作を初めてNetduinoで大規模なものを作る というのもアリかも
少なくともNetduinoはWinを使ってる限りは開発環境を整えるのがめんどくさいということもないし
かなりの規模でも作れるので

で とりあえずLチカで遊びました


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

namespace Example3_1_LightSwitch {
    public class Program {
        public static void Main() {
            var switchPort = new InputPort(
                Pins.ONBOARD_SW1, false, Port.ResistorMode.Disabled);      
            var ledPort = new OutputPort(
                Pins.ONBOARD_LED, false);

            while (true) {
                bool isClosed = switchPort.Read();
                if (isClosed) {
                    ledPort.Write(true);
                } else {
                    ledPort.Write(false);
                }
                Thread.Sleep(10);
            }
        }
    }
}
というプログラム
なんで入力のプルアップがディスられてるのかなぁと思ったら
ハードウェアでプルアップされてんのね 知らんかったorz

これから色々と遊んでみようかと思ってるので
ちょっとしたコードならココにぽんぽん置いていきます
長いコードはHPの方かなぁ

ま そんな所で

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進数だけだったからこれだけで

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

2011年5月9日月曜日

電波時計を作る(方法だけ)

Netduinoで電波時計を作ってました

何故かWinがNetduinoを認識しなくなったので要点をいくつか書くだけにしておきます
覚書

まず受信モジュール
40kHzを受信して〜というのは結構めんどくさいので
トライステートの電波時計V2の受信モジュールを使います

あれあるのになんで作るのかと
大した理由はなく暇つぶし的な

ちなみにWebで公開されている回路図と実際の基板のシルクが違うので注意してください

最低限必要なのは
電源(9V〜20V程度)
です
あとは5Vや3Vをフォトカプラに入れれば3進のパルスが出てきます

これを50ms程度の割り込みで監視して
3種類に分けて
60この配列に入れてやれば準備完了

あとはひたすらifで足し算していくだけ
Netduinoが復活したらコード載せます


/* ********* */

何故かBloggerのエディタがロードできない
旧エディタにして書いてる

2011年5月1日日曜日

Netduinoでシリアルポート

とりあえずNetduinoで使える機能を紹介するこのコーナー(?)

まずはシリアルポート
デバッグなら
Debug.Print("hello world");
でも十分だけど
シリアルポートを実際に使うのは多いはず

まずは参照設定に
Microsoft.SPOT.Hardware.SerialPort
を追加します
ソリューションエクスプローラーの参照設定を右クリックして「参照の追加」
出てきたウインドウの「.NET」タブから追加します

そしてプログラム先頭の方に
using System.IO.Ports;
を書き加えます

そしたら適当なところ(「public static void Main()」 の上あたり)に
static private SerialPort serial;
を追加
そしてMain()の適当なところ(最初のほう)に

serial = new SerialPort(SerialPorts.COM1, 9600,
                Parity.None, 8, StopBits.One);
を書き加えます
この設定だと
ビットレート9600
ストップビット1
パリティ無し
という一般的な設定になります

SerialPorts.COM1の場合Digital I/O 0ピンが受信 1ピンが送信
COM2の場合2ピンが受信 3ピンが送信になります
COM1とCOM2は同時に使うことができるので
COM2でGPSから緯度と経度を追加して
COM1でアナログから得た温度データ等と共にPCに送信
ということも可能です

そしてシリアルポートの設定が済んだら.Net Fullと同じように
serial.Open();
で接続を開始します(ピンに何もつながっていなくても接続です TCP等とはちょっと違う 「相手がいる前提」です)

これで通信することが可能です

ただ
serial.Print("hello world");
とやりたいところですが

Print関数が使えないみたいなので


        static private byte[] Print(string text)
        {
            byte[] da = new byte[text.Length];

            for (int i = 0; i < text.Length; i++)
            {
                da[i] = (byte)text[i];
            }

            return da;
        }


というのを作って

            string text = "Hello world";
            serial.Write(Print(text), 0, text.Length);
のように送信したりします(Printの中で送信することもできますが)


受信はまた機会があったらやろうと思います