pdf-icon

Arduino入門

2. デバイス&サンプル

Unit Grove to Grove Arduino チュートリアル

1. 準備

2. サンプルプログラム

サンプルの説明
Unit Grove to Grove は、Grove インターフェースを通じて流れる電流値を測定でき、インターフェースの電源回路を制御することができます。このユニットは、アナログ信号の読み取り用と電源オン/オフ制御用の2つのIOインターフェースを提供します。

電流値計算

cpp
1 2 3 4
uint32_t adc_raw = adc1_get_raw((adc1_channel_t)ADC1_CHANNEL_7);
uint32_t voltage_mv = (uint32_t)(esp_adc_cal_raw_to_voltage(adc_raw, adc_chars));
float voltage = (voltage_mv - offset) / 1000.0f;
float grove_current = (voltage / 50.0f / 0.02f);

電源スイッチ

cpp
1 2 3 4 5
pinMode(POWER_CTL_PIN, OUTPUT);
// 電源オン!
digitalWrite(POWER_CTL_PIN, HIGH);
// 電源オフ!
digitalWrite(POWER_CTL_PIN, LOW);

完全なプログラム

M5Unified と M5GFX を基にした基本的な表示とスイッチ制御を追加し、電流値の読み取りとタッチによる電源制御を実現します。

ADC チャンネルの注意点:
この例では、ESP32-S3 の ADC 入力ピンとして GPIO8 を使用しているため、初期化時に ADC1_CHANNEL_7 に設定する必要があります。異なるマイコンを使用する場合は、対応する ESP32 チップのマニュアルを参照し、ADC の章で使用する GPIO とチャンネルを確認し、プログラムを修正してください。
cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
#include <M5Unified.h>
#include "driver/adc.h"
#include "esp_adc_cal.h"
#include "math.h"
#define POWER_CTL_PIN 9
#define ANALOG_PIN 8
esp_adc_cal_characteristics_t *adc_chars;
bool power_status = false;
float offset = 0.0f;
void adc_init()
{
gpio_pad_select_gpio(ANALOG_PIN);
gpio_set_direction((gpio_num_t)ANALOG_PIN, GPIO_MODE_INPUT);
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(ADC1_CHANNEL_7, ADC_ATTEN_DB_11);
adc_chars = (esp_adc_cal_characteristics_t *)calloc(1, sizeof(esp_adc_cal_characteristics_t));
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 3300, adc_chars);
}
void cal_adc_offset()
{
float sum = 0;
for (int i = 0; i < 100; i++) {
uint32_t adc_raw = adc1_get_raw((adc1_channel_t)ADC1_CHANNEL_7);
uint32_t voltage_mv = (uint32_t)(esp_adc_cal_raw_to_voltage(adc_raw, adc_chars));
sum += voltage_mv;
}
offset = sum / 100.0f;
}
void setup()
{
M5.begin();
Serial.begin(115200);
pinMode(POWER_CTL_PIN, OUTPUT);
// 電源オン!
digitalWrite(POWER_CTL_PIN, power_status);
M5.Display.setFont(&fonts::FreeMonoBold12pt7b);
M5.Display.println(power_status ? "Grove Power On" : "Grove Power Off");
adc_init();
cal_adc_offset();
}
time_t last_update_time = 0;
void loop()
{
M5.update();
auto t = M5.Touch.getDetail();
if (t.wasClicked() || M5.BtnA.wasClicked()) {
Serial.println("click!");
power_status = !power_status;
digitalWrite(POWER_CTL_PIN, power_status);
M5.Display.fillRect(0, 0, 320, 50, BLACK);
M5.Display.setCursor(0, 0);
M5.Display.println(power_status ? "Grove Power On" : "Grove Power Off");
if (!power_status) {
cal_adc_offset();
}
}
if (millis() - last_update_time > 1000) {
last_update_time = millis();
M5.Display.fillRect(0, 50, 320, 100, BLACK);
M5.Display.setCursor(0, 50);
uint32_t adc_raw = adc1_get_raw((adc1_channel_t)ADC1_CHANNEL_7);
uint32_t voltage_mv = (uint32_t)(esp_adc_cal_raw_to_voltage(adc_raw, adc_chars));
float voltage = (voltage_mv - offset) / 1000.0f;
float grove_current = (voltage / 50.0f / 0.02f);
M5.Display.printf("Grove Current:%.3fA\r\n", grove_current);
Serial.printf("Grove Current:%.3fA\r\n", grove_current);
}
}

3. コンパイルとアップロード

    1. ダウンロードモード:異なるデバイスではプログラム書き込み前にダウンロードモードに入る必要があります。この手順は使用するメインコントロールデバイスによって異なる場合があります。詳細については、Arduino IDE のはじめにガイド を参照し、デバイスごとのダウンロード手順をご確認ください。
  • CoreS3 の場合、リセットボタンを 2 秒ほど長押しして、内部の緑色の LED が点灯したらボタンを離します。これでデバイスはダウンロードモードに入り、プログラム書き込みの準備が整います。

    1. デバイスのポートを選択し、Arduino IDE の左上にあるコンパイル&アップロードボタンをクリックして、プログラムのコンパイルとアップロードを行います。

4. 電流監視と電源制御

タッチスクリーンを使って、Unit Grove to Grove の電源回路のスイッチを制御し、現在の電流値をリアルタイムで表示します。

On This Page