激安で購入したICカードリーダーACR122U-A9をRaspberryPiで使用

前回のエントリでは激安で購入してきたICカードリーダーACR122U-A9Windowsから使用してみる実験を行ってみました。

f:id:ueponx:20220312000242p:plain

uepon.hatenadiary.com

結果的には公式ドライバを使用して無事に認識して、SuicaなどのICカードも無事に認識できたというものでした。実はこのICカードリーダーは公式でLinuxにも対応をうたっている珍しいデバイスで、公式サイトからLinuxドライバが公開されています。更にLinuxといってもRaspberryPiでも使用できるという稀有な特徴があります。

f:id:ueponx:20220317234602p:plain

今回はこのICカードリーダーがRaspberryPi OSでも使用できるかということを検証してみたいと思います。 ただし、公式ドライバはRaspberryPi OSBusterベースより古いものに対応しているということなので、現在公開されているRaspberryPi OSLegacyバージョンを使用することになるのであしからず。

今回使用したRaspberryPi OSは以下のようなシステムバージョンとなっていました。

f:id:ueponx:20220317002741p:plain

続きを読む

非接触のICカードリーダーACR122U-A9を激安で購入

今回も自分定番の名古屋大須にある佐古前装備さんで変わったジャンク(ほぼ新品なのでジャンクというか微妙)を購入してきました。 非接触ICカードリーダーで型番はACR122U-A9です。いわゆるSuicaに代表されるFeliCaリーダーになります。

f:id:ueponx:20220312000228p:plain

どんなデバイス

パッケージの内容はこんな感じです。ドライバー用のCDROMが入っていますが、自分の使用しているPCに光学ドライブが存在していないので困る。

f:id:ueponx:20220312000242p:plain

昔に発売された商品だと思ったので、商品ホームページはどうなっているのだろかと思って検索したところ…ちゃんと存在していました。

www.acs-japan.jp

続きを読む

Node-REDのfunctionノードだけで解決が難しいときにフロー内にPythonの処理を導入する

Node-REDを使用していると、偶にこのPythonの処理をそのまま埋め込めればいいのになと思うことがあります。

自分も以前のエントリでwordcloudの画像生成に関して拡張ノードがなかったのでexecノードを使用して回避したことがありました。

参考

uepon.hatenadiary.com

このときには、モジュールがコマンドラインCLI)で実行できるようになっていたので、その方法が良かったのかもしれないなと思ったのですが、いろいろ調べてみるとpythonのコード記述ができるpython-functionノードというものがあるとわかりました。今回はそれの使い方について見てみようと思います。

拡張ノードのインストール

今回使用する拡張ノードはnode-red-contrib-python-functionという名前です。

flows.nodered.org

このノードのドキュメントにもありますが以下の注意点があるようです。

(注意)保証されるものではないのでプロダクトでは使用しないのは前提となります。

In any case, this quick hacked node will let you write functions using Python instead of Javascript! How cool is that? Too cool to be used in production, that is for sure.

(注意)非同期的なプロセスに関しても保証はされません(スレッドなど)

Python is by default a synchronous runtime. The function is run in a dedicated child process, therefore it won't block the NodeJS main process, but in any case only 1 message is processed at a time. That is, of course, unless you use any of the concurrency features available in Python, like multithreading, multiprocessing, Tornado, Twisted...

なんとなくわかるような内容です。このモジュールですが、Pythonの2系3系どちらにも対応しているようなのですが、現状3系を使用したほうがいいかなと思います(どうやってバージョンを判別しているのだろうか?)

では、いつもどおりメニューから拡張ノードのインストールを行いましょう。メニューの【パレットの管理】からインストール作業を行いますが、特にトラブルなく処理は終わると思います。

f:id:ueponx:20220228224934p:plain

f:id:ueponx:20220228224937p:plain

f:id:ueponx:20220228224939p:plain

パレットの【機能】のカテゴリの中にpython-functionノードが追加されていればOKです。

f:id:ueponx:20220228225036p:plain

python-functionノードをつかってみる

基本ノードに含まれるfunctionノードとそれほど大きな差異はないようです。入力エリアにPythonのコードを入力していくだけです。importも動作可能なので必要なモジュールがあれば、使用することもできそうです。(venv系の動作はやめておいたほうがいいかも?)

簡単な実験を行うためのフローを作成します。以下のノードを配置して行きます。

  • injectノード
  • python-functionノード
  • debugノード

f:id:ueponx:20220228225348p:plain

python-functionノードをダブルクリック処理を記述していきます。

f:id:ueponx:20220228225402p:plain

例えば下記のようなコードを動作させることができます。

import os

k = 0
for x in range(10**6):
    k += x

# 作業フォルダを取得
folder_name = os.getcwd()

# msgオブジェクトに格納(文字列でないとエラーがでるようです)
msg["folder_name"] = folder_name
msg["payload"] = str(k)

return msg

今回はdebugノードで【対象】をmsgオブジェクト全体を表示するように変更しておきます。

f:id:ueponx:20220228225634p:plain

作成したフロー

f:id:ueponx:20220228225537p:plain

このノードの処理の結果がある場合には、msgオブジェクト(dictionary)として返す必要があるので、結果などを文字列として格納する必要がありそうです。msg.payload以外にも値を格納できますが値をString型に変更しておきます。

実行結果

f:id:ueponx:20220228225823p:plain

python-functionノードを使用することでNode-RED上にPythonのコードを内包することは可能となりますが、デバッグなどの容易さを考えるのであればPythonCLIのプログラムを作成したほうが楽なのではないかと思います。execノードからそのプログラムを呼び出し、標準出力やエラー出力をうまく調整しても似た処理はできるかなと思います。もしメリットがあるとするならばフローで出てきたパラメータ使用するのが楽?かも。changeノードexecノードを使えばそれも解決しますが。

おわりに

今回はNode-RED側からPythonのコードを記述して処理を行うpython-functionノードを使用してみました。

基本的にはあまりおすすめできる感じではないのですが、ちょっとしたPythonの動きを確認するのであればこちらを拡張ノードをつかうのもありかもしれません。

最近はPythonのモジュールがNode.js側に移植されている処理も多くなってきているので、そこまでの需要はあるのかなと思いますが、何かあったときには実験的につかってみるのもありかもしれません。

Node-REDのフロー上に画像を表示する方法

先日のエントリでNode-REDで生成した画像をデバッグ用途でフロー上に表示するという処理を使用しました。 今回はその部分を取り出して説明するとともに、もう一つの表示方法についても取り上げてみたいと思います。

uepon.hatenadiary.com

生成した画像をフロー上に表示していた箇所

f:id:ueponx:20220221231845p:plain

フロー上に画像を表示する方法?

Node-REDのデフォルト情報ではフロー上に画像を表示する機能(ノード)はありません。その機能を持つものは以下の2つが代表的だと思います。

  • node-red-contrib-image-output

flows.nodered.org

こちらの拡張ノードは前述のエントリでも使用したものになります。msg.payloadに与えられた画像データ表示処理を持ったシンプルなノードになります。

  • node-red-contrib-image-tools

flows.nodered.org

こちらは画像を表示する以外にも、与えられたデータにフィルタ機能など画像処理が行える、多機能なノードになっています。表示するだけならオーバースペックかもしれません。

上記の2つを使ってみます。

続きを読む

Debian 11 "bullseye"にlsb_releaseコマンドがインストールされてなかったので四苦八苦した話

ChromeBookを久々に使っていたらLinux機能のOSバージョンのアップデートができるというメッセージが表示されました。BusterからBullseyeへの移行ということなんだろうなあと思って、早速アップデートを行いました。

f:id:ueponx:20220218002357p:plain

途中、ストレージが足りないことや、30分で終了されるというメッセージのハズが1時間もかかってしまうなどのこともありましたが無事にアップデートは終了。

早速バージョンの確認をするためにlsb_releaseコマンドを実行しようとするのですが、

f:id:ueponx:20220218002517p:plain

コマンドが入っていない?おや?RaspberryPi OSBullseyeでは入っていたはずなんだけどなあ。パスの問題かなと思っていたりしたのですが、そうでも無いようです。

コマンドがないならインストールすればいいじゃないか

ということで、lsb_releaseコマンドのインストールを行います。aptコマンドで速攻だろうと思っていたのですが、引っかかりました(またかよ)。 以下のように実行するのですが…

続きを読む
/* -----codeの行番号----- */