ATOM MatrixのセンサとIO


Wi-Fiを繋げてるとLED Matrixがチラつく問題はまだわかってないですが、そもそもESP32はWi-Fiモジュールとして使っていて中まであまり調べてないのと、M5Stack系を触るの初めてなので、基本的なとこから調べてます。趣味の範囲なので、テキトーですがw

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

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

ほかにもATOM Matrixに関する記事を書いています。
ATOM Matrixを触ってみた
ATOM Matrixに心拍センサを繋ぐ
ATOM MatrixをAmbientに繋ぐ
ATOM Matrixの消費電流を計測してみた

GPIOピン

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

回路図(公開されてる?)をあまり調べられなかったので、間違いがあるかもしれません。
チップの情報はESP32-PICO
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)にボリュームを接続し、確認しました。

プログラム


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);
}

結果

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

アナログ出力

タッチセンサ

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

プログラム

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);
}

結果

UART

Co2センサ(UART)の確認を参照ください。

I2C

BME680(I2C)の確認を参照ください。

SPI

ホールセンサ

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

プログラム

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

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するにはフィルタが必要そうです。

6軸センサ

プログラム

結果