中華製16桁×2行LCDの不具合を解消する！

# 経緯

2024年10月に [Amazon Japanで中国製のLCDを購入](https://www.amazon.co.jp/gp/product/B0B76Z83Y4/ref=ppx_od_dt_b_asin_title_s01?ie=UTF8&th=1) しました。

価格は6,000円、16桁×2行のバックライト付きLCDが２つ入ったものを2つ買いました。 届いてすぐに動作確認をしましたが、うまく点灯しませんでした。

しかし、この不良は、若干の手直しで、動作するようになりますので、
同じ症状でお悩みの方が居られましたら、皆さんに共有したいと思います。


# どのような商品？
取扱説明書も、図面も、何もついていない、Amazon あるある商品。
パッケージにQRコードが付いていますので、[製造メーカサイト](https://freenove.com  "freenove.com/") からサンプルプログラムをダウンロードできます。
頒布されているサンプルには、以下のものが入っていました。

* LCDのデータシート
* PCF8574(I2C)インターフェイスチップのデータシート
* その他、おすすめ商品のデータシート
* USBドライバ（CH340、当商品とは全く関係なし）
* Arduino、C++、Pythonでのサンプルコード
  * Arduino版(C++)のソースは他メーカー（Adafruit）のライブラリを使用
  * C++のサンプルは、ライブラリが添付していないため使用できません
  * Pythonのものは、RPi.GPIO を使用しており ラズパイ５ では動きませんでした
 

## まずは動作確認

**Arudino** で簡単な サンプルコード を作って動作を確認していきます

<iframe width="600" height="360" src="https://www.youtube.com/embed/S83sZMYC3BA" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

上記の動画では、「12_」と出ていますが、実際には「12345」と出力しています。
「12_」も出たりでなかったりで、動作が非常に不安定でした。

## サンプルコード
* <p>前記のLCDを動作させた仮コード（Arduino 用）は以下の通りです。</p>
* **lcd.init()** を2回呼んでますが、2回呼ばないと動きません！

```C++:sketch_NanoIOT.ino
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {

    lcd.init();
    lcd.init();

    lcd.display();
    lcd.backlight();
    lcd.cursor();
    lcd.setCursor(0,0);
    lcd.print("12345");
}
void loop() {
  // put your main code here, to run repeatedly:
}
```



# 商品の仕様・構成

まずデータシートから確認していきます。
LCDモジュールだけのデータシートと思われる、製造メーカーサンプル在中の **LCD1602.pdf** （商品名：TC1602B-01）から抜粋；
<table>
<tr><td>LCDバックライト最大定格</td><td colspan="4">最大 150mA</td></tr>
<tr><td>LCDバックライト定格</td><td colspan="4">5.0V</td></tr>
<tr><td>液晶モジュール定格</td><td>4V～</td><td> 4.2V (typ値)</td><td>～4.4V</td><td>100mA</td></tr>
<tr><td>LCDモジュール電源</td><td colspan="4">5.0V</td></tr>
<tr><td>外部接続</td><td colspan="4">GND / VCC / SDA / SCLの4線式（I2C）</td></tr>
<tr><td>I2C制御IC</td><td colspan="4">PCF8574T または PCF8574AT<br/>
8ビット・シフトレジスタにI2C機能が付いたような代物</td></tr>
<tr><td>LCD制御IC</td><td colspan="4">恐らく日立の HD44780 (1999') と同等</td></tr>
<tr><td>その他</td><td colspan="4">

- LCDモジュールだけのデータシートで、LCDモジュールの寸法図が書かれており、当該商品とは別物だと分かります
- 液晶モジュールとバックライトの稼働電圧が異なりますが、液晶モジュールの電源ラインに抵抗やレギュレータらしきものは付いていません
- バックライトLED用に耐圧45V/100mA の電圧バラストタイプのトランジスタ1つと、電流制限用の抵抗100オームが付いてます

</td></tr>
</table>

## PCF8574 の接続ライン

次に **I2C** インターフェイスの **PCF8574** ですが、チップ自体のデータシートであり、特段おかしいところはありませんでした。

本商品としてのデータシートは付属していないので、チップ間接続を調べることにします。
テスターと虫眼鏡で確認したところ、以下のような接続でした。
LCDを、4ビットモードで制御する仕様です

|PCF8574の端子|LCD側の端子(4ビットモード)|備考|
|:-----------:|:----------------------:|---|
|D0|RS|0=コマンド/1=データ|
|D1|RW|0=書き込み/1=読み込み|
|D2|E|許可ライン(クロック的)|
|D3|Backlight|0=オフ/1=オン|
|D4|D4|4bitモードでのD4ライン|
|D5|D5|4bitモードでのD5ライン|
|D6|D6|4bitモードでのD6ライン|
|D7|D7|4bitモードでのD7ライン|


## PCF8574 の I2Cアドレス選択
I2Cアドレス選択は、以下のようになっています
（PCF8574 のデータシートから抜粋）
<table>
<tr><th rowspan="2">I2Cアドレスライン</th><th colspan="2">I2Cアドレス選択</th></tr>
<tr><th>PCF8574A<br/>0x3F(初期値)</th><th>PCF8574<br/>0x27(初期値)</th></tr>
<tr><td style="text-align:center;">A7</td><td>0 内部固定</td><td>0 内部固定</td></tr>
<tr><td style="text-align:center;">A6</td><td>0 〃</td><td>0 〃</td></tr>
<tr><td style="text-align:center;">A5</td><td>1 〃</td><td>0 〃</td></tr>
<tr><td style="text-align:center;">A4</td><td>1 〃</td><td>1 〃</td></tr>
<tr><td style="text-align:center;">A3</td><td>1 〃</td><td>0 〃</td></tr>
<tr><td style="text-align:center;">A2</td><td colspan="2" rowspan="3">下位3ビットは基板上のジャンパより、<br/>

|ジャンパ|信号レベル|
|:-:|:-:|
|オープン|High(1)|
|ショート|Low(0)|
|デフォルト|全オープン（0b111と等価）|

</td></tr>
<tr><td style="text-align:center;">A1</td></tr>
<tr><td style="text-align:center;">A0</td></tr>
<tr><td colspan="3" style="text-align:center;">アドレス線 (A0～A2）ジャンパ（<font color='red'><b>赤枠</b></font> ）<br/>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1890015/b4c5d6ba-1d8e-48eb-9a74-ac43d726d742.jpeg" width="400"><br/>
下の黒く四角いのが <b>PCF8574</b> です<br/>
その上の3本脚の黒いのが電圧バラスト用のトランジスタ
</table>




# 動作させるための修正


## 対策その1） **電源電圧を下げる**
データシートからの観点で、液晶モジュールに、typ値の **4.2V** でなく **5V** が供給されている点が気になるので、まずここから改善します。LCDに直接手を加えるのではなく、電源ラインに抵抗を入れて降圧させることにしました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1890015/719b1da4-ffe2-487d-8e30-bc68e0c4cbdb.png" width="400">

画ずらが汚いですが、<font color='red'><b>赤丸</b></font> の箇所が電源ラインに挿入した抵抗です。
色々やってみて41オームに落ち着きました。
電圧は、typ値より若干低い **4.1V** 弱になりました。

## 対策その2） **バックライトの電流制限抵抗を交換**

次は液晶の文字色が黒くなる現象の対策です。

### 動作症状
* <p>症状としては以下のものが挙げられます。</p>

  |バックライト|状態|正常性|
  |:---:|----|:--:|
  | 消灯時 | 明るい光にかざすと、液晶部分が白く抜けている|正常|
  | 点灯時 | じわじわと、でもほぼ瞬時に黒く変色する|異常|

### 不良原因
* <p>前記の症状から、考えられる原因は、以下の通りです。</p>

1. バックライトの消費電力が大きい
2. ゆえに液晶部で著しい電圧降下が発生
3. 電圧降下により液晶色が白から黒に変色する

### 修正

* 次のように修正して行きます

|修正箇所（添付写真）の説明|
|---|
| 1. 左端<font color='red'><b>赤枠</b></font>のところにLEDの **A**（アノード）, **K**（カソード）が見えます |
| 2. <font color='red'><b>赤矢印</b></font>（ハイライト部分）のところに LED のラインが通っています |
| 3.  <font color='orange'><b>橙色</b></font>の箇所に「101」と書かれたチップ抵抗 **100**オーム があります。<br/>これを **220**オーム 1/4W のチップ抵抗（「221」表示）に交換します。<br/>※ 抵抗の交換には、元の抵抗の取り外しと、ハンダ付け作業が必要です。|
| ![IMG_1611-1 編集済み 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1890015/d46dbdda-edce-43ee-828a-36c859e5452a.png) |

# 修正後の動作確認

これですべての手順は終わりです。修正後の様子を撮影しました。
青地のバックライトに、白抜きの字がちゃんと表示されています！

<iframe width="600" height="360" src="https://www.youtube.com/embed/gd8Xk5c-TMA" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 最後に

如何だったでしょうか？

では、また！