2026年2月6日金曜日

AIと相談してコレクタで、持ち込みと持ち出しをRFID読み取りで記録してみた

簡単にRFIDできるツールとして、マニカ コレクタがあります。

 https://www.hayato.info/collector.htm 

です。

とても簡単に始められるのは、もちろんですが、実はSQL文を実行することも、さらっと記載されています。

SQL文にコレクタが展開して埋め込むことができるのは、
①タグID:ICタグの電子ID

②アンテナID:複数枚のアンテナをつなげた定置リーダーは何枚目で読んだか

③YYYYMMDD:年月日

④HHMMSS:時分秒

です。


注目なのは②です。定置リーダーは2枚から4枚のアンテナをつなげることができて、コレクタは何枚目で読んだのか分かるのです!

そこで、賢明な貴方は気が付くはずです。

方向の検出に使えるのでは?と。


そこで、AIに相談します。

「私はRFIDタグから①②③④を読み取れるソフトをPCで動かしています。データベースに情報を格納したいのですが、安価なものを紹介してください。」

回答を見ると、SQL Server Expressが良さそうだと思われました。

そこで、AIに質問します。

「アンテナが2枚あり、部屋の扉の外側と内側に取り付けてます。RFID読み取りタイミングで、何番目のアンテナで読んだかは識別できます。部屋に持ち込んだ、部屋から持ち出した、を知りたいです。データベースで方法はありますか?」

すると、

「テーブルを2つ作り、逐次読取り結果テーブルと持ち込み持ち出しを記録するテーブル、そしてトリガーを使用すれば出来ます。」

という回答なので、テーブル作成SQL文も作ってもらい、エラーが出たら報告して修正してもらい、と繰り返したら、できました!



コレクタのログ表示では逐次の読み取りが表示され、右のデータベース表示では、「IN」「OUT」が表示されます。

コレクタを使えば手軽に持ち出し/持ち込みが識別できることがわかりました。

仕掛けは機能したので、お客様に勧めるときは、見た目の相談もして、現場で使いやすくアレンジしましょう!


使用した機材は、ノートPCが1台、定置リーダーが1台、アンテナが2枚です。

AIに相談して作成したSQL文も紹介しますね。

【コレクタで実行するSQL文】

--コレクタの時刻文字列をSQL Server用の時刻文字列に変換してインサート。

INSERT INTO dbo.T_RFID (dt,id_ant, id_epc, yyyymmdd, hhmmss, desc_txt)

VALUES (

  DATEADD(SECOND,

      DATEDIFF(SECOND, CONVERT(time(0),'00:00:00'),

               TRY_CONVERT(time(0), STUFF(STUFF('[HHMMSS]',3,0,':'),6,0,':'))),

      TRY_CONVERT(datetime2(0), '[YYYYMMDD]', 112)

  ),

  '[アンテナNO]',

  '[タグID]',

  '[YYYYMMDD]',

  '[HHMMSS]',

  'COLLECTOR'

);


【SQL Server Expressでテーブル作成】

USE [MANICA_01]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[T_RFID](

[auto_id] [int] IDENTITY(1,1) NOT NULL,

[dt] [datetime2](0) NULL,

[id_ant] [varchar](2) NOT NULL,

[id_epc] [varchar](96) NOT NULL,

[yyyymmdd] [varchar](8) NOT NULL,

[hhmmss] [varchar](6) NOT NULL,

[desc_txt] [varchar](14) NULL,

PRIMARY KEY CLUSTERED 

(

[auto_id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO


USE [MANICA_01]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[T_DIRECT](

[auto_id] [int] IDENTITY(1,1) NOT NULL,

[id_epc_auto_id] [varchar](96) NOT NULL,

[direct] [varchar](4) NOT NULL,

[desc_txt] [varchar](14) NULL,

PRIMARY KEY CLUSTERED 

(

[auto_id] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO


【SQL Server Expressでトリガー作成】

USE [MANICA_01]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE   TRIGGER [dbo].[trg_T_RFID_to_T_DIRECT_5sec]

ON [dbo].[T_RFID]

AFTER INSERT

AS

BEGIN

    SET NOCOUNT ON;

    INSERT INTO dbo.T_DIRECT (id_epc_auto_id, direct, desc_txt)

    SELECT

        i.id_epc,

        CASE

            WHEN i.id_ant IN ('1','01') THEN 'IN'

            WHEN i.id_ant IN ('2','02') THEN 'OUT'

            ELSE 'IN'

        END,

        i.desc_txt

    FROM inserted AS i

    CROSS APPLY (

        SELECT TOP (1)

            r.auto_id,

            r.dt

        FROM dbo.T_RFID r

        WHERE r.id_epc = i.id_epc

          AND r.auto_id < i.auto_id          -- 「直前」の候補に限定(重要ぴょん)

          AND r.dt IS NOT NULL

        ORDER BY r.auto_id DESC              -- ここで降順ぴょん

    ) AS prev

    WHERE

        i.dt IS NOT NULL

        AND DATEDIFF(SECOND, prev.dt, i.dt) BETWEEN 0 AND 8;

END;

GO

ALTER TABLE [dbo].[T_RFID] ENABLE TRIGGER [trg_T_RFID_to_T_DIRECT_5sec]

GO



【コマンドラインで「IN][OUT」表示】

「show_update.bat」の内容


@echo off

setlocal

:loop

sqlcmd -S .\SQLEXPRESS -d MANICA_01 -U manica_user -P "himitu" -W -Q "SELECT TOP (10) * FROM dbo.T_DIRECT ORDER BY auto_id DESC;"

echo ---- %date% %time% ----

timeout /t 3 /nobreak >nul

goto loop


ここで終わりです。


2026年2月3日火曜日

ユニクロのタグを使って、生活はどこまで楽になるか実験してみた|おうち棚卸・家事ラク編


RFIDというと、

「物流」「倉庫」「アパレルの在庫管理」
…みたいな、いかにも業務向けの技術というイメージが強いと思います。

でも、ふと思いました。

これ、もっと生活レベルまで引き下げたらどうなるんだろう?

ちょうど手元にあったのが、ユニクロの服についているあのタグ。
実はこれ、誰でも手に入るRFIDなんですよね。

今回はこれを
「身近に手に入るRFID」として使って、
家庭・家事レベルでどこまで役に立つのかを、
かなり現実的な条件で試してみました。 


床下収納を開けなくていい?
RFIDで“家のストック棚卸”をやってみた


やったことはシンプルです。
  • 常備品などの日用品にタグを紐づけ
  • 在庫切れのものは、タグを「買い足し用ボックス」に入れておく
  • 冷蔵庫・床下収納・パントリーを開けずに買い足すものをチェック
  • 読み取ったデータを家族(旦那)と共有


なぜこれをやろうと思ったか


家事の中で、地味〜にストレスなのがこれ。
  • 床下収納を毎回開けて確認する
  • 「あったっけ?」と曖昧なまま買い物に行く
  • 結果、「もうあるのに買った」が発生する

完璧な在庫管理がしたいわけじゃないんです。

「出かける前に、ざっくり確認できればいい」
それだけなのに、意外と手間がかかる。

そこで思いついたのが、
RFIDで“家のストック棚卸”ができないか?
という、かなり軽いノリの実験でした。


やり方(超シンプル)


難しいことは一切していません。

① タグを紐づける


対象はこのあたり。
  • 冷蔵庫の常備品(牛乳・納豆・豆腐…)
  • いちいち開けるのが面倒な
    床下収納の醤油・みりん・調味料
  • トイレットペーパーなどの日用品

それぞれにユニクロのタグを紐づけました。




マニカエクセルツールのアプリでタグを読み取って入力。
サクサク登録できて、ここは意外とストレスなし。

② ストックがなくなりました


使い切ったら、
買い足しが必要なタグを
適当な入れ物にポイっと放り込むだけ。



管理というより、「仕分け」感覚です。

③ 買い物行く前に読み取り




リーダーでまとめて読み取り。
いちいちメモに書いたり、
スマホに打ち込んだりする必要はありません。

④ 外出先でスマホから確認


外出先からでも、
「今、家に何があるか」をスマホで確認できます。

買い終わったものはその場で削除できるので、
残りの「買い足しが必要なもの」だけがすっきり残ります。


⑤ データを家族と共有




管理画面のリンクを家族に共有しておけば、
いちいち買い物リストを送る手間もなし。

③の読み取り自体を、
家族にお願いするのも全然アリです。


実際どうだったか


まず結論から。

「意外と、使える」

日常の細かい負担って、
 一つひとつは小さいけど、積み重なると結構効きます。

それを減らせるだけで、
生活の快適度ってちゃんと上がるんだな、と。


まとめ




RFIDは
「管理するため」の技術じゃなくて、

「確認作業を減らすため」
くらいの使い方で、ちょうどいい。

「出かける前に一瞬確認できる」
それだけで、家事のストレスはかなり減ります。

これは完璧な在庫管理ではありません。
でも、

“出かける前の確認”としては十分使える。

RFIDは、
家事を効率化する魔法の技術ではなく、

👉 家事の「確認作業」を減らす道具

として考えると、
 一気に生活に近づく技術だと感じました。

2026年1月28日水曜日

アンテナとタグの距離を測る その5

 前回では AOA が何となくできそうみたいなところまでやりました。今回はマルチパス環境をどこまで解析できるかやってみます。エクセルで計算するのもしんどくなってきたので、ここはひとつ解析用のアプリを作ってしまおうと思います(Claudeちゃんが)。

1.Delay-and-Sum ビームフォーミング

最も基本的なビームフォーミング手法だそうです。各アンテナの信号に位相重み(ステアリングベクトル)を適用して合成し、特定方向からの信号を強調するそうです。

合成信号 = Σ (signal_i × weight_i)

weight_i = exp(-j × 2π × d × sin(θ) / λ)

パワー = |合成信号|^2


タグをアンテナの正面1mのところに置いて計測したのがこちらです。0度のところでピークになっているのがわかります。マルチパスがあると、小さいピークがあらわれるようですが、鉄板使っていろいろマルチパスっぽいことやってみたんですが、小さいピークが出ることはありませんでした。2アンテナでは難しいようです。

2.Capon(MVDR) ビームフォーマー

Minimum Variance Distortionless Response(MVDR)法という方法だそうです。共分散行列の逆行列を使用して、干渉を抑制しながらビームを形成します。Delay-and-Sumより高い角度分解能を持つそうです。

P(θ) = 1 / (a^H × R^-1 × a)

a: ステアリングベクトル

R: 共分散行列(2×2)

R^-1: 共分散行列の逆行列


結果がこちら。確かに先ほどのビームフォーミングに比べて鋭いピークが見えます。こちらもいろいろ試したんですが、小さいピークを見ることはできませんでした。

3.周波数ドメイン解析(遅延プロファイル)

複数周波数の位相データをフーリエ変換し、距離(遅延時間)ドメインに変換するんだそうです。異なる経路長を持つマルチパスを距離方向で分離することを目指すようです。

距離分解能 Δd = c / (2 × B)
c: 光速
B: 周波数帯域幅

こうなりました。マルチパスを距離で見分けようということのようです。一番期待してたんですが、計測している帯域幅が狭いせいで十分な分解能が出せないようです。

4.IQ平面プロット

各周波数での位相を I(同相)・Q(直交)成分に分解し、複素平面上にプロットします。

I = cos(phase)
Q = sin(phase)
Radius = 点の重心からの平均距離
MultipathIndicator = 点の散らばり具合(0-1)

マルチパスが無い場合は全周波数の点が1箇所に集中し、マルチパスがある場合は点が散らばるようです。

確かに点が散らばってます。ようやくマルチパスが見えてきた感じです。

5.位相安定性解析

位相の時間的な変動(分散)を周波数ごとに計測します。マルチパス環境では、反射波と直接波の干渉により位相が不安定になる傾向があるのを可視化します。


やってみましたがどの周波数でも分散値は十分小さく、安定しているようです。

と、ここまでやってみて、IQ平面プロットがマルチパスがあるかどうかを見るのに使えるかなぁというくらいで、特に有効な方法は見つかりませんでした。

2026年1月20日火曜日

アンテナとタグの距離を測る その4

 前回は MF-PDOA を実際に計算して求めてみました。が、思ったような結果は得られませんでした。マルチパス(壁や床からの反射波)があると、位相が合成されてしまって結果が歪んでしまいます。マルチパスの影響を取り除くには FFT を用いる方法やもっと幅広い帯域での測定が必要みたいですが、リーダで読み取れるチャンネルは限られているのでそう簡単には実現できません。

そこで簡単にチャレンジできることとして、アンテナを2枚にして2か所から測定してみることにします。ということで調べていると、2枚のアンテナを使うことでAOA(Angle of Arrival:到着角度)の推定もできることがわかりました。2枚のアンテナを並べて設置し、タグからの電波を受信すると、タグの位置(角度)に応じて2枚のアンテナに届く電波の経路長にわずかな差が生じます。この経路差が、アンテナ間の位相差として観測されます。

距離(PDOA)と角度(AOA)の両方がわかると、タグの2次元的な位置(平面上の座標)が特定できるようになります。さらに、マルチパス対策としても強力です。マルチパスは直接波とは異なる角度から届くことが多いです。AOAによって「タグがあるはずの方向」がわかれば、その方向以外から届く(位相を乱す)反射波成分を理論的に排除しやすくなります。と、Geminiちゃんが申しております。

まじすか?ということでまずは AOA から試してみました。

前々回に作成した位相を表示するだけのアプリを改造して、2枚アンテナで取得した位相の【差】を表示するようにしてみました。

確かにタグを左右に動かすことで位相の差が変化することがわかります。周りが金属だらけなのでマルチパスしまくりでしょうけど、いちおう判断つくくらいの動きは見れました。ただ真正面にタグがあるときも位相の差が結構70度くらい出ているのが気になります。

真正面にあるときはそれぞれのアンテナとタグの距離は同じなので、測定される位相は同じ値になって差は0になるはずです。アンテナのケーブル長や、リーダ内部の基板上の長さのちょっとした違いで差がでるそうなので、これが表れているのだと思われます。この真正面のときの差は、リーダ固有のオフセット値と考えれば補正値として利用できそうです。


2026年1月6日火曜日

アンテナとタグの距離を測る その3

 前回はRFIDリーダで取得できる位相について見てきました。約16cm動かすと位相が一周するのがわかりました。しかしこれだけでは距離を正確に測ることができません。位相が何週したかがわからなければならないからです。

そこでMF-PDOAという手法があります。これは異なる周波数で位相を測り、その差分で距離を想定するやり方です。具体的には異なる周波数 f1 と f2 で位相を測った場合、

Φ2 - Φ1 = (4π・d f2 / c) mod 2π - (4π・d f1 / c) mod 2π = 4πd(f1 - f2)/c

となって(何週分かはどちらも同じと仮定した場合)、これを d について解くと、

d = c/4π・ΔΦ / Δf

となります。横軸に周波数、縦軸に位相で測定値をプロットした場合、直線となってその傾きから距離が求められるということになります。

まじすか?ということで実際に計測してみます。

測定風景は写真撮り忘れました。左が周波数(MHz)で値が位相(rad)になります。位相は複数回測定した平均値で、-πからπに収まるように補正しています。


これを横軸周波数、縦軸位相でプロットするとこうなりました。いい感じに直線になってますね。この直線の傾きから距離が計算できるということになります。実際に計算してみました。

100cm のタグ 計算値 18.623m

200cm のタグ 計算値 14.447m

300cm のタグ 計算値 28.542m

んー・・・ これは・・・ 何か間違えてる?

Geminiちゃんに聞くと、実際はアンテナの長さとかも含まれるからじゃね?あとマルチパスの影響もあるだし。みたいなこと言ってました。まぁ室内で測定してるしマルチパスはありそうだよなー、でも現場で使うにはマルチパス絶対あるだろうしなー、ということでもう少し探ってみたいと思います。



2025年12月25日木曜日

アンテナとタグの距離を測る その2

 前回の記事(もう5年も前ですけど)でざっくりとした計測をしたんですが、そんなことではいかんと思い直し、ちゃんと技術的にアプローチしようということにしました。

ちゃんと基礎からやって、どこまでできるかチャレンジしていきたいと思います。

リーダで計測できる位相を使います。位相ってあんまり着目していなかったのでどんなもんか見るところからやっていきます。

まずアンテナとタグの距離を d とすると、アンテナから出た電波がタグまで行って帰ってくるまでの距離は 2d になります。電波の波長を λ とすると、計測できる位相 φ は

φ = 2π * 2d/λ mod 2π

となります。電波の周波数を f とすると、λ = c/f なので、φ = 4πdf/c mod 2π になります。

これを実際に見てみようということで、位相だけを見るアプリを作ってみました。


まず 50cm のところにタグを置いて計測していますが、位相の値は安定しているのがわかります。ただ手を動かしたりすると位相が変化するので、結構マルチパスの影響を受けることもわかります。

50cm のところで 270° くらいだったので、これがぐるっと1回転するところまでタグを離していきます。周波数は 916.8 MHz 固定で出力したので、1波長は 3×10⁸ / 916.8×10⁶ ≈ 32.7 cm ということで、往復なので半分の 16cm くらい動かすと1回転する計算になります。動画でもそれが確認できると思います。

これだけだと正確な距離を測るには難しいので、MF-PDOAという手法にチャレンジしたいと思います。これは複数の周波数で位相を測定し、その差分で距離を求めるという手法です。次回以降これについて書いていきます。


2025年12月5日金曜日

第13回久辺テクノフェスタに出展しました

 

 11月15日に開催された第13回久辺テクノフェスタに出展しました。
    昨年の模様はこちら


恒例の「光る絵」体験会をひらきました。







    今年は宇宙甲子園とみまもり自販機の展示もおこないました。