[M5Stack Core2 for AWS] Arduinoで仮想ボタンを作成してみました

2021.07.17

1 はじめに

IoT事業部の平内(SIN)です。

以前、Core2 for AWS IoT EduKit BSPの動作確認の中で、ディスプレイの表示(LVGLライブラリ)を確認してみました。

LVGLライブラリでは、各種のコントロールが用意されており、その中でも、ボタンは、簡単に利用でき非常に美しいと感じてました。

今回は、このようなイメージのボタンを、簡単に使えるようにArduinoでクラスを作成してみました。 最初に、使用している様子です。

2 main()

先の動画のmainコードは、以下のとおり非常にシンプルです。new VButton() でオブジェクトを生成し、コールバック関数で、ボタンの操作を処理できます。

ボタンは、タップとトグルの2つのモードが利用可能です。また、ボタンの色は、デフォルトで赤色ですが、コンストラクタ 自由な色を指定できます。

#include <M5Core2.h>
#include "VButton.h"

VButton *red_button;
VButton *blue_button;
VButton *green_button;

void button_callback(char *title, bool use_toggle, bool is_toggled){
    if (use_toggle) {
        Serial.printf("%s Toggled. %d\n", title, is_toggled);
    } else {
        Serial.printf("%s Tapped.\n", title);
    }
}

void setup() {
    M5.begin(true, true, true, true);
    M5.Lcd.setBrightness(200);
    M5.Lcd.fillScreen(WHITE);

    red_button = new VButton("red_button", button_callback, true, -70);
    blue_button = new VButton("blue_button", button_callback, false, 0, BLUE);    
    green_button = new VButton("green_button", button_callback, false, 70, TFT_DARKGREEN);
}

void loop() {
    red_button->loop();
    blue_button->loop();
    green_button->loop();
}

3 リファレンス

(1) constructor

VButton(char *title,
        void (* callback)(char *, bool, bool),
        bool use_toggle = false,
        int position = 0,
        ushort color = RED);
  • title 表示される文字列 (必須)
  • callback ボタン操作時に呼ばれるコールバック関数(必須)
  • use_toggle トグルモードの有効無効 [デフォルト:false] (オプション)
  • position 表示位置 [デフォルト:0] (オプション)
  • color 表示色 [デフォルト:RED] (オプション)

(2) callback

void (* callback)(char title*, use_toggle bool, is_toggled bool);

コンストラクタで指定するコールバック関数の型です。

  • title 表示される文字列(コンストラクタで指定したもの)
  • use_toggle トグルモードの有効無効
  • is_toggled 現在のトグル状態(use_toggle=trueの時のみ有効な値)

(3) loop

void loop()

タップ操作を取得するため、メインプログラムのloopの中で呼び出す必要があります。

例)

void loop() {
    button->loop();
}

4 カラー

この仮想ボタンのライブラリでは、色の指定が簡単できるようになっています。少し時間かけたので説明させてください。

コンストラクタでは、枠の色のみを指定します。そして、その他の色は、枠の色を基準に以下のよう修正された値が使用されます。

  • ボタン本体の通常状態の色:枠色より200 明い色
  • ボタン本体のトグル状態の色:枠色より100 明い色

この色を生成している要領は以下の通りです。

(1) RGB分解

M5.Lcdの色は、RED:5bit、GREEN::6bit、BLUE:5bitで表現されています。

RGBに分解しているコードです。

void VButton::get_rgb(ushort color, ushort rgb[3]){
    rgb[0] = (color & 0xF800) >> 8;
    rgb[1] = (color & 0x07E0) >> 3;
    rgb[2] = (color & 0x001F) << 3;
}

(2) 明度調整

RGBそれぞれの明度を調整しています。

for(int i=0; i<3; i++) {
  rgb[i] += 200;
  if (rgb[i] > 0xFF) {
    rgb[i] = 0xFF;
  }
}

(3) RGB合成

最後にRGBを元の形に結合します。

ushort VButton::create_color(ushort rgb[3]){
  return ((rgb[0]>>3)<<11) | ((rgb[1]>>2)<<5) | (rgb[2]>>3);
}

上記を組み合わせて通常のボタンの色を生成しているコードです。

ushort VButton::create_background_color_normal(ushort color){
    ushort rgb[3];
    this->get_rgb(color, rgb);
    for(int i=0; i<3; i++) {
        rgb[i] += 200;
        if (rgb[i] > 0xFF) {
            rgb[i] = 0xFF;
        }
    }
    return this->create_color(rgb);
}

5 最後に

今回は、Arduinoで使用できる、仮想ボタンを作成してみました。

全てのコードは、下記に置きました。
https://github.com/furuya02/M5Stack_Core2_VirtualButton

6 参考リンク


Visual Studio Code + PlatformIO 環境で M5Stack Core2 for AWS でHello Worldしてみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してLEDを光らせてみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してディスプレイに表示してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用して仮想ボタンの動作を確認してみました
[M5Stack Core2 for AWS] LVCLを使用してディスプレイ上のボタンの動作を確認してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用して電源を操作してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してスピーカーを操作してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用して静電容量式タッチパネルを操作してみました
[M5Stack Core2 for AWS] Core2 for AWS IoT EduKit BSPを使用してジャイロセンサーを操作してみました
[M5Stack Core2 for AWS] PlatformIO を使用して、ArduinoでHello Worldしてみました
[M5Stack Core2 for AWS] ArduinoでLED (Adafruit NeoPixel フルカラーLED) を点灯してみました
[M5Stack Core2 for AWS] Arduinoで仮想ボタンを作成してみました
[M5Stack Core2 for AWS] ArduinoでMQTT接続してみました
[M5Stack Core2 for AWS] Arduinoでオーディオファイルを再生してみました
[M5Stack Core2 for AWS] Arduinoでマイクの利用方法を確認してみました
[M5Stack Core2 for AWS] ArduinoでGroveポートのGPIOを使用しててみました