MicroPython的午睡(125)ESP32でテスト対向機、相手はPICのI2Cスレーブ

Joseph Halfmoon

前回はPICマイコンのSPIスレーブのテストをお手伝い。こちらからは送信一方でした。今回は同じくPICマイコンのI2Cスレーブのテストですが送受してます。折り返してデータを照合しようなどとは考えてないので各方向とも同じデータの垂れ流しっす。MicroPythonを使えば「さらさら」書ける簡単なプログラム。ホントか?

※「MicroPython的午睡」投稿順 Indexはこちら

※Windows11上のThonny IDE 4.0.1 と ESP32 Devkit C に書き込んだMicroPython v1.19.1で動作確認しています。

別シリーズでPICマイコンのI2Cスレーブを使ってみたのは以下記事です。PICマイコンのMSSPは、SPIでもI2Cでも、マスタでもスレーブでもなる変幻自在?な周辺回路です。

PIC三昧(16) MSSP、I2C Slaveモードでデータを送受、PIC16F18855

MicroPython ソフトウエアI2Cバス

ESP32の場合、ハードウエアのI2Cインタフェースも当然使えるのですが、ソフトウエアのI2Cというものも使えます。フルソフトでIOポートを操作してI2Cしているので、速度的にはハードには及びませぬが、GPIOピンを漏れなく使えるので便利です。日本語ドキュメントは以下に。

クラス I2C — 2線式シリアルプロトコル

今回はテストのお手伝いなので、ソフトウエアI2Cを使ってみます。

実験に使用したMicroPython スクリプト

I2Cマスタになって、相手のPICマイコンの通信のお相手をします。短いスクリプトですが、以下を2秒ごとに繰り返します。

    1. I2Cバスをスキャン。使用可能な7ビットアドレスを全スキャンする。該当アドレスからACKが返ってくればそのアドレスを表示。
    2. PICマイコンに設定のアドレス宛に1バイトデータ0xA5を書き込み
    3. PICマイコンに設定のアドレスから1バイトデータを読み込む。読み込んだデータを表示。
from machine import Pin, SoftI2C
import time

I2CADR = 8

def main():
    print("ESP32, SOFT I2C master.")
    i2c = SoftI2C(scl=Pin(21), sda=Pin(22), freq=10000)
    while True:
        print("i2c SCAN: ", i2c.scan())
        i2c.writeto(I2CADR, b'\xA5')
        rb = i2c.readfrom(I2CADR, 1)
        print("READ : 0x{0:02x}".format(int.from_bytes(rb, 'little')))
        time.sleep_ms(2000)
           
if __name__ == "__main__":
    main()
ESP32 DevKitCとPIC16F18855をI2C接続

ESP32 DevKitC(MicroPythonが動作している)と、PIC16F18855の開発ボード(被テスト対象のC言語からビルドしたオブジェクトが動作している)を接続したところが以下に。PIC16F_ESP32

どちらもI2Cバスの端子は自由度が大きいので、上は単なる成り行きの結果っす。

動作確認

PIC側での受信(当方からみたら送信)結果は別記事で(まあ成功しておるけど。)以下は、MicroPython上でのSCANと1バイトリードの結果。

i2c SCANは[8]が返ってきております。i2cバスに接続しているのは7ビットアドレス0x08のPICマイコンのみ。ちゃんとPICのインタフェースは生きておるみたい。

その後の1バイトリードの結果は0x34とな。これは予定どおり。i2cREAD

まあ、PICマイコンのI2Cスレーブ、動いているみたいね。お手伝いできてよかった?

MicroPython的午睡(124)ESP32のMicroPythonでPICのテスト補助 へ戻る

MicroPython的午睡(126)M5Stack UIFlow2対応、MicroPythonを書き込む へ進む