1602LCDとは
SC1602に代表される、キャラクタ表示の LCDモジュール。
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まである。
コントローラー
日立の 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モジュール
なお、今回は 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);
}
基板を起こして動かしてみました。
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 ライブラリ → 廃止
まずはライブラリとしてこれを使ってみましたが・・・
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)
動いた動いた・・と思ったら、このライブラリは廃止なんだって。
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 は使ってないのだが適当に設定した。
映りました。