M5Stack_BASIC

M5Stack BASIC 入門編

・自分が持っているのは、M5 Stack BASIC v2.7
・いろいろ触ってみる。

開発環境のセットアップ(Arduino IDE)

・Arduino IDEをインストール

・Arduino IDEはデフォルトではM5 Stackに非対応。
 M5 Stackのボード定義をする必要がある。
 これには、ピンの定義、firmの書き込み方法などが含まれる。

 File → Preferences → Additional boards manager から上記URLを追加。
 https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json

↑M5Stack公式のボード定義URL

・Tools → Boards → Boards manager → M5Stackと検索 → インストール

・Tools → Manage Libraries.. → M5Stackと検索 → インストール

・M5StackをPCに接続 → COMポート → Select Other Board and Port → “M5Core – M5Stack”を選択
 ※”M5Stack BASIC v2.7″以外は、選択するものが異なるっぽい。

これでセットアップ完了。

簡単なスケッチ例

Hello Worldを表示

・とりあえず画面に”Hello World”と表示。

#include <M5Stack.h>

void setup() {
  M5.begin(); //ハードウェアの初期化、周辺機能の有効化
  M5.Lcd.print("Hello World");
}

void loop() {
}

画面表示のプロパティ設定

・画面の背景色、テキスト色、テキストサイズ、テキスト配置など。

#include <M5Stack.h>

void setup() {
  M5.begin(); //M5Stackハードウェアの初期化
  M5.Lcd.fillScreen(WHITE); //ディスプレイ背景色の設定
  M5.Lcd.setTextColor(BLUE); //テキスト色の設定
  M5.Lcd.setTextSize(2);  //テキストサイズの設定

  //テキストの開始位置を設定(左上基準)
  M5.Lcd.setCursor(10, 0);  //ピクセルで(x,y)
  M5.Lcd.print("Test"); //テキスト表示

  //(x,y)で指定した座標でx方向は中央揃えでテキスト表示。あとはfont size : 4
  M5.Lcd.drawCentreString("Hello!", 160, 100, 4);
}

void loop() {
}

ボタンの設定

・ボタンAを押すと、画面に”A”と表示。ボタンB/Cも同様の動作。

#include <M5Stack.h>

void setup() {
  M5.begin(); //M5Stackハードウェアの初期化
  M5.Lcd.printf("Push the button!\n");  //printfだと変換指定子つかえる。\nは改行  
}

void loop() {
  M5.update();  //ボタンの状態を更新

  if (M5.BtnA.wasReleased()) {  //ボタンがAが押された時
    M5.Lcd.printf("A\n");  //Aを表示
  }

  if (M5.BtnB.wasReleased()) {  //ボタンがBが押された時
    M5.Lcd.printf("B\n");  //Bを表示
  }

  if (M5.BtnC.wasReleased()) {  //ボタンがCが押された時
    M5.Lcd.printf("C\n");  //Cを表示
  }
}

GPIO 出力設定

・2pinの論理を100ms毎に切り替える。(3.3V出力)

#include <M5Stack.h>

void setup() {
  M5.begin(); //M5Stackハードウェアの初期化
  M5.Power.begin(); //バッテリー動作の場合はこれを入れる。
  pinMode(2, OUTPUT);  // 2pinをGPIO出力モードに設定
}

void loop() {
  digitalWrite(2, HIGH); // 2pinをHIGHにする。
  delay(100);                // 100ms

  digitalWrite(2, LOW);  // 2pinをLOWにする。
  delay(100);                // 100ms
}

GPIO入力設定

・2pinの入力状態(HIGH/LOW)を1秒ごとに読みだして、画面に表示。

#include <M5Stack.h>

void setup() {
  M5.begin(); //M5Stackハードウェアの初期化
  M5.Power.begin(); //バッテリー動作の場合はこれを入れる。
  pinMode(2, INPUT);  // 2pinをGPIO入力モードに設定
}

void loop() {
  int buttonState = digitalRead(2);  // 2pinの論理を読み取る

  if (buttonState == HIGH) {
    M5.Lcd.printf("2pinはHIGHです。\n");  //画面にテキスト表示
  } else if (buttonState == LOW){
    M5.Lcd.printf("2pinはLOWです。\n");  //画面にテキスト表示
  } else {
    M5.Lcd.printf("2pinは異常値が入力されてます。\n");  //画面にテキスト表示
  }

  delay(1000);                // 1000ms待機
}

シリアルモニタ

・ArduinoIDEのシリアルモニタから送信したテキストをM5Stack画面上に表示。
・書き込み時間 : 38s

#include <M5Stack.h>

void setup() {
  M5.begin(); //M5Stackハードウェアの初期化
  M5.Power.begin(); //バッテリー動作の場合はこれを入れる。
  Serial.begin(115200); //ビットレート設定
}

void loop() {
  M5.update();  //ボタンの状態を更新

  if (M5.BtnA.wasReleased()) {  //ボタンがAが押された時
    M5.Lcd.printf("A\n");
    Serial.println("A");  //Arduino IDE上のシリアルモニタへ送信
  }

  if (Serial.available() > 0){
    String str = Serial.readStringUntil('\n');
    M5.Lcd.printf("recieved -> %s\n",str); 
  }
}

・pin35をA/Dポートとして使用
・pin35に外部から0~3.3Vの電圧を入力して、A/D読み値を画面表示
・結構、入力電圧と表示電圧のずれがある。入力に対して、-0.16V程度。
・書き込み時間 : 45s

#include <M5Stack.h>

#define ANALOG_PIN 35 // 35pinを"ANALOG_PIN"という名前で定義

void setup() {
  //初期化して、テキスト表示
  M5.begin();
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(10, 20);
  M5.Lcd.println("ADC Value:");

  //12bit分解能に設定 2^12 = 4096
  analogReadResolution(12);
}

void loop() {
  int adcValue = analogRead(ANALOG_PIN);  //35pinのAD値を読みだして、変数に代入(0-4095)
  float voltage = adcValue * (3.3 / 4095.0); // AD読み値を電圧に変換
  
  //四角形を表示。順番に説明すると
  //X座標, Y座標, 四角形の幅, 四角形の高さ, 色
  M5.Lcd.fillRect(10, 50, 200, 30, WHITE); 
  M5.Lcd.setCursor(10, 50);
  M5.Lcd.setTextColor(BLACK);

  // %d : int型の表示、%.2f : float型の小数第2位まで表示
  M5.Lcd.printf("%d (%.2fV)", adcValue, voltage);
   
  delay(500); // 500ms待機
}

D/A出力

・pin26をD/A出力ポートとして使用
・pin26に 0V → 3.3V → 0Vで変化する三角波を出力
・pin25でDACを動かすと、パタパタ音が聞こえる。
・for分の中にDAC値の画面表示などの処理を入れると、周期が長くなる。
・書き込み時間 : 40s

#include <M5Stack.h>

#define DAC_PIN 26  // 26pinを"DAC_PIN"という名前で定義

void setup() {
    M5.begin();
}

void loop() {
  //10.24s周期の0V → 3.3V → 0Vで変化する三角波を出力

  //0V → 3.3Vに変化。20ms * 256 = 5.12sかかる。
  for (int value = 0; value <= 255; value++) {
    dacWrite(DAC_PIN, value); //25pinに値を書き込む
    float voltage = value * (3.3 / 255.0);
    delay(20);
  }

  //3.3V → 0Vに変化。20ms * 256 = 5.12sかかる。
  for (int value = 255; value >= 0; value--) {
    dacWrite(DAC_PIN, value);
    float voltage = value * (3.3 / 255.0);
    delay(20);
  }
}

エラー例

・stray ‘\343’ in program
 →プログラム中に全角のスペースや記号が入っている。