<ご注意>
・このサイトを参考に実験を行い、火災、感電等がおきましても筆者は一切責任を取ることはできません。必ず自己責任で安全に十分注意したうえで実施してください。
・認証のない無線機器の使用及び技適付き無線機器の改造は法律により禁止されています。
RC-S660/Sそのものの分解改造や、外国製の日本国内の型式認証を受けていないNFCカードリーダを使用することは電波法違反となります。
1.RC-S660/Sと仕様書の入手
個人で入手できる通販サイトのうち、スイッチサイエンスで変換基板と合わせて購入しました。本体と変換基板の購入
2024/10 現在、電子工作界隈で有名な個人客対応の通販サイトでは、下記で取り扱いがあるようです。(「RC S660 S」 Google 検索結果順 2024/10/19)
・スイッチサイエンス
・マルツ
・せんごくネット通販
・共立エレショップ
この中でスイッチコネクタ変換基板・ケーブルを一緒に買えるスイッチサイエンスで購入しました。
NFC/FeliCa 組み込み用リーダー/ライター RC-S660/S
本体への接続はフラットケーブルですから、変換基板・ケーブルが無いとブレッドボードに接続できません。
RC-S620/S とコネクタ形状が同じであり、下記の変換基板が使用できます。
FeliCa RC-S620S/RC-S730 ピッチ変換基板のセット(フラットケーブル付き)
ただし、RC-S620/SとはPINアサインが変更になっています(2章で後述)
ドキュメントの入手
RC-S660/S ドキュメント
RC-S620/S と異なり、ユーザー登録必須になっています。
SONYのページから、ドキュメントとサンプルプログラムを入手できます。
ドキュメントは日本語ですから安心です。
RC-S660/S製品仕様書<簡易版>
NFC Port-400シリーズ コマンドリファレンスマニュアル UARTインターフェース編<簡易版>
サンプルプログラム
会社名・団体名、部署名 が必須になっていますが、両方とも「個人」と入力して通りました。
登録が完了すると、ダウンロードできるようになります。
関連ドキュメント
RC-S660/S で採用されているコマンドは国際規格に関連しており、RC-S660/S のコマンドを理解する参考書として参照しました。
Specification for Integrated Circuit(s) Cards Interface Devices
RC-S660/S が採用しているCCIDコマンドの仕様書です。
DWG_Smart-Card_CCID_Rev110.pdf
カードリーダを操作するのに、下記のコマンドを使います。
6.1.8 PC_to_RDR_Escape
Interoperability Specification for ICCs and Personal Computer Systems
Specification Files – PC/SC Workgroup から Pcsc3 V2 01 09 を取得
Part 3. Supplemental Document for Contactless ICCs Revision 2.02.00
Specification Files – PC/SC Workgroup から Pcsc3 V2 02 00 Sup2 を取得
RC-S660/S が採用しているAPDU (Application Protocol Data Unit ) コマンドの仕様書です。
カードリーダと通信するのに、下記のコマンドを使います。
4 Manage Session Command
5 Transparent Exchange Command
6 Switch Protocol Command
2. ハードウェアの接続と仕様
ハードウェアを接続し使用する準備をします。RC-S620/Sと仕様の比較をし、過去作った物がどの程度流用できるのかの確認もしました。
PINアサイン
スイッチサイエンスの変換基板を接続した場合のPINアサインです。RC-S660/Sのコネクタは、裏表どちらでも使えるようになっています。
マイコン基板と2階建てで使う場合は青い面をシールド側に、並べて使う場合は青い面を基板側で使うとフラットケーブルを途中でひねることなく綺麗に接続できそうですそうです。
RC-S620/SとはPINアサインが変わっていますから、そのまま差し替えて使うことはできません。
RC-S620/Sとのハード比較
PINアサインに外にもRC-S620/Sとハードウェア仕様が異なる部分があり、RC-S620/S向けに作った物がどの程度流用で切るのか確認するため整理しておきます。電源・URAT共に3.3V系のみの対応となり、5V系から移行する場合は対応が必要になります。
・UARTの絶対最大定格が3.5V (5Vトレラントではない)
絶対最大定格電圧は、電源だけでなく、入力 も 3.5V となっています。
電源以外の入力端子は UART しかないことから、UART が 5Vトレラントではないということが分かり、5V系のマイコン直結では使えないです。
電子工作で有名なマイコンボードでは、Arduino UNO は5V系ですから直結できず、レベル変換回路が必要と分かります。
・3.3V 200mA の安定化電源が必要
電源についても RC-S620/S の時のように容量のある USB バスパワー出力 5V で動作させることができなくなり、3.3V の電源が必要になります。
3.3V電源には、電流容量 200mA以上、リップル 30mVPP(Peak to Peak) 以下 の条件が付いています。
入手性の良いFT23x系のUSBシリアルは、3.3V出力端子の最大電流が50mAとなっていますから、外付けで3.3Vの電源が必要と分かります。
3.3V出力が 50mA となっているUSBシリアルの例:
秋月電子 FT231X USBシリアル変換モジュール "AE-FT231X"
秋月電子 FT232RL USBシリアル変換モジュール "AE-UM232R"
リップルの少ない電源が必要ですから、フィードバック回路を持った安定化電源ICを使うのが良さそうです。
USBシリアルを使った実験回路例
私がTeraTermでテストした時の回路を示します。USBシリアル は、秋月電子 FT232RL USBシリアル変換モジュール "AE-UM232R" を使用しました。
AE-UM232R は基板上のジャンパピン J1 を切り替えることで UART の 5V系動作 と 3.3V系動作 を切り替えるようになっています。
J1 を 1-2 間ショート に設定し 3.3V 動作を選択しています。
LDO は使いやすい3端子レギュレータ型の TA48033S を使用しました。
3.コマンドの概要
RC-S660/Sのコマンドは、下位層コマンドの中に上位層コマンドをパックして送るような形になっています。もちろんUARTはシリアル通信ですから連続データになりますが、考える際に下図のような階層構造で捉えると分かりやすいです。
イーサネットのOSI参照モデルのようですね。
カードへ送る無線送信データも階層構造でとらえられる構造になりますが、このページではRCS-660/Sにのみ注目しますので、無線送信データ部分は1階層として扱います。
下位コマンドには上位コマンドのLEN(length:長さ)を指定する必要があるため、コマンドを組み立てる際は、最上位層から順番に組み立てていく必要があります。
ACK はデータを持たない特殊なフレームです。
以下に、シーケンス番号4で、ICカードに無線コマンド "00 A4 00 00" を送信する例を示します。
下位層コマンドに上位層コマンドを載せていく形になっています。
4.まずはRC-S660/S単品動作
それでは、手を動かしてコマンドを送受信してみます。まずは、カードはタッチせずに、カードリーダ単品を制御するAPDU(Application Protocol Data Unit)コマンドを題材に動作させてみます。
CCIDコマンドとUARTコマンドフレーム
題材はAPDUコマンド "Get Firmware Version"
APDUコマンドの中でも固定コマンド(データ部を持たない) コマンドを題材に選びます。
その名前の通り、RC-S660/S のファームウェアバージョンを取得するです。
APDUコマンドは下記です。
APDUコマンド = "FF 56 00 00 00"
最終バイトは Le で、期待するレスポンスの長さを指定しておくと応答のチェックに使える機能です。
ここでは使用しないため
Le = "00"
としています。
Leについては、後ほど 「Leについて」 項で試してみます。
APDUコマンドは3層目のコマンドですから、2層目のCCIDコマンドにまず載せたうえで、さらに1層目のコマンドフレームに載せてUART送信する必要があります。
ホストコントローラーから RC-S660/S にデータを送信する際に使う2層目のCCIDコマンドは PC_to_RDR_Escape です。
STEP1:PC_to_RDR_Escape コマンドに載せる
PC_to_RDR_Escapeコマンドは、APDUコマンドを送信するためのCCIDコマンドです。
RC-S660/S 独自の物ではなく、
Specification for Integrated Circuit(s) Cards Interface Devices (Revision 1.1)
で定められています。
それでは、コマンドを組み立てていきます。
固定の場所は仕様通りに入れればよいですから、可変の場所を検討します。
まずabDataです。
今回送信したい "Reset Device" のAPDUコマンド "FF 55 00 00" をそのまま入れて下記になります。
abData = "FF 56 00 00 00"
続いでdwLengthです。
abDataの長さは 5バイト になりました。
dwLengthの幅は4バイトですから、まずは素直にビックエンディアンで4バイトで表記すると "00 00 00 05"となります。
忘れずにリトルエンディアンに変換し下記になります。
dwLength = "05 00 00 00"
bSeq は、今回は一発目のフレームですから 0番目 とします。
bSeq = "00"
最後に、固定部とつなげてPC_to_RDR_Escape CCIDコマンドが完成します。
CCIDコマンド = ”6B 05 00 00 00 00 00 00 00 00 FF 56 00 00 00”
STEP2:UART コマンドフレームに載せる
作成したCCIDコマンドをRC-S660/Sに送信するため、さらにUARTコマンドフレームに載せます。
CCIDコマンドの時と同様、可変の部分を組み立てていきます。
まずは、パケットデータはSTEP1で組み立てたCCIDコマンドです。
パケットデータ = ”6B 05 00 00 00 00 00 00 00 00 FF 56 00 00 00”
続いでDCSです。
まずはパケットデータを合計します。
"6B" + "05" + ・・・ = "1C5"
DCSは、パケットデータの合計 + DCS の下位バイトが "00" になるようにDCSを設定する必要があります。
DCSは例えば、"100" (百ではなく 0x100)からパケットデータ合計の下位1バイトを引けば求めることができます。
パケットデータ合計の下位1バイトはパケットデータ合計を "100" で割った余りを求めればよく、
"1C5" % "100" = "C5"
よって
DCS = "100" - "C5"
DCS = "3B"
下位1バイト取り出しは直感的にわかりやすい「余りを求める」方法で書いていますが、マイコンで実装していくときは、
datasum % 0x0100 で余りを求めるよりも、
datasum & 0x00FF でビットマスクした方が処理が速いかもしれません。
続いて LEN です。 パケットデータの長さは 15 バイトですから、16進数に直すと "0F" になります。
LENは2バイトですから、下記になります。
CCIDコマンドのdwLengthと異なり、こちらのLENはビッグエンディアンですから、間違えないようにします。
素直に2バイトにするだけでOKです
LEN = "00 0F"
LENが決まればLCSを計算します。
LEN上位バイト + LEN下位バイト + LCS の下位1バイトが ”00” となる必要があります。
DCSの時と同様、"100" (百ではなく 0x100) から (LEN上位バイト + LEN下位バイト) を引いて求めると、下記になります。
LCS = "100" - ("00" + "0F") % "100"
LCS = "F1"
以上で可変部が決まりましたので、UARTコマンドフレームを組み立てます。
URATコマンド = ”00 00 FF 00 0F F1 6B 05 00 00 00 00 00 00 00 00 FF 56 00 00 00 3B 00”
STEP3:UART送受信し UART コマンドフレーム レスポンスを読む
組み立てたUARTコマンドを、USB-シリアル変換アダプタ経由でパソコンからRC-S660/Sに送信します。
Tera Termを16進モードに設定し、データ送信にはマクロを使います。
USBシリアル周りの配線は 2.ハードウェアの接続と仕様に、 Tera Termの設定については、Appendix A.Tera Term操作 掲載しています。
RC-S660/Sからの応答も、USBシリアル経由でTeraTermで表示します。
;Tera Termマクロ Get Firmware Version (Le = 0)
send $00$00$FF$00$0F$F1$6B$05$00$00$00$00$00$00$00$00$FF$56$00$00$00$3B$00
send $00$00$FF$00$0F$F1$6B$05$00$00$00$00$00$00$00$00$FF$56$00$00$00$3B$00
コマンドを実行した結果を下図に示します。
UARTコマンドを送信すると、まず ACK が返ってきます。
ACK は英語の "acknowledge" から来ており、文字通りコマンドを受け取ったことを知らせる専用のフレームで、データを持たないUARTコマンドフレームです。
LEN = "00 00"であり、パケットデータ部を持たないため、UARTコマンドフレームだけ1層構造の特殊フレームです。
例えるならば「既読マーク」みたいなものでしょうか。
ACKに続いて、UART コマンドフレームのレスポンスが返ってきます。
UART コマンドフレームの構造とルールは、送信時と同じです。
パケットデータ部の長さ(LEN)を読み取り、チェックサムを点検します。
LEN = "00 1E" , LCS = "E2" と読み取れます。
"00" + "1E" + "E2" = "100"
より、LEN上位バイト + LEN下位バイト + LCS の下位1バイトが ”00”となっており、正しく受信出来ていそうです。
LEN = "00 1E" を10進数に直すと 30 です。
よって パケットデータ部の長さは 30バイト と分かります。
パケットデータ部は送信した PC_to_RDR_Escape コマンド に対する応答ですから、 PDR_to_PC_Escape レスポンス が載ってきていることになります。
図中「レスポンス」にて 赤文字 で示した部分が、PDR_to_PC_Escape レスポンスに相当するパケットデータ部分です。
PDR_to_PC_Escape の中身は、次項で読み解きます。
データ部のチェックサムを点検します。
DCS = "D3"と読み取れます。
パケットデータ部の合計を求めると、
"83" + "14" + ・・・ + "00" = "72D"
DCSを足すと
"72D" + "D3" = "800"
パケットデータの合計 + DCS の下位バイトが "00" になっており、こちらも正しく受信できていそうです。
STEP4:RDR_to_PC_Escape レスポンスを読む
STEP3 で受信したフレームから、CCID RDR_to_PC_Escape レスポンスを切り出して読み解いていきます。
受信したCCIDレスポンスを当てはめると下記のようになります。
bMassageType = "83"
仕様書通りです。
dwLegth = "14 00 00 00"
dwLegthはリトルエンディアンになっていますからビックエンディアンに直すと
"00 00 00 14" となります。
16進ですからさらに10進に変換します。十四 ではありません。
0x14 = 20 ですから、abData の長さは 20バイトあると分かります。
bSlot = "00" ,bSeq = "00"
仕様書通り、送信時と同じ値が入っています。
bStatus = "02"
こちらはさらにビットにばらす必要があります
0x02 = 0b00000010
bmlCCStatus = 0b10 = 2
2 固定の仕様書通りです。
bmRFU = 0b0000
0 固定の仕様書通りです。
bmCommandStatus = 0b00 = 0
こちらは 「エラーなし」を意味していると読み取れます。
bError = "00"
bmCommandStatus が「エラーなし」ですからスキップします。
abData = "00 00 01 01 01 01 FF FF 04 01 FF FF 01 00 FF FF 00 00 90 00"
上位層コマンドのレスポンスデータが入っています。
送信した APDUコマンド "Get Frimware Version" に対する APDU レスポンスが入っていることになります。
図中に 赤文字 で abData と示した部分が、 APDUレスポンス部分です。
参考:送信時にdwLengthを間違えた場合のエラー例
bmCommandStatus = 0でエラーなしでしたが、送信時にdwLengthを間違えた場合を例に、エラーが発生した様子を参考として掲載します。
「dwLenghtをリトルエンディアンに変えるのを忘れる」という、手作業でコマンドを組み立てているとうっかりやってしまうミスを題材にします。
bStatus = "42"
になりました。ビットにばらします。
0x42 = 0b01000010
bmCommandStatus = 0b01 = 1
「失敗」になりました。
bError = "01"
"Bad dwLength"エラー となり、dwLength間違いがエラー検出されている様子を確認できました。
STEP5:APDU レスポンスを読む
寄り道しました。
話をエラーのないデータに戻し、最後に、目的の 3層目 APDU レスポンスを読み取って完了となります。
詳細は省略しますが、受信したCCIDレスポンスを仕様に当てはめると下記のようになります。
各ファームウェアのバージョンが読み取れました。
APDUコマンドは、データオブジェクト(array)に続いて、2バイトのレスポンス SW1, SW2 が付いてきます。
実行したコマンドに対するエラーステータス情報です。
コマンド共通のエラーステータスと、コマンド固有のエラーステータスがあります。
"90 00" は 正常終了 を示しています。
使用するコマンドよって、エラーのバリエーションは変わってきます。
マイコンで制御プログラムを実装する場合は、必要に応じてエラー処理に使用します。
5.【予告編】NFC Type-B を捕捉
続いて、カードと捕捉します。マニュアルにカードと通信をするための代表的なシーケンスが記述されていますから、マニュアルに従ってコマンドを実行していきます。
5章で "1), 2)" のコマンドを実行してカードを捕捉します。
"3)"以降は、次章で扱います。
1) Start Transparent Session
2) SwitchProtocol (TypeA/B/F)
3) Transmission and Reception Flag などでフラグ設定 (カードコマンドに依存)
4) RF On
5) Transceive(Transmit/Receive)でカードコマンドを送受信
6) RF Off
7) End Transparent Session
引用元:NFC Port-400シリーズ コマンドリファレンスマニュアル UARTインターフェース編<簡易版> (Version 1.0) 4.3 代表的なシーケンス, , Page 25 of 51
Manage Session
1つ目の "Start Transparent Session" は、 "Manage Session" という APDU コマンドを通じて実行します。透過的なセッションの開始終了と設定を行うためのコマンドで、メニュー画面で選択するようなイメージで使用する機能の Tag を選んで使用するようになっています。
"Data In" 部に "Tag" "Length" "data" のセットで並べて載せることで、複数のコマンドを同時に送信することができるようです。
例えば機能実行を遅延させる Timer は、待たせたい機能の Tag と並べて送ることが前提になります。
シーケンスNo.0 Start Transparent Session
Manage Session APDUコマンドの使い方を確認したところで、Start Transparent Session を実行するように可変部を埋めていきます。
Start Trasnparent Session の Tag は "81" です。
Start Trasnparent Sessionはデータ部は持たないですから、送るデータはTagだけとなり
Data In = "81"
Data In の長さは1バイトですから
Lc = "01"
Leチェック機能は使わない方針ですから、
Le = "00"
固定値の CLA ~ P2 をつなげて、APDUコマンドは下記になります。
Manage Session APDUコマンド = "FF C2 00 00 01 81 00"
シーケンスNo.1 SwitchProtocol(Type B)
Switch Protocol のコマンドを確認します。NFCの規格と、レイヤを切り替えるコマンドです。
Switch Protocol Data Object しか使わないため、Tag = "8F" 以外は省略します。
RC-S660/S でサポートされていないレイヤも省略します。
RC-S/660S 側のドキュメントでは、で各レイヤを選択した際にどこまで処理してくれるかが表記されています。
それでは、NFC Type-Bと通信ができる設定をするように、Switch Protocol の可変部を埋めてコマンドを組み立てます。
Switch Protocol Data Object ですから
Tag = "8F" , Length = "02"
続いてSwitch Protocol Data Object に設定する情報です。
NFC Type-Bですから
Standart Type = "01"
レイヤの選択肢が3つあります。
カードリーダ側の仕様だけでは不明なため、カードの仕様側を確認する必要があります。
トライ&アンドエラーで完了でもよいのですが、モヤモヤしますから、カード側仕様を確認して設定をしていきます。
カードの仕様ですが、残念ながら、JIS X 6322 が廃止されてしまいました。
ISO/IEC の仕様書は高すぎて手が出ないです。
ISO/IEC 14443-3:2018 のpdfが 194スイス・フラン、24/12/15時点で33,000円を超えます。RC-S660/Sが5個買えます。
しかしなんと、一般財団法人ニューメディア開発協会 から 日本語 かつ 無料で読める 互換仕様書が出ています!
日本語環境で "ISO/IEC 14443-3" でググるとトップに出てきます。
もちろんフル活用させていただきます!
一般財団法人ニューメディア開発協会 規約12
https://www.nmda.or.jp/nmda/ic-card/pdf/kiyaku12.pdf
こちらの規約をもとにType-Bカード側の衝突防止関係の仕様を確認してみると下図のようになっているようです。
ACTIVE(カードと通信できる)状態まで衝突防止処理を進めてもらうためには、 ATTRIB まで実施してもらえる レイヤ "04" を選択する必要があるとわかります。
よって、
Layer = "04"
となります。
Data In には、5バイト目~8バイト目までの4バイトが含まれますから、
Lc = "04"
Leチェック機能は使わない方針ですから、
Le = "00"
固定値部分をつなげて、APDUコマンドは下記になります。
Switch Protocol APDUコマンド = "FF C2 00 00 04 8F 02 01 04 00"
実行してみる
ここまで実行してみます。仕様を見ると、RF を ON する操作は、自動で実行してくれるようです。
上記で組み立てたコマンドでNFC Type-Bを捕捉できると期待します。
Switch Protocol Object を指定した場合、カードの捕捉状態によらずRFOff→RF On を行った後に指定Layerの動作を行います
引用元:NFC Port-400シリーズ コマンドリファレンスマニュアル UARTインターフェース編<簡易版> (Version 1.0) 4.10 Switch Protocol, Page 38 of 51
4章同様に、APUDコマンドをCCIDコマンドに載せ、さらにUARTコマンドフレームに載せて、TeraTermから送信します。
;Tera TermマクロでNFC Type-B を捕捉するコマンドを送信
;シーケンスNo.0 Start Trasnparent Session
send $00$00$FF$00$11$EF$6B$07$00$00$00$00$00$00$00$00$FF$C2$00$00$01$81$00$4B$00
;100ms待機
mpause 100
;シーケンスNo.1 SwitchProtocol(Type B)
send $00$00$FF$00$14$EC$6B$0A$00$00$00$00$01$00$00$00$FF$C2$00$02$04$8F$02$01$04$00$2D$00
;シーケンスNo.0 Start Trasnparent Session
send $00$00$FF$00$11$EF$6B$07$00$00$00$00$00$00$00$00$FF$C2$00$00$01$81$00$4B$00
;100ms待機
mpause 100
;シーケンスNo.1 SwitchProtocol(Type B)
send $00$00$FF$00$14$EC$6B$0A$00$00$00$00$01$00$00$00$FF$C2$00$02$04$8F$02$01$04$00$2D$00
RC-S620/S の InListPassiveTarget の時のような「無限リトライ」設定はないようですから、カードをタッチした状態でコマンドを実行する必要があります。
物を作っていく際は、マイコン側で例えば「正常終了でなければ無限リトライ」を実装する必要がありそうです。
エラーになったら再度コマンドを実行すれば、自動でRF OFF→ONして仕切り直してくれますから、Switch Protocol コマンド送信部分を"正常終了"を抜ける条件にしたループ処理にしておく感じでしょうか
RC-S620/S の InListPassiveTarget は、無限リトライに設定しておくとカードをタッチしたタイミングで ダーッ と応答が流れてきて「おー!NFCリーダー動かしている!」ってワクワクしたものですが、RC-S660/Sはコマンド実行のタイミングでカードが見つからなければエラーで終わりなのが寂しいです。
6.【予告編】NFC Type-B と通信
シーケンスNo.2 Transmission and Reception FlagシーケンスNo.3 RF On
シーケンスNo.4 Tamsceive で MF を選択する無線コマンドを実行する
デフォルトのままでは通信できないようです。
MF を選択し、カードから "90 00" (正常応答) が返ってくるようになりました。
続いて、従来型のICカード免許証 (NFC Type-B)を題材に、情報を読み取ってみます。
ICカード免許証は仕様が公開されています。
時々バージョンアップするため
「免許証 仕様」 で検索
して警察庁が出しているpdfを入手します。
2024/12 現在は 『原議保存期間 5年(令和10年3月31日まで)』 というタイトルです。
MF の配下に 共通データ要素 "EF01" があり、暗証番号による認証操作不要で発行日と有効期限を読み取ることができるようです。
暗証番号認証せずに読める領域ならば、ミスってもロックするリスクがないですから、早速試してみます。
下記の手順で読み取りを行ってみます。
(1) SELECT FILE 無線コマンドを使ってフォルダ "MF" を選択
(2) (1)の状態で SELECT FILE 無線コマンドを使って共通データ要素ファイル "EF01" (EF識別子"2F 01") を選択
(3) (2)の状態で READ BINARY 無線コマンドを使って共通データ要素の情報を読み取り
日付は 2進化10進数, BCD(binary-coded decimal)で記録されているため、16進表示のまま目視で読むことができ動作確認に最適です。
ばっちり読み取ることができました!
以上で、一通りのハンズオンが完了しました。
Appendix A .Tera Term操作
Windows上でCOMポートとデータをやり取りするフリーソフトを設定してきます。有名なTeraTermを使用します。
TeraTermのサイトはこちら
HEX表示の有効可
RC-S660/Sとのデータのやり取りは、すべてHEX(16進数)コマンドにより行います。ですがTeraTermをインストールするだけではHEXを表示することはできません。文字コードに置き換えられて文字化けしてしまいます。
そこでまずはTeraTermでHEXをそのまま表示できるように設定を変更していきます。
1. TeraTermを終了します。
2. TeraTermをインスト―ルしたフォルダを開きます。
例えば C\Prigram Filer(x86)\teraterm です。
3. "TERATERM.INI" ファイルを探し、「右クリック→編集」と操作しエディタで開きます。
4. ”Debug”で文書内検索をかけて "Debug = off" を探し、 "Debug = on"に書き換えて上書き保存します。
5. TeraTermを起動します。
USBシリアルへ接続
1. USBシリアルをパソコンへ接続した状態でTeraTermを起動すると、「新しい接続」画面が出てきます
2. シリアル を選択します。USBシリアルを複数台接続している場合は、プルダウンメニューでRC-S660/Sへ接続したUSBシリアルを選択します。
※「新しい接続」が出てこない場合
ファイル → 新しい接続 とクリックすると表示されます。
※USBシリアルが出てこない場合
接続を確認し、ます。USBシリアルの場合、PCと接続されていても電源出力端子をショートしているなどの理由により保護回路が作動していることがありますので、ブレッドボード側の配線も忘れずにチェックします。
問題なければドライバが当たっているか確認し、必要に応じUSBシリアルのIC型番をネット検索して手動でドライバをインストールします。
シリアル通信設定
RC-S620/Sの通信規格に合わせシリアルポートを設定します
1. 設定 → シリアルポート とクリックしメニューを開きます
2. ボー・レート を115200(RC-S660/Sのデフォルト値)に変更します
3. その他の値はデフォルトのままでよいはずですが、画像の設定と異なる場合修正します
※ボー・レートの選択肢に 115200 が出てこない場合
ご使用のUSBシリアルが高速通信に非対応な可能性があります
USBシリアルのスペックを確認し、最大通信速度が115200bps未達の場合はUSBシリアルを高速通信対応の品種に交換します。
例えばFTDIチップ製FT231/FT232は115200bpsに対応しています。
端末の設定
次に端末の設定をします
1. 設定 → 端末 とクリックしメニューを開きます。
2. 「漢字-送信」と「漢字-受信」を"SJIS"に設定します。
3. 「ローカルエコー」にチェックを入れます。
ローカルエコーは、送信するコマンドを手元に表示する機能です。
チェックを入れない場合、画面には受信データのみが表示されます。
ローカルエコー機能を使用しなくでも通信はできますが、コマンドが正しく送れているのかチェックしたり、コマンドを送信したタイミングを見られたりと何かと便利なため、有効にしています。
※次項目 HEXへの切り替え 時にはローカルエコーが必要になります。
HEX表示への切り替え
最後に表示をASCIIからHEXに切り替えます。
TeraTermにフォーカスが当たっている状態で"Shft + ESC"を押すたびに切り替わります。
「”Shift + ESC” → 何か文字を入力」をHEX表示になるまで繰り返します。
うまく切り替わらない場合は、"TERATERM.INI" ファイルの編集をミスっている可能性がありますので再確認します。
画面をクリアする
HEX設定時に表示された文字をクリアします
設定 → バッファのクリア と操作すると、画面に残っている文字が全て消去されます。
クリア手順は、RC-S620/Sと通信を試していく時にもしばしば実行するため、ショートカットキー "alt + E + B" を覚えておくと便利です。
Tera TermマクロでのHEX送信
TeraTermでのHEX送信では、マクロを利用します。キーボードから送信する場合、ASCII文字コードが割り当てられている値しか送信することができません。
例えば"0x61"を送信したい場合はaキーを押せば送信されますが、"0x00"を送信しようとしても割り当ててられているキーはなく送信することができません。
さらに、キーボードから送信する場合、キーを押すたびに1バイト送信するため、受け取り側がタイムアウトしてしまい全てのコマンドを受け取る前に受信終了してしまう可能性もあります。
そこであらかじめ送りたいコマンドをマクロとしてまとめて記述しておき、連続して一気に送る方法を使用します。
マクロは、TeraTermの処理を自動化するためのプログラムで、windowsのbatファイルのようなイメージです。
拡張子は.ttlです。
送り方も非常に簡単で、 画像のように、送信したいコマンドをttlファイルに書いておき、TeraTerm上で コントロール→マクロ からttlファイルを選択すれば、ttlファイルに書かれた処理が自動で実行されます。
TeraTermマクロには様々なコマンドが用意されていますが、RC-S660/Sとの通信で使うマクロコマンドは最低限下記2つ(+1)です。
send
HEXを送信するコマンドで、カードリーダにコマンドを送信するために使用します。
send スペース $1バイト目$2バイト目$・・・・・$nバイト目
例えば 0x00 0xff 0xd4 0x00 を送りたい場合、次のように記述します。
send $00$FF$d4$00
pause/mpause
指定秒数待つコマンドで、コマンド送信後に次のコマンドを送信するまでカードリーダーの処理時間を待つために使用します。
pause スペース 秒数
mpause スペース ミリ秒数
例えば1秒待ちたい場合、次のように記述します。
pause 1
または
mpause 1000
clearscreen
画面をクリアするコマンドです。
必須で使うコマンドはないですが、区切りの良いところで一旦画面をクリアしたい場合に便利です。
たとえば、カードから情報を読み取るタイミングの直前で、事前にカードと通信するために行う設定系のコマンド & レスポンス履歴をクリアしておくと読みやすくなります。
clearscreen 0
以上2(+1)コマンドがあれば最低限の通信はできますが、他のコマンドを組み合わせるとさらに高度なプログラムを作ることもできます。
例えばpauseのではなく期待した応答内容が返ってくるまで待つための wait を使って、無駄に長い時間待たずに「カードリーダ側の処理が終わったら次の処理に移る」ように改良することができます。
TeraTermマクロについて詳しくは、リファレンスのリンクを貼っておきます。
TTL コマンドリファレンス
コマンドはテキストエディタで作成し、拡張子をttlに変えて保存します。