ここ数週間、M5 と Arduino の SPI 通信にハマっています(現在進行形)。
M5Stack Tough や Arduino MKR wifi 1010 に加速度センサーを付けて波形を取れるようになりました。それをロギングするのに MicroSD を使用しようと目論見。
まずは M5。 こちらには TF カードモジュールが実装されています。SD.begin()に TF が使用している4番を割り振ってから、そこにカードを突っ込むだけ。ではダメでした。コンパイル直後は正しい値を示すものの、電源を入れなおすと加速度値が 0.00 になります。これが改善せず、放置。
次に MKR。 こちらも TF カードモジュールを加えるとダメ。取得値の桁が変わります。SDに書き込めるのでCSピンは正しく機能しているはず(と思いたいがダメなのでしょう)。コチラはブレッドボードに指していたので、TF モジュールやワイヤー順にを取り除いてみました。結果、MKR ボードに指すだけでも値が不安定になります。接触抵抗抵抗?電流不足?速度?
ブレッドボードを使用しない場合も試してみましたがダメ。で、放置。
似たような症状でしたので、少なくともSPIは干渉しているのでしょうと想像し、センサーを HSPI に、TF を VSPI に切り分けてみることにしました。M5 の接続は I2C と GPIO ポートを利用し、TFと物理的に分けました。
この段階でようやく理解したのが、SPI ライブラリが M5 と MKR で異なっている点。M5 は SPI.begin()にピン番号を引数として指定できたのですが、MKR ではダメ。M5 では SPIClass hspi(HSPI) が通るのに、MKR ではダメ。どちらを使うかはボードを選択したときに決まるようですね。esp32 と SAMD21 の違いでしょうね。
その後、Google先生や ChatGPT師範に教わるも進展なし。時間を溶かしながらも、ようやく M5 だけ通信ができました。以下の手順です。
・I2Cポート、GPIOポートに接続
・M5.In_I2C.release() で I2C をリリース。
・ピンを割り振って起動
//spi2.begin(sckPin, miPin, moPin, csPin);
spi2.begin(26, 36, 32, 33);
pinMode(csPin, OUTPUT);
digitalWrite(csPin, HIGH);
M5 では SPIClass hspi(HSPI) は通りますが不要でした。これ、ハマりどころでは?https://forum.arduino.cc/t/esp32-spi-accelerometer/1004705
web 上に情報がたくさんあるので素人でもなんとかなるでしょう、と軽い気持ちで始めたのですが、それは間違いでした。同じ名前のライブラリでも機種によって異なる、たくさんあるコードや情報には新旧玉石が混在。欲しい情報がなかなか見つかりませんでした。想定に反し、苦戦しそうです。
この先、M5 もディスプレーを begin すると TF と干渉するのでしょうか。うーん。
放置していた Raspberry Pi Pico へ進みましょうか。
****************************
20231230 試作品をGitHubに公開
https://github.com/T40O0/ADXL355_SPI_M5_SD_FIR.git