これまでの電子工作では、表示に主にLCDを使用してきましたが、最近OLED(有機ELディスプレイ)の表示器が比較的安価に購入できるようになりましたので、テストしてみます。
0.96インチ128×64ドットのOLEDは、秋月電子では、580円 Amazonでは760円で購入できます。どちらもコントロールにはSSD1306が使われています。
今回はAmazonからHiLetgoのものを調達しました。
幅、高さとも3cm未満で小さいです。
裏面です。
今回は、PIC(PIC16F1827)を使って、表示テストを行います。
OLEDの表示プログラムは、Arduinoなどのものが多く、PICでの表示例は少ないです。
以下の2つのサイトが参考になります。
まずは、JR3TGS局のサイトにあるプログラムをコピペして、表示テストをしてみました。問題なく表示されました。電源は乾電池3本(3V)で、消費電流は、PIC,OLEDを合わせて約7mAでした。なお、フォントはfont6.hとfont12.hとしてMPLAB X IDEの当該プロジェクトのHeader Fileフォルダーの中に保存します。
PIC16F1827とOLEDの接続は、下のとおりです。I2Cのプルアップ抵抗は、OLEDモジュールに内蔵されていますので、つけていません。
既に、PICでPLED表示の実験をしている仲間からOLEDから大きなノイズが出るという報告があり、電源ラインのノイズをpicoスコープで見てみました。
PIC OLEDともパスコン(0.1uF)を付けていますが、電圧3Vを中心に約0.1Vのノイズがのっています。
今回の実験では、動作に問題はありませんでしたが、目的、回路によっては対策が必要になると思います。
ここまで、クロック16MHzでしたが、32MHzに上げて実験を続けました。
OLEDを初期化するだけのプログラムを実行すると
GDDRAMがクリアされていませんので、テレビの砂の嵐のような画面になります。したがって、画面をクリアする関数 oled_clr();を実行します。
SSD1306のGDDRAMへの書き込みモードは、
Horizontal addressing mode
Vertical addressing mode
Page addressing mode
の3種類です。それぞれのモードの説明は、省略しますが、上記参照サイトおよびSSD1306の説明書を見てください。
自分なりに表示させてみました。一番下の行は0から数字をカウントアップさせています。printf()関数が使えますので、便利です。
参考までにmainプログラムのみ以下に掲載します。
内部クロックは8MHzですが、PLL ONで32MHzで動作しています。
void main(void) {
ANSELA = 0b00000000; // AN0-AN4は使用しない
ANSELB = 0b00000000; // AN5-AN11は使用しない
TRISA = 0b00000000; // PORTAは全て出力(RA5は入力)
TRISB = 0b00010010; // RB1(SDA)とRB4(SDA)は入力、他は出力
PORTA = 0b00000000; // PORTA初期化
PORTB = 0b00000000; // PORTB初期化
OSCCON = 0b01110000; // 内部クロック 8MHz
I2C_init(); // I2C初期化
OLED_init(); // OLED初期化
OLED_clr(); // OLED画面消去
unsigned int i = 0;
font6_posi(0,0);
printf("ABCDEFabcded012345");
font12_posi(3, 4);
printf("50.2346MHz");
while(1){
font12_posi(6,10);
printf("%6d",i);
i += 1;
__delay_ms(500);
}
}
ANSELA = 0b00000000; // AN0-AN4は使用しない
ANSELB = 0b00000000; // AN5-AN11は使用しない
TRISA = 0b00000000; // PORTAは全て出力(RA5は入力)
TRISB = 0b00010010; // RB1(SDA)とRB4(SDA)は入力、他は出力
PORTA = 0b00000000; // PORTA初期化
PORTB = 0b00000000; // PORTB初期化
OSCCON = 0b01110000; // 内部クロック 8MHz
I2C_init(); // I2C初期化
OLED_init(); // OLED初期化
OLED_clr(); // OLED画面消去
unsigned int i = 0;
font6_posi(0,0);
printf("ABCDEFabcded012345");
font12_posi(3, 4);
printf("50.2346MHz");
while(1){
font12_posi(6,10);
printf("%6d",i);
i += 1;
__delay_ms(500);
}
}
小型のケースに組み込んで、インターネットに接続して、天気予報を常時表示する・・なんて面白いかもしれませんね。
久しぶりです。お元気ですか。
そうですね。気温、湿度、気圧測定モジュールBME280を使って、温度、湿度、気圧表示器を作ろうとプログラミングをしています。
が、BM280は、けっこう難しいです。
インターネットに接続するならESP32を使った方が良いと思います。