2026年3月27日金曜日

おうちでユニクロタグやってみた話-おやつポイントで運動不足解消


最近ちょっと遊びで、 家でRFID使って遊んでます。 いわゆるユニクロタグです。

今回やろうと思ったのは、 「運動不足どうにかしたいな」っていうやつです。 ついでに、ダイエット的な管理もできたらいいかなと。

…まあ、建前はそんな感じで、
本当はちょっとした実験です。

どうせなら子どもと一緒にやろうと思って、 スマホだけでいけるマニカモバイルにしました。 PC立ち上げる必要ないので手軽です。

やってることはすごく単純で、

運動したらポイントつく
おやつ食べたらポイント減る

それだけです。

子どもが帰ってくる前に設定しておこうかとも思ったんですが、 一緒に作ったほうがいいかなと思って。

「こんなことやろうと思ってるんだけど…」
「どうやってやろうかなぁ…」

と私が考えている間に、 あれもこれもと、あっという間に作ってくれました。

トレーニングメニューとおやつポイント

こういう感じ、好きです。

私はついAIで仕上げようとしちゃうんですが、 子どものほうが早かったです。

大人って、新しいことやるとき
「ちゃんとやらないと」
ってなりがちじゃないですか。

でも子どもには、そういう前提がないんですよね。 完全に遊びです。

未完成さにも魅力があって、 楽しさがあります。

もし最初から完成形を出して
「こうやるんだよ」ってやってたら、
たぶん興味示さなかったと思います。

自分で考えるから楽しいんでしょうね。

で、実際の運用なんですけど、

貸出機能でポイントGET、
返却機能でおやつ消費。

とりあえず
スクワットと腕立てやってみました。

2ポイントGET。
ミニチョコ1個分です。

誰のポイントか分かるように、
棚で管理します。


使える機能はとりあえず使っていく感じです。

こうしてポイント登録している間にも、
子どもはめちゃくちゃやる。

なんか無駄に筋トレしてる。

やっぱり
「おやつがかかってる」と違いますね。

「これ何のタグ?」ってなると、
返却のとき困るので、
ここは普通に手書きで管理。

数日間運用してみました。

RFID=「効率化目的」を家で活用しようとすると、
ちょっと違いますね。

正直、準備のほうが手間に感じます。
(子どもは全く気にしてませんでしたが)

ただ、

スチーム教育として見ると、
かなりいいなと感じました。

結果的には、満足してます。

これ、学校とかでやったら すごくいいんじゃないかと思いました。

2人分だとあまり実感なかったんですが、 30人分とかになったら 一気に便利になりそうです。

またなんか思いついたらやります。

2026年3月25日水曜日

RFIDファラデー ケージを作ってみよう (4) ファラデーケージの中から外のRFID ICタグを読んで見た①

  ハヤト・インフォメーションの製品に「MANICA EXCEL TOOL 棚卸しパッケージ」(マニカ エクセルツール棚卸しパッケージ)があります。

 https://www.hayato.info/tanaorosi/index.htm 

です。エクセルからRFIDを読み取ることが可能です。お手頃な価格で役に立ちます。

RFIDハンディを便利に使う。特に「読み込みすぎて困る」お悩みに役立つことを祈って、今回は電波を遮断するファラデーケージを安価に試して見ようと思ってファラデーケージのシリーズです。


前回はファラデーケージの中にはICタグを入れて、ケージの外から読み取りを試しました。

今回は改修したケージの中から、外のICタグの読み取りを試したいと思います。


アパート敷地内の階段の上に配置します。


















3つ並べます。














読み取りは、道向かいから試して見ます。(道は、だいたい5mくらいが一般的ですね。)
















SP1をむき出しで普通に読み取りを試すと、5mの距離で4秒以内の電波照射で3つのICタグを読み取れます。


こんどは、RFIDファラデーケージ(改)の中のSP1リーダーから読み取りを試すと、













なかなか読み取れません。

5mでは、1W出力で試しても、だめです。

かといって近づいて、50cmくらいの距離で試すと、真ん中のICタグの場所で3つとも読み取れる場合があります。

挙動が安定しませんね。


電波出力を半分(約250mW)に抑えると、50cmくらいの場所で直線的にまっすぐな場所のICタグが読取れます。

電波照射を5秒以上の期間で続けると、となりのICタグが読める場合もチラホラあります。

今回使用したファラデーケージは、高さ35cm、幅13cm、奥行48cmです。


今回は以上です。






















































2026年3月18日水曜日

RFIDファラデー ケージを作ってみよう (3) ファラデーケージの中から外のRFID ICタグを読んで見る準備

 ハヤト・インフォメーションの製品に「MANICA EXCEL TOOL 棚卸しパッケージ」(マニカ エクセルツール棚卸しパッケージ)があります。

 https://www.hayato.info/tanaorosi/index.htm 

です。エクセルからRFIDを読み取ることが可能です。お手頃な価格で役に立ちます。

RFIDハンディを便利に使う。特に「読み込みすぎて困る」お悩みに役立つことを祈って、今回は電波を遮断するファラデーケージを安価に試して見ようと思ってファラデーケージのシリーズです。


前回はファラデーケージの中にはICタグを入れて、ケージの外から読み取りを試しました。

今回は改修したケージの中から、外のICタグの読み取りを試したいと思います。


前回で作成したファラデーケージを、「中から外のICタグを読み取る」仕様に改造します。

箱の6面のうち、1面を電波が通る改造です。

始めに、追加で1枚のサバイバルシートで包みました。


そして、下の図のように箱の1面からはサバイバルシートを除去しました。

開口部は 10cm x 30cmのサイズです。

ダンボールは電波を通すので、ハンディの電波は、この面から照射されるはずです。











前回はICタグを入れた入り口は改修しません。ここからRFIDリーダーをケージの中に入れます。










これで電波は、ひとつの面からだけで照射されることを期待します。


次にICタグの置き方です。

安価に調達できるシューズケースを使って、ICタグの向きが固定できるようにします。


素材は「ポリプロピレン」なので、電波的には影響は低いと思われます。

ICタグはセロテープで貼り付けて、3つ用意します。

ICタグの電子IDは

・000000000000000000000226 (印字はRF-UHF-226)

・000000000000000000000227 (印字はRF-UHF-227)

・000000000000000000000228 (印字はRF-UHF-228)

です。

























準備ができました。

これを並べて、読み取りを試します。


読み取りの距離を測るためのメジャーは、非金属のメジャーを使うことにします。

このメジャーは非金属なので、電波に対する影響も少ないと思われます。

今回は以上です。


2026年3月11日水曜日

RFIDファラデー ケージを作ってみよう (2) 安価なダンボール箱とサバイバルシートを試して見よう

ハヤト・インフォメーションの製品に「MANICA EXCEL TOOL 棚卸しパッケージ」(マニカ エクセルツール棚卸しパッケージ)があります。

 https://www.hayato.info/tanaorosi/index.htm 

です。エクセルからRFIDを読み取ることが可能です。お手頃な価格で役に立ちます。


RFIDハンディを便利に使う。特に「読み込みすぎて困る」お悩みに役立つことを祈って、今回は電波を遮断するファラデーケージを安価に試して見ようと思います。 


使う素材は安価のものが望ましいです。なので、広い面積の割に、価格が100円~200円程度の、いわゆるサバイバルシートを使います。



サイズは、137cm X 213cm なので、十分に大きいです。

素材は、「アルミ蒸着ポリエステル製」なので、アルミの層はとても薄くなります。


ダンボール箱をサバイバルシートで包むことにします。













ダンボール箱は、最近通販した際に使われていたダンボール箱がありました。
サイズ的にもSP1リーダーを入れるのにちょうど良さそうだったので、このダンボール箱を使うことにします。













ダンボール箱を包むと、左側の面は1層になるのですが、サバイバルシートは長いので、反対の面は折りたたんでモコモコの2層になります。




物を出し入れするために、上の面はくり抜いて、サバイバルシートにも穴が開いています。












中に入れるICタグは、100円ショップで調達したペンケースにICタグをセロテープで貼り付けます。

こうすれば、ICタグを箱の中に入れた時にICタグの向きを固定することが可能です。

ICタグは非金属物用の一般的なタグ、アンテナサイズは 70mm X 17mm です。
















中に入れると左図のようになるので、右図のように開口部はアルミシートでふさぎます。

このRFIDファラデーケージを使って、どのように電波遮断されるか試して見ます。

使うリーダーはデンソーウェーブ社のSP1と弊社のMANICA EXCEL TOOLアプリです。電波出力は1Wにて行います。

























MANICA EXCEL TOOLアプリを使えば、読み取ったICタグの電子IDを画面に表示するし、電波出力も調整できるので、

このような読み取りテストで重宝します。


【サバイバルシートが1層の面の読み取り】























1層の面です。1W出力で50cmの間隔を取って5秒間の連続照射すると4秒目あたりで読み取りました。

50cm以上の距離では5秒間の照射をしても読み取れません。


【2層の面の読み取り】


2層の面です。50cmで5秒でも読み取れない。ハンディのアンテナを2層面にピタリと近づけても5秒間の照射をしても読み取れません。
(ちからを込めてハンディのアンテナ面を押し付けたわけではありません。ふんわりピタリと近づけました。)

この2層は少し皺もあるし間隔も2センチくらいは空いている。これが作用していると推測されます。

なので、試してみました。余っていた切れ端のサバイバルシートを1層の面にかぶせます。

















すると、50cmで5秒でも読み取れなくなりました。安価で薄い「アルミ蒸着ポリエステル」のシートも間に少しの空間を持たせて2層にすると、電波遮断効果は良い感じです。

これは、現場で電波遮断する必要が生じたい際は、安価なサバイバルシートを2枚重ねすると役立ちそうです!


次の回は、逆の方法でファラデーケージを使ってみます。

逆というのは、SP1リーダーをファラデーケージに格納して、ファラデーケージに穴をあけて、狭い範囲の読み取りに使えるか。

という視点での実験のようなことを実施したいと思います。


今回は以上です。


【ご参考です】

RFIDシステムにては、電波を遮断することは皆さま共通の課題としてあります。

弊社にても社員で実験試行錯誤して、お客様の役に立つべく情報公開しています。

 塗料のシールド効果を実験してみた

 https://enjoy-rfid.blogspot.com/2022/01/blog-post.html 

もご覧ください。


2026年3月4日水曜日

RFIDファラデーケージを作ってみよう (1) 動機 - 棚卸しパッケージをもっと役に立たせたい

動機

ハヤト・インフォメーションの製品に「MANICA EXCEL TOOL 棚卸しパッケージ」(マニカ エクセルツール棚卸しパッケージ)があります。

 https://www.hayato.info/tanaorosi/index.htm 

です。エクセルからRFIDを読み取ることが可能です。お手頃な価格で役に立ちます。

5年、7年、と愛用いただいているユーザー様が多いです。

お話をうかがうと、貸出し、返却、棚卸し、電波で物探し、といった一通りの資産管理ができて、

(1)エクセルのシートにRFID読み取りを自動的に反映できるので物品管理作業が楽にできる。

(2)シートの列を増やして、業務にピッタリの情報を持てる。

(3)物品管理のソースコードが公開されているので、現場で業務ピッタリに改変できる。

という回答が多いです。


要望として、RFIDは広く一気に読取れてスピーディだし、ダンボール箱の中も見えなくても電波で読取れて便利。

しかし、物品が広く配置されている場所で狭い範囲だけを読み取りたい時は、読み取りたくない物品も読めてしまう。

何とかならないの?、があります。

2026年3月現在の回答は、

(a)読取りたい範囲にあるべき物品だけにしぼったエクセルファイルを作成してRFIDハンディを操作してください。

(b)読取りたい物品だけを対象になるように、一時的にエクセルファイルで電子IDや属性を書き換えてください。

(c)読取りたい範囲を電波が遮断されるようにアルミシートで囲んでRFIDハンディを操作してください。

(d)RFIDハンディの電波出力を弱くして、読み取りたい範囲にハンディを近づけて読み取ってください。

という回答になります。

ですが、手間がかかったり、うっかりミスが混入する可能性があります。


そこで、RFIDシステムである「棚卸しパッケージ」を販売するものとして、RFIDハンディの読み取り範囲を調整するための、現場で簡単に使える方法にチャレンジしたいと思いました。

電波業界では「ファラデーケージ」という理論は常識とのことです。WiKiペディアで「ファラデーケージ」を調べると説明があります。

検索エンジンで「ファラデーケージ アルミ箔」を検索すると、

AI による概要
アルミ箔を使ったファラデーケージのポイント
効果: 電気伝導性により、静電気や電磁波を遮断(シールド)し、ノイズを低減。
利用例: ノイズ計測時のシールド、電子機器の保護、電波遮断。
注意点: 完全に密閉する必要があり、隙間や厚さが薄いと遮断効果が低下する可能性がある。 
銅の金網が理想的ですが、アルミ箔でも十分なシールド効果が期待できます
ということです。そこで、

(4)アルミ素材を使って各種のRFIDファラデーケージを手作りしてみよう

という、実験やら何やら遊んでみます。


(1)エクセルのシートにRFID読み取りを反映できるので物品管理作業が楽にできる。

MANICA EXCEL TOOL棚卸しパッケージの標準の物品管理用のシートで管理する属性はこうなっています。


(1)管理番号(ICタグの電子ID)

(2)品名

(3)型番

(4)枝番

(5)ロケーション

(6)ステータス

(7)貸出回数

(8)貸出先

(9)貸出日

(10)確認者

(11)返却予定日

(12)返却日

(13)棚卸結果

(14)最終棚卸日時

(15)登録日

(16)ラベル発行日

(17)廃棄日

です。

1つの物品は1行ですので、RFIDハンディでICタグを「管理番号」のセルに読取れば、直ぐにRFID物品管理ができます。


(2)シートの列を増やして、業務にピッタリの情報を持てる。


棚卸しパッケージの標準の列は並べ替えもできるし、列を追加することができるので、
例えば測定器を管理したい場合は、
(18)資産番号
(19)機器メーカー名
(20)機器校正日(電子測定器などの校正を行って、正しい精度に調整した日)
(21)次回校正予定日
というような属性を追加することも可能です。操作は普通のエクセルの操作で列を追加します。黄色いセルの列です。


このようにして、貴社の業務ピッタリにすることが出来ます。


(3)物品管理のソースコードが公開されているので、現場で業務ピッタリに改変できる。

エクセルには標準でVisual Basic Editorが入っていて、ビジュアルベーシックでセルの値を操作できます。

Altキーを押しながらF11をポンとたたくと、Microsoft Visual Basic for Applications という開発環境が開きます。

いわゆるVBAエディタですね。


棚卸しパッケージはVBAソースコード付きで納品するので、

このVBAエディタで棚卸しパッケージの画面を改変できるし、


エクセルファイルのシートの自動的な書き換えも改変できます。


なので、貴社の業務にピッタリのシステムにすることができます。

もちろん、貴社で改変するぶんには、追加費用はゼロ円です。

お客様が独自にコードを追加して、業務効率を向上させることも可能です。

と、便利なので、弊社のロングセラー商品であり、7年間使用してリーダーが経年劣化したのでリーダーだけを買い換え。

というお客様もいらっしゃいます。


(4)アルミ素材を使って各種のRFIDファラデーケージを手作りしてみよう

RFIDハンディ用のRFIDファラデーケージは色々と試して見ようと思います。

大きな円錐や、小さな円錐や、ホーン付き円錐や、四角い箱や、ホーン付き四角い箱や、何やらを実験して行こうと思います。

分かった中で役に立ちそうなことは、お客様の現場ですぐに使って、業務に役立てて欲しいです。

なので、実験に使うのは、現場で手軽に手に入る素材を使っていこうと思います。

例えば下に示すように、SP1 RFIDリーダーを入れているのは、皆さんのお家のキッチンの排気用ダクトホースを使ってみます。


箱型はダンボール箱をアルミシートで覆って、その中からRFIDハンディで読み取りを試します。

読み取りテストはMANICA EXCEL TOOL棚卸しパッケージのAndroid用アプリを使って読み取ります。
このアプリは「スライダー」をつまんで左右に移動させることにより、電波の強弱を変更できて便利です。




次回以降にて、RFIDファラデーケージをシリーズで報告させて頂きます。


今回は以上です。

2026年2月19日木曜日

AIと相談してコレクタで、古いPCのリナックスサーバーに方向検知をRFID読み取りで記録してみた


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

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

です。

前回は「プロセスを起動する」を使いましたが、今回は「Webサーバへ投げる」です。

Webサーバーは安価に済ませたいです。


「サーバへ投げる」のところで、
nec/cgi-bin/collect/add.cgi?PC=REUSE1&TAG=[タグID]&YYYYMMDD=[YYYYMMDD]&HHMMSS=[HHMMSS]&ANT=[アンテナNO]

を設定しました。(サーバーPCの名前は「nec」でPCのhostsに設定してあります。)

MANICAコレクタには、読み取ったアンテナ番号も通知させる設定です。


MANICAコレクタは、HTTPまたはHTTPSにてGETメソッドで送信することができます。

なので、送信先のWebサーバーに対して自分のPC名(PC=REUSE1)と、コレクタが置き換えてくれる値を設定します。

(一般的なWebに対する送信の、引数の書き方はAIに相談すると教えてくれます。)


さらにAIに相談しました。

「会社には、もう古くなって誰も使わないWindows7のPCがあります。これをWebサーバーにしたいのですが良い案はありますか?」

と質問すると、

AIは「Ubuntu Linux(ウブンツ リナックス)」という無償ソフトに入れ替えればすれば快適にWebサーバーを作れます。」

と回答があったので試すことにしました。

ということで、「どうやってインストールするのですか?」「試したらこういうエラーになったのですが原因を推測できますか?」「なるほど、それを試して見ます!」ということを、繰り返していたら動くようになりました。


Webサーバーでは、

(1)HTTPでGETメソッドでデータを受け取ったら、受け取ったデータをテキストファイルに追記する。

(2)次に、その履歴データから最新の20行を抜き出す。

(3)次に、上記(2)のデータの秒単位の時刻経過とアンテナ番号とEPCを判断する。

(4)次に、上記(3)の方向検出データでhtmlファイルを書き換える。

(5)htmlファイルでは、ブラウザに対して、数秒置きに再度読み取らせる。

ということをしたいです。

と、AIに相談すると、かくかくしかじか推奨です。と回答してくれます。

上記の(5)についてはhtmlファイルにて

<head>
<meta charset="utf-8">
<meta http-equiv="Refreshcontent="1">
<title>LIST - MANICAコレクタ</title></head>
</head>

と書けば、ほっておいても、PCではブラウザが読み直してくれるので、最新のデータを表示できます。

まぁ簡単!

上記(1)から(4)については、AIに質問して試してみて、巧く行かなかったらまたAIに質問して、を地道に繰り返します。

AIに相談してWebサーバーで動かすスクリプトも作成しました。


すると、できました!


左のウィンドウはMANICAコレクタのログ画面です。

右のウィンドウはWebブラウザで状況表示しています。

コレクタが読取ると、Webブラウザ画面にすぐに反映されています。


今は使っていない古いPCと、お金のかからないリナックス。

コレクタが動くPCと組み合わせて便利に使うことができました。


AIに相談して作った、Webサーバーで動かしたスクリプトも紹介しておきますね。

名前はadd.cgiです。

#!/usr/bin/perl
#@TOP マニカコレクタ用のCGI

#@使うモジュール
use CGI;
use Time::Piece;
use utf8;

#@ここから始まり。
my $qq = new CGI;
my($bContinue)=1;

#@EPCと製品名を紐づけるグローバル変数
my(%TagInfo)=(); # EPCと詳細情報を紐づけるデータ
$TagInfo{'000000000000000000000230'}="治具(一般的)";
$TagInfo{'000000000000000000000231'}="治具(その1)";
$TagInfo{'000000000000000000000232'}="治具(その2)";
$TagInfo{'000000000000000000000233'}="治具(その3)";
$TagInfo{'000000000000000000000234'}="治具(その4)";
$TagInfo{'000000000000000000000235'}="治具(その5)";
$TagInfo{'000000000000000000000000'}="治具(一般的)";

#@エラーログを開く
open $efh, '>> ', "error.txt" ; # エラーログを開く
flock($efh,2) or die; # Ubuntu Linuxだと、ブロックされて待ちになるな、、。
print $efh "start. ----------\n"; # エラーログに追加

#@データファイルを開き、http通信で受け取ったデータ記録する。
my($fh);
my($pf_name)=sprintf("log.txt");
if($bContinue){
    open $fh, '>> ', $pf_name ;
    flock($fh,2) or die; # Ubuntu Linuxだと、ブロックされて待ちになるな、、。
}

if($bContinue){ #@受け取ったデータを記録する。
    # PC,ANT,YYYYMMDD,HHMMSS,TAG
    print $fh $qq->param("PC").",";
    print $fh $qq->param("ANT").",";
    print $fh $qq->param("YYYYMMDD").",";
    print $fh $qq->param("HHMMSS").",";
    print $fh $qq->param("TAG")."\n";
    close $fh; #閉じる。
}

#@データを記録するグローバル変数配列を宣言する。
my(@aPC)=();
my(@aANT)=();
my(@aYYYYMMDD)=();
my(@aHHMMSS)=();
my(@aTAG)=();
my(@aMove)=(); #移動方向を記録する。

#@データを記録する
if($bContinue){
    $/ = undef;
    my($tmpFName)="tmp.$$.txt"; #print $efh "tmpf=".$tmpFName."\n";
    system("tac ".$pf_name." | head -20 >$tmpFName"); #最新データをピックアップ。
    open $fh2, '< ', $tmpFName ;
    my($buf)=<$fh2>;
    close $fh2;
    unlink($tmpFName);
    
    my(@aBuf)=split(/\n/,$buf);
    for (my $m=0; $m < @aBuf; $m++ ){ #行単位
	my(@aLine)=split(/,/,$aBuf[$m]); #カンマ区切り単位
	push(@aPC,$aLine[0]);
	push(@aANT,$aLine[1]);
	push(@aYYYYMMDD,$aLine[2]);
	push(@aHHMMSS,$aLine[3]);
	push(@aTAG,$aLine[4]);
	push(@aMove," "); #数を合わせるため、空行を入れる。
    }
}

#@記録されたデータから、移動方向を判断する。
if($bContinue){
    my $aNum=@aPC; #print $efh "aNum=".$aNum."\n";
    if ( $aNum == 0 ) {
	# データが空っぽならNOP
    }
    else{
	for(my $m=0; $m < $aNum; $m++){ #print $efh '$m='.$m."\n";
	    if($m == ($aNum -1)){
		# 最後のデータは、ひとつ後の行とは差分をとれない。	    }
	    }
	    else{ # PCがどこなのか、今のところチェックしない。
		#直近の同じEPCのタグを探す。見つからない可能性はある。
		#print $efh "m=".$m.":";
		my($mm)=0;
		for($mm=$m+1; $mm < ($aNum-1); $mm++){ # $mmを設定。
		    if($aTAG[$m] eq $aTAG[$mm]){
			#print $efh "aNum=".$aNum.":TAG ID HIT. mm=".$mm.":[".$aTAG[$m]."][".$aTAG[$mm]."] last\n";
			last;
		    }
		}
		#print $efh " mm=".$mm."\n";
		if($aTAG[$m] eq $aTAG[$mm]){ # タグのIDは同じか?
		    #print $efh "[".$aYYYYMMDD[$m].$aHHMMSS[$m]."][".$aYYYYMMDD[$mm].$aHHMMSS[$mm]."]\n";
		    my $t  = Time::Piece->strptime($aYYYYMMDD[$m].$aHHMMSS[$m],     '%Y%m%d%H%M%S');
		    my $t2 = Time::Piece->strptime($aYYYYMMDD[$mm].$aHHMMSS[$mm], '%Y%m%d%H%M%S');
		    my $diff = $t - $t2;

		    #print $efh "[".$aYYYYMMDD[$m].$aHHMMSS[$m]."][".$aYYYYMMDD[$mm].$aHHMMSS[$mm]."]\n";
		    #print $efh "diff sec = ".$diff->seconds."\n";
		    if ($diff->seconds < 20){ # 間隔の最大値は、この秒数とする。
		     	if($aANT[$m] eq $aANT[$mm]){ #print $efh "移動なし"."\n";
			    $aMove[$m]="移動なし";
		     	}
		     	elsif($aANT[$m] eq "1"){ #print $efh "持ち込み"."\n";
			    $aMove[$m]="持ち込み";
		     	}
		     	elsif($aANT[$m] eq "2"){ #print $efh "持ち出し"."\n";
			    $aMove[$m]="持ち出し";
		     	 }
		     	else{ #print $efh "空間転移"."\n";
			    $aMove[$m]="空間転移";
		     	}
		    }
		    else{#print $efh "タイムアウト"."\n";
			$aMove[$m]="";
		    }
		}
	    }
	}
    }
}

#@htmlのテーブル部分を作成する。
my($tableStr)=""; #@テーブル部分を作成する。
if($bContinue){
    my $aNum=@aPC; #print $efh "aNum=".$aNum."\n";
    if ( $aNum == 0 ) {
	# データが空っぽならNOP
    }
    else{
	$tableStr="";
	$tableStr .= '<table border="1">'."\n";;
	$tableStr .= "<tr><th>移動方向</th><th>年月日</th><th>時分秒</th>";
	$tableStr .= "<th>読取PC</th><th>アンテナ</th><th>EPC</th><th>タグ情報</th></tr>\n";
	for(my $m=0; $m < $aNum; $m++){ #print $efh '$m='.$m."\n";
	    $tableStr .= "<tr>";
	    $tableStr .= "<td>".$aMove[$m]."</td>";
	    $tableStr .= "<td>".$aYYYYMMDD[$m]."</td>";
	    $tableStr .= "<td>".$aHHMMSS[$m]."</td>";
	    $tableStr .= "<td>".$aPC[$m]."</td>";
	    $tableStr .= "<td>".$aANT[$m]."</td>";
	    $tableStr .= "<td>".$aTAG[$m]."</td>";
	    if ( exists($TagInfo{$aTAG[$m]}) ){
		$tableStr .= "<td>".$TagInfo{$aTAG[$m]}."</td>";
	    }
	    else{
		$tableStr .= "<td>"."未登録タグ"."</td>";
	    }
	    $tableStr .= "</tr>\n";
	}
	$tableStr .= '</table>';
    }
}

#@htmlファイルを更新する。
my($htmlStr)=""; #@html全体を作ってhtmlファイルを更新する。
if($bContinue){
    my($t)=1; # htmlファイルの再読み込み間隔秒
    $htmlStr = $htmlStr. "<html>\n";
    $htmlStr = $htmlStr. "<head>\n";
    $htmlStr = $htmlStr. '<meta charset="utf-8">'."\n";
    $htmlStr = $htmlStr. "<meta http-equiv=\"Refresh\" content=\"$t\">"."\n";
    $htmlStr = $htmlStr. "<title>LIST - MANICAコレクタ</title></head>\n";
    $htmlStr = $htmlStr. "</head>\n";
    $htmlStr = $htmlStr. "<body>\n";
    $htmlStr = $htmlStr. '<h1>MANINCAコレクタ 方向検出の最新読取情報</h1>';
    $htmlStr = $htmlStr. "最新のデータが".$t."秒ごとに再度読み込みされます。"."\n";
    $htmlStr = $htmlStr. "<hr>\n";
    $htmlStr = $htmlStr.$tableStr."<br>\n";
    $htmlStr = $htmlStr. "<hr>\n";
    $htmlStr = $htmlStr. "</body>\n";
    $htmlStr = $htmlStr. "</html>\n";

    my($fhHtml);
    open $fhHtml, '> ', '/var/www/html/collect/direct.html' ;
    flock($fhHtml,2) or die; # Ubuntu Linuxだと、ブロックされて待ちになるな、、。
    print $fhHtml $htmlStr;
    close $fhHtml;
}

#@エラーログを閉じる。
print $efh "end. ----------\n"; # ログファイルに追加
close $efh; # エラーログを閉じる

#@呼び出すPCが判断できるように応答を返す。
#もし応答しないと、コレクタはWebサーバーの内部障害として認識する。
print "Content-Type: text/html\n\n";
print "<html><head><title>response</title></head>\n";
print "<body>\n";
print "OK\n";
print "</body>\n";
print "</html>\n";

1;

以上です。


2026年2月18日水曜日

最近のレゴと、IoTブロック

同じ「ブロック」だけど、やってることは全然ちがう話


STEAM教育って言葉、ここ数年でよく目にするようになりました。
正直、ちゃんと説明しろと言われると少しあいまいですが、
「なんとなく、これから必要そう」
そんな距離感で気になっている人も多いんじゃないでしょうか。

私もその一人です。

子どもが将来どういう分野に進むかは分かりませんが、
テクノロジーについては、どの分野に行っても
分かっていてマイナスになることはなさそうだなと思っています。


最近のレゴを見ていて思ったこと

最近のレゴ公式ストアを見ると、
完成度の高いセットがかなり増えました。

どれも
「作る → 完成する → 眺める」
までがきれいに設計されていて、
遊びとしてはとても分かりやすいです。

もうすぐリリースされる レゴ スマートプレイシステム も、
組み立て方によって音や動きが変わる仕組みで、
いかにもレゴらしい進化だな、という印象です。

作る楽しさ、集中力、想像力。
このあたりは、やっぱりレゴは強いです。


「IoTブロック」って何だろう、と思って調べた

「IoTブロック」について、少し調べてみました。
試しにそのまま「IoTブロック」で検索してみると、
よく出てくるのが MESH や PLOCO。

どちらも「ブロック」と呼ばれていますが、
レゴのように形を作るブロックとは、
どうも考え方が違いそうです。

調べていくと、
同じブロックでも、
そもそもの役割や遊び方がかなり違う
ということが見えてきました。


MESHは「仕組みをいじる」ブロック

MESHは、

  • センサー
  • 無線
  • アプリ

を組み合わせて、
「こうなったら、こう動く」
というルールを自分で作っていくタイプのブロックです。

完成形が決まっているというより、
ずっと途中、みたいな感じ。

触っていると、

  • 条件を変える
  • 結果が変わる
  • また直す

という流れが自然に出てきます。

レゴのように「完成したら終わり」ではなく、
 動きや仕組みを調整し続ける遊び、という印象です。


PLOCOは、レゴに近い感触だった

一方の PLOCO。

PLOCOは、
  • ブロックを組み立てる
  • その形をスマホで読み取る
  • 数値に変換される
  • 画面上で結果(バトルなど)が出る
という流れです。

自分で条件分岐を作ったり、
処理の流れを設計したりするわけではありません。

なので、
IoTブロックというよりは、
レゴの延長線上にある遊びに近いと感じました。

「作って、読み取って、結果を見る」
という分かりやすさがあります。


同じブロックでも、向いている遊び方は違う

並べてみると、こんな感じです。

  • レゴ/スマートプレイ
    → 作ること自体を楽しむ
  • PLOCO
    → 作った形と結果の関係を楽しむ
  • MESH
    → 仕組みを考えて動かすことを楽しむ

どれが上とか下とかではなく、
そもそも遊びのタイプが違う、というだけの話です。


まとめ(特にオチはないです)

最近のレゴを見ていると、
ブロックと一口に言っても、
ずいぶん役割が分かれてきたなと感じます。

  • 形を作るブロック
  • 結果を返すブロック
  • 仕組みをいじるブロック

どれも同じ「ブロック」ですが、
やっていることはかなり違います。

STEAM教育とか、IoTとか、
大きな言葉で考えると難しくなりますが、
まずは
「何をして遊んでいるか」
くらいの目線で見ると、分かりやすい気がしました。


2026年2月16日月曜日

AndroidのHCEでオフラインスマート名刺

AndroidのHCEでオフラインスマート名刺

NFCを使ったスマート名刺と聞くと、ICカードにURLを埋め込むタイプのものを連想することが多いと思いますが、AndroidのHCE(Host Card based Emulation)を使えば受信側はアプリ不要、完全オフラインで画像つきのプロフィールを送信することができます。

仕組みは単純で、まず送信側のアプリでAIDにType 4 Tagを示す"D2760000850101"を設定します。
これで受信側は送信側をNFCタグと認識するので、OSを問わず、かつアプリ不要で通信できます。

画像を送信するためのキモになるのはvCard(.vcf)という名刺用のファイルフォーマットです。
iOSとAndroidはvCardで連絡先データを管理しています。vCardにはプロフィール画像と氏名、連絡先、会社などの情報を記載することができ、これをNDEFレコードにのせることで受信側は自動で連絡先データとして認識するというながれです。

NDEFレコード上ではvCardはMIMEタイプとして扱います。NDEFヘッダーのTNF(Type Name Format)に 0x02 (MIME Media) を指定し、タイプフィールドに text/vcard をセットすることで、受信側のOSがこれを連絡先データとして解釈します。

// NDEF Message Builder (vCard Record)
fun createVCardNdefMessage(vCardString: String): ByteArray {
    val vCardBytes = vCardString.toByteArray(StandardCharsets.UTF_8)
    val typeBytes = "text/vcard".toByteArray(StandardCharsets.UTF_8)
    val payloadLength = vCardBytes.size

    val output = ByteArrayOutputStream()
    val isShort = payloadLength <= 255
    var header = 0xC2 // MB=1, ME=1, TNF=0x02
    if (isShort) header = header or 0x10
    
    output.write(header)
    output.write(typeBytes.size)

    if (isShort) {
        output.write(payloadLength)
    } else {
        output.write((payloadLength shr 24) and 0xFF)
        output.write((payloadLength shr 16) and 0xFF)
        output.write((payloadLength shr 8) and 0xFF)
        output.write(payloadLength and 0xFF)
    }

    output.write(typeBytes)
    output.write(vCardBytes)
    return output.toByteArray()
}

HostApduService を継承し、以下のシーケンスを実装します。

  • SELECT AID: Type 4 Tag アプリケーションの選択
  • SELECT FILE: CCファイルまたはNDEFファイルの選択
  • READ_BINARY: 選択されたファイルのデータをオフセットに従って返却

特に READ_BINARY では、一度に送信できるバッファサイズ(Le)に制限があるため、大きなvCardデータ(画像付きなど)を送信する場合は、複数回の読み取りリクエストに対して正確にオフセット管理を行う必要があります。

// HostApduService (READ_BINARY Response)
override fun processCommandApdu(commandApdu: ByteArray, extras: Bundle?): ByteArray {
    if (readBinaryApdu(commandApdu)) {
        val offset = getReadBinaryOffset(commandApdu)
        val le = getReadBinaryLe(commandApdu)
        
        val selectedFile = currentSelectedFile ?: return STATUS_FAILED
        if (offset >= selectedFile.size) return STATUS_FAILED
        
        val lenToRead = Math.min(le, selectedFile.size - offset)
        val response = ByteArray(lenToRead + 2)
        System.arraycopy(selectedFile, offset, response, 0, lenToRead)
        
        // Append Success Status (90 00)
        response[lenToRead] = 0x90.toByte()
        response[lenToRead + 1] = 0x00.toByte()
        return response
    }
    // ...
}

実際に動かしました。

vCardのファイルサイズが大きくなりすぎるとおそらくタイムアウトが発生してしまいます。
試したところ30KBあたりが送信できる限界で、20KBを超えると送信するのに5秒ほど時間がかかりました。実際に使うときは相手のスマホのNFCセンサーの位置を把握するためにさらに時間を要するので、10KB程度で収まるようにするのが現実的かと思いました。

URLのみを飛ばすことができます。そもそもオフラインで通信する必要もほとんどないうえ、URL単体のほうが速くて安定しているのでそのほうが実用性はあります。

URLバージョン

2026年2月13日金曜日

AIと相談してコレクタで、もっと簡単に方向検知をRFID読み取りで記録してみた

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

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

です。

前回はリレーショナルデータベスを使いましたが、もっと簡単に実現したいです。

今回はコレクタにバッチファイルを実行させる方法です。

PCはマイクロソフトオフィスが入っているので、エクセルのVBAで何とかします。



バッチファイルの作りかたは、知らなくても大丈夫。

AIに相談しました。

例えば「コマンドラインで時刻を取得して、その出力から特定の情報をとりたい。」

と相談すると、実例を交えて回答してくれるので、

コピーすると、やりたいバッチファイルが実現できました。


実行させるバッチファイルは、コレクタからの引数を、ちょこっと加工して新たにテキストファイルを作ります。

バッチファイルは今回も、コレクタからアンテナ番号をもらいます。

このバッチファイル(collog.bat)は、

「時刻情報+EPC情報+アンテナ番号」を入れて、拡張子「.coltxt」として作成します。


コレクタで何回か読み取ると、こいう感じになります。


つぎにエクセルで、このフォルダを監視して「*.coltxt」を、常に監視したい。

監視して、アンテナ番号と時刻の差分の秒数を計算して、ICタグ移動を知りたい。

と、AIに相談すると、

「モードレスのフォームを作り、そのフォームから数秒間隔で監視するのがお勧めです。

そのフォームの中から結果をエクセルシートに書いてはいかがですか。

こういうフォームを作ると実現できます。」

という回答をくれるので、試しに作ったり、エラーを相談したり、改良案を求めたり、

と、AIと一緒に考えました。


すると、実現できました!


左上の画面ではコレクタがバッチファイルを実行している様子が見えます。

下のエクセルでは、モードレスフォームを実行して「監視中」を表示しています。

フォームではコレクタが作ったファイルを監視して、

「持ち込み/持ち出し/移動無し/タイムアウト」を表示しています。

(タイムアウトとは、1回は読んだけど、次の読み取りまでの時間が長すぎた。

だから移動ではなく、移動は判断しないタイムアウトだね。

という意味です。今回の「移動」とは、読んでから10秒ぐらいの間に

再度の読み取りがあった。という考えです。)


エクセルのフォームのレイアウトや作り方は、皆さんが好みで作成されると良いでしょう。

コレクタから情報をもらい、新たにファイルを作成するバッチファイルは、

コレクタの仕様にしたがった呼び出しになりますので、下記にご紹介します。


【コレクタに設定する、collog.batの呼び出し】

C:\RFID\CMD\collog.bat  [タグID]  [アンテナNO] [YYYYMMDD] [HHMMSS]


【collog.bat】

set P=C:\RFID\CMD\

set T=%TIME: =0%

set F=%T:~0,2%%T:~3,2%%T:~6,2%%T:~9,2%

set D=%date:~0,4%%date:~5,2%%date:~8,2%

set EPC=%1%

set ANT=%2%

set YMD=%3%

set HMS=%4%

set OUTF=%P%%D%-%F%-%EPC%-%ANT%.coltxt

echo %OUTF%

echo %EPC%,%ANT%,%YMD%,%HMS% > %OUTF%

exit


ここで終わりです。

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は、
家事を効率化する魔法の技術ではなく、

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

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