Nokia 5110の液晶部を$4.3セールしてたMSP430FR2433でプログラムしてみた。
なぜMSP430G2じゃないのかというと、
LinuxでIDEが使用不可のため。
ArduinoやRaspberrypiでコントロールする例は結構見つかるが、やっぱりMSP430の情報は少し少なめだ。
Arduinoで動かした例:
Nokia 5110 LCD 動かして見ました ( おもちゃ ) - 趣味の電子工作
Raspberry PIで動かした例:
Nokia 5110/3310 LCD Python Library | Adafruit
MSP430G2で動かした例:
Nokia 5110 display - 43oh
とりあえず、最低限のコードで書くだけ書いてみた。
このNokia 5110の液晶モジュールは個人的にMSP430と非常に相性が良いと思う、というのも3.3V駆動なのだ。
5V駆動のディスプレイとしては有名どころだとSC1602シリーズがあると思う。
ただ、文字の表示特化で、文字数の制限もあるので使いづらい。
Nokia 5110の液晶モジュールは84x48ドットで、自由にドットが打てるので非常に柔軟性がある。
基本的な操作は4-wire SPIで可能。一点除いて結構簡単だった。
接続は以下のような感じ。
LED → 未接続
SCLK → P2.4 (UCA1のSPI SCLK)
DN(MOSI) → P2.6 (UCA1のSPI MOSI)
D/C → P2.0 (GPIO)
RST → P2.1 (GPIO)
SCE → P3.1 (UCA1のSPI STE)
GNDとVCCはそれぞれGNDと3.3Vに接続 (5Vは動作範囲外)
コードは下みたいな感じ。
#include <msp430.h>
#define COMDSEND P2OUT &= ~BIT0
#define DATASEND P2OUT |= BIT0
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
P2SEL0 |= BIT4 | BIT6; // SPI
P3SEL0 |= BIT1; // SPI STE
UCA1CTLW0 |= UCMST | UCSYNC | UCCKPH | UCMSB | UCSSEL__SMCLK | UCMODE1 | UCSTEM;
P2DIR |= BIT0 | BIT1;
P2OUT |= BIT1;
UCA1CTLW0 &= ~UCSWRST;
PM5CTL0 &= ~LOCKLPM5;
P2OUT &= ~BIT1;
_delay_cycles(10);
P2OUT |= BIT1;
COMDSEND;
UCA1TXBUF = 0b00100001;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0b10111111;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0b00100000;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0b00001100;
while (!(UCA1IFG&UCTXIFG));
DATASEND;
UCA1TXBUF = 0b00011111;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0b00000101;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0b00000111;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0b00000000;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0b00011111;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0b00000100;
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = 0b00011111;
while (!(UCA1IFG&UCTXIFG));
while (1);
}
意味としては、上のCOMDSENDまでがSPIやピンの設定。
SPIのチップセレクトで毎回GPIOをパタパタさせるのは面倒なので、UCSTEMでSPIとGPIOを連動させた。
GPIOはPM5CTL0のLOCKLPM5のビットをリセットしておかないと機能しないらしい
MSP430 FRAM FR5/FR6 外部pinとDIO設定 [msp430info FRAM DIO])。
また、Nokia 5110液晶を制御しているチップ(Philips PCD8544)のデータシートの8.1 Initializationに起動直後にリセットをかけることと書いてあるので、P2.1をパタつかせた。
その後のSPI通信は一点を除いてPCD8544データシートの13 Application Information - Table 6に書いてある制御のSTEP1-12までと同じ。
その一点というのがVopの設定。
ICの中にチャージポンプ型の昇圧回路が入っていて、その電圧設定値がLCDのものと異なると動作しない(当然)。
で、たぶん物とか温度とかによって変わるのだろうと思うんだけれど、2つめのSPIコマンドの0b10111111の部分を状況によって適当に変更するべきらしい。
温度係数とかも色々と設定項目があるらしく、
Nokia 5110 display - Projects - 43ohでは、
Vopの設定=0x80|0x3F (Vop=3.06+0.06x63=6.84V)
温度計数の設定=0x04|0x02 (TC2, 17mV/K)
バイアス電圧の設定(これはよくわからん)=0x10|0x03 (Mux Rate=1:48?デューティ比?)
というふうになっているみたい。
最後のバイアス電圧の設定はよくわからないが、これらを盛り込むことで不自然にディスプレイが真っ黒になったり白っぽくなったりするのは改善されるみたい。
とりあえず、僕のボードではVopの設定のみで動いたが、もしやってみて駄目だったらこのあたりを弄ってみることを推奨。