当面の目標


M5StickC


環境の構築

Arduino IDEの設定

  • 参考ページ
  • Arduino IDEのインストール
  • USB to Serial Driver のインストール
  • Arduino Core for ESP32の導入
  • Arduino IDEにM5StickCのライブラリを入れる
    • ツール→ライブラリを管理→M5StickCを検索してインストール
  • お試しのスケッチを書き込む
    • ファイル→スケッチ例→M5StickC→Basics→HelloWorld
こんにちは 世界
  • USBはtype-cにもかかわらず,向きがあるらしい。

インターネット経由の時刻合わせ

#include <M5StickC.h>
#include <WiFi.h>
#include "time.h"
 
const char* ssid       = "oouchi"; // SSIDは秘密
const char* password   = "gambare"; // パスワードも秘密
 
const char* ntpServer =  "ntp.jst.mfeed.ad.jp";
 
RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;
 
void setup() {
  // put your setup code here, to run once:
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
 
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(40, 0, 2);
  M5.Lcd.println("RTC NTP TEST");
 
  // connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" CONNECTED");
 
  // Set ntp time to local
  configTime(9 * 3600, 0, ntpServer);
 
  // Get local time
  struct tm timeInfo;
  if (getLocalTime(&timeInfo)) {
    M5.Lcd.print("NTP : ");
    M5.Lcd.println(ntpServer);
 
    // Set RTC time
    RTC_TimeTypeDef TimeStruct;
    TimeStruct.Hours   = timeInfo.tm_hour;
    TimeStruct.Minutes = timeInfo.tm_min;
    TimeStruct.Seconds = timeInfo.tm_sec;
    M5.Rtc.SetTime(&TimeStruct);
 
    RTC_DateTypeDef DateStruct;
    DateStruct.WeekDay = timeInfo.tm_wday;
    DateStruct.Month = timeInfo.tm_mon + 1;
    DateStruct.Date = timeInfo.tm_mday;
    DateStruct.Year = timeInfo.tm_year + 1900;
    M5.Rtc.SetData(&DateStruct);
  }
 
  //disconnect WiFi
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}
 
void loop() {
  static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
   
  // put your main code here, to run repeatedly:
  M5.Rtc.GetTime(&RTC_TimeStruct);
  M5.Rtc.GetData(&RTC_DateStruct);
  M5.Lcd.setCursor(0, 30);
  M5.Lcd.printf("Data: %04d-%02d-%02d\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date);
  M5.Lcd.printf("Week: %s\n", wd[RTC_DateStruct.WeekDay]);
  M5.Lcd.printf("Time: %02d : %02d : %02d\n", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);
  delay(500);
}
時刻合わせができました

測定できるようにする

加速度

  • M5StickCに搭載の加速度センサはロットによって異なる
    • SH200I or MPU6886
    • 今回入荷分はMPU6886
  • 参考ページ
  • このページの内容をもとに,加速度だけを取得するスケッチを書いてみた。
#include <M5StickC.h>

float accX = 0.0F;
float accY = 0.0F;
float accZ = 0.0F;

void setup() {
  M5.begin();
  M5.IMU.Init();
}
 
void loop() {
  M5.update();
 
  // データ取得
  M5.IMU.getAccelData(&accX, &accY, &accZ);
 
  // モードチェンジ
    // プロッタ用のタイトル出力
   //   Serial.printf("accX,accY,accZ\n");//ここのコメントアウトを外すと,Arduino IDE上のシリアルプロッタのデータラベルが表示される。
 
  // データ出力
    Serial.printf("%5.2f,%5.2f,%5.2f\n", accX, accY, accZ);
  delay(10);
}
.
プロッタ モニタ

皮膚コンダクタンス

#include <M5StickC.h>

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
}

void loop() {
  int val = analogRead(33);

  Serial.println(val);
  M5.Lcd.setCursor(8*4, 8*3);
  M5.Lcd.printf("%4d", val);
  delay(100);
}
.

皮膚温

//#include <M5Stack.h>
#include <M5StickC.h>

#define PERIOD 10 // 測定周期(秒)

void setup() {
    M5.begin();
    Serial.begin(115200);

    pinMode(26, INPUT);

    M5.Lcd.setTextSize(2);
}

void loop() {
    float voutT = (float)analogRead(26) / 4095.0 * 3.6 + 0.1132;
    float temp = voutT / 0.01;

    Serial.printf("%4.1f", temp);

    M5.Lcd.setRotation(3);
    M5.Lcd.setCursor(10, 40);
    M5.Lcd.printf("temp: %4.1f'C", temp);

    delay(PERIOD * 1000);
}
とりあえず温度計

皮膚コンダクタンス,皮膚温,3軸加速度をまとめて出力

  • 上にある「インターネット経由の時刻合わせ」をしたうえで,下記のスケッチを読ませると,下図のような出力が得られる。
#include <M5StickC.h>
#include "time.h"

float accX = 0.0F;
float accY = 0.0F;
float accZ = 0.0F;

RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;


void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);

  M5.IMU.Init();

  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(40, 0, 2);

  struct tm timeInfo;
  if (getLocalTime(&timeInfo)) {

    // Set RTC time
    RTC_TimeTypeDef TimeStruct;
    TimeStruct.Hours   = timeInfo.tm_hour;
    TimeStruct.Minutes = timeInfo.tm_min;
    TimeStruct.Seconds = timeInfo.tm_sec;
 
    RTC_DateTypeDef DateStruct;
    DateStruct.WeekDay = timeInfo.tm_wday;
    DateStruct.Month = timeInfo.tm_mon + 1;
    DateStruct.Date = timeInfo.tm_mday;
    DateStruct.Year = timeInfo.tm_year + 1900;
  }
  static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
  // put your main code here, to run repeatedly:
  M5.Rtc.GetTime(&RTC_TimeStruct);
  M5.Rtc.GetData(&RTC_DateStruct);
  M5.Lcd.setCursor(0, 30);
  M5.Lcd.printf("Data: %04d-%02d-%02d(%s)\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date,wd[RTC_DateStruct.WeekDay]);
  M5.Lcd.printf("Time: %02d : %02d : %02d\n", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);


  int mil = millis(); 



  pinMode(26, INPUT);
}
 
void loop() {
  // 経過時間取得
  int mil = millis(); 
  
  // 加速度データ取得
  M5.IMU.getAccelData(&accX, &accY, &accZ);

  // GSRデータ取得
  int gsrval = analogRead(33);
    
  //Serial.printf("Time,accX,accY,accZ,GSR\n");//ここのコメントアウトを外すと,Arduino IDE上のシリアルプロッタのデータラベルが表示される。

  //温度データ取得
  float voutT = (float)analogRead(26) / 4095.0 * 3.6 + 0.1132;
  float temp = voutT / 0.01;

  static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
  // put your main code here, to run repeatedly:
  M5.Rtc.GetTime(&RTC_TimeStruct);
  M5.Rtc.GetData(&RTC_DateStruct);
  M5.Lcd.setCursor(0, 30);
  M5.Lcd.printf("Data: %04d-%02d-%02d(%s)\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date,wd[RTC_DateStruct.WeekDay]);
  M5.Lcd.printf("Time: %02d : %02d : %02d\n", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);

 
  // データ出力
  Serial.printf("%04d-%02d-%02d, %02d:%02d:%02d, ", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date, RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);
    Serial.printf("%6d, %5.2f, %5.2f, %5.2f, %4d, %4.1f\n", mil, accX, accY, accZ, gsrval, temp);

  delay(100);
}