t-yosh’s blog

元ソフトウェアエンジニアが、モノづくりについて学んでいるブログです。モノづくりに必要なハードウェア・ソフトウェア・デザインのことを書いています。

水漏れセンサー 保守編

水漏れセンサーの保守関係

 

たまに動かなくなっている時があるという連絡を受けた。不可解な動作としては以下があるということを聞いた

(1) ディスプレイの表示がおかしくなっている時がある。

(2) ディスプレイ表示がおかしい時、動作していない様に見受けられる。

(3) 電源をON/OFFすると直る。

 

<ハードウェア>

信頼性を上げるために中継基板起こし。

今回、seeedで頼んでみたんだけど、インターフェースが良いので注文しやすかったです。最近、Eagleの中に基板作成のためのGerberを作成するツールが追加されていて、楽になったんですが、seeedのサイトだと、データを上げたあとにGerberファイルをチェックできる画面に飛ぶので、ここのステップも楽でした。(いつもはGerber Viewerというサイトで最後に確認していた。)

 

f:id:t-yosh:20190329002415j:plain

<ソフトウェア>

一日に一度再起動するプログラムに変更したところ、I2Cの読み込みと書き込みに失敗するような動作になってしまった。

色々調べたところ、新しいesp32のライブラリにした時の、Wireライブラリの動作が変っていた。(arduino-esp32 ライブラリ stable版 1.0.1 )

具体的には、以下のPCAL9555APWのサンプルコードでWire.requestFrom(id, datasize,false ) を呼ぶとI2Cのコマンドの読み込みが動かなかった。(波形を見ると読み込みの信号が出ていない。)

 

trac.switch-science.com

 色々確認したところ、Wire.requestFrom()の引数の動作が変わったようでした。

void dataread(int id,int reg,int *data,int datasize)
{
Wire.beginTransmission(id);
Wire.write(reg);
Wire.endTransmission(false);
Wire.requestFrom(id, datasize, false);
for(int i=0;i<datasize;i++)
{
data[i] = Wire.read();
}
Wire.endTransmission(true);
}

 

Wire.requestFrom()関数の第三引数はstopbitを送るかどうかなのだが、Wire.requestFrom(id, datasize,true)にすると読み込みできるようになりました。Wire.requestFrom(id, datasize)でもOKで、ソースコードを見ると引数がない場合はstopbitを勝手に入れるみたいでした。

 ↓ 読み込みデータが戻るように直ったところf:id:t-yosh:20190203223355p:plain

 

ソフトウェアのバグはコードだけでしばらくデバッグしていたのですが、やはりオシロで信号当たったほうが問題の特定するのが早かったです。