紙テープリーダのTweetを見て、紙テープ読み込みやってみたくなりました!
紙テープリーダー出来た!
(あとテープ作成スキルを獲得した!) pic.twitter.com/yHtbstSdfa— Naohiro IIDA (@dannymodules) April 25, 2022
紙テープ、「鑽孔テープ」(さんこうテープ)や「穿孔テープ」(せんこうテープ)とか呼ばれているものですね。
テープ幅は 1インチ、テープ間の間隔は0.1インチ。1列1バイトのタイプだと、穴は上部3つ+送り穴+下部5つです。
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
穿孔テープだいぶ読めるようになりました!#M5Stack#UnitV pic.twitter.com/h9v183Vbo0
— Nochi (@shikarunochi) April 26, 2022
送り穴の座標で、現在読み込みタイミングかどうかを判断しています。送り穴座標が白→黒に変わった時が、読み込みタイミングとなります。
このタイミングで各座標の穴が黒か白かを読み取り、それぞれをデータのビットとして、値に変換しています。
この場合は、上側(画面下側)から 1,0,1,0,1,(送り穴),0,0,1 なので 0b10101001 = 169 となります。
読み込みの時には、紙の明るさがいい感じになるように、手で覆って調整していますw
UnitV のプログラムは、MaixPy IDE で作りました。久しぶりだったのですっかり使い方を忘れていた…。
MaixPy IDE
https://dl.sipeed.com/MAIX/MaixPy/ide/
プログラムはこちら。