ミニ四駆用モーター慣らし機の作り方

ミニ四駆

はじめに

ミニ四駆用モーター慣らし機の作り方を公開します。
構成としては「M5Core2」と「M5Stack用プログラマブル電源モジュール 13.2」を使用します。
買い物で出来るので、プログラムを書き込むだけで特殊な加工等はほとんど必要ありません。

ライセンス

CC BY-SA 4.0を適用します。
個人で使用する分には問題ないと思います。
下記がライセンスの内容となります。

あなたの従うべき条件は以下の通りです。

表示 — あなたは 適切なクレジット を表示し、ライセンスへのリンクを提供し、 変更があったらその旨を示さ なければなりません。これらは合理的であればどのような方法で行っても構いませんが、許諾者があなたやあなたの利用行為を支持していると示唆するような方法は除きます。

継承 — もしあなたがこの資料をリミックスしたり、改変したり、加工した場合には、あなたはあなたの貢献部分を元の作品と 同じライセンス の下に頒布しなければなりません。

追加的な制約は課せません — あなたは、このライセンスが他の者に許諾することを法的に制限するようないかなる法的規定も 技術的手段 も適用してはなりません。

機能

・基本的な定電圧・定電流 (精度・出力範囲はプログラマブル電源モジュールを参照してください)
・内部抵抗エミュレート (電流が流れるほど電圧が降下します)

今後実装したい機能
・スケジュール機能
・回転数検出機能

使い方

画面下部の [ON] [OFF] ボタンで出力のON OFFを切り替え

設定値の変更方法
画面左部の項目をタッチすると文字が緑色に変化
緑色になっている項目が、画面右部の矢印で増減が可能
長押しで早送りが出来ます。

設定可能項目は上から順番に下記の3点
・内部抵抗
・電圧値
・電流値

※ MENUは現状機能無し

構成部品

主な構成部品は下記の通りです。
ACアダプタ、バナナ-ワニ口クリップは任意のものを用意してください。
C4で使っているアダプタが使えると思います。

下記はスイッチサイエンスでの購入をお勧めします。
(メジャーどころで一番安い)
https://www.switch-science.com/

M5Stack Core2 v1.1
https://www.switch-science.com/products/9349

M5Stack用プログラマブル電源モジュール 13.2
https://www.switch-science.com/products/9571

組み立て方

(追加予定)

書き込み方法

使用ライブラリは下記の通りです。
・M5Unified.h
・M5GFX.h
・M5ModulePPS.h

書込確認済環境
・VSCode + PlatformIO
・Arduino IDE

(M5Core2への書き込み方は他の方の説明の方が詳しいので、、、)

プログラム

開発環境 VSCode + PlatformIO
検証環境 Arduino IDE

使用ライブラリ
・M5Unified
・M5GFX
・M5ModulePPS -> これはダウンロードしてインストールする

// 各種 includeファイル
#include <Arduino.h>
#include <M5Unified.h>
#include <M5GFX.h>
#include <EEPROM.h>
#include <time.h>
#include "M5ModulePPS.h"


// 各種固定値
#define EEPROM_VERSION "M5PPS1.0.0"

#define ResistanceMin 0.0        // 設定電圧最小値
#define ResistanceMax 10.0       // 設定電圧最大値

#define VoltageMin 0.5        // 設定電圧最小値
#define VoltageMax 30.0       // 設定電圧最大値

#define CurrentMin 0.0        // 設定電流最小値
#define CurrentMax 5.0        // 設定電流最大値

#define InputVoltageMin 9.0   // 入力電圧最小値
#define InputVoltageMax 36.0  // 入力電圧最大値

// グローバル変数

// テスト用
unsigned long test_start_time = 0; // タッチパネル読取用
unsigned long test_end_time = 0; // タッチパネル読取用

unsigned long touch_panel_read_time = 0; // タッチパネル読取用
unsigned long touch_panel_long_press_time = 0; // タッチパネル読取用
unsigned long setting_update_time = 0; // タッチパネル読取用
unsigned long lcd_draw_time = 0; // 画面を更新した時間
bool touch_panel_pushing = false; // タッチパネルを押し続けているか
unsigned long touch_panel_pushing_time = 0; // 画面をタッチした時間
int touch_panel_pushed_x = 0; // タッチパネルを最初にタッチしたx座標
int touch_panel_pushed_y = 0; // タッチパネルを最初にタッチしたy座標


// EEPROM 構造
struct eeprom
{ 
  char EEPROMVersion[11]; // EEPROMのバージョン確認用
  float InternalResistance; // 内部抵抗
  float OutputVoltage; // 出力電圧
  float OutputCurrent; // 出力電流
  bool  PowerEnable;   // ON・OFF
};

eeprom EepromData;

// バイブレーションを動作させる
void vibration(int run_time)
{
  M5.Power.Axp2101.setDLDO1(3300); // On 1800-3300
  delay(run_time);
  M5.Power.Axp2101.setDLDO1(0); // Off
}

// EEPROMへ書き込み
void eeprom_write()
{
  // EEPROMのデータを読み込み
  eeprom EepromTemp; // 一時読込用の構造体をセット
  EEPROM.get<eeprom>(0, EepromTemp); // EEPROMから読出

  // EEPROMとの内容に変更がなかったら書き込まずに戻る
  if(
    EepromTemp.InternalResistance == EepromData.InternalResistance && // 内部抵抗
    EepromTemp.OutputVoltage == EepromData.OutputVoltage && // 出力電圧
    EepromTemp.OutputCurrent == EepromData.OutputCurrent // 出力電流
    ) return;

  // 書き込み用の構造体にデータをセット
  strcpy(EepromTemp.EEPROMVersion, EEPROM_VERSION); // EEPROMのバージョン書き込み
  EepromTemp.InternalResistance = EepromData.InternalResistance; // 内部抵抗
  EepromTemp.OutputVoltage = EepromData.OutputVoltage; // 出力電圧
  EepromTemp.OutputCurrent = EepromData.OutputCurrent; // 出力電流
  EepromTemp.PowerEnable = false; // ON・OFF

  EEPROM.put<eeprom>(0, EepromTemp);
  EEPROM.commit();

  vibration(140); // 書き込み後の確認用 

}

// 電源モジュール
M5ModulePPS pps;

// 描画関係
M5GFX display;
M5Canvas canvas_full(&display);

// 設定値をチェックして電圧を送信する
bool VoltageSend()
{
  if(VoltageMin > EepromData.OutputVoltage)return false; // 最小値以下だったらエラー
  if(EepromData.OutputVoltage > VoltageMax)return false; // 最大値以上だったらエラー
  pps.setOutputVoltage(EepromData.OutputVoltage); // 出力電圧セット
  return true;
}

// 設定値をチェックして電流を送信する
bool CurrentSend()
{
  if(CurrentMin > EepromData.OutputCurrent)return false; // 最小値以下だったらエラー
  if(EepromData.OutputCurrent > CurrentMax)return false; // 最大値以上だったらエラー
  pps.setOutputCurrent(EepromData.OutputCurrent); // 出力電流セット
  return true;
}

// 設定値をチェックして出力をONにする
bool OutputSend()
{
  // if(!VoltageSend())return false; // 出力電圧を正常にセットできなければエラー
  // if(!CurrentSend())return false; // 出力電流を正常にセットできなければエラー
  pps.setPowerEnable(EepromData.PowerEnable); // 出力セット
  return true;
}


void setup() {

  // EEPROMセット
  EEPROM.begin(1024); // EEPROM開始(サイズ指定)
  EEPROM.get<eeprom>(0, EepromData);

  // EEPROMのバージョンが違っていたら初期値に置き換え
  if(strcmp(EepromData.EEPROMVersion, EEPROM_VERSION) != 0)
  {
    EepromData.InternalResistance = 0.0; // 内部抵抗セット
    EepromData.OutputVoltage = 0.0; // 出力電圧セット
    EepromData.OutputCurrent = 0.0; // 出力電流セット
  }
  EepromData.PowerEnable = false;  // 出力セット

  // 範囲チェック
  if(ResistanceMin > EepromData.InternalResistance)EepromData.InternalResistance = ResistanceMin;
  if(EepromData.InternalResistance > ResistanceMax)EepromData.InternalResistance = ResistanceMax;

  if(VoltageMin > EepromData.OutputVoltage)EepromData.OutputVoltage = VoltageMin;
  if(EepromData.OutputVoltage > VoltageMax)EepromData.OutputVoltage = VoltageMax;

  if(CurrentMin > EepromData.OutputCurrent)EepromData.OutputCurrent = CurrentMin;
  if(EepromData.OutputCurrent > CurrentMax)EepromData.OutputCurrent = CurrentMax;


  // 画面初期化
  auto cfg = M5.config(); // 設定用の構造体を代入。
  M5.begin(cfg); // 設定した値でデバイスを開始する。

  M5.Lcd.setBrightness(200); // バックライトの明るさ(0-255)

  // canvas用
  display.begin();
  display.setEpdMode(epd_mode_t::epd_fastest);
  canvas_full.setColorDepth(8);
  canvas_full.setFont(&fonts::Font4);             // フォント
  canvas_full.createSprite(display.width(), display.height());
  canvas_full.setTextSize(1);
  canvas_full.setTextDatum(0);            // 文字の位置
  canvas_full.setTextColor(WHITE, BLACK); // 文字の色
  M5.Lcd.fillScreen(BLACK); // LCD背景色
  canvas_full.setCursor(0, 0);

  // 電源モジュール接続確認
  while (!pps.begin(&Wire, M5.In_I2C.getSDA(), M5.In_I2C.getSCL(), MODULE_POWER_ADDR, 400000U)) {
    // 接続出来るまでエラーを出力
    canvas_full.clear(BLACK);     
    canvas_full.setCursor(0, 0);
    M5.Lcd.print(F("module pps connect error"));
    canvas_full.pushSprite(0 ,0);
    delay(100);
  }

  // 各種EEPROMから書き込み
  pps.setOutputVoltage(EepromData.OutputVoltage); // 出力電圧セット
  pps.setOutputCurrent(EepromData.OutputCurrent); // 出力電流セット
  VoltageSend(); // 出力電圧セット
  CurrentSend(); // 出力電流セット

  if(EepromData.PowerEnable) //出力セット
  {
    OutputSend();
  }
  else
  {
    pps.setPowerEnable(false);
  }

}

void loop() {

  // 変数の定義
  float voltage_readback = 0.0; // 出力電圧
  float current_readback = 0.0; // 出力電流取得
  float vin              = 0.0;             // 入力電圧取得
  int   mode             = 0;            // 制御モード取得
  float temp             = 0.0;     // 温度取得
  uint8_t enable_get     = false;     // ON OFF取得
  float voltage_read_set = 0.0;   // 出力電圧設定値読取
  float current_read_set = 0.0;   // 出力電流設定値読取
  int set_mode           = 0; // セットモード(数値変更の項目) 0:non 1:ohm 2:vol 3:cur

  bool break_trig = false; // ブレイク用

  // 永久ループ
  while(true)
  {
    // EEPROMへの書き込み判定
    if(setting_update_time != 0 && setting_update_time +5000 < millis())
    {
      setting_update_time = 0;
      eeprom_write();
    }

    lcd_draw_time = millis(); // 描画した時間を保持

    if(!break_trig)
    {
      voltage_readback = pps.getReadbackVoltage(); // 出力電圧取得
      current_readback = pps.getReadbackCurrent(); // 出力電流取得
      vin              = pps.getVIN();             // 入力電圧取得
      mode             = pps.getMode();            // 制御モード取得
      temp             = pps.getTemperature();     // 温度取得
      enable_get       = pps.getPowerEnable();     // ON OFF取得
      voltage_read_set = pps.getOutputVoltage();   // 出力電圧設定値読取
      current_read_set = pps.getOutputCurrent();   // 出力電流設定値読取

      pps.setOutputCurrent(EepromData.OutputCurrent); // 出力電流セット

      // 内部抵抗計算
      if(EepromData.InternalResistance != 0.0)
      {
        // 内部抵抗の値が0.0以外だったら、電流値から電圧降下分を引いて電圧を設定する
        float OutputVoltageTemp = EepromData.OutputVoltage - EepromData.InternalResistance * current_readback;
          pps.setOutputVoltage(OutputVoltageTemp); // 出力電圧セット
      }
      else
      {
        // 内部抵抗の値が0.0だったら設定値とPPSの持っている値を比較して、違ってたら書き込む
        if(voltage_read_set != EepromData.OutputVoltage)
          pps.setOutputVoltage(EepromData.OutputVoltage); // 出力電圧セット
      }
    }

    // 各種設定値チェック (想定通りの動きをしているかの確認)
    canvas_full.setFont(&fonts::Font2);             // フォント
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setTextSize(1);             // 文字のサイズ
    canvas_full.setTextColor(WHITE, BLACK); // 文字の色
    canvas_full.clear(BLACK);               // クリア
    canvas_full.setCursor(10, 0);

    // 各種ステータスの表示
    canvas_full.setTextFont(2);             // フォント
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setTextSize(1);             // 文字のサイズ
    canvas_full.setTextColor(WHITE, BLACK); // 文字の色

    // 入力電圧表示
    canvas_full.setCursor(5, 0);
    canvas_full.print(F("VIN : "));
    canvas_full.printf("%.2fV", vin);

    // 温度表示
    canvas_full.setCursor(100, 0);
    canvas_full.print(F("TEMP : "));
    canvas_full.printf("%.0f`C", temp);

    // 出力モード表示
    canvas_full.setCursor(200, 0);
    canvas_full.print("Mode : ");
    if    (mode == 0) // 出力無し
    {
      canvas_full.print(F(" -- "));
    }
    else if(mode == 1) // CV 定電圧制御
    {
      canvas_full.setTextColor(WHITE, GREEN); // 文字の色
      canvas_full.print(F(" CV "));
    }
    else // CC 定電流制御
    {
      canvas_full.setTextColor(WHITE, RED); // 文字の色
      canvas_full.print(F(" CC "));
    }

    // 内部抵抗
    canvas_full.setTextColor(WHITE, BLACK); // 文字の色
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(5, 20);
    canvas_full.setFont(&fonts::Font2);     // フォント
    canvas_full.print(F("Resistance"));
    if(set_mode == 1)
    {
      canvas_full.setTextColor(GREEN, BLACK); // 文字の色
    }
    else
    {
      canvas_full.setTextColor(WHITE, BLACK); // 文字の色
    }
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(20, 50);
    canvas_full.setFont(&fonts::Font4);     // フォント
    canvas_full.printf("%.2f Ohm", EepromData.InternalResistance);

    // rpm
    canvas_full.setTextColor(WHITE, BLACK); // 文字の色
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(150, 20);
    canvas_full.setFont(&fonts::Font2);     // フォント
    canvas_full.print(F("rpm"));
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(165, 50);
    canvas_full.setFont(&fonts::Font4);     // フォント
    canvas_full.print(F("--"));
    //canvas_full.printf("%.2fV", voltage_read_set);

    // 出力電圧設定値
    canvas_full.setTextColor(WHITE, BLACK); // 文字の色
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(5, 80);
    canvas_full.setFont(&fonts::Font2);     // フォント
    canvas_full.print(F("Voltage Set"));
    if(set_mode == 2)
    {
      canvas_full.setTextColor(GREEN, BLACK); // 文字の色
    }
    else
    {
      canvas_full.setTextColor(WHITE, BLACK); // 文字の色
    }
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(20, 100);
    canvas_full.setFont(&fonts::Font6);     // フォント
    canvas_full.printf("%.2fV", EepromData.OutputVoltage);


    // 出力電圧出力値
    canvas_full.setTextColor(WHITE, BLACK); // 文字の色
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(150, 80);
    canvas_full.setFont(&fonts::Font2);     // フォント
    canvas_full.print(F("Voltage Out: "));
    canvas_full.setTextColor(WHITE, BLACK); // 文字の色
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(165, 100);
    canvas_full.setFont(&fonts::Font6);     // フォント
    canvas_full.printf("%.2fV", voltage_readback);


    // 出力電流設定値
    canvas_full.setTextColor(WHITE, BLACK); // 文字の色
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(5, 150);
    canvas_full.setFont(&fonts::Font2);     // フォント
    canvas_full.print(F("Current Set: "));
    if(set_mode == 3)
    {
      canvas_full.setTextColor(GREEN, BLACK); // 文字の色
    }
    else
    {
      canvas_full.setTextColor(WHITE, BLACK); // 文字の色
    }
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(20, 170);
    canvas_full.setFont(&fonts::Font6);     // フォント
    canvas_full.printf("%.2fV", EepromData.OutputCurrent);


    // 出力電流出力値
    canvas_full.setTextColor(WHITE, BLACK); // 文字の色
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(150, 150);
    canvas_full.setFont(&fonts::Font2);     // フォント
    canvas_full.print(F("Current Out: "));
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setCursor(165, 170);
    canvas_full.setFont(&fonts::Font6);     // フォント
    canvas_full.printf("%.2fA", current_readback);

    // 各種UI表示
    canvas_full.setFont(&fonts::Font4);     // フォント
    canvas_full.setTextDatum(0);            // 文字の位置
    canvas_full.setTextSize(1);             // 文字のサイズ
    canvas_full.setTextColor(WHITE, BLACK); // 文字の色

    // タッチボタン表示
    canvas_full.setCursor(15, 218);
    canvas_full.print(F("MENU"));

    // 電源のON・OFFの状態で表示を切り替える
    if(EepromData.PowerEnable)
    {
      // 出力がONの時
      canvas_full.fillRect(110, 215, 105, 25, RED);
      canvas_full.setTextColor(WHITE); // 文字の色
      canvas_full.setCursor(140, 218);
      canvas_full.print(F("ON"));
      canvas_full.setTextColor(WHITE); // 文字の色
      canvas_full.setCursor(240, 218);
      canvas_full.print(F("OFF"));
    }
    else
    {
      // 出力がOFFの時
      canvas_full.fillRect(215, 215, 105, 25, GREEN);
      canvas_full.setTextColor(WHITE); // 文字の色
      canvas_full.setCursor(140, 218);
      canvas_full.print(F("ON"));
      canvas_full.setTextColor(WHITE); // 文字の色
      canvas_full.setCursor(240, 218);
      canvas_full.print(F("OFF"));
    }

    // 線描画
    // 枠線
    canvas_full.drawFastHLine(0, 16, 280, WHITE); // 水平線
    canvas_full.drawFastHLine(0, 75, 280, WHITE); // 水平線
    canvas_full.drawFastHLine(0, 145, 280, WHITE); // 水平線
    canvas_full.drawFastVLine(140, 16, 199, WHITE); // 垂直線

    // スイッチ部
    canvas_full.drawFastHLine(0, 215, 320, WHITE); // 水平線
    canvas_full.drawFastVLine(110, 215, 25, WHITE); // 垂直線
    canvas_full.drawFastVLine(215, 215, 25, WHITE); // 垂直線

    // UP,DOWN用
    canvas_full.drawFastVLine(280, 0, 215, WHITE); // 垂直線
    canvas_full.drawFastHLine(280, 108, 40, WHITE); // 水平線
    canvas_full.drawLine(286, 54, 300, 42, WHITE); // UP
    canvas_full.drawLine(314, 54, 300, 42, WHITE); // UP
    canvas_full.drawLine(286, 162, 300, 174, WHITE); // DOWN
    canvas_full.drawLine(314, 162, 300, 174, WHITE); // DOWN


    display.startWrite(); // SPIを占有 (描画速度向上の為)
    canvas_full.pushSprite(0 ,0); // メモリから描画する
    display.endWrite(); // SPI占有を解除


    // 画面更新待ち・タッチパネル読み込み
    while(true)
    {
      test_start_time = micros();// 描画スタート時間
      break_trig = false; // ブレイク用
      // タイマーで割り込みしたらタッチパネルの読取を行う
      if(touch_panel_read_time + 10 < millis()){
        touch_panel_read_time = millis(); // タッチパネルの読み取り時間を更新
        M5.update(); // タッチパネルの情報を更新する
        if(M5.Touch.isEnabled()) // タッチパネルが有効なら処理する
        {
          auto pos = M5.Touch.getDetail();
          bool p = pos.isPressed();
          int read_x = pos.x;
          int read_y = pos.y;

          if(p) // タッチパネルが押されてたら処理する
          {
            if(!touch_panel_pushing) // 初めて触った時の処理
            {
              touch_panel_pushing_time = millis();
              touch_panel_pushing = true;
              touch_panel_pushed_x = read_x;
              touch_panel_pushed_y = read_y;
            }

            // 押しっぱなしの時の処理
            else
            {
              // 長押し判定
              if((touch_panel_pushing_time + 1000 < millis() && touch_panel_long_press_time + 500 < millis())
              || (touch_panel_pushing_time + 3000 < millis() && touch_panel_long_press_time + 100 < millis()))
              {

                // タッチした場所とずれていないか判定する
                if(abs(touch_panel_pushed_x - read_x) < 20 && abs(touch_panel_pushed_y - read_y < 20))
                {
                  // UPボタン判定
                  if(280 < read_x && read_x < 320 && 0 < read_y && read_y < 108)
                  {
                    switch (set_mode)
                    {
                      // 内部抵抗変更
                      case 1:
                        EepromData.InternalResistance += 0.1;
                        if(EepromData.InternalResistance > ResistanceMax)
                          EepromData.InternalResistance = ResistanceMax; 

                        break;
                      // 出力電圧変更
                      case 2:
                        EepromData.OutputVoltage += 0.1;
                        if(EepromData.OutputVoltage > VoltageMax)
                          EepromData.OutputVoltage = VoltageMax; 

                        pps.setOutputVoltage(EepromData.OutputVoltage); // 出力電圧セット
                        break;

                      // 出力電流変更
                      case 3:
                        EepromData.OutputCurrent += 0.1;
                        if(EepromData.OutputCurrent > CurrentMax)
                          EepromData.OutputCurrent = CurrentMax; 

                        pps.setOutputCurrent(EepromData.OutputCurrent); // 出力電流セット
                        break;
                      
                      default:
                        break;
                    }

                    if(set_mode != 0)
                    {
                      break_trig = true; // ボタンが押されたので更新する
                      touch_panel_long_press_time = millis();
                      setting_update_time = millis();
                      vibration(70);
                    }
                  }

                  // DOWNボタン判定
                  else if(280 < read_x && read_x < 320 && 108 < read_y && read_y < 215)
                  {
                    switch (set_mode)
                    {
                      // 内部抵抗変更
                      case 1:
                        EepromData.InternalResistance -= 0.1;
                        if(EepromData.InternalResistance < ResistanceMin)
                          EepromData.InternalResistance = ResistanceMin; 
                        break;

                      // 出力電圧変更
                      case 2:
                        EepromData.OutputVoltage -= 0.1;
                        if(EepromData.OutputVoltage < VoltageMin)
                          EepromData.OutputVoltage = VoltageMin; 
                        pps.setOutputVoltage(EepromData.OutputVoltage); // 出力電圧セット
                        break;

                      // 出力電流変更
                      case 3:
                        EepromData.OutputCurrent -= 0.1;
                        if(EepromData.OutputCurrent < CurrentMin)
                          EepromData.OutputCurrent = CurrentMin; 
                        pps.setOutputCurrent(EepromData.OutputCurrent); // 出力電流セット
                        break;
                      
                      default:
                        break;
                    }
                    if(set_mode != 0)
                    {
                      break_trig = true; // ボタンが押されたので更新する
                      touch_panel_long_press_time = millis();
                      setting_update_time = millis();
                      vibration(70);
                    }
                  }
                }
              }
            }
          }
          else // タッチパネルを押していない時の処理
          {
            if(touch_panel_pushing) // タッチパネルを外したかの判定
            {
              
              // タッチした場所とずれていないか判定する
              if(abs(touch_panel_pushed_x - read_x) < 20 && abs(touch_panel_pushed_y - read_y < 20))
              {
                
                // ONボタン判定
                if(110 < read_x && read_x < 215 && 215 < read_y && read_y < 300)
                {
                  EepromData.PowerEnable = true;
                  OutputSend();
                  break_trig = true; // ボタンが押されたので更新する
                  vibration(70);
                }

                // OFFボタン判定
                else if(215 < read_x && read_x < 320 && 215 < read_y && read_y < 300)
                {
                  EepromData.PowerEnable = false;
                  pps.setPowerEnable(EepromData.PowerEnable);
                  break_trig = true; // ボタンが押されたので更新する
                  vibration(70);
                }

                // UPボタン判定
                else if(280 < read_x && read_x < 320 && 0 < read_y && read_y < 108)
                {
                  switch (set_mode)
                  {
                    // 内部抵抗変更
                    case 1:
                      EepromData.InternalResistance += 0.01;
                      if(EepromData.InternalResistance > ResistanceMax)
                        EepromData.InternalResistance = ResistanceMax; 

                      break;
                    // 出力電圧変更
                    case 2:
                      EepromData.OutputVoltage += 0.01;
                      if(EepromData.OutputVoltage > VoltageMax)
                        EepromData.OutputVoltage = VoltageMax; 

                      pps.setOutputVoltage(EepromData.OutputVoltage); // 出力電圧セット
                      break;

                    // 出力電流変更
                    case 3:
                      EepromData.OutputCurrent += 0.01;
                      if(EepromData.OutputCurrent > CurrentMax)
                        EepromData.OutputCurrent = CurrentMax; 

                      pps.setOutputCurrent(EepromData.OutputCurrent); // 出力電流セット
                      break;
                    
                    default:
                      break;
                  }

                  if(set_mode != 0)
                  {
                    break_trig = true; // ボタンが押されたので更新する
                    vibration(70);
                  }
                }

                // DOWNボタン判定
                else if(280 < read_x && read_x < 320 && 108 < read_y && read_y < 215)
                {
                  switch (set_mode)
                  {
                    // 内部抵抗変更
                    case 1:
                      EepromData.InternalResistance -= 0.01;
                      if(EepromData.InternalResistance < ResistanceMin)
                        EepromData.InternalResistance = ResistanceMin; 
                      break;

                    // 出力電圧変更
                    case 2:
                      EepromData.OutputVoltage -= 0.01;
                      if(EepromData.OutputVoltage < VoltageMin)
                        EepromData.OutputVoltage = VoltageMin; 
                      pps.setOutputVoltage(EepromData.OutputVoltage); // 出力電圧セット
                      break;

                    // 出力電流変更
                    case 3:
                      EepromData.OutputCurrent -= 0.01;
                      if(EepromData.OutputCurrent < CurrentMin)
                        EepromData.OutputCurrent = CurrentMin; 
                      pps.setOutputCurrent(EepromData.OutputCurrent); // 出力電流セット
                      break;
                    
                    default:
                      break;
                  }

                  if(set_mode != 0)
                  {
                    break_trig = true; // ボタンが押されたので更新する
                    setting_update_time = millis();
                    vibration(70);
                  }
                }

                // ohm設定ボタン判定
                else if(0 < read_x && read_x < 140 && 16 < read_y && read_y < 75)
                {
                  if(set_mode == 1)
                  {
                    set_mode = 0;
                  }
                  else
                  {
                    set_mode = 1;
                  }
                  
                  break_trig = true; // ボタンが押されたので更新する
                  vibration(70);
                }

                // ボタン判定
                else if(0 < read_x && read_x < 140 && 75 < read_y && read_y < 145)
                {
                  if(set_mode == 2)
                  {
                    set_mode = 0;
                  }
                  else
                  {
                    set_mode = 2;
                  }

                  break_trig = true; // ボタンが押されたので更新する
                  vibration(70);
                }

                // OFFボタン判定
                else if(0 < read_x && read_x < 140 && 145 < read_y && read_y < 215)
                {
                  if(set_mode == 3)
                  {
                    set_mode = 0;
                  }
                  else
                  {
                    set_mode = 3;
                  }

                  break_trig = true; // ボタンが押されたので更新する
                  vibration(70);
                }
              }
            }
            touch_panel_pushing = false; // タッチパネル押しっぱなし判定のリセット
          }
        }

        float ax, ay, az;
        M5.Imu.getAccel(&ax, &ay, &az);
        test_end_time = micros() - test_start_time;
      }

      //前回更新から500msec 経過したら抜ける
      if((millis() > lcd_draw_time + 500) || break_trig)break;
      delay(1);
    }
  }
}

タイトルとURLをコピーしました