RaspberryPi I2C接続のキャラクタLCDを使う (AQM1602)

 2016-07-30
最近のロットのAQM0802やAQM1602は、少々仕様に変更が入ったらしく、そのままではRaspberryPiで使えなくなってしまったらしい。
 
 
 
でも私は変更前のロットのAQM0802をRaspberryPiで普通に使用できた経験があったため、「まぁ大丈夫だろう」と楽観視して買って来たのですが・・・・

動かない・・・


完全に動かないのではなく、たまに通信が失敗する感じで、微妙に希望を持ってしまう感じがやらしい。
raspi_i2c_aqm.jpg
折角買ったのでどうにか使える様にしました。


忙しい人のための結論

PNPトランジスタと抵抗を1個ずつ使用する方法が低コストで、かつ、バス上の電圧への影響が少ないため、ベストかと思います。


なぜ動作しないのか

まずこの問題は、RaspberryPiの基板上でSDAが1.8Kというやや低めの抵抗でプルアップされていることが一つの原因です。I2CバスはオープンドレインのワイヤードORな接続を行うため、プルアップ自体は必要な処置なのですが、付いている抵抗がやや低いのが問題。。。
低めの抵抗でプルアップされているということは、プルアップが強めに効くということです。そして例のAQM1602や同0802はどうかと言うと、SDAの駆動能力が低いのです。後述しますが、1.2mA程度しか引けません。1.8kで3.3Vにプルアップされているバスから1.2mAを引くと、約1.14V程度までしか電圧が下がりません。

バスの電圧を3.3Vとしたとき、I2Cの規格上ではVIHは2.31V以上(0.7*Vcc)、VILは0.99V以下(0.3*Vcc)と決められています。LCD側がLをドライブしようとして1.2mAを引いても、バスの電圧は1.14Vまでしか下げられないので、I2Cバス的にはLと見なされないというわけです。
実際には設計マージンなどもあって、個体それぞれの実力によって動いたり、動かなかったりするわけです。


先人達の苦労

この事は割と昔から議論にはなっていたようです。 ↓参考

Raspberry Pi • View topic - i2c pull up resistors
https://www.raspberrypi.org/forums/viewtopic.php?f=44&t=7664

Since the RPi board already has 1.8K resistors on the I2C lines, any pull-ups included on a breakout board are superfluous and can be removed. On the other hand, they probably won't cause any problems as long as they aren't too big or too small in value.


「実例で学ぶRaspberry Pi電子工作」補足情報: 読者の方々の声
http://raspibb2.blogspot.jp/2015/12/blog-post_31.html

「LCDの新しいロットでは電流の引き込み能力が低いためACK信号が十分小さくならず、Raspberry Piで認識しない」


「実例で学ぶRaspberry Pi電子工作」補足情報: 本書発売後の追加情報
http://raspibb2.blogspot.jp/2015/12/blog-post.html

p.171:完成品のLCDを購入しても認識されない場合の暫定的な対処法
Raspberry Piから認識されない完成品LCDに対して ... SDA部からGNDの間に抵抗を追加すると、動作を確認することができました。


AQM1602XA-RN-GBWをRaspberry Piで使う | たくのこ Web
http://www.takunoko.com/blog/aqm1602xa-rn-gbw%E3%82%92raspberry-pi%E3%81%A7%E4%BD%BF%E3%81%86/

そこで、 ... RaspberryPi上の抵抗を外します。


I2C接続小型キャラクタLCDモジュール(16x2行・3.3V/5V)ピッチ変換キット: ディスプレイ関連 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/g/gK-08896/

☆Raspberry Piで使用する際は、下記の「よくある質問(Q&A)」およびPDF資料をご参照ください。
http://akizukidenshi.com/download/ds/akizuki/I2C-LCD_Raspberry_Pi_repeater.pdf


FAQ詳細 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/faq/goodsfaq.aspx?goods=K-08896

これを回避するためには[SDA(データ)]ラインに双方向バッファ(リピーター)を介在させ、正常なデータ通信を確保する必要があります。 簡単な方法として、I2Cバスリピーター[ I-10882 ]を使用 ...




回避策

現状において回避策は三つ。
  1. RaspberryPi基板に実装されている1.8kのプルアップ抵抗を取り外す (= RaspberryPi基板の改造)
  2. 駆動能力の低いSDAラインにプルダウンを追加して微妙な中間電位に吊る
  3. I2Cバス向けのバッファを入れてバスを切り離す


回避策1はRaspberryPiの基板に直接手を加えるというところがハードルが高いです。ニッパーで抵抗を砕けばそれでオッケーだろうとは思いますが、折角汎用的に使えるボードに手を入れてしまうのはちょっと・・・なのでこれはパスします。

回避策2は抵抗1本で実行できるためお手軽ですが、丁度良い抵抗を探す必要があります。ヘタに適当な抵抗値のものを使うとVIHの電圧がI2Cバスの規格から外れる恐れがあります。たぶん、デバイス個別の実力において動作する領域はあると思いますが。。。

回避策3は確実でしょう。しかしコストがかかります。秋月でリコメンドされている石は1個110円します。AQM0802は320円程度で入手できますので、単純に3割増しのコストになります。おまけにパッケージは表面実装用なのでブレッドボードやRaspberryPiのピンヘッダに挿せる様に変換基板も用意するとなるとさらにコスト増。。。


第4の(インチキ)回避策

そこで、これらをイイカンジに解決する策はないかとごにょごにょやって思いついた方法を解決策4として提案します。
RaspberryPiとLCDとの間のSDAラインに100k程度の大きめな抵抗を挿入し、そこで発生する電位差でPNPトランジスタを駆動してRaspberryPi側のSDAラインをGNDに落とすものです。

RaspberryPi側からすると1.8kのプルアップラインをPNPトランジスタがLドライブするので充分に電位が下がります。ただしトランジスタ駆動用の電位差は必要になるため下がりきっても0.7Vとか0.8V程度は残ります。しかしこれはI2Cバスの規格で決められたVIL以下なので問題ありません。
LCD側からすると1.8kのプルアップと間に挟まれた100kの抵抗によって、見かけ上101.8kのプルアップになるため1.2mAの駆動能力でも充分にLに下げられます。問題は大きな抵抗が通信線につくので、通信速度に悪影響があることです。しかしI2Cは遅い通信速度でも動作可能ですし、そもそもAQM1602やAQM0802は元々低速でしか動きませんので、実際の影響は軽いかと思います。


回路sim

実際にやってみるまえに適当にシミュレーションしてみます。

そのままRaspberryPi

raspi_i2c_aqm_01-normal_0.png
まずはRaspberryPiや外付け回路に特に何もしない状態を作って動作を確認しておきます。上の方にゴチャっとあるのが電源で3.3Vとしました。それからI2Cバス規格の0.3*Vccと0.7*Vccをグラフに出すための分圧。
真ん中辺りにある1.8kのR1がRaspberryPi基板上にあるプルアップ抵抗のつもり。
向かって左側のV1とM2がRaspberryPiのSDA駆動部分。N-ch MOSでオープンドレインとしました。
向かって右側のV2とM1がLCDのSDA駆動部分。同じくN-ch MOSですが、駆動能力が低いことを演出するために直列抵抗R3を入れました。
R3の値は後述のオシロスコープによる観測から950Ωとしました。オシロ確認前は適当に2kとか5kとか適当に入れてました。

raspi_i2c_aqm_01-normal_1.png
こちらはsim結果。V1,M2とV2,M1を動かしてRaspberryPi側LCD側それぞれでHiz駆動(?), L駆動を行わせました。
I2CバスはワイヤードOR構成なので、最初の25%部分以外はどちらかまたは両方がL駆動なので、バス電圧はLになるのが期待値です。
しかしsim結果からはRasPiがHizでLCDがLのとき、I2Cバス電圧は1.1V程度になってしまい、VILである0.99Vを上回ってしまいました。一応VIHは超えていないので大丈夫そうな感じではありますがこの波形がL→L駆動だからそうみえるだけであって、H→L駆動の場合は実によろしくありません。 (AQM***はReadできないので実際は問題ないのかも?)
これが実デバイスで通信が成立したり失敗したりと不安定な原因です。


2.2kでプルダウン (回避策2)

raspi_i2c_aqm_02-2_2kdown_0.png
I2Cバスを(先人達が試していた)2.2kでプルダウンしました。

raspi_i2c_aqm_02-2_2kdown_1.png
VILは満たせるようになりましたが、やはりVIHは規格未達になりました。
実機ではこれでも一応動作可能で、数十回試行した限りでは通信エラーは発生しませんでした。
しかし規格上はよろしくありませんし、常に電流が流れる構成なのでできれば避けたいところ。。。


トランジスタで必要なときだけGNDに落とす(回避策4)

raspi_i2c_aqm_03_pnp-tr_0.png
SDAラインに100kの抵抗を入れ、そこで発生した電位差でPNPを駆動する様にします。

raspi_i2c_aqm_03_pnp-tr_1.png
VIHもVILも規格を満足できました。 トランジスタの動作電圧はどうしても必要なので0.7V程度の浮き上がりがあります。


オシロで実機動作を確認

持ってて良かった安物オシロ

そのままRaspberryPi

raspi_i2c_aqm_wave_01-normal_1.jpg raspi_i2c_aqm_wave_01-normal_2.jpg
とくに何もしない、そのまま接続した状態で波形を見てみます。
ちょっと見にくいですが電圧カーソルをI2C規格のVIH,VILに置いています。小さい山の箇所がLCDによるLドライブです。
この写真の波形はアドレスに対するACKのところです。たぶん。
simで確認した様に、I2Cの規格を超えてしまっています。 1.1V以上、1.2V以下な程度まで浮き上がっているので、1.2mA程度しか流せていない模様。


2.2kでプルダウン (回避策2)

raspi_i2c_aqm_wave_02-2_2kdown_1.jpg raspi_i2c_aqm_wave_02-2_2kdown_2.jpg
2.2kでプルダウンしました。写真中央付近にある金皮の水色の抵抗を追加しました。
こちらもsim通り、VILは満足しましたがVIHが低すぎる結果に。。 Vmax=1.96V
ただし、この波形でもLCDはエラー無く動作します。


トランジスタで必要なときだけGNDに落とす(回避策4)

raspi_i2c_aqm_wave_03-pnp-tr_1.jpg raspi_i2c_aqm_wave_03-pnp-tr_2.jpg
2SA1015と100kの抵抗を追加しました。
sim通りの波形が得られています。3.3Vフルスイングしていますし、LCDからのACK波形もVIL以下なのでI2C規格としてもLであると認識されます。


結論

RaspberryPiでAQM***なLCDを使うときは、バスバッファを使ってバスを切り離しましょう。(といいつつ私は未確認)
バスバッファのコストが気になるなら、PNPトランジスタと100kの抵抗を使うことでI2C規格を満足した状態で回避可能です。
極限までコストをそぎ落としたいなら、2.2kの抵抗でSDAをプルダウンしましょう。I2C規格は違反しますが、デバイスの実力で動作するようです。


この回路で問題ないかな?

おわり。

 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/242-bec25699
≪ トップページへこのページの先頭へ  ≫