この記事は下記で寄稿した記事を2024年に再構成したものです。
- COSMIC L0 Vol.3 - SIGCOWW「[WIP] ESC/POSびより ざんげ」(2017年)
- COSMIC L0 Vol.4 - SIGCOWW「スーパーなデバイスでライフハック」(2017年)
- COSMIC L0 SP1 - SIGCOWW「イシダ製電子棚札の解析 ;-)」(2019年)
はじめに
本稿では、「電子棚札」の表示書き換えについて述べています。 電子棚札 (ESL: Electronic Shelf Label) とは電子的な棚札、棚札とは棚に貼る値札のことであり、最近ではスーパーや家電量販店などの小売店でも目にするようになりました。
電子棚札の表示方式としては、少なくとも「電子ペーパーを用いたタイプ」「セグメント液晶を用いたタイプ」の2種類を見かけます。 後者は割と昔の1990年代ごろから存在するようで、次の図のとおり2009年(!)に放送された「けいおん!」でもそれっぽいものが見えます1 2 3。
けいおん!13話「冬の日!」より ©かきふらい・芳文社/桜高軽音部
今回、そのようなセグメント液晶を用いたタイプの電子棚札を入手したので、解析し表示内容の書き換えを試します。 表示内容の書き換えについては、電子棚札に備わる赤外線通信機能を利用する方法、および内部の液晶を部品として扱って制御することで表示を書き換える方法について述べています。
入手した電子棚札の概要
入手した電子棚札について、まず外観は次の図のとおりで「何か表示のある小さな棚札」と「何も表示されていない大きな棚札」の2種類があります。
外観
どちらも内部には、セグメント液晶ディスプレイ・制御基板・コイン電池が入っています。 これらは数年前に秋月電子で売られていたもので、調べてみると株式会社イシダがPRICER社(スウェーデン)と協力し販売しているようです。 PRICERが直接販売する電子棚札では「€」「$」「Kr」「£」の通貨しか対応していないところ、 この電子棚札には、日本語で「円」や「お買得品」といった表示があるため、イシダ向けにカスタマイズされていると思われます。
電子棚札では値段を表示する以上、表示を書き換えるためのインターフェースがあります。 PRICERの電子棚札では、赤外線通信により表示書き換えを実現しています。 でも赤外線通信だと、人や品出しのワゴンで隠れてしまい通信出来なくなるのでは? 確かに、このリスクを回避するためか現代では電波を使う製品を販売しているメーカーもあります。 ただ、電子棚札が登場した1990年代当時でコイン電池で稼働させることを考えると、赤外線通信を採用したのも納得です。 ZigBeeとかBLEとか無いんで…920MHz帯は当時から国内外で使えたのかは分かりませんが…。 (さらに初期の電子棚札は有線でした、という記事を後述の文献調査で見た覚えがあります。イシダかPRICERが西友の店舗に導入したのがその方式で…という感じだったようなそうではなかったような気がしますが、詳細は忘れました。)
赤外線通信の構成は次の図のとおりで、ESLキー(電子棚札の管理用端末)または天井に設置されたトランシーバが赤外線で通信、そのトランシーバはベースステーションという親玉のような機器を経由して、Pricer Server(管理サーバ)とやりとりしています。
電子棚札システム
赤外線通信による操作
早速、赤外線通信で電子棚札を操作したいと思います。
ただし仕様は謎なので、トランシーバと棚札との赤外線通信を横から受信できるか試しましょう。 実際受信できるようになったとして、スーパーでうろうろ歩き回るのか?価格更新のタイミングに遭遇できるのか?という問題4はありますが、それは置いておきます。
いままで触れてきませんでしたが、ここで使われている赤外線通信は搬送周波数が特殊です。 一般的なテレビやエアコンのリモコンの場合、信号を38kHzの矩形波で変調した上で赤外線LEDを発行させています。 ところが、棚札で使われる赤外線通信の搬送周波数は1245kHz(イシダのカタログより)です。 市販されている赤外線受信モジュールでは受信不可、さらに棚札を分解しても受光素子がそのままASICに繋がっており外部からは何もできません5。
とはいえ、受信できる方法はあるのでは? 発光側として、棚札の赤外線通信に使われる波長である880nm(PRICERのカタログより)を出す赤外線通信LEDを用意し、ひとまず1245kHzでスイッチングさせました。 なんとかしてこれを受信しましょう。
赤外線通信の受信
全国0x1 4 da 人のイシダファンにとっては残念なお知らせですが、結論からいえばダメでした。 赤外線通信を受信するには、「受光素子」のほか「アンプ」「リミッタ」「BPF」「検波回路」「コンパレータ」といったコンポーネントを組み合わせた回路が必要になります。 これが搬送波38kHzなど広く使われている方式であれば「受信モジュール」として流通しており簡単に扱えます。 しかし、今回はその構成をイチから作ることになり、こうした回路を扱う技量は自身にはありません。 せめてアナログ回路を肩代わりしてくれそうなICを試してみましたが、動きません。 ブレッドボードで試していたのが悪い?と思い基板を起こしてみましたが変わりませんでした。おわり。
次に試したのはSDR機器です。 搬送周波数が1245kHzなのでもはや電波相当じゃないか? SDRの入力に受光素子を接続すれば電波として扱えるのではないか?と考えました。 結果、わずかに反応した気がしますがノイズと区別できないレベルです。おわり。
ヤフオクで電子棚札のトランシーバが出ていたので入手して調べてみましたが、何も分かりませんでした! いかがでしたか?おわり。
通信仕様の調査
受信がどうしてもできないので通信の仕様を調べます。 運が良ければ、それに従って赤外線LEDを発光させて棚札を操作できます。
まず、海外で電子棚札の表示を書き換えているfurrtek氏のプロジェクトを見つけました。 これは非常に参考になりましたが、製品の世代差によるものかイシダがカスタムしているのか、この通りに実施しても動きません。
そこで、furrtek氏がYouTubeに上げたこの件の動画(フランス語)をGoogle Cloud VisionやGoogle Cloud Speech経由で見たり、 GitHubで「PRICER AB」という文字列を検索したり、 PRICERの日本法人やイシダが書いた特許・書籍を片っ端から確認したり、 一般に流通していない資料は国会図書館に行って確認したり、 もちろんググりまくって調査しました。
se.pricer
という文字列をパッケージ名として持つJavaプログラムについてQ&Aサイトで質問している人を見つけたり、 電子ペーパータイプの電子棚札を大学で出席管理に使った事例6は見つかりましたが、表示書き換えそのものについては活かせません。 また、PRICERとの共同研究と思われる棚札向け画像圧縮法や棚へ固定する機構の検討、ベースステーションのエミュレータを作る報告7もありましたが、参考文献にはPRICERの内部資料が載っており、アクセスできない我々はこの先生きのこれません。 さらに、機能材料という雑誌8では、電子ペーパータイプの棚札では4PSKとCMI (Coded Mark Inversion) を組み合わせたMCMI (Modified CMI)というイシダが開発した通信方式が使われていると述べられていますが、今回はセグメント液晶タイプの話なのでやはり活かせません。
最終的に、ある海外の代理店Webサイトで「ISTT4」という棚札の管理ツールが公開されているのを見つけました。 しかもC#.NETで書かれており、実質ソースコードが公開されているようなものです。 若干出所が怪しいですが、このツールにはトランシーバと棚札の間で通信できているか確認する処理が実装されていて解析に役立ちました。
通信仕様
こうして調査した通信の仕様をまとめます。
物理層
まず物理層です。 送信側はある信号を1245kHzで変調し、波長880nmのLEDを点灯させます。
ある信号とは、PP4C (Pricer Protocol Version 4 Revision C) というPRICER独自の方式によって変調された信号のことです。 PP4Cは4PPM(4値パルス位置変調、4 Pulse Position Modulation)の一種で、2ビット単位で次の図に示す信号に変換されます。
PP4Cの変調
なお、“HIGH”の部分は連続した場合は連続すると一つにまとめられるようです9。
この2ビットは、もともと4つで1バイトを構成しています。 ただしエンディアンが独特で、「AB CD EF GH
」というビットの並びは「GH EF CD AB
」という並びにしてから送信しなければなりません。
データリンク層
PP4Cの上で流れるデータについて述べます。
PP4Cのデータは次の図に示す構造になっています。
PP4Cのデータ構造
PLIDは棚札本体に貼られたバーコードから計算され、具体的にはfurrtek氏のコードのとおり算出できます。 また、チェックサムとなるCRCはCRC-16-CCITTにおいて生成多項式と初期値をともに0x8408にすると計算できます。
ここで、Cmd (Command)を0x17
、Payloadを00AA00
、つまり16進数表記で「84 PLID 1700AA CRC
」というデータを電子棚札に送ると、ACKとして棚札の赤外線LEDが光ってくれます10。 ACKは見えにくいので、赤外線カットフィルタの甘い安物のWebカメラを通して見るか、LEDにかかる電圧をロジアナでトリガーしておくと分かりやすいです。
そして念願の表示書き換えですが、Commandを0x37
、Payloadを「0x000000 + ビット列
」にすると実現できます。 (また、あまり調べていませんが、Commandを0x35
にすると点滅表示になる気配もあります) 「ビット列」というのは184 bitsで構成されており、各ビットが液晶のセグメントに対応しているようです11。 全セグメントを点灯させる場合、「84[PLID]37000000F0E52EFAE12BBFF88FFFB8CB2FFEE33FEEF28BFFF88FBB[CRC]
」というデータを送ることになるでしょう。
棚札(小)において各ビットとセグメントの対応を頑張って見つけて、さらにコマンドを作成しやすくするfudafudaという支援ツールも作ったので良ければ使ってください。 (※このツールはPP4Cのデータ全体を作成します。後述するfurrtek氏のrawcmd.py
を使う場合などはCmdとPayload部分のみで十分なのでその辺は調整してください。)
次に、棚札(大)の配置も調査したいところですが、残念ながらそれはできませんでした。 詳細は後述しますが、この棚札では一度電池がなくなってしまうと、再び電源を入れても一切の操作を受け付けなくなるためです。 悲しいですね。
送信編
通信の仕様が分かったので、いよいよ棚札の表示を書き換えてみます。
イチから1245kHzで変調して…というのはしんどいところですが、furrtek氏が送信用のソフトウェアとハードウェア構成を公開していました。
furrtek/PrecIR
https://github.com/furrtek/PrecIR
次の図のように回路を構成12し、AVRマイコンに対してPCからデータを送ると、PP4Cに変換してGPIOを操作してくれます。 電子ペーパータイプの電子棚札向けに書かれており、本稿で0x84
としているヘッダが0x85
になっている点など一部直すところはありますが、非常に簡単になります。
PrecIRを用いた書き込みの様子
これをベースにし、AVRマイコンとPCを接続のうえPCから次のようなコマンドを実行してみます。
$ python rawcmd.py /dev/ttyS3 D4586030516411091 \
37000000F0E52EFAE12BBFF88FFFB8CB2FFEE33FEEF28BFFF88FBB 100
末尾の「100」は100回繰り返し送信する、という意味です。 というのも、データ長が長くなるにつれて受信が難しくなるようで、ここでは100回再送することによってデータの到達性を上げています。 しかしこれでもうまく受信されないことがあり、先ほどのコマンドを何度も実行するはめになることもあります。
運良く受信されると、次の図のように棚札のセグメントが全点灯し、少し変えれば^_^の表示もできるようになりました。
全点灯 | これには棚札もニッコリ |
この様子は次に示す動画にも収めています。
セグメント液晶の直接制御
先ほど触れなかった棚札(大)についてですが、そもそも何故触れなかったのでしょう? それは棚札(大)は電池が切れてしまったこと、そして一度電池が切れてしまうと赤外線による操作を受け付けなくなるためです。 というのも、furrtek氏によると棚札はRAMしか備えていないため電源断によりファームウェアが揮発するとのことで、打つ手がありません。
そこで、棚札(大)から液晶だけを取り出し、それを制御することで表示書き換えを実現します。
駆動方法
セグメント液晶の駆動方法は、セグメントLEDと近いです。 適切に電圧を印加すると黒く見えます…くらいしか説明できないため、詳細はMicrochip の資料などをご覧ください。
おぼろげな説明としては、セグメント液晶にはSEG端子とCOM端子があります。 たとえば、SEG端子に電圧を印加、COM端子にGNDを繋ぐとその間のセグメントが点灯します。 電圧には、だいたい1Vから3Vほどの電圧が使われるようです。 ただ、長時間にわたり直流電圧を与えると焼き付きが発生する恐れがあり、駆動には交流電圧が必要です。 交流といってもPWMによる矩形波で十分で、その周波数は64Hzから1000Hzほどが用いられるようです。 周波数が低いとコントラスト低下、高いと消費電力の増加を招くそうですが、あまり気にしなくて良いでしょう。
ピンアサイン解析
駆動方法が分かっていても、ピンとセグメントの対応が分からないなら話になりません。 当然そんな資料は見つからなかったため、次図のように分解し地道にピンアサインを調べます。
分解の様子
なお、入手した電子棚札には、価格を表示するメイン液晶と、「お買得品」のみを表示するためのサブ液晶があります。 ここでは主にメイン液晶を解析します。サブ液晶のことは忘れてください。
セグメント液晶と基板は0.9mmピッチのヒートシールコネクタによって溶着されており、このままでは解析が困難です。 露出しているパッドからUEWを引き出そうとしましたが、3ピン目あたりで心が折れました。 そこで、次の図に示すとおりヒートシールコネクタを剥がし、aitendoで買った変換基板にアイロンで再融着し直しています。
接続の様子
このとき、ある端子にPWM信号を印加、別のある端子にはGNDを接続します。 何か点灯13したら、どちらかの端子がCOMとSEGです。 この方法でピンアサインを解析していくわけですが、よく見ると次の図のように電極が露出した怪しい箇所があります。
怪しい端子
ここから優先的に確認すると、これらの端子はCOMであることが分かり解析の手助けになりました。
こうしてピンアサインが判明しました。 各セグメントとピン番号の対応を次に示します。
セグメント番号の一覧
PIN番号 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
com0 (pin3) | 1f | 1a | 1b | 2f | 2a | 2b | 3f | 3a | 3b | 4f | 4a | 4b | 5f |
com1 (pin4) | 1e | 1g | 1c | 2e | 2g | 2c | 3e | 3g | 3c | 4e | 4g | 4c | 5e |
com2 (pin5) | REG | 1d | p1 | 2d | 3d | 4d | y1 | ||||||
PIN番号 | 19 | 20 | 21 | 22 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
com0 | 5a | 5b | 6f | 6a | 6b | 7f | 7a | 7b | 8f | 8a | 8b | 9f | 9a |
com1 | 5g | 5c | 6e | 6g | 6c | 7e | 7g | 7c | 8e | 8g | 8c | 9e | 9g |
com2 | 5d | p2 | 6d | 7d | 12d | 8d | 12c | 12b | 9d | ||||
PIN番号 | 36 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | |||||
com0 | 9b | 10f | 10a | 10b | 11f | 11a | 11b | ||||||
com1 | 9c | 10e | 10g | 10c | 11e | 11g | 11c | ||||||
com2 | p3 | 12a | 10d | 12f | 12g | 11d | 12e | PRM | |||||
PIN番号 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | |
comA (pin25) | 13f | 13a | 13b | 14f | 14a | 14b | 15f | 15a | 15b | 16f | 16a | 16b | |
comB (pin24) | 13f | 13a | 13b | 14f | 14a | 14b | 15f | 15a | 15b | 16f | 16a | 16b | |
comC (pin23) | y2 | 13d | p4 | 14d | p5 | 15d | p6 | y3 | 16d |
え、分かりにくい? いえ、別に自分はfudafuda (AkizukiBig)のようなツールを作ったので問題ありません、続けてください。 はい、わかりました。
pin55の「お買得品」については、他のCOMで点灯するようにするとサブ液晶と連動する可能性があります。 それは、メイン液晶とサブ液晶の一部端子は基板を介して同じ配線に接続されているためです。 しかし、まったく検証していないため、やはりサブ液晶のことは忘れます。
セグメント液晶の駆動
判明したピンアサインを基にセグメント液晶を駆動させます。 といっても、すべてを自前でやるのは骨が折れます。 世の中にはLCDドライバという便利なものがあるので、これを利用します。 今回は、その中でも入手性が高い上に簡単に扱える「HT1621」を用いました。
HT1621では、4つまでのCOM端子と32個までのSEG端子を制御できます。 残念ながら、今回の液晶に対しては端子が足りないため、全セグメントの独立した制御はできません。 ドライバを複数使えば多少マシになりますが、そこまでする必要はあるかと疑問が残ります。 そこで、利用頻度が低いと考えられるセグメント同士を共通の配線で制御することにし、端子不足を解決しました。
ドライバをLPC1114で制御することにし、電子棚札の基板が入っていたケースに収まるようなサイズで基板を設計すると、次の図のとおりとなります。
基板の設計(※コイン電池ホルダーの下に配線層やレジストを張ると困る。厚みが出て電池と電極が接触せずハンダを盛るはめになるので)
この設計を基に基板を製造してもらい、組み立てると次の図のようになりました。
その1 | その2 | その3 |
おわりに
秋月電子で売られていたイシダ (PRICER) 製電子棚札を解析し、表示内容を書き換えました。
2017年~2019年ごろまでに実施した内容を2024年に再構成しましたが、当時の熱意がありすぎる。 これをやって何になったのか? 当時は書き換えのコマンドをfurrtek氏の通りに実施しても通らず、コマンドが違うのか?それとも自分の理解が足りないのか?全く分からない中で、ブルートフォースのようにコマンドを試していました。 forループでコマンドを探して、いつの間にか電子棚札の表示が変わっていたときは感動しました。 ただ、その後もコマンドが受信されない(コマンドは正しかったがノイズか何かで受信されない。当時はコマンドが合っているかも分からなかったので何が正しくて何が間違っているのか分からない状態…)現象でもあり、正確なコマンドの特定には時間がかかりました。 キツかったです。
おまけ: 電子ペーパータイプの書き換え
ebayにて、PRICERが直販していると思われる電子ペーパータイプの電子棚札を入手しました。 このタイプはfurrtek氏により解析しつくされています。
PrecIRをそのまま使うだけで、次の図のように表示を書き換えできました。
電子ペーパータイプの表示書き換え
その他、PRICERやイシダとは関係ありませんが、ZKONG製の電子棚札も入手しました。 今後この電子棚札の書き換えもしたいような…いやもう当時のような思いはしたくないような…です。 でも分解くらいはそのうちやってみようと思います。
Footnotes
アニメ「こぴはん」第4弾のコンビニにも電子棚札らしきものが出てきます。なお、第3弾でもコンビニが映りますがその際は紙製の棚札のようでした。設備更新したのかな?また、第5弾でもコンビニは映りますが棚札自体は映らず確認できません。 ↩
アニメ「citrus」にも出てきた気がするのですが当該シーンを見つけられませんでした。藍原芽衣と柚子さんとさんが一緒にスーパーで買い物しているところだったような…と思いますが百合オタクが見た夢だったかも知れません。なお、作中に一瞬出てきた豊洲の「フードストアあおき」では、少なくともcitrusの放送当時はセグメント液晶タイプの電子棚札が使われていました。でもその後無くなったような気がするようなしないような…でいまの状況は未確認です。 ↩
アニメ「フレームアームズ・ガール」にはたびたび「いなげや」が登場します。いなげやといえば電子棚札が使われていますが…作中では棚札が映ることは無かったと思います。 ↩
ドラマや映画向けのロケ地としてスペースを貸し出しているスーパーで電子棚札を使っているところもあり、そういった店舗と交渉すればなんとかなるかな…と思ったこともありました。 ↩
坂本將暢,菱田隆彰,中村栄治,株式会社イシダESL事業部.“電子棚札の教育への応用”.三恵社.2011. ↩
Kallas Viktor. “Design and Development of a Base Station Emulator”. 2006. ↩
水川繁光,電子ペーパーの利用―電子値札(ESL)―,機能材料,2011年1月号,pp.43-55. ↩
LOW区間さえしっかりしていれば良い?例えばHIGHが2つ分連続して80usでも実は良い?かも知れませんが試していません。 ↩
エイリアスなのか「
84 PLID 97000000 CRC
」というデータでも反応します。 ↩ただしフルビット使われるわけではありません。ここで用いた棚札よりセグメントの多い棚札用に多く確保しているのではと思われます。 ↩
ちゃんと基板に起こしたいところ…もっと言えばRaspberry Pi Picoで実装したいところです。 ↩
インピーダンスが高く、本当に何もしていなくても点灯することもあります。 ↩