閉じる

UI言語[UI Language]

記事自体は翻訳されません! 記事によって英語版があったりなかったりします。翻訳がある記事は文頭に記載があるよ!
Each articles themselves will not be translated by this setting. Some of article has translation and some of them doesn't. You will notice if the article has its translation by its preamble!

テーマ[Theme]


アイキャッチ画像

【解決】Nokia 5110 LCD(液晶ディスプレイ)に何も表示されない


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箇所の光源位置丸わかりですが、それもまた魅力というものです。

Nokia 5110 LCD module
Nokia 5110 LCD module

自分が購入したのはこんな感じのモジュール。ネットを見ると緑色の基板を持つタイプや、同じ赤い基板でも背面のパターンが違うものがあるようです。緑色の基板はあまり出回ってないようで、使い方を解説する記事や動画でも殆ど使われていません。それらは赤い基板が多いですが、背面のパターンがこの写真のように直線のものは見当たりませんでした。


Arduinoとの接続はSPI

ArduinoとはSDカードモジュールの接続でお馴染みのSPI接続になります。SDカードと違ってモジュール側からArduinoへ送る情報は無い(Arduinoから液晶に表示する内容を送るだけの一方通行)のでMISOMaster In Slave Outピンは使いません。その代わり他にSPIの他に2ピンの接続が必要で、GNDとVCC(3.3V)と合わせてArduinoとは7本のワイヤーで接続する形になります(バックライトLEDを操作したければもう1本)。

モジュールのピンアウト

#表記説明ESP32での接続例
1RST

リセットピン。Arduinoの汎用GPIOに接続。

GPIO 2
2CE

SPIのCSChip Select(またはSSSlave Select)。Arduinoの汎用GPIOに接続。

GPIO 15
3DC

Data/Commandピン。Arduinoの汎用GPIOに接続。

GPIO 4
4DIN

SPIのMOSIMaster Out Slave In。ArduinoのMOSIピンに接続。ESP32であれば通常(VSPI)はGPIO 23となる。

GPIO 23(MOSI)
5CLK

SPIのSCKSerial Clock。ArduinoのSCKピンに接続。ESP32であれば通常(VSPI)はGPIO 18となる。

GPIO 18(SCK)
6VCC

電源。3.3V動作なので、5VのArduinoの場合は変換が必要。ESP32ならそのまま接続できる。便利!

3V3
7LIGHT

バックライトのON/OFF。HIGH/LOWどちらで点灯するかはモジュールによって違うみたい。自分の買ったものはGNDに接続すると点灯した。

GND
8GND

GNDへ接続。

GND

ピン数が多くて面倒くさいですが、落ち着いて一本ずつ繋げば難しいところはありません。モジュールに選ってピンの順番が異なる事があるようです。
電源及びロジックレベルは3.3Vで、自分はESP32に繋いだので電圧変換は不要でしたが、Arduino Unoなど5Vのマイコンに繋ぐ時の抵抗を介した接続の仕方は下記が参考になりそうです。

その他接続方法の参考にさせていただいたサイト。

また、英語で良ければYoutubeでnokia 5110 arduinoと検索すればチュートリアル動画が大量に見つかります。


ESP32のSPIについて

この液晶モジュールと直接関係はないのですが、ESP32にはSPI接続が2系統(内部的には3系統?)あって、VSPIとかHSPIとか書かれているのがややこしいですよね。通常はVSPIと呼ばれるピン群がSPI通信に使われるようです。

特に何もしなければVSPIのモジュールが使われるとのこと。

  • SPIは内蔵FLASHとの接続に使われている

  • HSPI - SCK,MISO,MOSI,SS = 14,12,13,15

  • VSPI - SCK,MISO,MOSI,SS = 18,19,23,5

メモ:ESP32のSPIについて混乱していることの整理 - Qiita

ちなみに、VとHがそれぞれ何の略なのかは謎……

VSPI の ‘ V ‘ や HSPI の ‘ H ‘ の意味は良く分かりません。
Twitter で Vertical , Horizontal ではないかという意見もありました。
でも、機能的には通常の SPI と何ら変わりありませんでした。
Hがついているからといって、Hi-Speed ではありませんよ・・・。

ESP32 の SPI_MODE が修正。HSPI , VSPI , 複数SPIデバイス制御 , SPI高速化などについて | ページ 2 | mgo-tec電子工作

ライブラリはAdafruitを使用

Arduinoでこの液晶モジュールを動かすためのライブラリは何種類かあるようです。ArduinoのIDEから 〈ツール〉〈ライブラリの管理...〉(ショートカット Ctrl+shift+I )で検索欄にnokia 5110と入力するといくつか出てきます。

Arduinoに入っているNokia 5110用ライブラリ

自分はOLEDディスプレイでAdafruitのライブラリを使ったことがあったので、メソッド類が共通で使い易いだろうとAdafruitの Adafruit PCD8544 Nokia 5110 LCD libraryを使うことにしました。

Adafruit PCD8544 Nokia 5110 LCD library - pcdtest

インストールしたら 〈ファイル〉〈スケッチ例〉〈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!

これでスケッチを書き込めばディスプレイにサンプルが表示……


何も表示されないんですけど!

Nokia 5110 LCD module 何も表示されない
Nokia 5110 LCD module 何も表示されない

うんともすんとも!
液晶に一切反応がなく、電源が入っているのかすら怪しい。ただ、辛うじてバックライトの点灯は確認できる。液晶画面だけが死んでるような。とりあえず試したこと。

どれもダメ。相変わらず液晶 is dead.

確かに自分は電子工作は素人ですが、それにしたってこんな簡単(であろう)なモジュールひとつまともに使えないのかとすっかり自信喪失。だってググっても是々これこれこう接続して、ハイ表示されました。めでたしめでたし」みたいな記事しか出てこないんですもの……
誰一人として “何も表示されません”みたいなド頭で躓いた形跡がない(涙)。憎い…… 己の非力が憎い……


めちゃめちゃアナログな解決方法

すっかり諦め、電子工作そのものに対する自信や希望すら失いかけた頃、ふと見つけた英語のページに遂に一縷いちるの希望を見たのです!

With 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に固定している金属のピンを少し曲げるとより良いコントラストが得られるかもしれません。その後コードで調整してください。

LCD nokia 5110 Issues. - Using Arduino / Displays - Arduino Forum

金属の! フレームを!指で押す!!

えぇぇ…… 何その壊れたテレビ叩いたら直るみたいな……

ところがこれが効果覿面てきめん。実際に押してみた所、完全に死んでいたハズの液晶画面に黒い命が芽生えたのです。とどのつまり、シンプルに接触不良……

Nokia 5110 LCD module 金属フレーム上部を押してみる
Nokia 5110 LCD module 金属フレーム上部を押してみる

写真はテスターで押し込んでみてるところ。うんともすんとも言わなかった液晶画面にこんなアナログな方法で表示が浮かび上がるなんて……

とりあえず投稿にあった通り、ディスプレイのフレームがより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増減しただけで劇的に変わっちゃったりする)ので、やはり先ずは適切なバイアスを設定することが重要のようです。

Nokia 5110 LCD module コントラストとバイアスの調整
Nokia 5110 LCD module コントラストとバイアスの調整

あと、サンプルスケッチでは花が落ちるシーンでしか調整できないですが、うまく調整できたと思った値で初期化するようコードを修正して他の描画を見てみると、案外ちゃんと見えなかったりするので注意が必要です。
本気で調整したい場合は値の調整部分にsetupの頭に戻れるような処理を追加した方がいいかも。


思わぬ落とし穴: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 LCD module 表示成功
Nokia 5110 LCD module 表示成功

というわけで紆余曲折あったものの、Nokia 5110の液晶ディスプレイをESP32(Arduino)からまがりなりにも操作できるようになりました。
Arduino用に同じくらいの価格で普及しているI2C OLEDディスプレイと比べると、

などなどの欠点がありますが、往年のゲームボーイやガジェットを彷彿とさせるモノクロ液晶ディスプレイは他では得られないノスタルジックな魅力を醸し出します。解像度の低さもレトロフューチャーなデバイスを目指すなら逆にアドバンテージになるかもしれません。個人的にはM5Stackに搭載されている320x240ピクセルもあるカラーディスプレイより、こういったモノクロディスプレイの方が何倍もやる気が出ます。

フォースカーブ測定マシンの自作プロジェクト じくはかりは今の所128x64ピクセルのOLEDを想定して作ってるんですが、このディスプレイにも対応させたいですねー。
問題はOLEDと違い適切なコントラストとバイアスに設定されてないと何も見えなくなってしまう点。デバイス上で変更できるようにしたとしても、そもそも画面が見えなきゃその設定画面まで辿り着けない恐れが。ゲームボーイは本体横のダイヤルでコントラストを調整できるようになってましたが、あんな感じで画面を見ずにハード的に調整できるようにしないとですかね…… それは面倒くさいな……
いや、そもそも適切な電圧さえ供給されていれば、つまり電池で動かしたりしない限り、バイアスもコントラストも決め打ちで変更できる必要はないのか? でもそれこそ今回の自分みたいにハブ経由のUSBケーブルを使ったりして電圧が低かったら? いやそこまで想定する必要ないか……?
いーやもー考えるのめんどくさーいやめやめ。

いじょ!

この記事のタグ[This article is filed under]: Arduino[Arduino] | ESP32[ESP32] | 電子工作[Electronics] | トラブル[Trouble] | ハウツー[How to]


この記事はここで終わりです。
読んでいただきありがとうございました。
良かったらシェアしてね!

That's all for this article. Thank you for your reading.
Please share this if you like it!

Twitter | Reddit | Facebook | Pinterest | Pocket

前の記事[Prev Post]

前の記事のアイキャッチ画像

USB-シリアル変換モジュールについて調べたメモ

次の記事[Next Post]

次の記事のアイキャッチ画像

【PC】リメイク「アクトレイザー・ルネサンス」レビュー。良かったところとイマイチなところ