M5Stack:UnitVカメラで穿孔テープ読み取り

紙テープリーダのTweetを見て、紙テープ読み込みやってみたくなりました!

紙テープ、「鑽孔テープ」(さんこうテープ)や「穿孔テープ」(せんこうテープ)とか呼ばれているものですね。
テープ幅は 1インチ、テープ間の間隔は0.1インチ。1列1バイトのタイプだと、穴は上部3つ+送り穴+下部5つです。

Wikipedia:紙テープ


http://www.chiba-kc.ac.jp/user/~iseri/siryo/card.html


穴の場所が正確に決まっているので、テープを撮影して、画像の指定ピクセルが黒か白かでデータを読めるのでは?
そう思ってチャレンジしてみました。

カメラはM5Stack社 の UnitV を使いました。

UnitV k210 Edge Computing AI Camera(OV7740)
https://shop.m5stack.com/products/unitv-k210-edge-computing-ai-camera-ov7740

Kendryte K210を搭載したAIカメラなのですが、AIによる画像検出機能は今回は使ってないです。カメラ+ESP32 とか、カメラ+RaspberryPi とかでも同じようなことができると思います。(正確には、僕が使った UnitV は旧バージョンです。)

紙テープは、本物持ってないので、こちらのサイトの画像を幅1インチに調整して印刷しました。


紙テープをスムーズに送れるように、サポートパーツを3Dプリンタで作りました。

UnitVはレゴテクニックのブロックで土台を組みました。

全パーツをレゴで組みたかったところなのですが、レゴの1ブロックは8mm なので、テープ幅1インチ(2.54cm)が作れませんでした。

といいつつ、3Dプリントサポートパーツを作る前に、一回、レゴで作ってみています。やっぱちょっときびしかったです。
テープ幅を細くしてしまってもいいのですが、最終的に本物テープも使ってみたいので、1インチは合わせといたほうがいいかなと。


紙の検出ですが、まず、カメラときっちり垂直になるように紙テープをセットします。(アナログな調整)

カメラのX軸中央で、黒い部分が出るまで下向きにY軸を検索して、黒い部分になったら次は白い部分が出るまで検索します。これがテープの上Y座標。同じように、下側から検索して、テープ下Y座標を見つけます。

これで、テープ幅のピクセル数がわかります。テープ幅ピクセル数を10で割ったものが、穴の間隔ピクセル数です。これらがわかれば、テープの穴の座標が計算できますね。

次に、テープを動かしていきます。手動でじわじわと引っ張ってますw

送り穴の座標で、現在読み込みタイミングかどうかを判断しています。送り穴座標が白→黒に変わった時が、読み込みタイミングとなります。

このタイミングで各座標の穴が黒か白かを読み取り、それぞれをデータのビットとして、値に変換しています。

この場合は、上側(画面下側)から 1,0,1,0,1,(送り穴),0,0,1 なので 0b10101001 = 169 となります。


読み込みの時には、紙の明るさがいい感じになるように、手で覆って調整していますw


UnitV のプログラムは、MaixPy IDE で作りました。久しぶりだったのですっかり使い方を忘れていた…。

MaixPy IDE
https://dl.sipeed.com/MAIX/MaixPy/ide/

プログラムはこちら。