ATOM MatrixのセンサとIO

[Wi-Fiを繋げてるとLED Matrixがチラつく問題](https://qiita.com/jksoft/items/915f917fd76c2b045fe0#%E5%8B%95%E4%BD%9C%E4%B8%8D%E8%89%AF)はまだわかってないですが、そもそもESP32はWi-Fiモジュールとして使っていて中まであまり調べてないのと、M5Stack系を触るの初めてなので、基本的なとこから調べてます。趣味の範囲なので、テキトーですがｗ

ATOM Matrixのファーストタッチからサードタッチぐらいまでやってきたので、ATOM Matrix自体を調べてみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/04756f34-222d-5ccd-cc1f-63a245d24a55.png)

途中の内容もあるので、この記事に追記していく形で纏めていきたいと思います。

ほかにもATOM Matrixに関する記事を書いています。
[ATOM Matrixを触ってみた](https://qiita.com/jksoft/items/fa92281f90bcbc32929c)
[ATOM Matrixに心拍センサを繋ぐ](https://qiita.com/jksoft/items/1307056b2d001388974a)
[ATOM MatrixをAmbientに繋ぐ](https://qiita.com/jksoft/items/915f917fd76c2b045fe0)
[ATOM Matrixの消費電流を計測してみた](https://qiita.com/jksoft/items/e78b95e4ba786a9d81b0)



# GPIOピン
ATOM Matrixの裏には電源と6ポートのGPIOがあります。単純なデジタル入出力以外にも機能を持ってそうなので、調べてみました。
ちなみに黄色い丸の部分は裏にM2のねじ穴があり、シールをはがずか、穴をあけることでネジ止めできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/3c1a7a06-4293-5904-64e9-ff7aad7ddfe2.png)


~~回路図（公開されてる？）をあまり調べられなかったので、間違いがあるかもしれません。~~
チップの情報は[ESP32-PICO](https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/core/esp32-pico-d4_datasheet_en.pdf)
GPIOピンのレジスタは以下のソースコードの`esp32_gpioMux`という変数で定義されています。
`\ArduinoData\packages\esp32\hardware\esp32\1.0.4\cores\esp32\esp32-hal-gpio.c`
そこから調べた結果なので、間違いないと思います。

| ピン名 | ポート番号 | 機能 |
| --- | --- | --- |
| G19 | 19 | デジタル入出力 |
| G21 | 21 | デジタル入出力、内部で6軸センサMPU6886のI2C SCLに接続 |
| G22 | 22 | デジタル入出力 |
| G23 | 23 | デジタル入出力 |
| G25 | 25 | デジタル入出力、アナログ入力、アナログ出力、内部で6軸センサMPU6886のI2C SDAに接続 |
| G33 | 33 | デジタル入出力、アナログ入力、タッチセンサ |

※GPIOマトリクス機能によりUARTやI2C、SPIは好きなピンに割り当て可能です。



## アナログ入力
アナログ入力(G25、G33)にボリュームを接続し、確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/8052cc60-d6ff-c8c4-cca5-64d68c56350d.png)


### プログラム

```cpp

int analogIn = 25;  // 25 or 33

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  Serial.printf("analogRead() = %d\n", analogRead(analogIn));
  delay(100);
}
```

### 結果
ボリュームを回すと値が変化しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/ad8805ce-9dfc-c1a5-60c1-2bf260840846.png)

## アナログ出力

## タッチセンサ
スマホのタッチパネルのように静電容量を計って、指が触れているかまたは近いかを数値で取得できます。（指が近い、触れてるほど0に近づきます）
タッチセンサの機能はG33ピンに割り振られていますが、なぜかプログラム上では32を指定しないと反応しませんでした、おそらくGPIOの定義テーブルが間違っているんだと思います。

### プログラム

```cpp
int touch = 32;  // 物理的にはG33ピンだがプログラム上の指定は32となっている

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.printf("touchRead() = %d\n", touchRead(touch));
  delay(100);
}
```

### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/24660ffe-1404-b32c-2055-a532e55b33eb.png)


## UART
[Co2センサ(UART)の確認](https://qiita.com/jksoft/items/3df0d8321a4e6125de47#co2%E3%82%BB%E3%83%B3%E3%82%B5uart%E3%81%AE%E7%A2%BA%E8%AA%8D)を参照ください。

## I2C
[BME680(I2C)の確認](https://qiita.com/jksoft/items/3df0d8321a4e6125de47#bme680i2c%E3%81%AE%E7%A2%BA%E8%AA%8D)を参照ください。

## SPI

###

# ホールセンサ
ESP32のチップ自体にホールセンサが内蔵されている様なので、確認してみました。

## プログラム
簡単にホールセンサの値を取得できる関数が用意されているので、それの値を取得しているだけです。

```cpp
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  Serial.printf("hallRead() = %d\n", hallRead());
  delay(100);
}
```
## 結果
磁石を近づけると大きく変化するので動いてます。磁石でON/OFFするにはフィルタが必要そうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/899e3957-d8f3-2ffa-26e2-026d86f808a1.png)

# 6軸センサ

## プログラム

## 結果