
Arduino入門



#include "M5Chain.h"
#define RXD_PIN GPIO_NUM_5 // 47 for the other side of Chain DualKey
#define TXD_PIN GPIO_NUM_6 // 48 for the other side of Chain DualKey
Chain M5Chain;
device_list_t *device_list = NULL;
uint16_t device_count = 0;
uint8_t opr_status = 0;
uint8_t switch_id = 0;
bool switch_found = false;
const uint16_t OPEN_THRESHOLD = 3967;
const uint16_t CLOSE_THRESHOLD = 128;
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("===========================");
Serial.println("M5Stack Chain Switch Test");
M5Chain.begin(&Serial2, 115200, RXD_PIN, TXD_PIN);
while (!M5Chain.isDeviceConnected()) {
Serial.println("No device connected");
delay(1000);
}
M5Chain.getDeviceNum(&device_count);
device_list = (device_list_t *)malloc(sizeof(device_list_t));
device_list->count = device_count;
device_list->devices = (device_info_t *)malloc(sizeof(device_info_t) * device_count);
M5Chain.getDeviceList(device_list);
for (uint16_t i = 0; i < device_count; i++) {
if (device_list->devices[i].device_type == CHAIN_SWITCH_TYPE_CODE) {
switch_id = device_list->devices[i].id;
switch_found = true;
Serial.printf("ID[%d] is Chain Switch\n", switch_id);
break;
}
}
if (!switch_found) {
Serial.println("Chain Switch not found");
return;
}
// Set the onboard RGB LED brightness (0-100).
M5Chain.setRGBLight(switch_id, 50, &opr_status);
// Set open/close thresholds without saving them to flash.
M5Chain.setSwitchThresholdValue(switch_id, OPEN_THRESHOLD, CLOSE_THRESHOLD,
&opr_status, CHAIN_SAVE_FLASH_DISABLE);
M5Chain.setSwitchDirection(switch_id, CHAIN_SWITCH_DOWNUP_INC, &opr_status,
CHAIN_SAVE_FLASH_DISABLE);
}
void loop() {
if (!switch_found) {
delay(1000);
return;
}
uint16_t switch12Bit = 0;
switch_status_type_t switch_status = CHAIN_SWITCH_OPEN;
if (M5Chain.getSwitch12BitAdc(switch_id, &switch12Bit) == CHAIN_OK &&
M5Chain.getSwitchStatus(switch_id, &switch_status) == CHAIN_OK) {
uint8_t rgb[3];
if (switch_status == CHAIN_SWITCH_CLOSE) {
rgb[0] = 0;
rgb[1] = 255;
rgb[2] = 0;
} else {
rgb[0] = 255;
rgb[1] = 0;
rgb[2] = 0;
}
M5Chain.setRGBValue(switch_id, 0, 1, rgb, sizeof(rgb), &opr_status);
Serial.printf("ADC: %u, status: %s\n", switch12Bit,
switch_status == CHAIN_SWITCH_CLOSE ? "ON" : "OFF");
} else {
Serial.println("Failed to read Chain Switch");
}
delay(200);
}Chain Bridge コネクタを使用して、メインコントローラである Chain DualKey と Chain Switch を接続します。接続時は方向に注意し、三角形の矢印がメインコントローラ Chain DualKey から外側へ向くようにしてください(下図参照):
この例では、Chain DualKey の GPIO5 を RX、GPIO6 を TX として使用します。Chain Switch を Chain DualKey の反対側のインターフェースに接続する場合、または別のメインコントローラを使用する場合は、実際の配線に応じてプログラムの RXD_PIN と TXD_PIN を変更してください。
Chain Switch のスライダーは STM32G031G8U6 の PB0 (ADC_IN) に接続され、MCU 内蔵の 12 ビット ADC を使用します。出力範囲は 0 ~ 4095 です。プログラムの OPEN_THRESHOLD と CLOSE_THRESHOLD はそれぞれ開状態と閉状態のしきい値を表し、設定可能な値の範囲は 0 ~ 4095 です。この例では 3967 と 128 に設定し、CHAIN_SWITCH_DOWNUP_INC によってスライダーを下から上へ動かすと ADC 値が増加する方向に設定しています。
上記のプログラムをコンパイルしてデバイスに書き込み、Arduino IDE 右上のボタンをクリックしてシリアルモニタを開きます。Chain Switch の 12 ビット ADC 値とスイッチ状態をリアルタイムで確認できます。Chain Switch が ON のときは基板上の RGB LED が緑色に、OFF のときは赤色に点灯します:
<Chain Switch のシリアルモニタ出力(ADC 値とスイッチ状態)の画像>
サンプルの動作結果は次のとおりです: