1602 キャラクタ LCDモジュール を STM32 と RaspberryPi  で動かす

# 1602LCDとは

SC1602に代表される、キャラクタ表示の LCDモジュール。

![IMG_20200318_170019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/84f797d9-706c-e28b-2ebd-b3071e5dcfbf.jpeg)

16行2列。キャラクタは5x7ドット。

SC1602は台湾SUNLIKE社の製品。この形態のLCDモジュールは山ほどあるが、オリジナルはどこだろう？？ （現サンテック・ディスプレイ株式会社？）

表示文字数が異なるバリエーションがあり、たとえば16行1列は SC1601, 20行4列はSC2004。

インターフェースは16ピン。ピンが 2x8ピンと 1x16ピンのタイプがある。SUNLIKE社の製品だと、 SC1602A は 2x8ピンタイプ、 SC1602B は 1x16ピンタイプ。

SUNLIKE社の1602シリーズは他にも SC1602C, SC1602D , ・・・とあり、 SC1602Zまである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1c344503-c432-2588-d611-cb8465c2f4db.png)

## コントローラー

日立の HD44780コントローラー ないし互換品。
 
日立の HD44780 コントローラーは 1980 年代から存在するドライバチップ。
https://www.crystalfontz.com/blog/look-back-tech-history-hd44780-controller-data-sheet/

元々2x28文字が表示できる。拡張ドライバを使うと80文字まで表示できるらしい。


## 濃度調整ボリューム

LCDモジュールのピン3は、半固定抵抗で濃度を調整する。今回手持ちに半固定抵抗が無かったため10kΩと10kΩで中点の電位でいいんじゃない？ と思ったら全然ダメだった。

http://radiopench.blog96.fc2.com/blog-entry-287.html
によると、0.5V ぐらいなのだそうです。

2kΩと330Ωで3.3Vを分圧すると何とか見える濃度になりました。

## 使用したLCDモジュール

中国で流通している、安いもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/df68dd5b-c326-4a80-31d4-3989d832b787.png)

3.3V 仕様のものを使いました。
![IMG_20200319_120241.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2b7651a2-461e-de30-c4f5-5633d8af3870.jpeg)


なお、今回は 3.3V 仕様のものを購入しましたが 5V 仕様のものでも I/O は 2.2V 以上で Hi になるので、3.3V 系のマイコンで大体使えます。

# STM32 で動かしてみる

## 環境

- STM32_Arduino
- Arduino IDE 1.6.10
- Ubuntu 18.04

## 配線

以下のようにしました。

この配線のバインディングは必ずしもこれである必要はなく、大体、自由ぽいです。


|LCD PIN|SIGNAL NAME|STM32|
|:---:|:---:|:---:|
|1| VSS|GND|
|2| VDD|3.3V|
| 3 |VO |(Volume)|
| 4| RS|PB11|
| 5 |R/W|GND|
| 6| E|PB10|
|7| D0|(NC)|
|8 |D1|(NC)|
|9 |D2|(NC)|
|10 |D3|(NC)|
| 11 |D4|PB0|
|12 |D5|PB1|
|13|D6|PC13|
|14|D7|PC14|
|15 |LED(+)|3.3V|
|16 |LED(-)|GND|



```

#include <LiquidCrystal.h>

const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //STM32 Pins to which LCD is connected
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD

void setup() {
Serial1.begin(115200);
lcd.begin(16, 2);//Defining 16*2 LCD
lcd.setCursor(0, 0); //LCD Row 0 and Column 0
lcd.print("Hello...!");
lcd.setCursor(0, 1); //LCD Row 0 and Column 1
lcd.print("Time:");

}

void loop() {

lcd.setCursor(6, 1);
int times=millis() / 1000;
lcd.print(times);
Serial1.println(times);
delay(1000);
}

```

![IMG_20200317_144723.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/603c8a5d-f5ec-60a1-9696-907201b20f09.jpeg)

基板を起こして動かしてみました。

# RaspberryPi


|LCD PIN|SIGNAL NAME|RaspberryPi2|
|:---:|:---:|:---:|
|1| VSS|GND|
|2| VDD|3.3V|
| 3 |VO |(Volume)|
| 4| RS|GPIO26|
| 5 |R/W|GND|
| 6| E|GPIO19|
|7| D0|(NC)|
|8 |D1|(NC)|
|9 |D2|(NC)|
|10 |D3|(NC)|
| 11 |D4|GPIO20|
|12 |D5|GPIO21|
|13|D6|GPIO22|
|14|D7|GPIO27|
|15 |LED(+)|3.3V|
|16 |LED(-)|GND|

## Adafruit_Python_CharLCD ライブラリ → 廃止

まずはライブラリとしてこれを使ってみましたが・・・

https://github.com/adafruit/Adafruit_Python_CharLCD

pip3を使ってインストール


```

pi@raspberrypi:~ $ sudo pip3 install Adafruit_CharLCD
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting Adafruit_CharLCD
  Downloading https://www.piwheels.org/simple/adafruit-charlcd/Adafruit_CharLCD-1.1.1-py3-none-any.whl
Collecting Adafruit-GPIO>=0.4.0 (from Adafruit_CharLCD)
  Downloading https://www.piwheels.org/simple/adafruit-gpio/Adafruit_GPIO-1.0.3-py3-none-any.whl
Collecting adafruit-pureio (from Adafruit-GPIO>=0.4.0->Adafruit_CharLCD)
  Downloading https://www.piwheels.org/simple/adafruit-pureio/Adafruit_PureIO-1.0.4-py3-none-any.whl
Requirement already satisfied: spidev in /usr/local/lib/python3.7/dist-packages (from Adafruit-GPIO>=0.4.0->Adafruit_CharLCD) (3.4)
Installing collected packages: adafruit-pureio, Adafruit-GPIO, Adafruit-CharLCD
Successfully installed Adafruit-CharLCD-1.1.1 Adafruit-GPIO-1.0.3 adafruit-pureio-1.0.4

```

```

import Adafruit_CharLCD as LCD
lcd_rs        = 22
lcd_en        = 26
lcd_d4        = 5
lcd_d5        = 6
lcd_d6        = 13
lcd_d7        = 19
#
lcd_columns = 16
lcd_rows    = 2
#
#
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
                       lcd_columns, lcd_rows)
lcd.clear()
lcd.message('Hello...!')
# cursol blink
lcd.blink(True)                          
```
![IMG_20200317_154041.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/20d07b71-a869-5401-4371-0d661b85f6bc.jpeg)


動いた動いた・・と思ったら、このライブラリは廃止なんだって。

## Adafruit_Python_CharLdCD ライブラリ


なので、adafruit_character_lcd ライブラリを使いました。

https://github.com/adafruit/Adafruit_Python_CharLCD
https://learn.adafruit.com/character-lcds/python-circuitpython


### インストール

```
sudo pip3 install adafruit-circuitpython-charlcd

```

### Python プログラム

下のページ
https://learn.adafruit.com/character-lcds/python-circuitpython
の
Raspberry Pi simpletest example:
は上記ページでは表示されていないが、Project ZIPの中に charlcd_rpi_mono_simpletest.py
がある。

ページ内にある charlcd_mono_simpletest.py とコードは同じ、GPIOの割当などの指定が違うだけ。


これらのプログラムを、今回の配線に合わせて、以下のように書き換える。


```

# Metro M0/M4 Pin Config:
lcd_rs = digitalio.DigitalInOut(board.D26)
lcd_en = digitalio.DigitalInOut(board.D19)
lcd_d7 = digitalio.DigitalInOut(board.D27)
lcd_d6 = digitalio.DigitalInOut(board.D22)
lcd_d5 = digitalio.DigitalInOut(board.D21)
lcd_d4 = digitalio.DigitalInOut(board.D20)
lcd_backlight = digitalio.DigitalInOut(board.D13)

```

lcd_backlight は使ってないのだが適当に設定した。

映りました。

![IMG_20200320_074915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1d3053a7-d32b-5d72-a8ac-272d117ad730.jpeg)