netduino pLusでfeLicaリーダー動かしてみました(補足編)
この投稿はLL/ML Advent Calendarの12/11向けの記事です。
いつものごとくTLを眺めていたら@teruroさんに
なんか人を増やしたらいいらしいから、@miguse と @nagakenjs も呼ぼうず #LLAdventJP
— てるるー 名古屋店さん (@terurou) 11月 20, 2012
と
LL/MLにちなむと言うことでいろいろ考えたのですが、先日のNGK2012Bで話した内容の補足をしようかと思います。発表資料はこちら。
補足と言っても全てを取り扱うことはできませんので、NetduinoとFeliCaリーダーの通信方法について触れたいと思います。
ハードウェア
今回紹介するのは次の二つです。通販サイトのスイッチサイエンスさんにリンクを張っています。
準備
開発環境の構築は先日書いた記事を参照して下さい。
NetduinoとRC-S620Sとはシリアル通信で接続します。
作りたてのソリューションではシリアルポートは使えませんので、参照の追加より「Microsoft.SPOT.Hardware.SerialPort」を追加します。
NetduinoとRC-S620Sの接続
Netduino Plusには、二つのシリアルポートがあります。
COM1がD0(RX)とD1(TX)、COM2がD2(RX)とD3(TX)となりますが、今回はCOM1の方を使います。
RC-S620Sのピンアサインはこうなっています。
ピン番号 | ピン名称 | 機能 | 備考 |
---|---|---|---|
1 | VDD | 電源端子 | DC3.3V±5%もしくはDC5.0V±5% |
2 | RXD | RXD信号 | |
3 | TXD | TXD信号 | |
4 | GND | GND端子 | GND接地 |
5 | Reserve | テスト出力端子 | コントローラ側でOpen処理が必要 |
6 | GND | GND端子 | GND接地 |
Netduinoと繋ぐにはクロス接続する必要があるので、互いの端子のRXとTXを繋ぐように配線します。ピン1は電源、ピン4と5はGNDなのでNetduinoの該当端子にそれぞれ繋ぎます。
Netduino PlusとRC-S620Sを繋いだ図が以下になります。
シリアル通信
シリアルポートを扱うには、System.IO.Ports.SerialPortクラスを使います。コンストラクタでポート名、ボーレート、パリティ、などのシリアル通信に必要な値を指定します。
処理を開始する前にOpenメソッドを実行し、ポートを開く必要があります。
SerialPort serialPort = new SerialPort(Serial.COM1, 9600, Parity.None, 8, StopBits.One); serialPort.Open(); // なにか処理 serialPort.Close();
シリアルポートにデータを書き込むのは簡単です。
SerialPortクラスのWriteメソッドにbyte配列を指定します。
byte[] buffer = new byte[] { 0x01, 0x02, 0x03 }; serialPort.Write(buffer, 0, buffer.Length);
シリアルデータの読み込みにはReadメソッドを使います。イベントハンドラを用いる非同期なやり方もあるのですが、RC-S620Sでは頻繁に応答があるためReadメソッドを使った同期的なやり方を採用しました。
始めに受信したいバイト数(例では256バイト)分シリアルポートにデータがたまるまで待機し、Readメソッドでたまったデータをバッファに読み込みます。
byte[] buffer = new byte[256]; int len = buffer.Length; while (serialPort.BytesToRead < len) { Thread.Sleep(5); } int receivedBytes = serialPort.Read(buffer, 0, buffer.Length);
以上が.NET Micro Frameworkでのシリアル通信の基本になります。
一度ハードウェアを組み立てれば、後はソフトウェアの問題なので、興味のある方はRC-S620Sのコマンドリファレンスマニュアルを読みつつドライバを書いてみてはいかがでしょうか。
Arduino向けのソースコードがありますので、私はこれをベースにNetduino用のドライバを書きました。
今回実装したFeliCa認証システムのソースは、調整ののちBitbucket上で公開予定です。