前回紹介したNode-RedからのI2Cデバイス制御する方法に続いて、応用例を紹介します。
Node-Redはノードを結び付けてフローを作成してプログラミングできる他にファイルの読み込み、書き出しをすることが可能です。今回はMicrochip製のI2C接続EEPROM 24LC512とUSB-I2C変換アダプタを使用してメモリデータのファイルへの読み出しとファイルからの書き出しをしてみました。プログラムのforループを書き直すことで24LC64, 256にも対応可能です。また、アドレスをバンク毎で書き換えれば24LC1024にも対応できます。なお、アドレスセレクトのA0、A1、A2はすべてGNDに接続しています。
下記のようにNode-Redでコードを書いてました。
16byteずつ読み込んでcsvファイルに出力します。NodejsPortableの場合はNodeJSPortable\Dataのフォルダにmem_read.csvが生成されます。
処理のラグが多く、24LC512の場合はすべて読み出すまでに10分程度要しました。
csvファイルから読み込んで書き込むツールも同様に作成してみました。16byte毎に0~255の数字を書き込んだcsvファイル(mem_write.csv)を用意し、Node-Redから読み込んで24LC512に書き込みます。
読み込み同様に16byte毎のcsvファイル(mem_write.csv)から8byte毎に書き込みを実行します。NodejsPortableの場合はNodeJSPortable\Dataのフォルダにcsvファイル(mem_write.csv)を配置します。シリアルI2C変換SC18IM700のバッファサイズが16byteのため、開始や終了コマンドを含めると最大10byte毎の書き込みとなりますが、キリが悪いので8byte毎に書き込みを実行しました。
読み込み同様に書き込みには10分ほど要しました。一般的には書き込みの方が時間を要しますが、今回のシステム構成の場合は書き込みの方が若干早く処理が終わりました。この理由として読み込みの場合、Node-Redのシリアル送信処理をしてからシリアル受信するまで待機する必要があります。一方、書き込みの場合は一方的にシリアル送信処理のみなのでシリアル受信するまで待機する必要ありません。シリアル受信はOS側のFIFOやNode-Red側の割込み発生周期などが影響し、シリアル受信してもすぐに受信処理が実行されません。現在のコードは受信処理が16byte毎に発生しますが、少し大きなサイズでまとめて受信すれば、受信処理の待機時間の回数を減らせるため、全体の処理時間を短くできると思われます。
正直、実用的なバックアップ、リストアツールではありませんが、ちょっとデータを保存しておきたいといった場合や複製したいという場合には有効だと思いました。I2Cアドレスやサイズを変更すれば24LC512以外でもI2CのEEPROMであれば利用できます。今回のサンプルコードはこちらで公開しています。活用してみてください。