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