・自分が持っているのは、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); 
  }
}A/D入力
・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
 →プログラム中に全角のスペースや記号が入っている。