2020年5月22日金曜日

Web RAIN! WebからRFIDリーダを制御する

UHF帯のRFIDリーダを使う場合、たいていスマホやパソコンに制御用のアプリを入れる必要がある1と思います。一方で、バーコードスキャナであれば、挿すだけで使えますし、同じRFIDでもNFCについては、ブラウザから直接読み取れるようになりました。UHF帯のRFIDリーダでもブラウザから直接タグを読めるといいなあと思い、今回試してみました。

簡単にどうやったかを説明すると、PCとBluetoothのSPPで接続されたRFIDリーダに対して、ブラウザから現在策定中のSerial APIを介して制御するという感じです。

さて、この言葉が将来使われるのか分かりませんが、まだ誰も使ってなさそうなので、WebからUHF帯RFIDリーダを制御する使い方をWeb RAINと銘うっておこうと思います。次点でWeb LLRPでしょうか。

今回使ったもの


とりあえず作ったサイト



制限など


リーダ

今のところ使えるリーダはRF Blasterのみです。AT388も動くかもしれませんが、未検証です。

OS

Windows 10のみ対応です。Android系はどうもSDKがSerial Portに未対応なので、今後もこの方法での接続はできなさそうです。Androidの場合は、BLEに対応したRFIDリーダをWeb Bluetoothで接続する方向性になるでしょうか。

ブラウザ

ChromeかEdgeの最新版が必要です。ここまではいいとして、#enable-experimental-web-platform-features をEnabledにする必要がありますので、なかなかすぐに業務に使うというのは難しそうです。

準備


Bluetooth

まず、RF BlasterとPCのBluetooth接続を行います。タスクトレイのBluetoothアイコンを右クリックして「Bluetoothデバイスの追加」をクリックします。

「Bluetoothまたはその他のデバイスを追加する」をクリックします。
RF Blasterの電源を付けて、「Bluetooth」をクリックします。そうすると、「RFPrisma-xxxx」みたいなのが見つかると思うので、クリックします。


そのあとPINコードの確認が表示されるので、「接続」をクリックしてください。
元の画面に戻って「その他のBluetoothオプション」をクリックしてください。

COMポートタブを開くと、こんな風になっていると思います。方向が「発信」で、名前が「RFPrisma-xxxx 'AMP-SPP'」となっているポート番号をメモしておきます。あとで使います。下の図の場合は、COM13ですね。


ブラウザ

次にブラウザの設定を行います。使えるのは最新版のGoogle Chromeか、同じく最新版のMicrosoft Edgeとなります。

今回使用するWeb Serialは実験的な位置づけの機能のため、デフォルトの設定では使用できません。アドレスバーに、Chromeの場合は chrome://flags を、Edgeの場合は edge://flags をそれぞれ入力して開いてください。検索窓がありますので、 #enable-experimental-web-platform-features と入力して、見つかった項目をEnabledあるいは有効にしてください。変更後、ブラウザを再起動すれば準備完了です。

あと開発中何度かフラグが無効になっていたことがあったので、ブラウザのアップデートのタイミングとかで元に戻ってしまうのかもしれません。うまく行かないときは再度確認してみてください。




いざ、実行!

下記のURLを開いてください。
https://webrain.azurewebsites.net/


リーダの電源が付いていることを確認したら、Connectボタンを押してください。下記のような画面が表示されると思います。Bluetoothの設定で確認したCOMポートを選択して接続ボタンを押してください。うまく行けばリーダからピピッピピッと鳴って接続されます。

なお、Connectボタンを押してから、専用ダイアログでどの機器と接続するかを選ぶ必要があるのはSecurity上の理由からだそうです。Webサイトを開くだけで、自動でリーダが読取始めたら怖いですからね。


リーダの読取ボタンを押すと、時刻と読み取られたタグIDが表示されると思います。



1: AlienやImpinjといった自律動作可能な据置リーダの場合はシステム構成によってアプリ不要
2: こっちが裏テーマです。つい先日正式版が発表されましたね。C#だけで書けるのはうれしいですが、今回みたいなことをやろうとすると、結局Javascriptが必要になるのかな。その辺は今後調査が必要です。

2020年5月20日水曜日

ItemSenseサーバを動かしてみた

前回ItemSenseサーバをインストールしてみたのですが、今回はそのあとの設定を行って動かしてみようと思います。(もうあれから1年経つんですね、早い)

今回使ったもの

  • Ubuntu 18.04 Server
  • itemsense-2.3.0+6-setup.run
  • xSpan
OSもItemSenseもそれぞれバージョンが上がっています。

インストール

こちらの手順通りで問題なく進められました。前回つまったdocker-composeの辺りもリンク先が明示されていて、分かりやすかったです。

初期セットアップ

次にユーザガイドのInitial Setupを読みながら、進めていきます。

 1. adminのパスワードの変更
 2. Facilityの設定
  建物に紐づく概念ですかね。とりあえず、画面上部のFacilitiesからHayatoを作成。


 3. ネットワークを設定します
  More > Admin Panel > Scanner Configurationから設定します。

 4. ネットワークをスキャン
  Readers > Registrationから設定します。追加したネットワークを選択して、Discover Readersします。リーダが見つかるので選択してRegisterします。

5. リーダ側の準備完了
  リーダにReader Agentというプログラムが設定されました。次は実際の読取のための設定となります。

Reader

リーダの設定をしていきます。Readers > ConfigurationsからCreate New Reader Configurationボタンを押して新規に作成します。
  • Operation:今回Overheadで設定したいので、THRESHOLDを選択
  • Reader Mode:とりあえずMODE_1002がオススメみたいです
  • Session:とりあえず0
  • Transmit Power:とりあえず30 dBmとしますが、現場によって調整だそうです
  • Channel Config:今回不使用。Side by Sideなど近くに他のリーダがある場合はそれぞれで異なるチャンネルを選択します

Threshold

Threshold、日本語にすると閾値でしょうか。ここからこっちは内、ここから先は外を決めるための設定といった感じでしょうか。Create New Thresholdを押して新規に作成します。
  • Arrangement:Overheadを選択
  • Reader1のReader:先ほど準備完了したReaderを選択
  • Configuration:xSpan Overheadを選択


In AntennasとOut Antennasは編集アイコンをクリックすると、どのアンテナ番号をInあるいはOutと見做すかと、それぞれの側のTransmit Powerを設定できます。たとえば、設置現場の片側に明らかに金属製の構造物があるような場合に使います。今回はデフォルトのままとします。ちなみにアンテナ番号はこちらのp. 58にあります。さらに余談となりますが、xSpanのLEDがある側がSECTOR 2 (IN)、反対側がSECTOR 3 (OUT)となります。Side By Sideで左右に設置する場合は、LEDのある側を揃える必要があります。

Recipe

次はRecipe、なんだかお料理みたいですが、秘訣とかこつっていう意味があるんですね。調べて知りました。Create New Recipeを押して新規に作成します。
  • Recipe Type:今回はTHRESHOLDを選択
  • ReadersのThreshold:先ほど作成したThresholdを選択
  • ReadersのRun:リーダを選択
  • ReadersのWith:Reader Configurationを選択  
  • Recipe ParametersのProfile Name:最初は空でよいですが、チューニングした結果を貼り付けるのに使用します
  • Iteration Data Log Enabled:チェックすると、チューニングツールにImportするためのログが出力されます


Job

ここまでで動かすための準備が終わりました。いよいよ動かしてみましょう。
  • Facility:適宜選択
  • Recipe:先ほど作成したRecipeを選択
  • Duration:とりあえず0
  • Start Delay:デフォルトの0のまま
  • Data Handling Options:3つともチェックを入れておきます。Docker使っているので外部にデータを出力するための設定みたいです、多分

Start Jobボタンをクリックします。全部うまく設定されていればJobのStatusがRunningとなります。一番右にあるActionsのTransitionsのアイコンをクリックすると読み取ったタグを表示できます。


このあとは、Actionsのところの右から3つ目のDownloadアイコンでIteration Data Logsを取得し、Threshold Tuning Tool(別ソフト)を使ったチューニング作業へと入ることになりますが、余白がつきたのでここまでにします。

2020年5月8日金曜日

今月も新しいRFID機器に対応しました(MANICA Excel Tool)。



今月も、とか書くと毎月リリースしてそうですが、そんなことありませんでした、、、
ーーーーーーーーーーー
続々と対応機種が増加するMANICA Excel Tool、
あらたに下記4機種への対応版がリリースされました!
・CT4-LX(SATO)
・PSRWU-9000(フェニックスソリューション)
・MC3330(ZEBRA)
・KDC480(KOAMTAC)

対応機種一覧はこちらから。
https://manica.jp/?page_id=301

2020年5月4日月曜日

(幻の)光るタグ

これまた懐かしいシリーズ、9年前の光るタグです。

登録済みの会員カードを読み取ると、お店のキープボトルに取り付けられた光るタグが、結構あかるく光ります。

デモ環境の機器構成は、ArmadilloにNFCリーダーとLF帯のリーダーが接続されていて、人の認証はNFC、光るタグの制御はLFという感じ。

残念ながら製品化までいきませんでしたが、パッシブながら光量に優れた有機EL採用のとても楽しみなプロトタイプだったのになぁ。

Youtube:
https://www.youtube.com/watch?v=sBxtmU9Wid8

事例紹介ページ:
http://www.hayato.info/home/report_hikarutag.htm

#rfid #nfc #icタグ

2020年5月1日金曜日

JR西日本様のRFID導入事例を公開しました!

JR西日本様の導入事例を公開しました。
ICタグを利用した工具管理ですが、タグの取り付け方や読み取らせ方、弊社のExcel Toolの活用方法など現場の知恵が詰まった素晴らしい活用事例かと思います。

誰が、どの工具を持ち出したか/返却したか、を自動的に記録する用途でお使いいただいています。

ハンズフリーでの検品ながら、大掛かりなゲートを設置することなく、アプリケーションもエクセルで済ませてしまうことで、かなりシンプル/低価格な仕組みを実現しています。

使ったことないと、ICタグって何か難しそうみたいなイメージかもしれませんが、全然そんなことないです。似たような仕組みのご要望あればお気軽にお問い合わせくださいませ。






2020年4月22日水曜日

テレワークを応援!RFIDで勤怠報告を自動化する

みなさん、テレワークしてますか。弊社でも昨今の情勢を受け、テレワークでの勤務を推し進めているところです。

さて、テレワーク中は勤怠報告を求められることも多いのではと思います。弊社でも始業時、昼休憩開始時、昼休憩終了時、終業時の1日計4回、メールでの報告を行っています。(そんなのチャットのステータスでいいじゃん、という声もあるかと思いますが、決まりは決まりです)
今まではGmailのテンプレートを使って凌いでいたのですが、この先の見えない状況を考えると4回といえど、重荷になってきます。

そこで、RFIDを使って自動化してしまおうと思います。たぶんこの記事を読んでいる方なら、自宅にRFIDリーダの1台や2台転がっているものと思いますので、ぜひお試しください。

使ったもの


マスプロ電工製RFIDリーダ、RFIDシートアンテナ

こんな感じです。ロープロファイルで机の上に置いておいても邪魔になりません。


Googleスプレッドシート

こんな感じのシートを用意しました。始業時間~終業時間の各列が勤務報告する時間に相当します。その他列はデバッグや判断できない時間帯に読まれた場合に利用します。タグIDのところに勤怠報告に使うタグのIDをセットします。G列にその日にやったことを書いておけば、それを終業時にメールで送信するようにしました。


ちなみに弊社は10:00~15:00がコアタイムのフレックス制で、11:45~12:45がお昼休みとなります。

Google Apps Script

詳しくは他の解説記事にゆずりますが、function doGet(e)という関数を作成すると、HTTP GETでアクセスを受け付けられるようになります。今回はtagId引数に読まれたタグIDを乗っけてアクセスする形にしました。

スプレッドシートのIDを使ってアクセスして、時間に応じて特定のメールを送信する感じにしました。たとえば、8時から10時の間なら業務開始、16時半以降なら業務終了といった感じです。この辺の業務ロジックはスプレッドシート側に設定持たせた方がよかったかもしれません。ソースの一部を抜粋すると、大体こんな感じです。


   
    var id = 'XXXXX';
    var sheet = SpreadsheetApp.openById(id).getSheetByName("シート1");
    
    var registeredTagId= sheet.getRange('B1').getValue();
    
    var tagId = e.parameter.tagId;

    if (tagId == registeredTagId) { // 登録されたタグIDと一致するか
      
      var lastRow = sheet.getLastRow();
      
      var dateNow = new Date();
      
      var lastDate = new Date(sheet.getRange(lastRow, 1).getValue());
      
      var recordRow;
    if (lastDate.getFullYear() == dateNow.getFullYear()
        && lastDate.getMonth() == dateNow.getMonth()
        && lastDate.getDate() == dateNow.getDate()) {
          recordRow = lastRow;
        } else {
          // 当日のレコードが無ければ追加
          recordRow = lastRow + 1;
          sheet.getRange(recordRow, 1).setValue(Utilities.formatDate(dateNow, "JST", "yyyy/MM/dd"));
          sheet.getRange(recordRow, 7).setValue('資料作成');
        }
      
      const recipient = 'recipient@example.jp';
      var subject;
      var body;
      const options = {cc: 'cc@example.jp'}
      if (dateNow.getHours() > 7 
          && dateNow.getHours() < 10) {
        //始業
        recordColumn = 2;
        var workPlan = sheet.getRange(recordRow, 7).getValue();
        subject = 'テレワーク開始連絡(中野)';
        body = `中野です。\n\n今からテレワーク開始します。\n\n <予定作業>\n・${workPlan}\n\nよろしくお願い申し上げます。`;
      } else if ((dateNow.getHours() == 11 && dateNow.getMinutes() >= 45 && dateNow.getMinutes() <= 59)
      || (dateNow.getHours() == 12 && dateNow.getMinutes() >= 0 && dateNow.getMinutes() <= 15)) {
        //休憩開始
        recordColumn = 3;
        subject = '休憩開始連絡(中野)';
        body = '中野です。\n\n今から休憩開始します。\n\nよろしくお願い申し上げます。';
      } else if (dateNow.getHours() == 12 && dateNow.getMinutes() >= 30) {
        // 休憩終了
        recordColumn = 4;
        subject = '休憩終了連絡(中野)';
        body = '中野です。\n\n今から業務を再開します。\n\nよろしくお願い申し上げます。';
      } else if ((dateNow.getHours() == 16 && dateNow.getMinutes() >= 30) 
        || (dateNow.getHours() >= 17)) {
          //終業
          recordColumn = 5;
          var workRecord = sheet.getRange(recordRow, 7).getValue();
          subject = 'テレワーク終了連絡(中野)';
          body = `中野です。\n\nテレワーク終了します。\n\n<実施作業>\n・${workRecord}\n\nよろしくお願い申し上げます。`;
        } else {
          recordColumn = 6;
        }
      
      var recordCell = sheet.getRange(recordRow, recordColumn);
      if (recordCell.isBlank() || recordColumn == 6) {
        recordCell.setValue(Utilities.formatDate(dateNow, "JST", "HH:mm:ss"));
        if (subject != undefined && body != undefined) {
          GmailApp.sendEmail(recipient, subject, body, options);
        }
      }


MANICAコレクタ

MANICAコレクタはこちらからダウンロードいただけます。多くのリーダに対応しておりますので、お持ちのリーダが対応しているかぜひチェックしてみてください。お使いになりたいリーダありましたら、お声がけください。(有償になりますが...)

リーダを追加して、高度な設定を開くと、一番下にWebサーバへ投げるというチェックボックスがあるので、チェックします。隣にGASの公開URLと引数を記述してください。URL中の[タグID]が実際に読まれたタグIDに置換されてHTTP Getされます。ちょっとした注意点としては、httpかhttpsはリストボックスから選択する形なので、URLの//の後ろからテキストボックスにはコピペしてください。


あとはMANICAコレクタのショートカットをWindowsのスタートアップフォルダに作成し、起動時に自動で開始するにチェックを入れておけば準備完了です。次回以降、始業時など、必要なタイミングでタグを読ませれば、自動でメールを送ってくれるようになります。


2020年4月3日金曜日

Bluetooth問題をなんとかする

おかげさまでご好評いただいております棚卸パッケージですが、面倒な問題を抱えております。ハンディリーダとPCの接続方法なんですが、現状はBluetoothかWifiを選択できるようになっています。このBluetoothが結構相性問題があって組み合わせによって接続できなかったり不安点だったりしていました。

昔はBluetoothスタックとして東芝スタックがほとんどの状況で、東芝スタックは安定していたのであまり問題にならなかったんですが東芝スタックを使っているBluetoothドングルというのが少なくなってしまい、他のスタックだと接続できない問題が明らかになってきて何とか東芝スタックのドングルを確保するのに奔走していました。

が、最後の東芝スタック対応ドングルのBT-Micro4-Hが在庫限りとなってしまっておりどうしたもんかなこれ、という状況でした。

この状況を打開するため、目を付けたのがコレ


じゃーん。ESP32ちゃんです。

ESP32のBluetoothは他の案件でも使用していますが結構安定して使えています。ということで通信系はESP32ちゃんに任せてしまって、COMとのブリッジをすることでPCからは単純にCOMポートとしてだけ見える状況にしてしまおうという計画です。

PCからは単にCOMポートにしか見えませんから、Bluetoothスタックがどうのこうのという話はなくなります。Bluetoothが付いていようがいまいが、どんなスタックが入っていようが入っていまいが、とにかくWindowsPCであれば動作するようになります。

というわけでやってみました。
ESP32のプログラムはBluetoothでハンディに接続し、あとはシリアルとBluetoothの通信をブリッジするだけなので簡単です。

#include "BluetoothSerial.h"

static BluetoothSerial SerialBT;
static uint8_t address[6]  = {0xD4, 0xC9, 0x4B, 0x80, 0x3B, 0x89};

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32", true);
}

void loop() {
  if (!SerialBT.hasClient()) {
    if (!SerialBT.connect(address)) {
      while(!SerialBT.connected(10000)) {
      }
    }
  } else {
    while (SerialBT.available() > 0)
      Serial.write(SerialBT.read());
    while (Serial.available() > 0)
      SerialBT.write(Serial.read());
  }
}

従来だと、

ハンディ(とかAndroid)とPCをペアリング → 設定されたCOMポートをエクセルツールに設定

という流れでしたが、

ESP32をPCに接続 → 設定されたCOMポートをエクセルツールに設定

という流れになります。
エクセルツール側はCOMポートとのやりとりということに違いはありませんのでほぼそのままで動きます。
今回Android版で試しましたが、Android側はPCから接続されるかESP32から接続されるかの違いなのでこちらもほぼそのままで動きます。


じゃーん、ちゃんと動きました。

PC <- COM -> ESP32 <- Bluetooth -> Android(SPP)

という組み合わせで動かしてますが、ESP32はWifiも動くので

PC <- COM -> ESP32(Wifi AP) <- Wifi -> Android(Wifi)

という組み合わせも可能ですね(試してないけど)。Wifi版は既設のWifi環境に接続するかモバイルルータなどを使う必要がありましたがこの組み合わせにすると既設のWifiもモバイルルータも必要なし!スバラシイ

そんなわけでこれはちょっと急ぎで進めたいと思います。