あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

コインセレクターをちゃんとつなぎつつレシートプリント機能に着手

Raspberry Pi Advent Calendar 19日目です。18日目はunaristさんのMIDIバイスRaspberry Piで動かすお話でした。初代Model Bアツい。初代でももちろんBullseyeも動きますしね(たぶんLiteじゃないときついけど)。

adventar.org

コミケまであと2週間を切ったけど、レジアプリは……

今日新刊のコピー誌を印刷・製本し終えました。

f:id:Akkiesoft:20211218223110j:plain

売り物は用意できたので、あとはレジアプリですが、進捗していませんでした……。実は、コイン投入時に誤作動が起こしがちで、コイン投入口にコインを当てこするだけでたまにカウントすることが判明していたのですが、対策を考えるのが面倒で放置になっていました。

もともとの配線はコインセレクターの5V・GND・100円の信号線をほぼ直結していたのですが、ググってみるとどうもコインセレクターはサージが起きやすいらしく、コインセレクターで工作している人達は大体リレー回路を使っていることがわかりました。ウワーめんどくせーという感じになったのですが、100円専用のお遊び要素だとしてもカウントミスはやはり避けたいので導入します。

リレーということは、電源を分離することになりそうなので、この際USBから5V取れるブツを用意して分離していきます。ちょうどMicroUSBのブレイクアウトがあったので、これにピンヘッダーを立てて、D+とD-をショートさせることで電源を取り出せるようにします。

f:id:Akkiesoft:20211218221657j:plain

で、5V電源をリレーモジュールとコインセレクターに食わせて、100円の信号線をリレーモジュールのIN1に接続します。Raspberry Pi側からはGPIO18とGNDをリレーモジュールのK1に接続します。コード側の変更はありません。

f:id:Akkiesoft:20211218221744j:plain

では動作確認。以前はコイン投入口にカツカツ100円玉を当てたりするだけでまれによくカウントされていましたが、それがなくなりました。投入がしっかり判定できていて良さそうです。リレーモジュールが一瞬ピカッと光るのがいい。

social.mikutter.hachune.net

電源分離とリレーでうまくいくようなら、もともとコインセレクターについていたソレノイドのコインシャッターもまたつけられそうですが、昇圧回路とかを考えるのも手間なので今回は外したままにしておきましょう。アレも動くとカチカチ言ってかっこいいんですけどね。

リレーでうまくいくことはわかったので、1ch版のリレーモジュールを買うか否かが悩みどころです。4chはでかすぎるんよ。

レシート!

せっかくレシートプリンターがあるので、レシートというか、私がこれを見ながら商品のピックアップをやる感じの紙が欲しく、レシートをデザインしていきます。レジアプリの操作を売り手買い手のどちらがやるかのオペレーションが固まっていないのが悪いせいではあるのですが……。

さておき、サークルのロゴを出そうとしたところ、画像出力がバグっているのかうまく出せず、断念。雑にpngじゃなくて、ESCPOSに合わせてちゃんとしたデータを食わせたらいいのかなあ?

f:id:Akkiesoft:20211218222757j:plain

まあ、今回はテキストで妥協します。と思ったら文字サイズ変更もライブラリの仕様が変わったらしく、サイズ指定の他にcustom_size=Trueとか言う宣言的なものが必要になっていて、これも出すまでに苦労しました。そのへんがクリアできれば、あとはハードコードでざっくりデザインです。

from datetime import datetime
from escpos import printer
from jptext import jptext

Printer = printer.Usb(0x08a6,0x0041)

# 1x: 16文字
#Printer._raw(jptext("あいうえおかきくけこさしすせそた\n"))
# 2x:  8文字
#Printer._raw(jptext("あいうえおかきく\n"))

Printer.set(align="center",width=2,height=2,custom_size=True)
Printer._raw(jptext("こくだランド\n"))
Printer.set(align="center",width=1,height=1)
Printer._raw(jptext("https://l.kokuda.org/\n"))
Printer._raw(jptext("コミックマーケット99 東5-テ23a\n\n"))
Printer.set(align="left",width=1,height=1)
Printer._raw(jptext("ミ★こくだランドでお買い上げ\n"))
Printer._raw(jptext("  ありがとうございます。\n"))
Printer._raw(jptext("  良いお年をお過ごしください!\n\n"))

now = datetime.now().strftime("%Y年%m月%d日 %H:%M\n\n")
Printer._raw(jptext(now))

Printer._raw(jptext("あっきぃのラズピッピ4        500\n"))
Printer._raw(jptext("あっきぃのラズピッピ5        500\n"))
Printer._raw(jptext("あっきぃのラズピッピPetit-3  100\n"))
Printer._raw(jptext("EJECTO 2012-2017             800\n"))
Printer._raw(jptext("Eject2020                    300\n"))
Printer._raw(jptext("麦子アクリルキーホルダー     500\n"))
Printer._raw(jptext("TinyPicoKeyピン付き          300\n"))
Printer._raw(jptext("TinyPicoKey板のみ            200\n"))
Printer._raw(jptext("--------------------------------\n"))
Printer.set(width=2,height=1,custom_size=True)
Printer._raw(jptext("合 計     3,200\n"))
Printer.set(width=1,height=1,custom_size=True)
Printer._raw(jptext("交通IC支払                 3,200\n"))
Printer._raw(jptext("上記領収致しました。\n\n\n"))

このスクリプトをそのまま使う人はいないと思いますが、jptextはこれです

印刷結果はこちら。やべ、紙がなくなってしまった。ヨドバシでポチりました。

f:id:Akkiesoft:20211218221150j:plain

あとはレジアプリへの組み込みをしていく感じになりますが、なんか若干体調不良気味?なので、健康第一で今日はデザインまでにしておきます。

組み込むために必要な実装が思い浮かべると、複数個買ったときの表記とか、両端揃えとかの処理とか、支払い方法に応じた表記とか、まあまあやること多くてだるそうだなあ?という感じです。レシートに特化したプロダクトがあるのも知ってはいるのですが今回はパスして、なんとか今日作ったやつベースでゴリゴリしていくつもりです。