FeliCa Lite-S と PaSoRi RC-S380 で勤怠打刻を自作する構成を固めた — 見た目そっくりの「無地PVCカード」はチップ無しの罠

開発misc-dev

FeliCa Lite-S と PaSoRi RC-S380 で勤怠打刻を自作する構成を固めた — 見た目そっくりの「無地PVCカード」はチップ無しの罠

カードをかざして出退勤を記録する勤怠打刻の仕組みを自作できないかと考えている。手元にはソニーのカードリーダー PaSoRi(RC-S380系)がある。あとは安いFeliCaカードを人数分買い足せば材料が揃う——と思ってAmazonで見つけた10枚数百円の白無地カードをClaude Codeに確認させたら、FeliCaではなかった。そこから構成が固まるまでの記録を残す。

先に結論を書く。

  • Amazonで売られている10枚数百円の「白無地プラスチックカード(JIS規格サイズ)」はICチップが入っていない印刷用の生カード。FeliCaとしては使えない
  • 安くFeliCaをそろえるなら「FeliCa Lite-S 白無地カード」が実質最安で、1枚あたり約150〜200円(2026年7月時点のAmazon実売)
  • RC-S380はPythonの nfcpy の動作確認済み機種。Windows PCにつないでカード固有ID(IDm)を読むだけで、打刻の骨格は数十行で書ける
  • ただしRC-S380をAndroidタブレットにつなぐ構成は今回見送り。公式ドライバがWindows向けで、Androidで使うには通信プロトコルの独自実装が要る。タブレット化したいなら「FeliCaを読めるNFC内蔵Android端末単体」か「WindowsタブレットにRC-S380」の二択になる

罠: 見た目がFeliCaそっくりでも、ただの生カードがある

最初に見ていたのは「プラスチックカード 10枚 白 無地 JIS規格サイズ PVCカード 0.76mm厚」という商品だった。サイズは横86mm×縦54mm×厚さ0.76mm。Suicaや社員証とまったく同じ規格サイズで、写真だけ見ればFeliCaカードと区別がつかない。

商品ページをClaude Codeに読ませて確認すると、正体は「名札、社員証、学生証、メンバーズカード等にお使い頂ける白色無地のプラスチックカード」。昇華型カードプリンタで印刷するための生カードで、ICチップには一言も触れていない。同ブランドの比較表でも本商品はICチップ非搭載と明記されていた。

カードの世界では、サイズ(ISO/JIS標準の86×54mm)と中身(ICチップの有無・方式)は別の話だ。「プラスチックカード」「PVCカード」としか書かれていない激安品は、まずチップ無しの印刷用と疑ってかかったほうがいい。

安いFeliCaカードの相場 — Lite-S 白無地で1枚150円前後

かざして使えるFeliCaカードで最安の選択肢は「FeliCa Lite-S」の白無地カードだ。Lite-SはソニーのFeliCaファミリーの廉価版で、勤怠管理・入退室管理用として広く流通している。Amazonの商品名によく出てくる「RC-S966」は搭載ICチップの型番で、カード自体の型番ではない。

2026年7月15日時点でAmazonを検索した実売価格はこうだった。

商品価格1枚あたり
Lite-S 白無地 5枚(IDm印字なし)870円174円
Lite-S 白無地 10枚(IDm印字なし)1,480〜1,580円148〜158円
Lite-S 白無地 10枚(IDm印字あり)1,990円199円
Lite-S 白無地 100枚(IDm印字あり)14,300〜17,900円143〜179円

選ぶときの分かれ目は「IDm印字」の有無だ。IDmはカード1枚ごとに固有の16桁IDで、勤怠管理ではこれを従業員と紐付ける。カード表面にIDmが印字されていれば、配る前に「この番号=この人」の登録を済ませられる。印字なしの安いほうを選んでも、リーダーで1枚ずつ読み取りながら登録すれば同じことはできる。数枚なら印字なし、数十枚配るなら印字ありが楽、という使い分けになる。

RC-S380での最小構成 — nfcpyでIDmを読むだけ

FeliCaカードは1枚ずつIDmを持っているので、勤怠打刻は「かざす → IDmを読む → 従業員と紐付けて時刻を記録する」で成立する。1つ注意しておくと、IDm照合はカードを「識別」しているだけで、正規カードだと「認証」しているわけではない。故意の代理打刻や偽装まで防ぎたければLite-Sの内部認証と鍵管理が要るが、それを脅威としない小規模な試作ならIDmで足りる。

手持ちのRC-S380は、Pythonの nfcpy動作確認済み機種一覧に載っている定番機種だ。骨格はこれだけで書ける(構成メモ段階のスケッチで、実機ではまだ動かしていない)。

import nfc

def on_connect(tag):
    idm = tag.identifier.hex().upper()  # カード固有の16桁ID
    print(f"打刻: {idm}")
    # → SQLiteに (idm, 出勤/退勤, タイムスタンプ) を記録する
    return True

with nfc.ContactlessFrontend('usb') as clf:
    while True:
        clf.connect(rdwr={'on-connect': on_connect})

これに足すものは3つある。「IDm→従業員名の対応表」、「打刻記録の保存先」、そして「出勤か退勤かの決め方」だ。保存先はPC内のSQLiteで完結させるか、Googleスプレッドシートに直接書き込んで共有するかの二択を考えている。出勤/退勤の判定は、画面のボタンで選ばせるか、同じカードのタッチごとに交互に切り替えるかのどちらかで、連続タッチを重複登録しない仕組み(数秒のクールダウン)とセットで設計する。ここは実装時に決める。

Windowsで組む場合のハマりどころは1つだけ知られている。nfcpyはソニー純正ドライバ(NFCポートソフトウェア)ではなく、libusb経由でRC-S380をつかむ。そのためnfcpy公式の導入手順に沿って、Zadig でWinUSBドライバに差し替えたうえでlibusbを入れる一手間が要る。ここは実装時に検証してまた書く。

タブレット化したい場合の選択肢

打刻端末はタブレットにしたい、という発想が最初にあったのだが、ここに制約がある。

  • RC-S380をAndroidタブレットにUSB接続する構成は今回見送り。ソニーのドライバ・SDKがWindows向けで、Androidで動かすにはUSB Host APIの上に通信プロトコルを独自実装することになる。技術的に不可能ではないが、最小構成の趣旨から外れる
  • タブレットでやるなら、NFC-F(FeliCa)の読み取りに対応したAndroidタブレットやスマホの内蔵NFCで直接読む。この場合PaSoRiは不要だが、ネイティブアプリ開発になる
  • もう1つはWindowsタブレット(Surface系)にRC-S380をつなぐ構成。上のPython構成がそのまま動く
  • iPadはNFC読み取りに対応していないので、この用途には使えない

なので進め方は、まず手元のWindows PC+RC-S380で骨格を作って動かし、置き場所を考える段階になってからタブレット化を検討する、という順番にした。

まとめ

  • 「JIS規格サイズの白無地プラスチックカード」はFeliCaとは限らない。チップの有無は商品説明で確認する。FeliCaが欲しければ「FeliCa Lite-S」と明記された商品を選ぶ
  • Lite-S白無地は1枚150〜200円。IDm印字ありなら配布前の登録が楽になる
  • RC-S380+Windows PC+nfcpyがIDm読み取りの最短経路。WinUSBドライバへの差し替えとlibusbの導入だけ注意
  • タブレット化はRC-S380と切り離して考える。FeliCaを読める内蔵NFCのAndroid端末か、Windowsタブレットの二択

次の一歩は、Lite-Sカードを少数買ってnfcpyでIDmが読めるところまで通すこと。動いたら実装編を書く。