< fantastic_next_gen_msx_001.html < linkdetail01.htm < indextable01.htm < index.html

tack Developers Group Homepage!

<<< m5stickc_plus2_01_002.html >>>


(KENT-WEB-San Dream Counter... 2024R06-0706-SAT-1723)

※ このページのソースコードを使用した結果起こる事については当方は何ら保証いたしません。


Firewall
ファイアウォール設定の確認
Windowsの場合
コントロールパネルを開く:

Windowsキー + Sを押して、「コントロールパネル」と入力し、コントロールパネルを開きます。

システムとセキュリティ:

「システムとセキュリティ」をクリックします。

Windows Defenderファイアウォール:

「Windows Defenderファイアウォール」をクリックします。

詳細設定:

左側の「詳細設定」をクリックします。

受信の規則:

左側のメニューから「受信の規則」をクリックし、新しい規則を作成します。

新しい規則の作成:

「新しい規則」をクリックします。

「ポート」を選択し、「次へ」をクリックします。

「TCP」を選択し、特定のローカルポートに「8000」と入力します。「次へ」をクリックします。

「接続を許可する」を選択し、「次へ」をクリックします。

「ドメイン」、「プライベート」、「パブリック」の全てにチェックを入れ、「次へ」をクリックします。

規則に名前を付けて(例:「ポート8000の許可」)、規則を作成します。
(... 2025R07-0120-MON-2208)

以下のソースコードはM5StickCPlus2にENV IV(M5STACK-U001-D)を接続して得た温度と湿度のデータをWi-Fi経由でPCやRaspberry Pi OSへ送信し保存するプログラムです。inoファイルと、server.pyファイルです。server.pyはPythonのソースコードです。

以下のソースコードはロジカラブログ様のソースコードを元にMicrosoft Copilotによって改良されたものです。ロジカルブログ様から改編と掲載の許可をもらっております。そもそも、僕は1行も書いておりません(1か所 加筆はしています。SSIDとパスワード、IPアドレスは自身の環境に合わせて記述してください)。ですのでこのソースコードの使用に関して著作権はロジカルブログ様とMicrosoft Copilot の利用に関するライセンスに従います。個人的には自由に使っていただいて構わないのですが、ライセンスは無視できませんので。これでは、Win-Winにはなりませんが使う方々におまかせいたします。

では、M5StickCPlus2生活をエンジョイしてください!

IPaddressには、コマンドプロンプトで、ipconfigと入力した結果出てくる、http://192.168.?.?を記述してください。

Arduino IDEを使ってM5StickCPlus2に書き込みます。コピーアンドペーストしてください。以後、解説を加筆していきますね。

[スケッチ]-[検証・コンパイル]とは動作するかどうかチェックする事だけ行います。[書き込み]はM5StickCPlus2に書き込みます。これらにはあらかじめ設定が必要です。

https://logikara.blog/m5stickc-plus2-init/

M5StickCPlus2上の送信プログラム:
© ロジカラブログ - https://logikara.blog/
© Microsoft Copilot.
inoファイル

#include <M5StickCPlus2.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Wire.h>

#define SHT3X_ADDR 0x44   // SHT3X(温度、湿度センサ)I2C通信アドレス
M5Canvas canvas(&M5.Lcd); // 液晶表示用、メモリ描画領域表示(スプライト)のインスタンスを作成

const char* ssid = "ssid"; //WiFi SSID
const char* password = "pw"; //WiFi Password
const char* serverName = "http://ipaddress:8000/data"; //server.pyを走らせるPCのIPアドレス(ipconfig)

// キャリブレーション用オフセット
float temp_offset = -0.0;  // 温度オフセット(℃)
float hum_offset = -13.0;  // 湿度オフセット(%)

void setup() {
  M5.begin(); 
  Wire.begin(32, 33);  // I2C通信初期化 SDA=32, SCL=33
  Serial.begin(9600);  // シリアル通信初期化
 
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setRotation(1);   
  M5.Lcd.setTextSize(1);   

  canvas.setTextWrap(false); 
  canvas.createSprite(M5.Lcd.width(), M5.Lcd.height());

  // WiFi接続
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(1000);
      M5.Lcd.printf("Connecting to WiFi...\n");
  }
  M5.Lcd.printf("Connected to WiFi\n");
}

void loop() {
  // I2Cデータ送信
  Wire.beginTransmission(SHT3X_ADDR);
  Wire.write(0xFD);
  Wire.endTransmission(true);
  delay(10);

  // I2Cデータ受信
  float data[6];
  if (Wire.requestFrom(SHT3X_ADDR, 6) == 6) {
    for (int i = 0; i < 6; i++) {
      data[i] = Wire.read();
    }
  }

  // 温度、湿度計算
  float t_ticks = data[0] * 256 + data[1];
  float rh_ticks = data[3] * 256 + data[4];
  float t_degC = -45 + 175 * t_ticks / 65535.0 + temp_offset;
  float rh_pRH = -6 + 125 * rh_ticks / 65535.0 + hum_offset;
  rh_pRH = min(max(rh_pRH, 0.0f), 100.0f);  // 型を float に統一

  // サーバーにデータを送信
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(serverName);
    http.addHeader("Content-Type", "application/json");

    String jsonPayload = "{\"temperature\": " + String(t_degC) + ", \"humidity\": " + String(rh_pRH) + "}";
    int httpResponseCode = http.POST(jsonPayload);

    if (httpResponseCode > 0) {
      String response = http.getString();
      M5.Lcd.printf("Response: %s\n", response.c_str());
    } else {
      M5.Lcd.printf("Error: %d\n", httpResponseCode);
    }

    http.end();
  }

  // シリアル出力
  Serial.printf("Temp: %.1f°C, Hum: %.1f%%\n", t_degC, rh_pRH);

  // LCD表示
  canvas.fillScreen(BLACK);
  canvas.setCursor(0, 0);
  canvas.setFont(&fonts::Font4);
  canvas.printf("I2C  ENV.IV ( SHT40 )\n");
  canvas.drawFastHLine(0, 30, 230, WHITE);
  canvas.setCursor(0, 35);
  canvas.setFont(&fonts::lgfxJapanGothicP_36);
  canvas.printf("温度:%.1f℃\n", t_degC);
  canvas.printf("湿度:%.1f%\n", rh_pRH);

  canvas.pushSprite(&M5.Lcd, 8, 8);
  delay(1000);
}
// © 2021 ロジカラブログ.
// (C) 2025 Microsoft Copilot.


PC上のserverでの受信プログラム(Windowsではファイアーウォールの設定が必要です):
server.pyファイル

from http.server import BaseHTTPRequestHandler, HTTPServer
import json

class SimpleServer(BaseHTTPRequestHandler):

    def _set_response(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)
        data = json.loads(post_data)
       
        with open('sensor_data.txt', 'a') as f:
            f.write(f"{data}\n")
       
        self._set_response()
        self.wfile.write(json.dumps({"status": "success"}).encode('utf-8'))

def run(server_class=HTTPServer, handler_class=SimpleServer, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f'Starting server on port {port}...')
    httpd.serve_forever()

if __name__ == '__main__':
    run()

#(C) 2025 Microsoft Copilot.

python3 server.py
「コマンド プロンプト」を「エクスプローラー」から開く最速の技 ~えっ、ソコ? - やじうまの杜 - 窓の杜
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1504991.html
cmd(コマンドプロンプト)をエクスプローラーの開いている場所で起動の仕方。コマンドプロンプトを開くには、目的のフォルダーでエクスプローラーのアドレスバーにcmdと書いてEnter。Pythonがインストールされていれば、を開いてpython3 server.pyと入力しエンター。
カウンター記録:000286
(... 2025R07-0111-SAT-1412)

ENV4~M5STACK-U001-D
M5StickC Plus2 I2C通信で温度,湿度測定ENV IVセンサの使い方 | ロジカラブログ
https://logikara.blog/env-iv/
M5StickCPlus2でENV IV。作者の方に感謝!

#include <M5StickCPlus2.h>
#include <Wire.h>

#define SHT3X_ADDR 0x44   // SHT3X(温度、湿度センサ)I2C通信アドレス
M5Canvas canvas(&M5.Lcd); // 液晶表示用、メモリ描画領域表示(スプライト)のインスタンスを作成

// キャリブレーション用オフセット
float temp_offset = -0.0;  // 温度オフセット(℃)
float hum_offset = -13.0;  // 湿度オフセット(%)

void setup() {
  M5.begin();
  Wire.begin(32, 33);  // I2C通信初期化 SDA=32, SCL=33
  Serial.begin(9600);  // シリアル通信初期化
 
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setRotation(1);  
  M5.Lcd.setTextSize(1);  

  canvas.setTextWrap(false);
  canvas.createSprite(M5.Lcd.width(), M5.Lcd.height());
}

void loop() {
  // I2Cデータ送信
  Wire.beginTransmission(SHT3X_ADDR);
  Wire.write(0xFD);
  Wire.endTransmission(true);
  delay(10);

  // I2Cデータ受信
  float data[6];
  if (Wire.requestFrom(SHT3X_ADDR, 6) == 6) {
    for (int i = 0; i < 6; i++) {
      data[i] = Wire.read();
    }
  }

  // 温度、湿度計算
  float t_ticks = data[0] * 256 + data[1];
  float rh_ticks = data[3] * 256 + data[4];
  float t_degC = -45 + 175 * t_ticks / 65535.0 + temp_offset;
  float rh_pRH = -6 + 125 * rh_ticks / 65535.0 + hum_offset;
  rh_pRH = min(max(rh_pRH, 0.0f), 100.0f);  // 型を float に統一

  // シリアル出力
  Serial.printf("Temp: %.1f°C, Hum: %.1f%%\n", t_degC, rh_pRH);

  // LCD表示
  canvas.fillScreen(BLACK);
  canvas.setCursor(0, 0);
  canvas.setFont(&fonts::Font4);
  canvas.printf("I2C  ENV.IV ( SHT40 )\n");
  canvas.drawFastHLine(0, 30, 230, WHITE);
  canvas.setCursor(0, 35);
  canvas.setFont(&fonts::lgfxJapanGothicP_36);
  canvas.printf("温度:%.1f℃\n", t_degC);
  canvas.printf("湿度:%.1f%\n", rh_pRH);

  canvas.pushSprite(&M5.Lcd, 8, 8);
  delay(1000);
}
© 2021 ロジカラブログ. Microsoft Copilot.

一番冷えるのでRaspberry Pi 400をセットアップして、このコードで得られたデータをWiFiで受信するプログラムを動かす予定です。そしてグラフ化します。

カウンター記録~000274
(... 2025R07-0110-FRI-2142)

カウンター記録~000251
(... 2025R07-0103-FRI-2047)

Copilotとの対話:

CallRemindという簡易リマインダー・プログラムをラズパイ5用に作ってもらいました。そのあとに、Copilotに初心者用のプログラム学習コード案について尋ねていて、その流れで、M5StickCPlus2のデータをPCで受信保存する簡易プログラムにたどり着きました。こちらはWindows PC側にPythonプログラム、M5StickCPlus2側にArduino言語でコーディングしました。PythonプログラムはラズパイOSでもIPアドレスを変更するだけで動作しました。
ちなみに僕はCopilotをToolやソースコードを作ってくれる優秀な上司と思っています。
callremindはラズパイOSで開発しました。Windowsでは明示的に文字コードをUTF-8に指定したところそれだけで動きました。もちろんこのコード変更後でもラズパイOSで動作いたします。
(... 2025R07-0102-THU-1811)

思いもしない成果(Win-Winで行こう):

Copilotとの会話のやり取りで生まれた、M5StickCPlus2のデータをWiFiでPCに送信しPCでデータ保存する簡易プログラムが完成。

PythonはソースコードがOSに依存しないようです。ライブラリが多くOSに依存しないクロスプラットフォーム構造になっているのでしょうか。Windowsで作ったソースコードが全く手直しなしでRaspberry Pi OSで動きました。凄い。まあ、ウィンドウはダメだろうけれど。うん?tkinterを使えばOK?
(... 2024R06-1231-TUE-2149)


2024R06-0920-FRI

2024R06-0920-FRI-1752
M5Stack用エンコーダユニット M5STACK-U135をM5StickCPlus2で:

m5-docs
https://docs.m5stack.com/en/unit/encoder
GitHub - m5stack/M5Unit-Encoder: Contains case programs of M5Stack Unit Encoder.
https://github.com/m5stack/M5Unit-Encoder?tab=readme-ov-file
の「<> Code」と書いた緑のボタンを押し、「Download ZIP」から、ZIPファイルをダウンロード。これをArduinoIDEの[スケッチ]メニューの[ファイルを追加]からZIPをそのまま追加いたします。

btn_speaker_encoder_001.ino
以下のソースコードをダウンロード。

# btn_speaker_encoder_001.ino
# COPYRIGHT(C) 2024 Microsoft, Microsoft Copilot, tdg_alive.
#include <M5StickCPlus2.h>
#include "Unit_Encoder.h"

#define BUTTON_PIN 37

Unit_Encoder sensor; // Unit_Encoderでオブジェクトを宣言
int periods[] = {500, 750, 1000, 1250, 1500}; // periodの5段階設定
int currentPeriodIndex = 0; // 現在のperiodのインデックス

void setup() {
  M5.begin();
  sensor.begin(); // オブジェクトの初期化
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  M5.Speaker.setVolume(128);
  M5.Lcd.setRotation(1); // 画面の向きを設定
  M5.Lcd.fillScreen(BLACK); // 画面を黒で塗りつぶす
  M5.Lcd.setTextColor(WHITE); // テキストの色を白に設定
  M5.Lcd.setTextSize(2); // テキストのサイズを設定
}

void loop() {
  signed short int encoder_value = sensor.getEncoderValue(); // エンコーダ値の取得
  bool btn_status = digitalRead(BUTTON_PIN) == LOW; // ボタンの状態を読み取る

  if (btn_status) {
    currentPeriodIndex = (currentPeriodIndex + 1) % 5; // periodのインデックスを切り替える
    delay(200); // Buttonのチャタリングを防ぐための遅延
  }

  int freq = map(encoder_value, -1000, 1000, 100, 1000); // エンコーダ値に応じた周波数を設定
  M5.Speaker.tone(freq, periods[currentPeriodIndex]); // 現在のperiodの長さで音を鳴らす

  // 画面にencoder_valueとperiodの値を表示
  M5.Lcd.fillScreen(BLACK); // 画面を黒で塗りつぶす
  M5.Lcd.setCursor(0, 0); // カーソル位置を設定
  M5.Lcd.printf("Encoder Value: %d\n", freq); // エンコーダ値を表示
  M5.Lcd.printf("Period: %d ms", periods[currentPeriodIndex]); // periodの値を表示

  delay(100);
}

Copilotに書いていただきました。
「#include <M5StickCPlus2.h>
#include "Unit_Encoder.h"
Unit_Encoder sensor;
signed short int encoder_value = sensor.getEncoderValue();
M5.Speaker.tone(freq, periods);
ボタンでperiodを5段階で変更できるようにしてください。
上記を使ってください。」
こんな感じでしょうか。

M5Unit-Encoder/examples/Unit_Encoder_M5Core/Unit_Encoder_M5Core.ino at master · m5stack/M5Unit-Encoder · GitHub
https://github.com/m5stack/M5Unit-Encoder/blob/master/examples/Unit_Encoder_M5Core/Unit_Encoder_M5Core.ino
上記を参考に動くように改良いたしました。

最後に、「これにM5.Lcdでencoder_valueを表示するコードを追加してください。あと、periodの値も同時に表示してください。」


2024R06-0916-MON

2024R06-0916-MON-1318

M5Stack 液晶表示の使い方まとめ – 完全版 -(Arduinoコマンド) | ロジカラブログ
https://logikara.blog/m5stack-lcd-setting/

M5Displayクラスの使い方 - M5StickC非公式日本語リファレンス
https://lang-ship.com/reference/unofficial/M5StickC/Tips/M5Display/

M5StickC Plus2の使い方、初期設定、旧モデルとの違い等サンプルプログラムで詳しく紹介 | ロジカラブログ
https://logikara.blog/m5stickc-plus2-init/

Copilotを頼ってもいいですが、出てきたコードとその使い方を覚えないといけないよ。しないとね。

16:14
Copilot:

どんなライブラリーや命令を使うか指定するとうまくコードを書いてもらえる。

ディスプレイ表示は、M5.Lcdを使うって書けばうまく行くでしょう。


2024R06-0915-SUN

2024R06-0915-SUN-1709
Copilot:

M5StickCPlus2で久方ぶりにコードを作りました。といっても相変わらず、Copilotに書いてもらっています。ButtonとSpeakerを使ったものを1つ。M5Stack用回転角ユニットとスピーカーを使ったものを1つ、さらにButtonとSpeakerとM5Stack用回転角ユニットを使ったものを1つ、それぞれ作ってもらいました。とにもかくにも面白さを再確認いたしました。

(2024R06-0916-MON-0831

M5STACK-U005はM5Stack用回転角ユニットです。これと、ButtonとSpeakerを使った複雑なサンプルプログラムを作ってください。Buttonはトーンを替えるのに使用してください。
「#include <M5StickCPlus2.h>」とM5Stack用回転角ユニットは「#define U005_PIN 33」で作ってください。
analogRead(U005_PIN)
M5.Speaker.setVolume(128);
M5.Speaker.tone(freq, period);
を使用してください。

と書けばいいでしょうか。)


2024R06-0724-WED

2024R06-0724-WED-1240
CopilotでArduinoプログラム製作 第7弾:

ANGLE-UNIT U005と、
M5.Speaker.tone(freq, period)でのプログラム製作。
注意)
M5.Lcd.setRotation(0);
値0が縦長の通常ポジション

自分
自分 が送信しました:
M5StickC PLus2とANGLE-UNIT U005で、
M5.Speaker.tone(freq, period)
を使って、ANGLE-UNIT U005で周波数を表示しながら変更して音を発生させ続けるプログラムを作成してください。

自分
自分 が送信しました:
(I2C用のWireが使われています。)ANGLE-UNIT U005はGPIOのG33ピン接続です。どうか書き直してくださいませ。

自分
自分 が送信しました:
(Wireのコードが残っていますが)Wireは必要ないですね?

自分
自分 が送信しました:
M5.Speaker.tone(freq, dur);
上記のfreqをANGLE-UNIT U005で、durをボタンで調節できるようにしてください。

// 2024R06-0724-WED-1139
// beeprp_002.ino
// COPYRIGHT(C) Microsoft, Microsoft Copilot, tdg_alive.
#include <M5StickCPlus2.h>

#define ANGLE_UNIT_PIN 33
#define BUTTON_A_PIN 37
#define BUTTON_B_PIN 39

int freq = 200;
int dur = 200;

void setup() {
  M5.begin();
  M5.Lcd.setRotation(0);
  M5.Lcd.setTextSize(3);
  pinMode(ANGLE_UNIT_PIN, INPUT);
  pinMode(BUTTON_A_PIN, INPUT_PULLUP);
  pinMode(BUTTON_B_PIN, INPUT_PULLUP);
}

void loop() {
  int angle = analogRead(ANGLE_UNIT_PIN); // ANGLE-UNIT U005から角度を読み取る
  freq = map(angle, 0, 1023, 200, 2000); // 角度を周波数にマッピング

  if (digitalRead(BUTTON_A_PIN) == LOW) {
    dur += 100; // ボタンAを押すと、durを増やす
    delay(200); // デバウンス
  }

  if (digitalRead(BUTTON_B_PIN) == LOW) {
    dur -= 100; // ボタンBを押すと、durを減らす
    delay(200); // デバウンス
  }

  dur = constrain(dur, 100, 2000); // durが100から2000の範囲内に収まるようにする

  M5.Speaker.tone(freq, dur); // スピーカーで音を出す
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.printf("Frequency: %d Hz \nDuration: %d ms\nAngle: %d", freq, dur, angle); // 周波数と持続時間を表示
  delay(100);
}

DOWNLOAD (CR+LF/UTF-8)
M5.Speaker.tone(freq, dur);
BtnA(正面M5ロゴのボタン)/BtnB(右横のボタン)で、durを100ずつ増減。ANGLE-UNIT U005で、freqを変更します。

歯科のレントゲン機器の音ですね・・・。

(15:08)
constrain() - Arduino Reference
https://www.arduino.cc/reference/en/language/functions/math/constrain/
constrain(x, a, b)

Arduino日本語リファレンス
http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2743
map関数。


2024R06-0723-TUE

2024R06-0723-TUE-1156
AIでプログラム製作:

僕は最近、Copilotに「何か面白いものを作って」と頼みます。

20:35
画面の角度を設定:

M5Displayクラスの使い方 - M5StickC非公式日本語リファレンス
https://lang-ship.com/reference/unofficial/M5StickC/Tips/M5Display/
M5Stack M5StickC Plus2動作確認 その1 画面まわり | Lang-ship
https://lang-ship.com/blog/work/m5stack-m5stickc-plus2-1/
画面の角度を設定するのですね。
M5.Lcd.setRotation(3);
画面の角度を指定する命令なのですね。
M5.Lcd.setRotation(0);が縦長の通常ポジション。
ここを0にすると、ソースコードを書き換える必要があります。


2024R06-0721-SUN

2024R06-0721-SUN-1424
CopilotでArduinoプログラム製作 第6弾:

M5stickCPlus2と、ANGLE-UNIT U005です。

ANGLE-UNIT U005:
M5Stack用回転角ユニット — スイッチサイエンス
https://www.switch-science.com/products/6551

お決まりの、Copilotでプログラム製作。

// M5StickC Plus2にANGLE UNIT(U005)使用でのソースコード。
// Copilotに書いていただいたソースコードではPIN番号はG36ピンになっていますが、M5stickC Plus2ではG36ピンではなくG33ピンです。
//
#include <M5StickCPlus2.h>
int UNIT_ANGLE_PIN = 33;  // set the input pin for the potentiometer.
//#define UNIT_ANGLE_PIN 33 // UNIT-ANGLEのGPIOピン

void setup() {
  M5.begin();
  //M5.power.begin();
  //M5.Lcd.setRotation(3);
  M5.Lcd.setTextSize(3);
  pinMode(UNIT_ANGLE_PIN, INPUT);
}

void loop() {
  int angle = analogRead(UNIT_ANGLE_PIN);
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.printf("Angle: %d", angle);

  // 角度に基づいてメッセージを変更
  if(angle < 1000) {
    M5.Lcd.setTextColor(TFT_GREEN);
    M5.Lcd.println(" Keep it cool!");
  } else if(angle < 2000) {
    M5.Lcd.setTextColor(TFT_YELLOW);
    M5.Lcd.println(" Getting warmer...");
  } else {
    M5.Lcd.setTextColor(TFT_RED);
    M5.Lcd.println(" Hot, hot, hot!");
  }
  delay(100);
}
// 2024R06-0721-SUN-1408
// 2024R06-0721-SUN-1259
// COPYRIGHT(C) Microsoft, Microsoft Copilot, tdg_alive.

[ DOWNLOAD (CR+LF/UTF-8)]

M5Stack/examples/Unit/ANGLE at master · m5stack/M5Stack · GitHub
https://github.com/m5stack/M5Stack/tree/master/examples/Unit/ANGLE
ANGLE.ino。PIN番号がG36になっています。M5Stackはそうなのかな?M5StickCPlus2ではPIN番号はG33です。

M5Stack用のGROVEユニットをM5Stick-Cで使ってみる #M5stack - Qiita
https://qiita.com/kazuhidet/items/6d58948672fc8e7afb95
「ANGLE UNIT
単純にGROVEに繋いでボリュームの回転角度をアナログ値として読み取ることのできるユニットです。
ボリュームはGROVEコネクタのG33に接続されているのでG33ピンの値をアナログ値で読み込むことで値を取得できます。」

M5StickC Plus2の使い方、初期設定、旧モデルとの違い等サンプルプログラムで詳しく紹介 | ロジカラブログ
https://logikara.blog/m5stickc-plus2-init/
「/* M5StickC Plus端子仕様
  G0 :入力/出力/アナログ入力(無線使用時無効、内部で10kΩでプルアップ)
  G36:入力/ ―  /アナログ入力
  G25:入力/出力/アナログ入力(無線使用時無効)/デジタル出力
  G26:入力/出力/アナログ入力(無線使用時無効)/デジタル出力
  G32:入力/出力/アナログ入力/Groveコネクタ(SDA)
  G33:入力/出力/アナログ入力/Groveコネクタ(SCL)
   ※G25/36はポートを共有しているため同時使用不可(使用しない方はフローティング入力にする)
  G37:本体ボタンA
  G39:本体ボタンB
  G35:本体ボタンC(6秒長押しで電源OFF)
  G19:本体LED(赤外線LEDと共用)
*/」

うん?GPIOデジタルは?

M5StickCPlus2 GPIO G33 - Google 検索
M5StickC Plus2 GPIO G33 - Google 検索
G33でページを検索。
M5StickC Plus2 — スイッチサイエンス
https://www.switch-science.com/products/9350
m5-docs
https://docs.m5stack.com/ja/core/M5StickC%20PLUS2
『G33』でページを検索。「G0, G25/G36, G26, G32, G33」

20:32
CopilotでArduinoプログラム製作 第5弾:

Copilotとの合作です。

// 2024R06-0721-SUN-2022
// 2024R06-0723-TUE-2107
// gyrogame_004b.ino
// COPYRIGHT(C) Microsoft, Microsoft Copilot, tdg_alive.
#include <M5StickCPlus2.h>

float gx, gy, gz;
int ballX, ballY;
int holeX, holeY;

void setup() {
  M5.begin();
  M5.Lcd.setRotation(0); // 画面の向きを変更
  M5.Lcd.fillScreen(BLACK);
  M5.Imu.begin();
  ballX = M5.Lcd.width() / 2;
  ballY = M5.Lcd.height() / 2;
  holeX = random(10, M5.Lcd.width() - 10);
  holeY = random(10, M5.Lcd.height() - 10);
}

void loop() {
  M5.update();
  M5.Imu.getGyroData(&gx, &gy, &gz);
 
  ballX += gy; // 画面の向きが変わったため、ジャイロデータの使用方法を変更
  ballY -= gx; // 画面の向きが変わったため、ジャイロデータの使用方法を変更
 
  if (ballX < 0) ballX = 0;
  if (ballX > M5.Lcd.width()) ballX = M5.Lcd.width();
  if (ballY < 0) ballY = 0;
  if (ballY > M5.Lcd.height()) ballY = M5.Lcd.height();
 
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.fillCircle(ballX, ballY, 10, WHITE);
  M5.Lcd.fillCircle(holeX, holeY, 10, RED);
 
  if (abs(ballX - holeX) < 10 && abs(ballY - holeY) < 10) {
    M5.Lcd.fillScreen(GREEN);
    delay(2000);
    holeX = random(10, M5.Lcd.width() - 10);
    holeY = random(10, M5.Lcd.height() - 10);
  }
 
  delay(10);
}

このコードは、M5StickC Plus2のジャイロスコープから取得したデータを使用して、画面上のボールの位置を更新します。ボールの位置は、デバイスを傾けることで変更できます。また、画面上には赤い穴が表示され、ボールが穴に入ると、画面が緑色になり、新しい穴がランダムな位置に生成されます。
[ DOWNLOAD (CR+LF/UTF-8) ]

ここで思います。傾けた方に動かすか、傾けた方の逆に動かすか、正直どちらが正しいのかわかりません。

自分
自分 が送信しました:
ジャイロセンサーとは、傾けた方に動かすか、傾けた方の逆に動かすか、正直どちらが正しいのかわかりません。
Copilot
Copilot が送信しました:
ジャイロセンサーは、デバイスの角速度(つまり、どのくらい速くデバイスが回転しているか)を測定するセンサーです。したがって、「傾けた方に動かす」か「傾けた方の逆に動かす」かは、あなたが作りたいアプリケーションやゲームの設計によります。

例えば、スマートフォンでレースゲームをプレイするとき、スマートフォンを左に傾けると車が左に曲がり、右に傾けると車が右に曲がります。これは「傾けた方に動かす」例です。

一方、航空機のオートパイロットシステムでは、ジャイロセンサーが飛行機が左に傾いていることを検出すると、自動的に右に舵を取って飛行機を水平に保ちます。これは「傾けた方の逆に動かす」例です。

したがって、どちらが「正しい」かは、あなたが何を達成したいかによります。ユーザーの期待に合わせて、ジャイロセンサーのデータを適切に解釈し、応用することが重要です。あなたのプロジェクトで成功を祈っています!

わかりませぬ。


2024R06-0720-SAT

2024R06-0720-SAT-1502
CopilotでArduinoプログラム製作 第4弾:

自分
自分 が送信しました:
// 2024R06-0723-TUE-2116
// 2024R06-0720-SAT-1515
// COPYRIGHT(C) Microsoft, Microsoft Copilot, tdg_alive.
#include <M5StickCPlus2.h>

void setup() {
  M5.begin();
  M5.Imu.init();
  M5.Lcd.setTextSize(2);
  M5.Lcd.setRotation(0);  // 画面の向きを縦長ロゴ正常に設定
}

void loop() {
  float accX = 0;
  float accY = 0;
  float accZ = 0;

  // 加速度データを取得
  M5.Imu.getAccelData(&accX, &accY, &accZ);

  // 傾きを計算(単位は度)
  // Roll  X軸, Pitch Y軸
  float pitch = atan2(accY, sqrt(accX*accX + accZ*accZ)) * 180.0 / PI;
  float roll = atan2(accX, sqrt(accY*accY + accZ*accZ)) * 180.0 / PI;

  // 傾きに基づいてLEDの色を変更
  if(abs(roll) > 30) {
    M5.Lcd.fillScreen(TFT_RED);
  } else if(abs(pitch) > 30) {
    M5.Lcd.fillScreen(TFT_BLUE);
  } else {
    M5.Lcd.fillScreen(TFT_BLACK);
  }

  // RollとPitchを表示
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.printf("Roll: %.2f\n", roll);
  M5.Lcd.printf("Pitch: %.2f\n", pitch);

  delay(100);
}

以上はCopilotに書いていただいたソースコードです。ありがとうございます。

このプログラムのM5stickCPlus2の向き、つまり起点を教えて下さい。画面は天井を向き、縦長にみるか横長に見るか教えて下さい。
Copilot
Copilot が送信しました:
このプログラムでは、M5StickCPlus2の向きは以下のようになります:

起点(原点):加速度センサーのデータは、M5StickCPlus2が水平に置かれ、画面が上向き(天井を向いて)であるときにゼロになります。つまり、この状態が起点(原点)です。
画面の向き:このプログラムでは、画面は縦長(ポートレートモード)で表示されます。M5.Lcd.printf関数を使用してテキストを表示するとき、テキストは上から下に流れ、左から右に読みます。
したがって、このプログラムを使用するときは、M5StickCPlus2を縦に持ち、画面を自分に向けてください。そして、デバイスを傾けると、その傾きに応じて画面の色が変わります。この傾きは、デバイスが水平(つまり起点)からどれだけ離れているかを示します。具体的には、デバイスを左右に傾けると(ロール)、画面が赤くなり、前後に傾けると(ピッチ)、画面が青くなります。デバイスが水平に近い場合、画面は黒くなります。これらの色の変化は、デバイスの傾きを視覚的に示すためのものです。また、具体的な傾きの値(度数)は画面に表示されます。この値は、デバイスがどれだけ傾いているかを数値で示します。具体的には、ロールとピッチの値が30度を超えると、色が変わります。これは、デバイスがかなり傾いていることを示します。それ以外の場合、画面は黒くなります。これは、デバイスがほぼ水平であることを示します。このように、このプログラムは、M5StickCPlus2の傾きを視覚的に示すためのものです。この情報がお役に立てば幸いです。他に何かご質問がありましたら、お気軽にどうぞ。よろしくお願いいたします。😊

COPYRIGHT(C) Microsoft, Microsoft Copilot, tdg_alive.

Copilotが間違う?RollとPitchの値が逆?ソースコード解説と違う実行結果になっています。直してよいものか・・・。直しましたが。え、違いますか?

22:25
ジャイロスコープって何?

CopilotでArduinoプログラム製作 第3弾:

Copilotへ:
M5.Imu.getGyroDataを用いて何か面白いコーディングをしてください。

//
//  imu04b_01p.ino
//
// 2024R06-0723-TUE-2159
// COPYRIGHT(C) Microsoft, Microsoft Copilot, tdg_alive.
#include <M5StickCPlus2.h>

void setup() {
  M5.begin();
  M5.Imu.init();
  Serial.begin(115200);
  M5.Lcd.setTextSize(2);
 
  // TFTディスプレイの初期化
  M5.Lcd.begin();
  M5.Lcd.setRotation(0); // 画面の向きを設定
  M5.Lcd.setTextSize(2);
  M5.Lcd.fillScreen(BLACK);
}

void loop() {
  float gx, gy, gz;

  // ジャイロスコープの値を取得
  M5.Imu.getGyroData(&gx, &gy, &gz);

  // ジャイロスコープの値を画面の中心にマッピング
  int centerX = M5.Lcd.width() / 2;
  int centerY = M5.Lcd.height() / 2;
  int posX = centerX + (int)(gy * 10); // 左右の動きをgyにマッピング
  int posY = centerY + (int)(gx * 10); // 前後の動きをgxにマッピング

  // 画面をクリア
  M5.Lcd.fillScreen(BLACK);

  // 新しい位置に円を描画
  M5.Lcd.drawCircle(posX, posY, 10, WHITE);

  // gxとgyを表示
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.printf("gx: %.2f\n", gx);
  M5.Lcd.printf("gy: %.2f\n", gy);

  delay(70);
}

【Arduino】M5StickCの画面制御を極める!画面表示のすすめ│KARAKURI MUSHA
https://karakuri-musha.com/inside-technology/arduino-m5stickc-04-time-display-for-m5stickc/
drawCircle, fillCircle...
M5Displayクラスの使い方 - M5StickC非公式日本語リファレンス
https://lang-ship.com/reference/unofficial/M5StickC/Tips/M5Display/
setRotation()で画面の向きを設定。

ジャイロスコープの動きがイマイチわからず。何だろう、これ・・・。


2024R06-0716-TUE

2024R06-0716-TUE-1231

M5StickC PLUS 主にMicroPythonで遊ぶ #M5StickCPlus - Qiita
https://qiita.com/numeru55/items/5cf7f8e72b3cbe4c92b2
「まずはとにかくファームを書き込む
・M5Burnerを使います。上記URL参照。
・PLUSじゃないサンプルファイルを書き込むと,いろいろ不都合を起こします。やってしまったら,Easyloader等でやり直しします。(これも上記URLからたどれる)」

上記はPlus2ではなくPlusですのでご注意あれ。上記文章部分はPlus2でも同じ。Plus2ではないサンプルファイルを書き込んでしまったら、Easyloaderなどでやり直す。Easyloaderの使い方を覚えるのですね。

19:27
CopilotでArduinoプログラム製作 第2弾:

以下は、Microsoft Copilotによる、M5StickCPlus2内臓IMUでのArduino傾き検出プログラムです。

"M5StickCPlus2の内臓IMUセンサーを使うArduinoプログラムで、加速度を除去し、傾きだけを取り出す。立てた棒を上から見た構図で傾きのみを反映させて下さい。"

これが正しいか未確認です。

"M5StickCPlus2用のArduinoプログラムを書いてください。"
"グラフィカルに上から見た棒を描いてください。あと、#include <M5StickCPlus.h>ではなく#include <M5StickCPlus2.h>です。そして大文字のIMUは間違いで正しくは全てImuです。"
"画面にはM5.Lcdで描いてください。"
"[傾きを3Dの棒として描画]のところで、画面の真ん中に見やすいように描画してください。"
"M5StickCPlus2がどの状態が起点ですか?M5の文字を読める縦長に、画面が天井に向いている?画面が自分の顔に向いている?どの状態でしょう?"

棒の動きが間違っている事をAIは検知できていなかったです。ですので以下をAIに尋ねてみました。

"具体的に傾けた方に傾くのですか?棒の動きはどう動きますか?"
"このソースコードでは棒はどのように動きますか?「M5StickCPlus2を平らなテーブルの上に置き、M5のロゴが読みやすいように(つまり、縦長になるように)配置します。このとき、ディスプレイは天井を向いています。この状態を起点とします。」以上を起点として画面がこちらに向くように傾けるときと左に傾けるときの棒の動きを教えて下さい。"
"画面がこちらに向くように傾けるとき棒がどう動くか?左に傾けるときの棒はどう動くかを教えて下さい。"

(上記の返答によりAIのソースコードがどう間違っているかわかりました。)

"棒の動きが逆になっています。棒の動きがx軸の増減率とy軸の増減率がともに逆です。"

新しいトピックの時はソースコードを貼り付けて"以上はCopilotに書いていただいたソースコードです。ありがとうございます。"と書いてから、その下に続けて書いて下さい。

傾きというのがどういうものなのか、正しいか不明です。

「具体的には、M5StickCPlus2を平らなテーブルの上に置き、M5のロゴが読みやすいように(つまり、縦長になるように)配置します。このとき、ディスプレイは天井を向いています。この状態を起点とします。」スペースの関係上、Roll(①ロール)とPitch(②ピッチ)の表示は通常の正しい向きではありません。

// 2024R06-0716-TUE-1927
// imu_asukiaaa_003ppp.ino
// COPYRIGHT(C) Microsoft, Microsoft Copilot, tdg_alive.
#include <M5StickCPlus2.h>

void setup() {
  M5.begin();
  M5.Imu.init();
  Serial.begin(115200);
 
  // TFTディスプレイの初期化
  M5.Lcd.begin();
  M5.Lcd.setRotation(0);  // 画面の向きを縦長に設定
  M5.Lcd.fillScreen(BLACK);
}

void loop() {
  float ax, ay, az;
  float gx, gy, gz;

  // 加速度とジャイロスコープの値を取得
  M5.Imu.getAccelData(&ax, &ay, &az);
  M5.Imu.getGyroData(&gx, &gy, &gz);

  // 重力加速度を除去
  float gravity = sqrt(ax * ax + ay * ay + az * az);
  float tiltX = ax / gravity;
  float tiltY = ay / gravity;
  float tiltZ = az / gravity;

  // 傾きを計算
  float pitch = atan2(tiltY, tiltZ) * 180.0 / PI;
  float roll = atan2(tiltX, tiltZ) * 180.0 / PI;

  // 傾きを3Dの棒として描画
  M5.Lcd.fillScreen(BLACK);
  int centerX = M5.Lcd.width() / 2;
  int centerY = M5.Lcd.height() / 2;
  M5.Lcd.drawLine(centerX, centerY, centerX - tiltX * 100, centerY + tiltY * 100, WHITE);

  // ヨーとピッチを画面下部に表示
  M5.Lcd.setTextSize(2); // テキストサイズを2に設定
  M5.Lcd.setCursor(0, M5.Lcd.height() - 50);
  M5.Lcd.printf("Pitch: %.2f\n", pitch);
  M5.Lcd.printf("Roll: %.2f", roll);
  M5.Lcd.setTextSize(1); // テキストサイズを元に戻す
 
  delay(100);
}
// DOWNLOAD(UTF-8)

上記は本当にあってるのかな?20:31 間違っていました。修正しました。

3次元ベクトルの回転「ロール・ピッチ・ヨー」 – Watako-Lab.
https://watako-lab.com/2019/01/23/roll_pitch_yaw/#:~:text=%E3%82%88%E3%81%8F%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B%E4%BD%9C%E6%B3%95%E3%81%AE,%E3%82%92%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82
Roll(①ロール), Pitch(②ピッチ)。


2024R06-0715-MON

2024R06-0715-MON-2032
CopilotでArduinoプログラム製作 第1弾:

M5StickCPlus2 Copilot万歩計(by Microsoft Copilot。言語Arduino):


#include <M5StickCPlus2.h>

int steps = 0;
float threshold = 1.2; // 歩行の加速度の閾値

void setup() {
  auto cfg = M5.config();
  M5.begin(cfg);
  M5.Imu.begin();
  M5.Lcd.setRotation(1);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(10, 10);
  M5.Lcd.print("Steps: ");
  M5.Lcd.setCursor(10, 40);
  M5.Lcd.print(steps);
}

void loop() {
  float accX, accY, accZ;
  M5.Imu.getAccelData(&accX, &accY, &accZ);

  float magnitude = sqrt(accX * accX + accY * accY + accZ * accZ);

  if (magnitude > threshold) {
    steps++;
    M5.Lcd.fillRect(10, 40, 100, 20, BLACK);
    M5.Lcd.setCursor(10, 40);
    M5.Lcd.print(steps);
    delay(200); // デバウンス処理
  }

  M5.update();
}
// COPYRIGHT(C) Microsoft, Microsoft Copilot, tdg_alive.
// DOWNLOAD(UTF-8)
//

スケッチ例~M5StickCPlus2のIMUサンプルソースコードの内容から、"Imu", "Lcd"と書くと知って書き換える。


2024R06-0706-SAT

2024R06-0706-SAT-1725
M5Burner:

M5Burnerの使い方を失念中で御座います。再調査いたします。
M5StickCPlus2 UserDemoはかろうじて記憶が御座いますが、M5StickCPlus-FactoryTestとは何であったか失念いたしております。

動作検証デモを書き戻す。「M5Burner」というプログラムで「M5StickCPlus2 UserDemo」をダウンロードして書き込めば元に戻せます。ただし、Eraseプログラムは元に戻せないフォントなども消してしまうので、バックアップ後でないと使えません。

上記は、以前記述致したものです。現在、M5Burnerのダウンロード場所喪失中で御座います。下手に書き込みますと本体内部のファイルを喪失しかねませんので、慎重に行います。

M5Burnerで、Offical以外ですが色々なプログラムを実行可能で御座いますが、元に戻せないと困りますので、調査後にいたします。

再度、記述致しますが、M5BurnerのダウンロードURLを喪失中です。


(... 2024R06-0706-SAT-1714)

CC BY tDG.