よもやま話β版

よもやま話を書きます。内容はぺらぺら。自由に書く。

発表補足余談「猫の健康を見守りたい!実践 Raspberry Pi + Ruby」

2025/12/06、北陸Ruby会議01にて5分LT「猫の健康を見守りたい!実践 Raspberry Pi + Ruby」を発表させていただきました。今回のテーマは「みんなのRubyの使い方」ということで、Rubyのtech寄りな話でなく、使った成果物にフォーカスした発表とさせていただきました。 聴いてくださったみなさん、ありがとうございました!

https://regional.rubykaigi.org/hokuriku01/

(発表資料URLが後日ここに入ります)

speakerdeck.com

5分に精一杯詰め込みましたが(※早口で喋った結果30秒くらい余ったけど)、時間都合上細かい余談が入らないと判断し、ブログ記事に逃しました。 超ド級の初心者がIoTをやろうとして困ったことの備忘録として記します! ご笑覧いただけますと幸いです。

これは発表スライド内のBESTオモシロ&&キュート画像・猫の後頭部

買ったはいいがラズパイの電源が無い

一念発起した際に、以下のアイテムを購入しました。

  • Raspberry Pi Zero 2 W
  • NFCタグ(10枚入り)
  • micro USB - USB A のアダプタ
  • USBカードリーダー

いざ届いて Raspberry Pi Zero 2 W に繋ごうと思った時、電源を供給する microB のアダプターが無いことに気付きました。改めて振り返ると、初心者うっかりでございました。

USBのリーダーモジュールは未対応

すでに上記の買い物リストでお察しですが、最初はUSBのカードリーダーを購入しまして、ラズパイに接続→動かない・なぜならWindowsとかMac向けなので…、ということがありました。そもそもリーダーとして何を購入するかというのがド素人としては第一関門でした。選択肢として、今回発表に使用した PN532 とは別に RC522 というモジュールもありましたが、ChatGPT曰く猫首輪につけるタグとの相性としてPN532が良い、というアドバイスに従って再購入をしました。

このラズパイにはピンが無い

さて PN532 が届いたことで意気揚々と繋ごうと思った段で、今度はラズパイにピンが無いことに気づきました。

  • Raspberry Pi Zero 2 W → GPIOピンヘッダーが無い(最初に買ったやつ)
  • Raspberry Pi Zero 2 WH → GPIOピンヘッダーがある

Wireless の W、そして Header の H らしいですね、なるほどな。 ピンヘッダー単独で売ってたのでそれを買いつつ、はんだ付けの過程で壊したらどうしようという気持ちがあり、おとなしく WH のほうを買い直したりしました。(なので今、家に遊ばせてるラズパイがもう1台あるんですよね。ピンのハンダ付けは必要だけど…さてどうしようかな…。)

ラズパイ <-> PN532 の接続

線を繋ぐところも分からなかったので、ChatGPTに画像を出してもらったりしたのですが、まるきり嘘の画像を出してきたので配線にはちょっと難儀しました。Webで改めてピン配置図を探し、接続しました。

  • ( ラズパイ ←→ PN532 )
  • 1 (3.3v) ←→ VCC ※5v(2番)のほうがいいのかも?(未検証)
  • 3 (GPIO 2) ←→ SDA
  • 5 (GPIO 3) ←→ SCL
  • 6 (GND) ←→ GND

また、PN532上のスイッチは「1」のみON ( I²C モード ) としています。スイッチはめちゃくちゃ小さいので、ピンセットでカリカリして動かしました。

Raspberry Pi Zero 2 WH と PN532 が接続されている様子
配線の様子

大きく接写したPN532と、サイズ比較用の1円玉
この小さいスイッチを I2Cモード にする必要がある

買ったはいいがタグが使えない(周波数)

色々買い足す時に、タグも急ぎ2〜3種類ゲットしたのですが、いざ試す時になって使用不可のタグがあることに気付きました。 リーダーが出す周波数に合うタグでないと読み取れないためです。(よく考えてみると当たり前…。)

Amazonで「RFID タグ」のようなキーワードで出てくるタグでは、次のようなものが見られます。

  • 125kHz, 134kHz → LF帯 ( Low Frequency: 低周波 ) → 猫の登録に使われるマイクロチップはこれらしい
  • 13.56MHz → HF帯 ( High Frequency: 高周波 ) → 交通系マイナンバーカードなど。 ※PN532にはこれ。
  • 860〜960MHz → UHF帯 ( Ultra High Frequency: 超高周波 ) → 倉庫とかで使われてるタイプ

何も分からず適当に買ってしまったタグが 125kHz のもので「わ〜なんでや動かん」と困っていた時がありました。勉強になった。

必要なライブラリとか環境構築

備忘録ですがこんな感じでした。※要らないものも入れてたりするかも…。

$ sudo raspi-config
# → Interface Options → I2C → Enable

$ sudo reboot
$ sudo apt-get install -y i2c-tools
$ sudo apt install libnfc-bin
$ vi /etc/nfc/libnfc.conf
device.connstring = "pn532_i2c:/dev/i2c-1"

$ sudo apt-get install -y libusb-dev
$ wget https://github.com/nfc-tools/libnfc/releases/download/libnfc-1.8.0/libnfc-1.8.0.tar.bz2

$ tar -xf libnfc-1.8.0.tar.bz2
$ cd libnfc-1.8.0
$ ./configure --prefix=/usr --sysconfdir=/etc
… 
$ make
…

#  ※ruby-nfc > ffi が、C拡張のコードを含むので、ruby3.1-dev が必要。
$ sudo apt install -y ruby3.1-dev build-essential libffi-dev libnfc-dev pkg-config

$ sudo apt install -y libfreefare0 libfreefare-dev
$ sudo ldconfig   # 念のためライブラリキャッシュ更新

$ sudo gem install ffi --no-document
$ sudo gem install nfc --no-document

読み取り距離の対処

読み取り精度の工夫が一番難しかったです。

(1) コンデンサをつける

コンデンサをつけ、電圧の変動を防ぐと安定するという記事を見かけ、つけてみました。 47μFの電解コンデンサと、0.1uFのセラミックコンデンサをハンダづけしました。

コンデンサをはんだ付けした後のPN532のウラ・オモテ
はんだ付けの苦労の跡がおわかりいただけるだろうか

発表でMAX3cmとお伝えしましたが、コンデンサをつけた上でのMAXなので、つけない場合はもうちょっと読み取り距離は短いかもです。(つける前の動作をもっと確認しておけばよかった…。)

コンデンサはネットで買おうとすると100本単位とかのレベルで注文になってしまうので、秋葉原千石電商でお買い物しました。 47μF * 3個、0.1uF * 3個 で合計135円税込。安い…! 一桁数レベルのコンデンサはインターネットで買うのは良くないなと学びました。

(2) ひたすら首輪にお裁縫

発表準備の内容としては、ひたすらタグを縫い付けるためのお裁縫をしていた記憶が多いです。タグは真ん中に配線のないエリアがあるので、そこに針を刺し、チクチク縫います。すあまの首輪はCatlogのシュシュ生地を使っているので、縫い付けやすいのですが、サラさんの首輪がフェルト製で硬いので縫い付けが難しかったです。また塗ってるとタグのシートが裂けてしまい、破損して読み取れなくなるということもありました。もう一工夫、なにかできないものだろうか…。

シール上のNFCタグを猫の首輪の内側に縫い付けている様子
ひとつ縫っては猫の為…。

裏側に6枚のNFCタグが縫い付けられた猫首輪
サラさん用の首輪はオモリが無く、首すじカイカイの動きですぐ回転できるのでほぼ全周取り付け

白猫のバストアップ写真。迷子札カプセルとCatlogをつけているのがわかる。
すあま(白猫)は迷子札カプセルとCatlogを装着させてるので、重みで首輪位置が固定されている。ので、PN532設置方向にのみタグをつけている。

(3) 猫たちの姿勢を観察

読み取り距離MAX3cmの範囲で、2匹の猫を検知可能にするというのも難易度が高かったです。 観察の結果、すあま(白猫)のほうは頭を天井に寄せ気味スタイルで出てくるのに対し、

すあま出現シーン

サラさん(キジトラ)の方は頭を低めに下げつつ出てくるのです。

サラさん出現シーン

最終的に、出入り口のエリアの上・端に制限を設けることで、両猫共に無理やりモジュールのほうへ寄ってもらう形にしました。 この工夫後、さらに読み取り成功確率がUPしました。

自動トイレ出入り口のサイズを段ボールを貼り付けて制限している様子
苦肉の策(物理)

PN532と壁面の間に、紙でつくったバネを挟んでちょっと浮かせて距離を稼ぐ、など。

読み取り距離の対処(失敗) デカいPN532を海外から取り寄せたけどダメだった話

読み取り距離を上げるためにChatGPTと色々とやりとりする中で「検知モジュールがよりデカければ良い」という発想がありました。実は elechouse から PN532 の"External Antenna" があるバージョンが出ています。

https://www.elechouse.com/product/pn532-nfc-rfid-module-w-external-antenna-updated-version/

これを発見したとき、すでに北陸Ruby会議01のLTに採択いただいていたので、やれる努力はすべてやる、の気持ちでポチーッ。滅多に無い海外からのお取り寄せ・送料込み $44.70 (約7000円) でゲット。 11月中旬に無事届きました。

これがPN532 の w/ External Antenna!

読み取り距離の改善に大期待したのも束の間、テストの結果、読み取り可能距離は 2.3cm でした。既存のPN532(コンデンサ付き)のほうが成績が良いです。冷や汗を感じながら、コンデンサの有無のせいでは…と思い、はんだ付け後に再トライしましたが、結果は 2.6〜2.9cm までにとどまりました。結局、元々使ってたノーマルなPN532の方が良い、と判断してお蔵入りとなりました。苦い出費…。良いのだ、トライが大事だから…。 ( 今思うと 3.3v 供給してたからか? 5vにして再検証しても、いいかもしれないな…。 )

Q: そもそも自動トイレで区別つくのでは?

今回入り口にPN532を設置した猫トイレは、PetSnowyという自動トイレです。これにも猫の体重測定の機能があったりしますが、今回の主要利用を想定した2猫、すあま & サラさん の体重差が僅差(200gくらい)でして、頻繁に誤判定してしまうという状況があり、別の手段を探したという経緯がありました。

ありがとうございました!

ふとした思いつきでしたが、故郷での発表機会をいただいたこともあり、一通りの実現を挫けずやりきることができました。実際に、白猫のトイレ事情のチェックに役立っています。Sinatraに表示させる情報にまだ工夫の余地があったり、首輪のタグが壊れて検知できなくなったりする場合もあったりするので、引き続き日々活用しつつ改善を回していきたいです。ありがとうございました!

書き散らしコードはこちら: https://github.com/betachelsea/cat-sensor

ChatGPTに描いてもらったけど、あまりスライドで出番のなかったアイコン画像↓

白猫・キジトラ・三毛のデフォルメ画像