Zero_hat_1 回路修正
先の記事「Zero_hat_1 手作り試作」で触れましたが、仕事で作ったPWB(生基板)で問題が発生していました。
不具合の内容はLCDに表示が得られない(または不安定)状態でした。致命的です。原因究明作業の詳細は省略して、Raspberry Pi の I2C (SDA, SCL)端子は内部で1.8kΩでプルアップされていることを知らなかったことが原因です。調べてみるとWeb上に多くの情報があって、勉強不足を恥じ入るばかりです。
I2Cの信号(大概要)
I2Cの信号線(SDA, SCL)はタイトル画像のようにプルアップして使います。プルアップとは図のように当該信号と電源の間に抵抗を接続することです。
I2Cバスラインに接続されたデバイスは各々必要なタイミングで各信号(SDA, SCL)からGNDに電流を流して、信号電圧を下げることで必要な信号を作ります。
I2Cの通信はマスターとスレーブの間で行われます。スレーブはI2Cバスライン上に複数接続できますが、マスター(この場合RasPi)は1つだけです。
(例外的に時分割でマスターを交代させるシステムもあります。)
SCL についてはもっぱらマスターが信号を制御します。
スレーブに対する通信はマスターがスレーブのアドレスを指定して第一声を発し、該当するスレーブが応答する形で通信を行います。
マスターからスレーブに対する問いかけに答える形でスレーブが返信することで双方向の通信を可能にします。
スレーブはひたすらマスターの話を聞き、マスターが送るSCLに同期して自分が返信すべきタイミングで(に限り)SDAからGNDに電流を流してSDAをLowにすることで返信します。
マスターからスレーブに対して一方的に指示を出す場合も、アドレスが一致したスレーブが(だけが)所定のタイミングでACKと言うLow信号を作ってマスターに返します。
不具合の原因
原因は、前述のACK信号の電圧がLowレベルに達していなかった(達しないことがある)ことにあります。
LCDを2個試しましたが、以下の状況です。
1.不安定(稀に表示しない)なものはACKの信号レベルが0.9[V]程度
2.表示しないものはACK信号レベルが1.2[V]程度
I2CのLowレベル閾値VIL は 0.3VCC (この場合0.3*3.3=0.99V)以下です。
私がI2Cを使い始めたころは、プルアップ抵抗は2kΩでした。
最近は省電力化が進み、短距離通信で使うセンサなどは10kΩが多くなりました。
今回使用したLCDもプルアップ抵抗として10kΩを推奨しています。
対策前、タイトル画像に示す4.7kΩが無い場合です。
結果、LCDはACKのタイミングで、Raspberry Pi 内部のプルアップ抵抗 1.8kΩに抗してSDAからGNDに電流を流しながらも力及ばずLowレベルまで引き下げることが出来ずに表示なし(あるいは不安定)と言う不具合が発生しています。
推定電流(タイトル画像の電流計の推定電流)
1.の場合 (3.3-0.9)/1.8k = 1.33[mA]
2.の場合 (3.3-1.2)/1.8k = 1.17[mA]
つまり、スレーブはACK送出のタイミングで 1.33~1.17[mA]しか電流を流せていないことになります。
暫定対策
Webからの情報を頼りに、タイトル画像の4.7kΩ(最終的に3.3kΩ)を追加し非力なLCDのACK生成作業を手助けすることで、とりあえず表示が安定しました。
3.3kΩの場合、ACKタイミングの電圧Voutはタイトル画像の電流計測定値をIoutとして
Vout = 3.3 - 1.8k*(Iout + Vout/3.3k)
Vout = (3.3-1.8k*Iout) / (1+1.8k/3.3k)
Iout = 1.17[mA]とすると
Vout = 0.773[V]
ただし、3.3kΩを選択した時点で SDA のHigh 電圧は2.1[V] 程になり、I2Cの規格を満足していません。LCDが動いているのだから問題ないだろうとLCDの仕様を見るとVIHは Min. 0.8VDD = 3.3*0.8 = 2.64[V]とこれも満足していません。(汗)
つまり、たまたま表示している(表示しなくても文句は言えない)状態です。
特定用途に限り、デジタル信号として代用可能なアナログ信号に過ぎません。(電気信号は本質的に全てアナログなのですが・・・)
仕事で作る機器は、少数の社内利用ツールであることと期日と予算の関係で、当面は3.3kΩプルダウン作戦で進めることにしました。
Zero_hat_1 (B01)はどうあるべきか
LCDの他、I2Cを使ってセンサ等を接続出来る汎用性を必要とする Zero_hat_1 は3.3kΩプルダウン作戦で誤魔化すことは出来ません。
前述のプルダウン作戦が経年変化等で不具合を生じさせた時には、何食わぬ顔で入れ替わってもらわなくてはなりません。
バスリピーターを追加して汎用性を確保します。
「Zero_hat_1 手作り試作」に、なんとかして全てディスクリート部品で作ろうと思います。と書いてしまいましたが、修正します。
バスリピーターだけはSMD(面実装部品)にします。
一方で、汎用性などいらない、LCDが使える最小コストの基板が欲しい(面実装部品は勘弁して)と言う方のために、実装部品を加減することでバスリピータ無しでプルダウン作戦も使える基板にする予定です。
今後の予定
方針が決まったところで、回路図修正とアートワークに着手します。
今後とも宜しくお願いします。
追伸:
バスリピーターを使った改善例は「Zero_hat_1-1 動作確認 OK」をご参照下さい。
出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。