ラズパイでPC/SC仕様対応のカードリーダーを使う方法
まずPC/SCとは?
正式にはPersonal Computer/Smart Card。
Windows環境でICカードを利用するための標準アプリケーションインターフェース仕様のこと。
なぜラズパイでPC/SC対応のカードリーダーを使う?
SonyのPasoriという、ラズパイに簡単に繋げられてサンプルのたくさん転がっているカードリーダーがあるが、
いかんせん反応が良くない。
ある調査で見つけた反応の良いカードリーダーがPC/SC仕様だった為に必要となった。
ラズパイをPC/SC仕様対応にするために必要なもの
pcsc_liteというパッケージが必要らしく、これで低レベルのAPIやコマンドは提供される。 pythonの実装は、以下の2つを見つけた。
1. python-pcsc_liteパッケージ
これははMac OS Xだとバグがあり、ビルドできないらしい。 Windows, Linux, Max OS Xで汎用的に使うにはpyscardライブラリを使う方が良いとのこと。
2. pyscardパッケージ
こっちの方がドキュメントが充実していて、使いやすそう(直感)。
今回はpyscardライブラリを使用する方向に決定。
※ 単にPC/SC仕様カードリーダーがラズパイで動くかだけを確認するなら、pcsc_liteパッケージとPCSC Toolsを入れてコマンド実行すればよい。(参考1)
ちなみに参考内にあるlibusb++というパッケージは存在しないと言われインストール出来ないが、実行に問題はなかった。
ラズパイへのpyscardインストール方法
1. 必要なライブラリをインストール
sudo apt install python3-pyscard pcscd libacsccid1
2. Info.plistに使用するカードリーダーの情報を追加
2-1. Info.plistの場所を探す
sudo find / -name Info.plist
2-2. 使用するカードリーダーの情報を取得
lsusbコマンドで機器のベンダーIDと製品IDが分かるのでそれを取得。
2-3. Info.plistに機器のベンダーID、製品ID、名称(自由でOK)を追加
【記入例】
<key> ifdVendorID </key>
<array>
…
<string> 0x0001 </string>
</array>
<key> ifdProductID </key>
<array>
…
<string> 0x0001 </string>
</array>
<key > ifdFriendlyName </key>
<array>
…
<string> HogeHogeReader </string>
</array>
参考サイト
【参考1】 www.mutek.com 【参考2】 qiita.com
Actuonix リニアアクチュエータを使う
とりあえず、リニアアクチュエータと制御基板が必要。
Actuonix L16アクチュエータ 50mm 150:1 6V RC Controll
https://www.robotshop.com/jp/ja/actuonix-l16-actuator-50mm-1501-6v-rc-control.html
Actuonix リニアアクチュエータ制御基板
https://www.robotshop.com/jp/ja/actuonix-linear-actuator-control-board.html
動かすには、ロボットショップのHPよりLAC設定ソフトウェアが必要らしい。
1.Actuonixリニアアクチュエータのコントロールの種類
以下の3つがある。
P: Potentiometer Feedback
S: Limit Switches
R: RC Linear Servo
RシリーズはRCサーボモーターと同じく、PWM(パルス幅変調)で制御できるので
上記のアクチュエータ制御基板は必要なかったな。。。
Pシリーズのポテンショメータフィードバックなら必要だったんだけど。
ちなみにポテンショメータフィードバックの制御方法は?
2.電圧差をどうするか?
RaspberryPiの出力電圧はMax5Vだが、リニアアクチュエータの必要電圧は
6~12Vである。
零電にPWMの章があったと思うから要参照。
https://tech-blog.cerevo.com/adventcalendar2016/advent20/
USBへ送られている信号をロジックアナライザを使って解析する
今回はロジックアナライザとして、以下を使用する。
SODIAL(R)開発ボードUSB2.0 EZ-USB FX2LP CY7C68013A
https://www.amazon.co.jp/dp/B00OCEEIX0?tag=iotengineer22-22&linkCode=ogi&th=1&psc=1
アナライズソフトはsigrok pulseviewを使用する。
詳細は以下のサイトを参照。
https://tomosoft.jp/design/?p=6196
ここで問題。。。
pulseviewをインストールし、起動しようとしたら
"コンピューターにMSVCR100.dll がないため、プログラムを開始できません”と
エラー表示。
解決策は以下のサイト。
64bitの場合は、これのx64の方をインストール。
https://www.bayashitv.com/2017/08/msvcr100dllwindows10.html#toc_headline_1
ただ、起動してもサイトのような画面にならない。
おそらくドライバが正しくインストールされてないみたい。
以下の手順で、解決!
参考サイト
https://tomosoft.jp/design/?p=6196
Zadigを起動して、プログラムメニューから USBドライバインストール用プログラムのseirok->Zadigを起動してOptions->List All Devices を選択してチェックを入れます。
デバイスリストの中から先ほど確認したデバイス名を選択します。
※ここを間違えると別のデバイスドライバを上書きしてしまうので注意して下さい。
測定の基本設定:チャンネル、サンプル数、サンプリング周波数、トリガ
以上で走らせることはできたけど、動作がおかしい。
サンプル:50Mでサンプリング周波数:12MHzで測定時間が70msで終わる。
別のページを参考にもう一度設定してみる。
また一度これをやってみて、信号がちゃんととれるか確認するのがいいと思う。
https://misoji-engineer.com/archives/python-serial.html
Open CVを使ってみよう
前にインストールしたOpen CVを全然使ってなかったので
一度ちょいと触ってみる。
OpenCVをインストールしてみよう
https://news.mynavi.jp/article/zeropython-34/
Eclipseでcv2は走ったので、次はラズパイで挑戦。
きれいにエラー。。
以下対策
pythonでOpenCVを使うときにエラーでハマったので解決策を書いておく
https://creepfablic.site/2020/04/10/python-opencv-error/
こんなエラー分かるかい!!(怒)
とりあえず、ラズパイでcv2は使えるようになったので次。
Raspberry PiにOpenCVをインストールし、RasPi-CAMの画像をリアルタイムに顔認識
https://qiita.com/NaotakaSaito/items/f1f1548c8b760629cd26
RasPi-CAM用ライブラリのインストールがうまくいかない。
↓以下エラー↓
パッケージ libhighgui-dev は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。
しかし、以下のパッケージが置き換えます:
libopencv-dev
パッケージ libcv-dev は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。
しかし、以下のパッケージが置き換えます:
libopencv-dev
E: パッケージ 'libcv-dev' にはインストール候補がありません
E: パッケージ 'libhighgui-dev' にはインストール候補がありません
make: *** 'libraspicamcv.a' に必要なターゲット 'objs/RaspiCamControl.o' を make するルールがありません. 中止.
↑
まぁ、最後のエラーは論外だがw
一文ずつ解読してくか。。。
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_tutorials.html
Flaskとopencvの連携はこちら
https://qiita.com/Gyutan/items/1f81afacc7cac0b07526
ここなんかよさげ
https://qiita.com/MuAuan/items/92f3b1004cfde071add6
サーバーとリアルタイムで通信したい
画像認識ログインをするのに、いちいちsnapボタンを押すのは面倒。
リアルタイムで画像取得して、パターンマッピングにかけたい。
方法としては、以下の3つぐらいが思いつく。
1. websocketを使用してサーバー&クライアントを常時接続状態で画像処理
2. opencv.jsを使用してクライアント上で画像処理を完結
3. Ajaxを取り入れ、見た目だけリアルタイム処理にする。
(実際は定期的なサーバーポスト)
個人的には1.をやってみたいが、サーバーの負荷が心配。
ちなみに「WebSocket」は、 サーバー側とユーザー側を常時接続状態にしておいて双方向通信ができるようにする技術のこと。
参考は以下のサイト。
Flaskとwebsocketを使った簡易的なチャットを開発する
https://note.com/shimakaze_soft/n/n99b47eccd915
サーバーはFlaskで建てるつもり。
とりあえず、必要なパッケージをインストール。
・ Flask-sockets
・ gunicorn
・ gevent
・ gevent-websocket
よくわからんのもいるので、ちょいと調べる。
gunicornはUNIX 向けの Python WSGI HTTPサーバー。
なんかflaskとかが持ってる内部サーバーより動作が速いらしい。
(詳しくはまた別記事で...)
さらに、WSGI(Web Server Gateway Interface)とは、サーバーとWebアプリケーションをつなぐ共通のインターフェースをPythonで定義したもの。
gevent は libev を元にした並行ライブラリ。
socket(s)は察して。
上記のサイトで一通り組んだが一か所エラーが出たため修正。
server = WSGIServer(
host_port,
app,
handler_class=WebSocketHandler
)
server.serve_forever()
上記を
with make_server('localhost', 8080, app) as httpd:
print("Serving HTTP on port 8080...")
httpd.serve_forever()
と修正。
元々は
make_server('localhost', 8080, app, handler_class=WebSocketHandler)~
としていたが、一切動かなかったのでハンドラーをなくした。
これでうまくいくか!?
エラーなく走ったが、なぜかlocalhost:8080/にアクセスしても
接続されない。
JSで画面をコロコロ切り替える方法やら、レイアウトやら
CSS Grid Layout を極める!(基礎編)
https://qiita.com/kura07/items/e633b35e33e43240d363
ブラウザを自動的にリロードするいくつかの方法
https://www.mitsue.co.jp/knowledge/blog/frontend/201806/29_1525.html
JavaScriptで画面表示をパカパカ切り替えるボタン
http://www.02320.net/tech/clickable-switch-javascript/
Javascriptのタイマー処理 setIntervalとsetTimeout
Git(Github)を使ってプロジェクトを共有する
家のEclipseと会社のEclipseでプロジェクトを共有したい。
欲をいうと、RaspberryPiでも共有したい。
共有にはGit(Github)を使おうと思う。
以下のように段階を追って実験。
2.会社のEclipseからGithubにアクセスし、リポジトリを取得
3.会社のEclipseからpushして、家のEclipseでリポジトリ取得する
4.RasbperryPiのGitでGithubからリポジトリを取得し、変更を加えpushする
まずはGitとは何か知らないと始まらないため以下説明サイト
https://qiita.com/nnahito/items/e546b27f73e7be131d4e
また、githubのアカウント作成も済ませておくこと。
やり方は以下を参照
https://qiita.com/kooohei/items/361da3c9dbb6e0c7946b
1-1. EclipseにEGitをインストールする
https://www.blog.danishi.net/2019/04/30/post-866/
このサイトにEclipseを用いてのステージ⇒コミット⇒プッシュまでの手順も
書かれている。
【キーワード】
・Gitステージング
・ステージ
・コミット
・(ブランチの)プッシュ
https://qiita.com/komikcomik/items/207794a332aa581c22d4
問題なく完了!
2.会社のEclipseからGithubにアクセスし、リポジトリを取得
一部既存のプロジェクトを使ったが、これも問題なく完了。
会社のPCからプッシュまで完了。
4.RasbperryPiのGitでGithubからリポジトリを取得し、変更を加えpushする
(もしラズパイにgitが入ってない場合は、インストールすること。詳細はググれ。)
以下の記事を参照
https://takashin10mura.blogspot.com/2015/03/raspberrypigit.html
これの「2.SSHの鍵の設定」と「3.SSHで接続してみる。」を飛ばし設定
Githubからのリポジトリ取得&変更を加えpushまで完了。
【キーワード】
・git config --global user.name(もしくはuser.email) "~"
・git clone "~"
・git add "~"
・git commit -m "~"
・git push
基本的なことは問題なかったので、実践として
今までvimで書いていたラズパイ内のプログラムをGithubにpushして
Eclipseで編集し、再度pushしてみる。
2.ラズパイ側で空のリポジトリをクローン(git clone)し、そこに既存のファイルを
追加(git add)。そして再度push。
この時Eclipseプロジェクト形式になっていない為、リポジトリ右クリックし
「プロジェクトをインポート」を実施。
これで、pydevパースペクティブに表示されるようになる。
ただ、一個問題が。
pydevパースペクティブからpydevモジュールを追加しようとすると、
ソースフォルダも何もかも空で、何も作れない。
ここらはちょっと調査要。

