【解決】Nokia 5110 LCD(液晶ディスプレイ)に何も表示されない
- Nokia 5110 LCDモジュール
- Arduinoとの接続はSPI
- モジュールのピンアウト
- ESP32のSPIについて
- ライブラリはAdafruitを使用
- モジュールのピンアウト
- 何も表示されないんですけど!
- めちゃめちゃアナログな解決方法
- コントラストとバイアスを調整
- サンプルスケッチを使って調整
- バイアス
- コントラスト
- 思わぬ落とし穴:USBハブ
- サンプルスケッチを使って調整
- 後記
Nokia 5110 LCDモジュール
電子工作に使える安価なディスプレイの一つに、Nokia 5110という1998年頃のノキアの携帯電話に使われていたモノクロ液晶ディスプレイを再利用※したものがあり、Nokia 5110 LCDなどの名前でAmazonでも買うことができます。
再利用って、要するにリサイクル回収された20年前の携帯から液晶を取り出して今売ってるって事? そんな数出回るものなの? と思ったんですが、そこは流石《さすが》ノキア、同じスペックの液晶を使った後継機種Nokia 3210はなんと1億6000万台を販売したそうで、それだけあれば回収できたのがわずかでも電子工作のニッチな需要を埋めるには十分そう。同じ液晶ユニットを使った機種は他にも多そうだし、それだけの数を製造していたなら工場も残ってそう。
そういえばiモードにもノキア端末ありましたね。ちょっとコダワリのある人が使ってるイメージでした笑。
モノクロ2階調のみ、解像度もわずか84x48ピクセルと、往年のピッチ(PHS)やiモード以前の携帯端末を思わせるような味のあるディスプレイで、知る人ぞ知るArduino互換の携帯ゲーム機
『Gamebuino』(初代)にも使われていました(残念ながら2代目Gamebuino Metaはカラー液晶になってしまいました)。
暗いところでも画面が見えるよう、青または白色のバックライトLEDも搭載しています。もっとも、今日《こんにち》想像するムラのない綺麗なバックライトと違い、4箇所の光源位置丸わかりですが、それもまた魅力というものです。
Arduinoとの接続はSPI
ArduinoとはSDカードモジュールの接続でお馴染みのSPI接続になります。SDカードと違ってモジュール側からArduinoへ送る情報は無い(Arduinoから液晶に表示する内容を送るだけの一方通行)のでMISO《Master In Slave Out》ピンは使いません。その代わり他にSPIの他に2ピンの接続が必要で、GNDとVCC(3.3V)と合わせてArduinoとは7本のワイヤーで接続する形になります(バックライトLEDを操作したければもう1本)。
モジュールのピンアウト
# | 表記 | 説明 | ESP32での接続例 |
---|---|---|---|
1 | RST | リセットピン。Arduinoの汎用GPIOに接続。 | GPIO 2 |
2 | CE | SPIのCS《Chip Select》(またはSS《Slave Select》)。Arduinoの汎用GPIOに接続。 | GPIO 15 |
3 | DC | Data/Commandピン。Arduinoの汎用GPIOに接続。 | GPIO 4 |
4 | DIN | SPIのMOSI《Master Out Slave In》。ArduinoのMOSIピンに接続。ESP32であれば通常(VSPI)はGPIO 23となる。 | GPIO 23(MOSI) |
5 | CLK | SPIのSCK《Serial Clock》。ArduinoのSCKピンに接続。ESP32であれば通常(VSPI)はGPIO 18となる。 | GPIO 18(SCK) |
6 | VCC | 電源。3.3V動作なので、5VのArduinoの場合は変換が必要。ESP32ならそのまま接続できる。便利! | 3V3 |
7 | LIGHT | バックライトのON/OFF。HIGH/LOWどちらで点灯するかはモジュールによって違うみたい。自分の買ったものはGNDに接続すると点灯した。 | GND |
8 | GND | GNDへ接続。 | GND |
ピン数が多くて面倒くさいですが、落ち着いて一本ずつ繋げば難しいところはありません。モジュールに選ってピンの順番が異なる事があるようです。
電源及びロジックレベルは3.3Vで、自分はESP32に繋いだので電圧変換は不要でしたが、Arduino Unoなど5Vのマイコンに繋ぐ時の抵抗を介した接続の仕方は下記が参考になりそうです。
Nokia 5110LCDとArduinoのインターフェース-Arduinoプロジェクトハブ
https://create.arduino.cc/projecthub/muhammad-aqib/interfacing-nokia-5110-lcd-with-arduino-7bfcdd
その他接続方法の参考にさせていただいたサイト。
[SPI] 1.8 inch LCD ディスプレイ (NOKIA 5110 / 3310)
https://ht-deko.com/arduino/lcd_nokia5110.html
プログラムや電子工作: Arduino で Nokia 5110 互換液晶を利用する
https://lazy-tsan.blogspot.com/2016/12/arduino-nokia-5110.html
また、英語で良ければYoutubeでnokia 5110 arduinoと検索すればチュートリアル動画が大量に見つかります。
nokia 5110 arduino - YouTube
https://www.youtube.com/results?search_query=nokia+5110+arduino
ESP32のSPIについて
この液晶モジュールと直接関係はないのですが、ESP32にはSPI接続が2系統(内部的には3系統?)あって、VSPIとかHSPIとか書かれているのがややこしいですよね。通常はVSPIと呼ばれるピン群がSPI通信に使われるようです。
メモ:ESP32のSPIについて混乱していることの整理 - Qiita特に何もしなければVSPIのモジュールが使われるとのこと。
SPIは内蔵FLASHとの接続に使われている
HSPI - SCK,MISO,MOSI,SS = 14,12,13,15
VSPI - SCK,MISO,MOSI,SS = 18,19,23,5
ちなみに、VとHがそれぞれ何の略なのかは謎……
ESP32 の SPI_MODE が修正。HSPI , VSPI , 複数SPIデバイス制御 , SPI高速化などについて | ページ 2 | mgo-tec電子工作VSPI の ‘ V ‘ や HSPI の ‘ H ‘ の意味は良く分かりません。
Twitter で Vertical , Horizontal ではないかという意見もありました。
でも、機能的には通常の SPI と何ら変わりありませんでした。
Hがついているからといって、Hi-Speed ではありませんよ・・・。
ライブラリはAdafruitを使用
Arduinoでこの液晶モジュールを動かすためのライブラリは何種類かあるようです。ArduinoのIDEから 〈ツール〉 → 〈ライブラリの管理...〉(ショートカット Ctrl+⇧shift+I )で検索欄にnokia 5110と入力するといくつか出てきます。
自分はOLEDディスプレイでAdafruitのライブラリを使ったことがあったので、メソッド類が共通で使い易いだろうとAdafruitの 『Adafruit PCD8544 Nokia 5110 LCD library』を使うことにしました。
インストールしたら 〈ファイル〉 → 〈スケッチ例〉 → 〈Adafruit PCD8544 Nokia 5110 LCD library〉 → 〈pcdtest〉でサンプルコードが出てきます。
書き換える必要があるのは#include
直後にあるAdafruit_PCD8544
クラスのインスタンスdisplay
を生成している部分です。
最初はソフトウェアSPIで制御するコンストラクタ(引数でSPIを含めた5ピンを指定する)になっているので、それをコメントアウトし、その下にあるハードウェアSPIで制御するコンストラクタへのコメントを外します。
前段の接続例の通りESP32と繋いでいる場合は、下記のように書き換えます。
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
//Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
// Hardware SPI (faster, but must use certain hardware pins):
// SCK is LCD serial clock (SCLK) - this is pin 13 on Arduino Uno
// MOSI is LCD DIN - this is pin 11 on an Arduino Uno
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(4, 15, 2);
// Note with hardware SPI MISO and SS pins aren't used but will still be read
// and written to during SPI transfer. Be careful sharing these pins!
これでスケッチを書き込めばディスプレイにサンプルが表示……
何も表示されないんですけど!
うんともすんとも!
液晶に一切反応がなく、電源が入っているのかすら怪しい。ただ、辛うじてバックライトの点灯は確認できる。液晶画面だけが死んでるような。とりあえず試したこと。
各ピン接続を指差し確認。
使ったGPIOが良くない? あちこち試す。
ハードウェアSPIじゃだめ? ソフトウェアSPIも試す。
LCDモジュール自体が不良品かも。同時に購入した別のモジュールを試す。
ESP32のせい? 別のESP32開発ボードに差し替え。
なんだったらESP32そのものが悪いんか!? ProMicroに繋いでみる。
3.3Vと言えどバックライトには抵抗が必要? 抵抗いろいろ挟んでみる。
ライブラリが悪い? 他のライブラリも色々試してみる。
中でどっか抜けてる? モジュールのPCBから液晶を取り外して覗いてみる。
どれもダメ。相変わらず液晶 is dead.
確かに自分は電子工作は素人ですが、それにしたってこんな簡単(であろう)なモジュールひとつまともに使えないのかとすっかり自信喪失。だってググっても「是々《これこれ》こう接続して、ハイ表示されました。めでたしめでたし」みたいな記事しか出てこないんですもの……
誰一人として
“何も表示されません”みたいなド頭で躓いた形跡がない(涙)。憎い…… 己の非力が憎い……
めちゃめちゃアナログな解決方法
すっかり諦め、電子工作そのものに対する自信や希望すら失いかけた頃、ふと見つけた英語のページに遂に一縷《いちる》の希望を見たのです!
LCD nokia 5110 Issues. - Using Arduino / Displays - Arduino ForumWith the LCD powered on and connected take the top end (where it says Nokia5510) and squeeze the silver metal frame of the LCD towards the PCB gently - between thumb and forefinger. You should see the contrast change (it should darken). If that works it may benefit you to bend the metal pins that attach the frame of the LCD to PCB slightly to achieve a better contrast. Then adjust it back down in code.
訳:LCDを接続して電源が入っている状態で、上端(Nokia 5110と書かれている部分)を掴んで親指と人差指で金属のフレームをPCBに向かってやさしく押します。コントラストが変わるのが見えるはずです(暗くなるはず)。それが確認できたら、LCDのフレームをPCBに固定している金属のピンを少し曲げるとより良いコントラストが得られるかもしれません。その後コードで調整してください。
金属の! フレームを! 指で押す!!
えぇぇ…… 何その壊れたテレビ叩いたら直るみたいな……
ところがこれが効果覿面《てきめん》。実際に押してみた所、完全に死んでいたハズの液晶画面に黒い命が芽生えたのです。とどのつまり、シンプルに接触不良……
とりあえず投稿にあった通り、ディスプレイのフレームがよりPCBに密着するようフレームのツメを曲げてみました。フレームをPCBから取り外すのは試したんですが、そもそもツメの角度が甘かったので取り外して再度取り付けるくらいでは接続不良はそのままだったというわけですね。もーぷんすか!
でも、よくよく思い出してみると、初代ゲームボーイなんかも画面の周囲を強く押すと液晶の濃さが変わったような変わらなかったような。
コントラストとバイアスを調整
これでとりあえず液晶に何かしら表示はされましたが、濃過ぎる。ということで投稿にあるようにコード側で液晶のコントラストを調整します。Adafruit_PCD8544
クラスのsetContrast(uint8_t)
というメソッドでコントラストを指定できますが、実はコントラストよりも大きく表示に影響する
『バイアス』という設定があります。
バイアスはAdafruit_PCD8544.setBias(uint8_t)
メソッドで設定でき、引数は0~7(7より大きい値を指定すると7にクリッピングされる)です。データシートを見ても仕組みはちんぷんかんぷんですが、とにかくコレがコントラストより劇的に見え方に影響します。そして値によっては画面が全く表示されなくなる(何も見えなくなる)ので難しいです。
サンプルスケッチを使って調整
実は先程のサンプルスケッチpcdtest
は、走らせながらArduino IDEのシリアルモニタを使ってコントラストとバイアスを調整できるようになってます。
スケッチのソースコードを読むと、setup
メソッド内で一通りのサンプル表示が終わると、testdrawbitmap
というメソッドを呼び出しており、その中のwhile
ループでシリアル入力を読むようになってました。
起動してしばらく放置すると花(?)が無限に降ってくる画面になるので、そのタイミングでシリアルモニタにキーボードからアルファベットを入力して送信することで、コントラストとバイアスを調整できます。コントラストはw/s
で増減、バイアスはe/d
で増減です。
バイアス
バイアスは電圧と関係しているようで、自分の環境ではESP32からの3.1V程度しか出ていない電源(3.3Vに満たない理由は後述)では6か7にしないとコントラストの値に関わらず何も表示されませんでしたが、安定化電源から3.3Vをちゃんと供給すると5でも表示されるようになりました。ただ3.3Vが供給されていても、それより下の値では表示が見えませんでした。
コントラスト
コントラストは0~127(0x7F)までの値で、大きいほど濃い表示になります。だいたい50~60ぐらいが適当でした。そもそもバイアスが合ってないといくら上限に近いコントラストを設定しても濃くなりません。一方コントラストを薄くする方向の調整は割と融通が効き、バイアスが大き過ぎてもコントラスト値を下げる事でけっこう薄くできます。
それでもバイアスの値が適切でないと適切に表示できるコントラスト値の幅が極端に狭くなる(1増減しただけで劇的に変わっちゃったりする)ので、やはり先ずは適切なバイアスを設定することが重要のようです。
思わぬ落とし穴:USBハブ
コントラストとバイアスの調整中、いい感じに調整できたところでまたしても画面が全く表示されなくなる事態に遭遇。
「もしかして超薄く表示されてるけど周りが明るすぎて見えないのか?」などと部屋の照明を落としLCDのバックライトのみに照らされる液晶を見た所…… 「見える! 見えるぞ!」
なのに照明を点けるとまた見えなくなる。なにこれ怖い話? 『ライト/オフ』みたいな?
その後あれこれ試して気づいたのは、手元のデスクランプを点けた時のみ見えなくなるという事。そしてこのデスクランプはUSB給電タイプ。さらにその接続先はPCに繋がるUSBハブ…… ここまで書けばあとはご想像の通りです。使用中のESP32もそのUSBハブに繋がっていました。
テスターでESP32の3V3 → LCDモジュールのVCC間の電圧を見てみると、3.0~3.1V。しかしデスクランプを点けた途端2.7V程度まで下がってしまいます。電圧不足でESP32本体は辛うじて動かせていたものの、LCDモジュールを駆動するほどの力は残っていなかったというわけですね。
Arduinoでの電子工作だとわりかし陥《おちい》りやすそうな落とし穴ですが、幸か不幸か電子工作でこういった事態に遭遇したのは今回が初めてでした。ArduinoやるならUSBケーブルはPCに直挿しするか、USBハブならセルフパワーのものをちゃんと使わないとですね。勉強になりました。
後記
というわけで紆余曲折あったものの、Nokia 5110の液晶ディスプレイをESP32(Arduino)からまがりなりにも操作できるようになりました。
Arduino用に同じくらいの価格で普及しているI2C OLEDディスプレイと比べると、
配線が多い。VCCとGND以外に必要なGPIOがI2C OLEDは2本、Nokia 5110は5本(LEDを含めると6本)。
SPI接続なのでSDカードと同時に使う時に注意が必要
解像度が若干低い。OLEDディスプレイは0.96inch 128x64ピクセルが一般的だが、Nokia 5110 LCDは84x48ピクセル。
などなどの欠点がありますが、往年のゲームボーイやガジェットを彷彿とさせるモノクロ液晶ディスプレイは他では得られないノスタルジックな魅力を醸し出します。解像度の低さもレトロフューチャーなデバイスを目指すなら逆にアドバンテージになるかもしれません。個人的にはM5Stackに搭載されている320x240ピクセルもあるカラーディスプレイより、こういったモノクロディスプレイの方が何倍もやる気が出ます。
フォースカーブ測定マシンの自作プロジェクト
『軸《じく》の秤《はかり》』は今の所128x64ピクセルのOLEDを想定して作ってるんですが、このディスプレイにも対応させたいですねー。
問題はOLEDと違い適切なコントラストとバイアスに設定されてないと何も見えなくなってしまう点。デバイス上で変更できるようにしたとしても、そもそも画面が見えなきゃその設定画面まで辿り着けない恐れが。ゲームボーイは本体横のダイヤルでコントラストを調整できるようになってましたが、あんな感じで画面を見ずにハード的に調整できるようにしないとですかね…… それは面倒くさいな……
いや、そもそも適切な電圧さえ供給されていれば、つまり電池で動かしたりしない限り、バイアスもコントラストも決め打ちで変更できる必要はないのか? でもそれこそ今回の自分みたいにハブ経由のUSBケーブルを使ったりして電圧が低かったら? いやそこまで想定する必要ないか……?
いーやもー考えるのめんどくさーいやめやめ。
いじょ!
この記事はここで終わりです。
読んでいただきありがとうございました。
良かったらシェアしてね!
That's all for this article. Thank you for your reading.
Please share this if you like it!