2024年6月4日火曜日

Raspberry pi(master)とESP32(slave)のI2C通信

まず基本的なこと。ESP32のWireはずっとslaveにならず外部のライブラリを使う必要があったけど、いつの間にかマージされたんですねー。普通のArduinoと同じようにWire.begin(Slave Address, SDA, SCL, Clock);と書けばスレーブとして動作します。

さて、Rapberry Piの3番ピンとXIAO S3のD0、5番ピンとD1、GNDと6番ピン とを接続して、Raspberry Piのraspi-configでI2Cを有効にし、i2cdetect -y 1<Enter>と押せばXIAOのスレーブアドレスが表示され……ません。

しばらく悩みましたが、ESP32側でI2Cクロック周波数を100000に設定してRaspberry Piの標準I2C速度に合わせたところ、無事通信できました。

……速度を自動的にあわせてくれるセンサーなどのI2Cデバイスって偉いですね ^ ^;


■余談:今日も朝からハマりまくりでした■

XIAO S3がどうも自動書き込みできなくなってBOOTボタン(ちっこい)とResetボタン(ちっこい)で強制的に書き込みモードにしていたんですが……Serial.beginの後にdelay(5000)を入れたら問題なく動くようになりまして。

while( !Serial ); を入れればいいんですかね。でも、これ入れると装置に組み込んでシリアルつながない状態だと永遠に起動しないんですよね(XIAO RP2040の場合……S3, C3などでは試してない←試せ←試します)。

whileに真面目にタイムアウトとか組み込んだ状態で対応すべきなんですが……そうすると組み込みの顧客から「起動が遅い!」って怒られてどうすりゃいいのさ思案橋(古い)。

--

次にハマったのはESP32でのサーボ制御。せっかくビット数の多いPWMがあるんだから真面目にPWMのリロードなどを書けば良い精度で複数chの50Hz PWM制御できると思うんですが、なかなか良いライブラリがありません……オシロで見ていると複数のサーボを同時に動かすだけでパルス幅がメロメロになっちゃう。

今回使いたいのは2chだけなので自分で書くか……とも思ったのですが、AVRなArduinoでしか動かないけどやけに滑らかに動くので、それ使うことにしました。ライセンスがGPLだけど顧客の承認も取れましたし。高い高い純正のArduino nanoも買いました。とりあえずティーチングした通りにサーボ2個を動かす必要があるので、学習データはI2C EEPROMに書き込むことにします。

I2C EEPROMの追加は10分で終わるけど、サーボの処理は10分じゃ書けない!

実作業よりハマっている時間の方が長いんですよね……。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。