公開情報と食券券売機からJVMA方式を調査し、コインメックやビルバリを自前で制御します。jvmaこの記事は下記で寄稿した記事を2024年に再構成したものです。;-)から数年経ち、また店舗機器を操作したい気持ちが出てきました。候補はいろいろ思いつきますが、ここでは現金を扱う機器を操作してみます。具体的には、飲料自販機や食券券売機などに利用される「コインメック」や「ビルバリ」と呼ばれる機器を操作します。本稿ではこれらの機器について概要と、操作に必要なプロトコルの調査方法1について述べ、最終的に機器を自前で操作します。機器の概要ここで操作する機器の概要について述べます。Mechanism)の略です。硬貨を扱うことができ、特に本稿では「コインメック」といえば、飲料自販機や食券券売機などで利用されるタイプとします。「コインアクセプタ」などと呼ばれるアーケードゲーム筐体で使われるような機器は対象外です。自販機などもこれらのメーカーが製造したコインメックがよく使われています。海外製の自販機などを国内で利用する際は、海外メーカー製の日本円仕様コインメックが使われることもあるようです3。このタイプのコインメックでは、硬貨(10円・50円・100円・500円)4を投入すると真贋判定が行われ、真貨なら内部のチューブに収金されます。お釣りとしてチューブ内の硬貨を払い出すことも可能です。エスクロという機能もあり、これは100円・500円を投入したが返却する場合に投入硬貨そのものを返す(チューブ内からは払い出さない)機能です。偽貨が投入され、もしその偽貨を真貨と誤判定した場合でもこの機能があることでチューブ内の硬貨(おそらく真貨)と交換されることを防いでいます。この機能を使うと一度の取引で投入できる硬貨が数枚程度に制限されます。これが支障になるようなら、機種を選ぶ際にエスクロ機能の有無や設定で無効にできるか確認する必要があります。これらのコインメックは外部からコマンドを与えることで制御可能です。通信方式として、国内ではJVMA方式5というプロトコルが採用されています。海外ではMDB/ICP、ccTalk、DEXなどが使われているようですがよく調べていないため割愛します。MDBについては仕様が公開されているようで、もし日本円仕様のコインメックが手に入れば6制御しやすいかも知れません。ビルバリ続いてビルバリです。Validator)7の略で、紙幣を扱います。紙幣を投入すると真贋判定が行われ、真券なら金庫に収金されます。本稿ではビルバリといえば「JVMA方式のビルバリ」を指します。この他「パラレル制御方式のビルバリ」も存在し、それぞれの概要は次のとおりです。JVMA方式のビルバリ主に飲料自販機(と一部フジタカ製食券券売機)で用いられる。基本的には低額紙幣(1000円札、2000円札)のみ扱えるが、高性能なものは高額紙幣も扱えるようになる。パラレル制御方式のビルバリ(本稿では使わないためあまり調べていないですが)食券券売機や両替機などで用いられる。だいたい高額紙幣も扱える。真券を投入すると特定ピンがONするらしい。「パラレル制御方式のビルバリ」のほうが使い勝手が良さそうな...。手元にあった(先走って入手した)のはJVMA方式のビルバリなので、これでなんとかするしかありません。コインメックを扱う以上、どのみちJVMA方式を使うことになるのでまぁ良いでしょう。本稿で利用するコインメックとビルバリの制御はJVMA方式で行われることがわかりました。ここではJVMA方式8について調べていきます。マニュアル」11などを定めています。これらもJVMA方式といえばそういえるのかも知れませんが、ここではJVMA方式といえばコインメックとビルバリの通信を指すものとします。JVMA方式の情報はあまり公開されていません。それでも特許公報を調べたり、食券券売機の実機を解析したり、もちろんググりまくった結果ある程度は仕様を把握できました。ここではそうして調べた記録をまとめます。.自動販売機の制御装置.特開2000-172908「従来の自動販売機では、主制御部と各端末制御部との間で行う通信は、図3に示すように、SYNラインをロー(L)にしてから通信を始め、最初の1バイトの途中でハイ(H)に戻す。「また、通信文は、コマンド(COM)とその反転信号で始まる。「コマンドは、先頭1ビットをスタートビットとしてローとし、その後に通信相手を示す5ビットと通信の種類を示す3ビット、パリティビット及びストップビットを持っている。.貨幣鑑別装置の通信監視装置.特開2001-34821「共通バスライン30は本例では3本の通信線からなる通信ライン31と、24V,8V,共通アースライン(GND)の3本の電源線からなる電源ライン32とによって構成されている。「なお、通信ライン31は、主制御部10が各従制御部20(21~26)にコマンドやデータを送信するシリアル信号線としてのOUT信号線311、主制御部10が各従制御部20(21~26)からデータを受信するシリアル信号線としてのIN信号線312、主制御部10がOUT信号線311にコマンドやデータを出力する直前に数100μsのパルス幅で出力する同期信号を送信するための信号線としてのSYN信号線313によって構成されている。「この分散制御システムの制御は、いわゆるポーリング/セレクティング方式によって行われている。主制御部10は各従制御部20(21~26)を規則的に1局ずつアドレス指定してコマンドを送り、そのつど当該の従制御部20から主制御部10へのデータの送信を求める(ポーリング)。別に、主制御部10は必要な従制御部20をアドレス指定してコマンドを送り、当該の従制御部20が主制御部10からのデータを受信することを求める(セレクティング)。24V、8V)、4800ビット/秒、0-24ボルト信号である。「MDB及びVCCSの両標準は、0から31までの装置アドレスを使用する。directional)(制御装置から周辺装置へ)の同期信号線を使用する。富士電機リテイルシステムズ株式会社.自動販売機.特開2009-223677「自販機制御に使用されているシリアル通信仕様では、命令の種類を表す「コマンド」と、コマンドに付随して内容を表す「データ」が存在する。「データとしては8ビットの16進数で表現できる、00H~FFHまでの256通りを扱う。「自販機内の上記主制御部52、各端末53間の通信では、「同期信号」を送受信する為の専用の制御線を別途設けて、この同期信号に同期させてコマンドを送信し、同期信号を送信しないデータ送信と区別するようにしている。「また、同期信号として十分に長い信号を入力することで、端末53をハードリセットできる機能も備えている。「主制御部52は、まず「同期信号線」54上に同期信号を規定時間(短時間;図示の例では0.2μs~2ms)出力(ON)し、続いて「送信線」55上にコマンドを出力する。「上記自端末向けのコマンドを受信した端末53は、「受信線」56上にACK信号を出力する。主制御部52が端末53を制御可能になるまでの間や、端末53が暴走する等して制御不能になった場合等には、主制御部52は図7(b)に示すように「同期信号線」54上に同期信号を一定時間以上(長時間;図示の例では数百ms程度)出力する。「これら回路構成は何れも基本的に、2つのインバータN1、N2が直列に接続された構成となっている。図示のインバータN1、N2は、何れも、オープン・コレクタのNOT回路である。「実際には出力側はNPNトランジスタのオープンコレクタ、入力側はトランジスタのベース入力となっている例が多い。「このオープン出力の特性を生かして、V1、制御電源(5Vや3.3V)と異なる信号伝達用のV2電源(24V等)を、インタフェース電源とすることで、ノイズ等のマージンを向上させている。関係しそうな箇所をまとめると、次のようになります。8V同期線がある「SYNラインをロー(L)にしてから通信を始め、最初の1バイトの途中でハイ(H)に戻す。」(特開2000-172908)「コマンドやデータを出力する直前に数100μsのパルス幅で出力」(特開2001-34821)「同期信号に同期させてコマンドを送信し、同期信号を送信しないデータ送信と区別」(特開2009-223677)「同期信号を規定時間(短時間;図示の例では0.2μs~2ms)出力(ON)し、続いて「送信線」55上にコマンドを出力する。受信4800bps8bitパリティあり(奇数か偶数かは不明だが、2パターン試せば良い)出力はオープンコレクタコマンドについて上位5bitは通信相手のアドレス、下位3bitは通信の種類を示すコマンドの後には、コマンドの反転信号が続くコマンド送信後にはACKが返るデータが存在する場合はこのACKを受信してから送る多少曖昧な箇所はありますが、やる気が出てきました。この時点でコインメックやビルバリ側との通信を試す?ファジング的にコマンドも投げてみる?という気になってきます。先ほどの特許情報や、その他インターネットの情報も用いて時間をかければJVMA方式による操作が出来そうな気がしてきました。いや...本当かな...正常に動いている機器を解析したほうが楽じゃない?ということで、ヤフオクから次図の食券券売機を入手しました。本当は自販機が欲しかったのですが、土地も倉庫も無く、まして自宅室内にも置けるわけもなく12、コインメックが付いていて室内に置けるくらいには小型な機器ということで卓上券売機にしました。中古、サポート無し、動作不安定という筐体です。実際、(あまり検証には影響しませんが)食券への印字はかなり薄い状態でした。この食券券売機には「パラレル制御方式のビルバリ」が備わっていましたが、それもまともに使えない状態です。そのためパラレル制御方式のビルバリの解析は出来ませんでした。結局「JVMA方式のビルバリ」が正常に動いている機器は入手できておらず、この操作については特許公報とインターネットの情報のみを頼りにしています。本当に券売機まで買う必要があったかな...というと、もしかしたら無くてもいけたかも知れません。後で知ったことですがオフィス複合機の課金装置として使われる「コインベンダー」にもコインメックや、状態によってはビルバリも備わっているようです。中古コインベンダーは中古券売機よりも安く取引されており、こちらを購入すべきだったかも知れません。(コインベンダーの動作として、複合機などの上位機器が無くても動くのかは不明です。以上でコインメックとビルバリの操作方法を完全に理解したことにして、実際に操作してみます。同期線の扱いでタイミングが重視されそうなことを踏まえるとOSの載ったボードからは制御したくありません。そこで間に中間ボードを挟み、この中間ボードがコインメックとビルバリを制御、中間ボードは上位機器から操作される構成にします。挟むものは何でも良いです。Picoを使うことにしました。実際使ってみると、上位機器ともUSBシリアルで利用できますし、UARTのDMA転送が簡単だったり、マルチコアが使えるのも便利でした。これが600円程度なら他のボード使う人なんて居なくなりますわ(お嬢様)。前述した特許公報よりコインメックとビルバリの電源として24Vと8Vが必要です。24Vについては秋月で売っているACアダプタを利用しています。8Vについてはなかなか選択肢がありません。最終的にはスイッチングレギュレータ(NJW1933)で24Vから降圧することにしました。本当は自分で降圧回路を組むとトラブルが起きそうなのでちょっと...極力簡単にしたかったのですが仕方ありません。して出来上がった中間ボードは、次の図のとおりです。中間ボードこれを利用してなんかやんやし、次の動画のような精算機?コインベンダー?を製作できました。おわりにJVMA方式でコインメックとビルバリを制御しました。冒頭で述べたとおり、この記事は下記を再構成したものです。SIGCOWW「精算機作るよ!」(2022年)実は、この続きとして下記の記事もありました。JVMA方式とはあまり関係ない話でした。Footnotes操作方法そのもの(プロトコルのコマンド)については述べません。↩2018年ごろまではPanasonicも、また時期不明ですが過去にはサンデンも作っていたようです。いうコインメックのJPY仕様品が使われていました。(CPI)の一部になっていました。ちなみに、コンラックスもCPIグループのようです。機種によっては5円やメダルにも対応しています。(日本自動販売システム機械工業会)の略称からこう呼ばれています。厳密さが求められる際に使うのは「紙幣鑑別機」らしいです。文字を小さくしたら識別と鑑別の識別と鑑別に失敗しそうですね。System」と書かれていることもありました。あと海外メーカーの資料だと「JPSTD」とも。電子マネー関連と思われるが内容は不明。自販機と赤外線通信を行う際の仕様と思われるが内容は不明。↩JIS規格「自動販売機の据付基準」もあるが別もの?やっぱり内容は不明。蔵書されているようなのでいつか確認しに行きたい。UPDATE同人イベントへのサークル参加にあたってレジを製作しました。製電子棚札を解析し、表示内容を書き換えます。UPDATEEPSON製レシートプリンタ、東芝テック製レシートプリンタ、EPSON製カスタマディスプレイをESC/POSで操作します。機器の操作おわりにFootnotes!!!XGitHubお問い合わせ。