M5StickCのQRCodeを調べてみた

※本ブログは現時点での情報です、最新情報はM5StickC非公式日本語リファレンスを参照してください。

単機能なんで、簡単だろうかと思ったら、いろいろわかりました。

QRコードとは?

二次元コードの一種で、一番使われている形式です。QRコードにもモデル1、モデル2、マイクロQRコードといろいろな種類があり、M5StickCで利用できるのは一番一般的なモデル2の誤り訂正レベルLになります。

iPhoneで読み取るためには

ここが一番重要で、普通に読み取ろうとしても読み取れません!

まず液晶の明るさが明るすぎて、画面が白飛びします。そしてQRコードが小さいので認識しません。カメラを近づけるとピンぼけします。

しかしながら、カメラの拡大機能を使って一番拡大すると、すんなり読み取れます。いままでiPhoneで試行錯誤しながらQRコード読み取っていた努力はなんだったんだろう、、、

サンプルコード

#include <M5StickC.h>

void setup() {
  M5.begin();

  M5.Lcd.qrcode("吾輩わがはいは猫である。名前はまだ無い。 どこで生れたかとんと見当けんとうがつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪どうあくな種族であったそうだ。この書生というのは時々我々を捕つかまえて煮にて食うという話である。",
    0, 45, 80, 15);
}

void loop() {
}

限界近くまで文字を詰め込んだ例です。こうみるとかなりシンプルですが、公式スケッチ例にはない、省略されたパラメータも一緒に指定したほうがよいと思います。

M5.Lcd.qrcode関数について

宣言

void 	qrcode (const char *string, uint16_t x=5, uint16_t y=45, uint8_t width=70, uint8_t version=7);
void 	qrcode (const String &string, uint16_t x=5, uint16_t y=45, uint8_t width=70, uint8_t version=7);

文字列の型が違うだけで、他は一緒の関数がM5Displayクラスで宣言されています。関数の実体はqrcode.hにありますが、そちらは通常気にしなくても良いと思います。

引数

  • string : 表示させる文字列
  • x : 画面上の表示座標
  • y : 画面上の表示座標
  • width : QRコードの大きさ
  • version : QRコードのバージョン

できるだけ大きくQRコードを表示するためには、M5StickCの液晶画面のサイズである80をwidthに指定し、それにともないxを0にして幅いっぱいに表示させる必要があります。

また、versionが一番重要で、ここの指定で表示できる文字数などが決まります。

QRコードのバージョンについて

Versionセル数倍率横幅バイナリ
12136317
22537532
32925853
43326678
537274106
641141134
745145154
849149192
953153230
1057157271
1161161321
1265165367
1369169425
1473173458
1577177520

上記が指定できるバージョンです。ちなみに0を指定するとM5StickCがハングアップしますのでご注意ください。

セル数が重要で、縦横のドット数になります。画面いっぱいに表示する場合には80ドットまで利用できるので、80未満になるように拡大されて表示されます。

そのためバージョン1でもバージョン2でも表示されるサイズは違いますが、同じ倍率3なので、認識率は変わりません。

そのため倍率の変わり目のバージョン2、5、15を選ぶのが良いでしょう。またバージョンが上がると表示できる文字数が増えます。

バイナリと表現されているところが、表現できるバイト数です。数字だけとか記号が含まれない英数のみであれば、もう少し文字数が増えますが、URLとかテキストとかを表示する場合には、バイト数換算で計算したほうがわかりやすいと思います。

規定バイト数を超えたデータを表示した場合には、一見QRコードは表示されているように見えますが、認識できませんので注意しましょう。

  • バージョン2 : 32バイトまで
  • バージョン5 : 106バイトまで
  • バージョン15 : 520バイトまで

普段使うのは5あたりが無難な気がします。15はちょっといかついです。

まとめ

一番苦労したのがiPhoneでの読み取り方法でした。。。画面の明るさは9ぐらいが白飛びしにくいですが、拡大したら8から15までで読み取れました。

コメント