Arduino入門

2. デバイス&サンプル

5. 拡張モジュール&サンプル

アクセサリー

6. アプリケーション

Module13.2 QRCode Arduino 使用チュートリアル

1. 準備

  1. 環境構築:Arduino IDE入門チュートリアル を参考に IDE インストールを完了し、実際に使用する開発ボードに応じて対応するボードマネージャおよび必要なドライバライブラリをインストールしてください。
  2. 使用ライブラリ:
  1. 使用ハードウェア:

2. 注意事項

ピンの互換性
各ホストのピン配置が異なるため、ご使用前に製品ドキュメントのピン互換表を参照し、実際の接続状況に応じてサンプルプログラムを修正してください。

3. サンプルプログラム

本チュートリアルで使用するコントローラは Basic v2.7 で、Module13.2 QRCode と組み合わせて一次元 / 二次元コードの解析を行います。使用前に下図を参照し、ピンスイッチを指定位置に切り替えてください。

3.1 ピンスイッチ設定

本サンプルはコントローラ Basic v2.7 と組み合わせ、G34 (RX) および G12 (TX) を通信ピンとして使用します。具体的なスイッチ設定は以下の図をご覧ください。

3.2 ベーシックスキャンプログラム

本サンプルプログラムでは、Module13.2 QRCode をボタン制御スキャンモードに設定します。ボタン A をクリックすると UART 経由でスキャン開始 / 停止コマンドを送信します。ボタン B を押し続けると、モジュールの TRIG ピンを制御してスキャンを開始し、ボタン B を離すとスキャンを停止します。スキャンが成功すると、デコード結果がディスプレイに表示されます。

cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
/*
 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
 *
 * SPDX-License-Identifier: MIT
 */
#include <Arduino.h>
#include <M5Unified.h>
#include <M5ModuleQRCode.h>
M5ModuleQRCode module_qrcode;
void setup()
{
    M5.begin();
    M5.Display.setFont(&fonts::efontCN_16);
    M5.Display.setTextScroll(true);
    /* Set module config */
    auto cfg     = module_qrcode.getConfig();
    cfg.pin_tx   = 12;
    cfg.pin_rx   = 34;
    cfg.baudrate = 115200;
    cfg.serial   = &Serial1;
    module_qrcode.setConfig(cfg);
    /* Init module */
    while (!module_qrcode.begin()) {
        M5.Display.setTextColor(TFT_RED);
        M5.Display.println(">> Init module failed, retry...");
        delay(1000);
    }
    M5.Display.setTextColor(TFT_WHITE);
    M5.Display.println(">> Init module success");
    /* Set light mode */
    M5.Display.println(">> Set lights mode");
    module_qrcode.setFillLightMode(QRCodeM14::FILL_LIGHT_ON_DECODE);
    module_qrcode.setPosLightMode(QRCodeM14::POS_LIGHT_ON_DECODE);
    /* Set trigger mode */
    M5.Display.println(">> Set trigger mode to continuous");
    module_qrcode.setTriggerMode(QRCodeM14::TRIGGER_MODE_CONTINUOUS);
    module_qrcode.stopDecode();
    M5.Display.println(">> Click BtnA to toggle scanning");
}
void loop()
{
    M5.update();
    static bool is_scanning = false;
    /* If BtnA was clicked */
    if (M5.BtnA.wasClicked()) {
        is_scanning = !is_scanning;
        if (is_scanning) {
            module_qrcode.startDecode();
        } else {
            module_qrcode.stopDecode();
        }
        M5.Display.setTextColor(TFT_WHITE);
        M5.Display.println(is_scanning ? ">> Start scanning..." : ">> Stop scanning");
    }
    /* Update module */
    module_qrcode.update();
    /* If scan result available */
    if (module_qrcode.available()) {
        auto result = module_qrcode.getScanResult();
        /* Display result */
        M5.Display.setTextColor(TFT_WHITE);
        M5.Display.println(">> Get code:");
        M5.Display.setTextColor(TFT_YELLOW);
        M5.Display.println(result.c_str());
    }
}

3.3 スキャンのトリガー制御

モジュールは様々なスキャンのトリガーモードに対応しています。

enum TriggerMode_t {
        TRIGGER_MODE_KEY = 0,
        TRIGGER_MODE_CONTINUOUS = 1,
        TRIGGER_MODE_AUTO = 2,
        TRIGGER_MODE_PULSE = 4,
        TRIGGER_MODE_MOTION_SENSING = 5
};
  • TRIGGER_MODE_KEY
    • ボタンモードを設定後、TRIG を低レベルで保持することでスキャン・デコードをトリガーします。成功後はスキャンが停止し、再度トリガーには一旦高レベルに戻したあと再度低レベルで設定します。
  • TRIGGER_MODE_CONTINUOUS
    • 連続モード設定後、TRIG 信号で立ち下がりエッジを検出すると連続スキャンモードに入り、TRIG の再トリガーでスキャンが停止します。
  • TRIGGER_MODE_AUTO
    • 自動モード設定後、常時スキャン・デコード状態を維持します。他のモードに切り替えるまで有効。TRIG や UART 制御不可。
  • TRIGGER_MODE_PULSE
    • パルスモード設定後、TRIG に 20ms の低レベルパルスを入力することで単回スキャンをトリガーします。
  • TRIGGER_MODE_MOTION_SENSING
    • 動体検知モード設定後、視覚シーンの変化で自動トリガースキャンを行い、他のモードに切り替えるまで停止できません。TRIG の低レベル設定でスキャンも可能です。
補足説明
1. 上記モードのうち TRIGGER_MODE_AUTO 以外は、UART コマンドによるスキャン制御が可能です。2. モード設定はデバイスに書き込まれ、電源 OFF でも保存されます。

setTriggerMode 関数でトリガーモードを設定できます:

module_qrcode.setTriggerMode(QRCodeM14::TRIGGER_MODE_KEY);
// module_qrcode.setTriggerMode(QRCodeM14::TRIGGER_MODE_CONTINUOUS);
// module_qrcode.setTriggerMode(QRCodeM14::TRIGGER_MODE_AUTO);
// module_qrcode.setTriggerMode(QRCodeM14::TRIGGER_MODE_PULSE);
// module_qrcode.setTriggerMode(QRCodeM14::TRIGGER_MODE_MOTION_SENSING);

Module13.2 QRCode は、以下 2 つの方法でスキャンを制御できます:

  • 方法 1:startDecode() 関数を呼び出し、UART 経由のコマンドでスキャンをトリガー(ソフトウェアトリガー)
  • 方法 2:setTriggerLevel(false) 関数で TRIG ピンのレベルを制御(低レベル有効)

startDecode 関数でスキャンを制御:

module_qrcode.startDecode();
delay(1000);
module_qrcode.stopDecode();
delay(1000);

setTriggerLevel 関数でスキャンを制御:

module_qrcode.setTriggerLevel(false);
delay(1000);
module_qrcode.setTriggerLevel(true);
delay(1000);

3.4 補助ライトの動作モード

setFillLightMode() で補助ライトモードを設定します。列挙定義は以下の通りです:

enum FillLightMode_t {
        FILL_LIGHT_OFF       = 0,  // 消灯
        FILL_LIGHT_ON_DECODE = 2,  // デコード時のみ点灯
        FILL_LIGHT_ON        = 3   // 常時点灯
};
  • FILL_LIGHT_OFF
    • 補助ライト常時消灯
  • FILL_LIGHT_ON_DECODE
    • デコード時のみ補助ライトが点灯
  • FILL_LIGHT_ON
    • 補助ライト常時点灯

setFillLightMode 関数で設定:

module_qrcode.setFillLightMode(QRCodeM14::FILL_LIGHT_ON_DECODE);
// module_qrcode.setFillLightMode(QRCodeM14::FILL_LIGHT_ON);
// module_qrcode.setFillLightMode(QRCodeM14::FILL_LIGHT_OFF);

3.5 ポジションライトの動作モード

setPosLightMode() でポジションライト(定位灯)のモードを設定します。列挙定義は以下の通りです:

enum PosLightMode_t {
        POS_LIGHT_OFF             = 0,  // 消灯
        POS_LIGHT_FLASH_ON_DECODE = 1,  // デコード時点滅
        POS_LIGHT_ON_DECODE       = 2   // デコード時点灯
};
module_qrcode.setPosLightMode(QRCodeM14::POS_LIGHT_ON_DECODE);
// module_qrcode.setPosLightMode(QRCodeM14::POS_LIGHT_FLASH_ON_DECODE);
// module_qrcode.setPosLightMode(QRCodeM14::POS_LIGHT_OFF);
  • POS_LIGHT_OFF
    • ポジションライト常時消灯
  • POS_LIGHT_FLASH_ON_DECODE
    • デコード時のみ点滅
  • POS_LIGHT_ON_DECODE
    • デコード時のみ点灯

4. USB モード

Module13.2 QRCode は複数の USB 動作モードに対応しており、USB-CDC シリアル、USB-HID キーボード、USB-HID POS デバイス機能をサポートします。

4.1 USB/UART インターフェース切替

使用前に、基板上のインターフェーススイッチを USB 側に切り替えてください。この操作により、内蔵モジュールの USB ピン (USB_D+、USB_D-) が PORT.C インターフェースに接続されます。その後、Grove to USBC 変換アダプタで PORT.C を PC に接続してください。下記サンプルプログラムに従い、必要な USB 動作モードを設定できます。

注意事項
デバイスを USB モードに切り替えると UART 通信用インターフェースは無効となり、通信コマンドに正常応答できなくなります。スキャン結果も UART ではなく USB 経由で返されます。元に戻す場合は下の設定 QR コードをスキャンして UART 通信モードに切替えてください。

4.2 USB-CDC

下記サンプルを参考に setModeUsbSerial() 関数を呼び出して USB-CDC モードへ設定します。PC と接続すると仮想シリアルポートが有効になり、ターミナルやシリアルモニタから該当 COM ポートにアクセスできます。BtnA(A ボタン)長押しでスキャンを行い、成功するとその結果がターミナル表示されます。このモードでは UART コマンドも利用可能です。UART モードに戻す場合、「HEX 値:21 42 40 00」を送信します。モジュール側で一瞬点滅すれば UART 切替成功です。以降 USB-CDC は無効となります。

cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
#include <Arduino.h>
#include <M5Unified.h>
#include <M5ModuleQRCode.h>
M5ModuleQRCode module_qrcode;
void setup()
{
    M5.begin();
    /* Set module config */
    auto cfg     = module_qrcode.getConfig();
    cfg.pin_tx   = 12;
    cfg.pin_rx   = 34;
    cfg.baudrate = 115200;
    cfg.serial   = &Serial1;
    module_qrcode.setConfig(cfg);
    /* Init module */
    while (!module_qrcode.begin()) {
        delay(1000);
    }
    module_qrcode.setFillLightMode(QRCodeM14::FILL_LIGHT_ON_DECODE);
    module_qrcode.setPosLightMode(QRCodeM14::POS_LIGHT_ON_DECODE);
    module_qrcode.setTriggerMode(QRCodeM14::TRIGGER_MODE_KEY);
    module_qrcode.stopDecode();
    module_qrcode.setModeUsbSerial();
    M5.Display.setFont(&fonts::FreeMonoBoldOblique24pt7b);
    M5.Display.println("Hold BtnA");
    M5.Display.println("Start Scan");
}
void loop()
{
    M5.update();
    if (M5.BtnA.isPressed()) {
        module_qrcode.setTriggerLevel(false);
    } else {
        module_qrcode.setTriggerLevel(true);
    }
}

4.3 USB-HID

setModeUsbKeyboard() 関数で USB-HID モードに切り替えます。デバイスは USB キーボードとして動作し、BtnA 長押しでスキャン、成功するとコード内容がキーボード入力として直接送信されます。

4.4 USB-HID POS

setModeUsbPos() 関数で USB-HID POS モードに設定できます。このモードでは、標準 POS スキャナデバイスとして動作し、対応プロトコルの PC アプリと連携します。現在提供されている上位アプリは Windows 専用で、他プラットフォーム向けはソースを参考に移植可能です。

上位アプリパッケージ内 examples\c\vs\Release\read-in-callback.exe を実行し、テスト QR コードをスキャンしてください。スキャン結果がウィンドウに表示されます。

4.5 USB HID-POS ドライバエラー解決方法

USB HID-POS 利用時、デバイスマネージャ上で下記のようなドライバエラーが発生する場合の対処法:

以下の手順で進めてください。

  1. 上記エラーデバイスをダブルクリックし、「ドライバー」タブで「ドライバーの更新」→「コンピューターを参照してドライバーを検索」を選択します。
  1. 「コンピューター上の利用可能なドライバーの一覧から選択」を選び、リストより「HID-compliant device」を選択し、「次へ」でインストールします。完了画面が出れば成功です。

作業完了後、デバイスマネージャで下図のように「HID-compliant device」と表示されれば USB HID-POS が正常に動作します。

5. PC 側設定ツール

注意事項
上位設定ツールではモジュールの各種パラメータ調整が簡単に行えます。ご利用の際は事前に USB-CDC モードに設定し、Grove to USBC アダプターで PORT.C を PC に接続してください。

「CodeBarConfigTool.exe」をダウンロードし起動してください。ツール画面例は下図の通りです。

以下は USB-CDC モードからシリアルモードへ変更する手順です: 最初に、下図①のアイコンをクリック、②で対応 USB ポートを選択し、③「接続」ボタンを押します。成功すると④がオンライン状態になります。

次に、下図①をチェック、②をダブルクリック、③が表示されたらシリアル設定成功です。

ツールの詳細説明はパッケージ内の CodeBarConfigTool.pdf を参照してください。

Page Tools
PDF
On This Page