« Arduino-UNOでのdelayMicrosecondsの設定は16383までだ! | トップページ | 秋月のI2C液晶表示器 ACM0802C-NLW-BBW-IIC 文字表示ライブラリ »

2021年7月 2日 (金)

秋月の液晶表示器 ACM0802C-NLW-BBW-IIC、I2Cのプルアップ抵抗

いつもはパラレルインターフェースの液晶表示器を
使うんですが、今回初めて、I2Cインターフェースのを
手に入れてみました。
   ・秋月のACM0802C-NLW-BBW-IIC
2本でインターフェースできるんで、パラレル品よりラクチン。
11_20210702171801
ところが・・・
パラレルインターフェース品だと、Arduinoのライブラリ
LiquidCrystal」を使えば悩むことはありません。
「みなさん、I2Cのだとどうしてるの?」と探しますと・・・
ズバリのがありません。
3.3Vでも5Vでも使える「AQM」シリーズのなら、
「I2CLiquidCrystal」や「LiquidCrystal_I2C」が使えそう
なんですが、ACM0802C-NLW-BBW-IICとは制御(初期化方法)
がちょい異なります。
  ※ACM0802C-NLW-BBW-IICのほうが昔からの
   HD44780と同じで拡張されていない。
  ※アカンと判断したライブラリ・・・
    時間待ちに「delay()」を使ってるもの。
    delay()はタイマー0の割り込みが絡んでるんで。

そこで、「LiquidCrystal」を手直ししてライブラリ化。
あれこれして動くようになりました。
   ※そのうちまとめますんで。
    「delayMicroseconds」  も絡みました。

試行錯誤の途中、I2Cの信号をオシロで見ていて
「ちょいとこれはどうしたもんだ」な事態に気が付きました。

ACM0802C-NLW-BBW-IICのI2Cライン、液晶基板上に「2.2kΩ
のプルアップ抵抗が乗っています。
12_20210702171801

液晶制御ICのLレベル駆動能力がちょい不足しているようで、
2.2kだと十分に引っ張り切れていないのです。

Image000_20210702171801  
液晶が出力する信号は、I2Cの「ACK」
これがGNDレベルからちょっとだけ浮いてしまいます。
Arduino-UNOのATmega328PはACKとして認識してますが、
もうちょいLレベルを下げたいところ。
I2Cのスピードも遅いですし、10kΩくらいで良いのではと。

駆動レベルを確かめるのに、もうちょい負荷を重してみるとどうやと、
SDAラインに2.2kΩの抵抗を並列につなぐとこうなりました。

Image001_20210702171801
Arduinoが出力するLレベルも持ち上がってしまいました。


※busyフラグを読みたかった
ライブラリ「LiquidCrystal」は「R/W」信号をつないでも
液晶の「busyフラグ」は読んでくれません。
  だからR/WはGND接続というのが定石。
busyをチェックできれば、タイマー待ちにせず、最速で動かす
ことができるんですが・・・
このACM0802C-NLW-BBW-IICもダメでした。
読めるかなと思って試してみましたが(コマンド表にはあるんで)、
バスが反応しませんでした。

※参考:ラジオペンチblog
ArduinoでI2Cキャラクタ液晶を使う(その1) 基本動作確認
ArduinoでI2Cキャラクタ液晶を使う(その2) ライブラリの選定
ArduinoでI2Cキャラクタ液晶を使う(その3) 最終動作確認

※悩みどころ
・液晶のイニシャル処理に「I2Cの初期化:Wire.begin()」を入れてしまっても
 良いものか。
 メイン側の「setup()でしてね」のほうが、良いように思うが。

・AQMシリーズの拡張命令はどうしよう。
   とりあえずほっとこうかと。

  今回のACM0802のI2Cアドレスは0x3C~0x3F。
    SA1、SA0の設定で4種選べる。
  ACM1602になると0x50固定。
  AQM1602だと0x3E。

※追記 SDA、SCLのプルアップ抵抗を10kΩにしたら、
Image002
ACK信号の浮き上がり、0.24Vほどに。

抵抗なしにしてATmegaの内蔵プルアップ抵抗にすると、
Image003
この抵抗値、40kΩくらい。
波形の鈍り具合から見て、これはちょいかわいそう。

※追記 待ち時間について
I2Cの「ACM0802」、コマンドやデータ書き込み後の
待ち時間、このような表になっています。
Dd2
内部クロックが「540kHz」とずいぶん高速な
値が記されているのです。

対し、従来型のパラレル・インターフェースの
「ACM0802」ではこんな具合。
Dd1_20210706102701
190kHz、270kHz、350kHzと3種類のクロック
での時間が記されています。

I2CのACM0802、実際のクロック周波数は?
っと調べてみました。
基板上、「RF」と記されて抵抗があります。
(値は91kΩ)これで内部クロック周波数を
決めているのだろうと、オシロのプローブを
当てると・・・「370kHz」くらいの三角波
が出てました。

ということは、上の表ではなく下表の350kHzあたり
を参考にして時間を決めるということになるかと
思います。
画面クリアだと1.5~2msちょいは待ちたい。
データだと40μs~50μsは必要かと。

※I2Cインターフェース液晶 8文字x2行文字表示ライブラリ
 まとめておきました。
秋月のI2C液晶表示器 ACM0802C-NLW-BBW-IIC 文字表示ライブラリ
お試しください。

|

« Arduino-UNOでのdelayMicrosecondsの設定は16383までだ! | トップページ | 秋月のI2C液晶表示器 ACM0802C-NLW-BBW-IIC 文字表示ライブラリ »

Arduino」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« Arduino-UNOでのdelayMicrosecondsの設定は16383までだ! | トップページ | 秋月のI2C液晶表示器 ACM0802C-NLW-BBW-IIC 文字表示ライブラリ »