RaspberryPiでRFID-RC522を使ってみる【失敗編】
このエントリーは失敗編です。失敗に至るメモのため、情報が基本ないので読み飛ばしてください。
以前の勉強会で教えてもらった(もう数年も前になりますが)NFCのタグシールを何かに使えないかと思って購入してみました。そのまま使うのもなんなのでArduinoやRaspberryPiでも使えないかなと思って以下も同時に購入してみました。
リーダーもこの値段で購入できるんですね。いい時代なのか、それともちょっとやそっとではお金を稼ぐことができない時代なのか。
このリーダーをネットで検索すると、こちらのリンクにヒットしました。結構Arduinoのネタは多いようなんですが、RaspberryPiはすくないようです。
webcache.googleusercontent.com
ふむふむと読んでいくと…
・the kernel to use Device Tree?
で Noを選択します。(コレ重要!)
raspi-config
コマンドで表示されるメニューで設定値が表示されるようなのですが、うちのRaspberryPiでは表示されないようです。なぜ?カーネルのバージョンなどで違いがあるのでしょうか。念のため、昔使っていたRaspberryPi2でも同様の設定は出ませんでしたし。ネットを検索してもそれっぽい情報はありませんでした。
とりあえず、とても嫌な予感がしますが、そのまま進めていくことにします。
候補としては以下の2つになると思います。そろそろC言語はつらいので…
- SPI-Py(SPI制御ライブラリ)&MFRC522-pythonの組合せ
- pi-rc522
今回は、候補の中で使用するのはPythonからこのリーダーを扱えるpi-rc522
モジュールになります。
リンク先のページではgitでCloneしてインストールしていますが、ヌルいPython使いの自分はpip
でインストールしました。
$ pip install pi-rc522 Collecting pi-rc522 Downloading pi-rc522-2.2.1.tar.gz Collecting RPi.GPIO (from pi-rc522) Downloading RPi.GPIO-0.6.3.tar.gz Collecting spidev (from pi-rc522) Downloading spidev-3.2.tar.gz Building wheels for collected packages: pi-rc522, RPi.GPIO, spidev Running setup.py bdist_wheel for pi-rc522 ... done Stored in directory: /home/pi/.cache/pip/wheels/83/45/21/0bc28b47c8dfb87d00d806b10c8ffb733e36a8b927668ce42b Running setup.py bdist_wheel for RPi.GPIO ... done Stored in directory: /home/pi/.cache/pip/wheels/ae/4d/3b/e924997dbf06810adf3b2e37f1d9627b2327eb9cbb285949c9 Running setup.py bdist_wheel for spidev ... done Stored in directory: /home/pi/.cache/pip/wheels/e4/9b/5f/cf0ec030fc958b72315a15412130e4e1dc6040cdb490aa21fb Successfully built pi-rc522 RPi.GPIO spidev Installing collected packages: RPi.GPIO, spidev, pi-rc522 Successfully installed RPi.GPIO-0.6.3 pi-rc522-2.2.1 spidev-3.2
同時にGPIOやSPIのモジュールもインストールされるようです。GitでCloneするとサンプルコードも同時に手に入るのですが、pipインストールでは手に入らないので、Githubにいってサンプルを取得します。
【サンプルページ】 github.com
$ wget https://raw.githubusercontent.com/ondryaso/pi-rc522/master/examples/Read.py --2017-09-18 03:08:03-- https://raw.githubusercontent.com/ondryaso/pi-rc522/master/examples/Read.py raw.githubusercontent.com (raw.githubusercontent.com) をDNSに問いあわせています... 151.101.72.133 raw.githubusercontent.com (raw.githubusercontent.com)|151.101.72.133|:443 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 983 [text/plain] `Read.py' に保存中 Read.py 100%[===================>] 983 --.-KB/s in 0s 2017-09-18 03:08:03 (6.98 MB/s) - `Read.py' へ保存完了 [983/983]
RFIDのリーダーとの接続は RC522側の IRQだけ接続不要です。
RC522モジュール | RaspberryPi | |
---|---|---|
1 | 3.3V | GPIO +3.3V(3V3) |
2 | RST | GPIO GPIO25 |
3 | GND | GPIO GND(GND) |
4 | MISO | GPIO MISO(GPIO9) |
5 | MOSI | GPIO MOSI(GPIO10) |
6 | SCK | GPIO SCLK(GPIO11) |
7 | SDA | GPIO CE0(GPIO8) |
以下のように実行すればうまく…
【Read.py】
#!/usr/bin/env python import signal import time import sys from pirc522 import RFID run = True rdr = RFID() util = rdr.util() util.debug = True def end_read(signal,frame): global run print("\nCtrl+C captured, ending read.") run = False rdr.cleanup() sys.exit() signal.signal(signal.SIGINT, end_read) print("Starting") while run: rdr.wait_for_tag() (error, data) = rdr.request() if not error: print("\nDetected: " + format(data, "02x")) (error, uid) = rdr.anticoll() if not error: print("Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3])) print("Setting tag") util.set_tag(uid) print("\nAuthorizing") #util.auth(rdr.auth_a, [0x12, 0x34, 0x56, 0x78, 0x96, 0x92]) util.auth(rdr.auth_b, [0x74, 0x00, 0x52, 0x35, 0x00, 0xFF]) print("\nReading") util.read_out(4) print("\nDeauthorizing") util.deauth() time.sleep(1)
はずだ…
$ python Read.py Starting
10分後…全く動かねえ…
ではということで
方法その1であった、SPI-Py(SPI制御ライブラリ)&MFRC522-pythonの組合せもやってみます。
$ git clone https://github.com/lthiery/SPI-Py.git $ cd SPI-Py $ sudo python setup.py install $ cd .. $ git clone https://github.com/mxgxw/MFRC522-python.git $ cd MFRC522-python $ sudo python Read.py
これでも動作せず。/(^o^)\オワタ。
もう少し調べてみる。
ハード側が怪しいということも疑って、Aruduinoでも使用可能なのでそちらでハード側のテストを行ってみました。 Arduinoでやっている例は結構あるので、こちらのほうが楽かなとは思いますが、Unoでは電圧が5V系なのでその部分は注意が必要です。(リーダー系は3.3V系なので)
Arduinoで近距離無線通信 RFID-RC522 NFC by ボクにもわかる地上デジタル
実際に動作させてみると…一応、リードできてる?UIDは普通に読めていますがデータブロックは読み取れていません。 (たまにブロックは読み込めることもある…。RFIF側のUIDの読み取りに空振ることもあるぽい…。) ハード的にはかなり怪しいようです。
粘ってみる…その1
更に情報をネットを検索すると
Raspberry PI 3 and RFID-RC522 Problem reading data - Raspberry Pi Forums
なる情報もdtoverlay=spi0-hw-cs
を/boot/config.txt
の設定の追加のようです。
$ sudo vim /boot/config.txt
【変更前】
(略) # Uncomment some or all of these to enable the optional hardware interfaces dtparam=i2c_arm=on #dtparam=i2s=on dtparam=spi=on (略)
↓ 【変更後】
(略) # Uncomment some or all of these to enable the optional hardware interfaces dtparam=i2c_arm=on #dtparam=i2s=on dtparam=spi=on dtoverlay=spi0-hw-cs (略)
dtはDeviceTreeの略のようです、最近ではraspi-configではなく/boot/config.txt
で設定を行う様です。
でも、こちらを追加したのですが駄目でした。
粘ってみる…その2
ならばということでそもそもOSを変えてやれってバージョンを2つ落として2015-05-05-raspbian-wheezy
にしてみました。
これで動かなかったらハードだろぐらいの気持ちです。
wheezy
では、jessie
以降にはなかったDevice Treeの設定はちゃんとraspi-config
コマンド内にも有効無効は存在しています。
それを設定すると検索でヒットするものと同じ状態になるみたいです。
$ dmesg | grep spi [ 6.733677] bcm2708_spi bcm2708_spi.0: master is unqueued, this is deprecated [ 7.008711] bcm2708_spi bcm2708_spi.0: SPI Controller at 0x20204000 (irq 80) $ lsmod |grep spi regmap_spi 2307 1 snd_soc_wm8804 spi_bcm2708 6018 0 $ ls /dev/spidev* -l crw-rw---T 1 root spi 153, 0 1月 1 1970 /dev/spidev0.0 crw-rw---T 1 root spi 153, 1 1月 1 1970 /dev/spidev0.1
ですが、動作しません。ムキー。
粘ってみる…その3
よくわからない気分になってきたので、更に粘ってみました。今度はIchigoJamです。
ドライバーもなにもないので、これでだめならハードが悪い(もうそんな気分ですが)と諦められます。
結果、駄目でした…読み取り待ちにはなってくれるのですが、それ以上の処理には続かないようです。 このためにIchigoJamの使い方をさらに勉強とは、すごい自分にもやる気があるんだなと思いました(棒)
終わりに
ハードさえ動けばやりたいこと全部やりきった感あります。 新規にハード買うかして再チャレンジしたいと思います。
2日使ったのでかなり寝たいです。