小型OLEDをArduinoで動かしてみた! [Arduino]
小型OLEDをいよいよArduinoで制御してみます。うまくOLEDを駆動できるか分かりませんが、配線は前回と同じ状態で試してみます。
接続の様子はこちら。
OLEDモジュールの初期化は、データシートに推奨設定がありました。販売店のサイトからダウンロードしたPIC用のサンプルプログラムも同じように設定されていました。
OLEDモジュールの仕様書とPICのサンプルプログラムを参照しながら、Arduinoのスケッチを記述してみました。表示部分(demo(), demo2())は私の独自のプログラムで、demo()はラインの点滅、demo2()は市松模様を点滅させます。
ArduinoのWireライブラリは一度に32バイトしか送れませんので、それに注意してスケッチを組みました。それでは実際の動きを見てみましょう!
無事に動きました!実際はいろいろと試行錯誤をしたんですが、思ったよりもすんなりと動いてくれました。いや~動くと思っていなかったので感無量です。
でも、これから始める方はこちらの製品を買ったほうがよいと思います。私の買ったOLED基板はハンダに手間がかかり、接触不良でハマったので・・・。
恐らくOLEDモジュールは同じだと思うので、うまくすれば、このスケッチがそのまま動くと思います。(もし違ってたらゴメンナサイ)
これでArduinoに表示デバイスをつなげることができました。より一層アプリケーションが広がりそうです!
(^^)/~
接続の様子はこちら。
OLEDモジュールの初期化は、データシートに推奨設定がありました。販売店のサイトからダウンロードしたPIC用のサンプルプログラムも同じように設定されていました。
OLEDモジュールの仕様書とPICのサンプルプログラムを参照しながら、Arduinoのスケッチを記述してみました。表示部分(demo(), demo2())は私の独自のプログラムで、demo()はラインの点滅、demo2()は市松模様を点滅させます。
#include <Wire.h> const int OLED_ADDR = 0x3C; const int RESET_pin = 8; void WriteCommand(byte cmd) { Wire.write(0x80); Wire.write(cmd); } void resetOLED() { digitalWrite(RESET_pin, HIGH); delay(1); digitalWrite(RESET_pin, LOW); delay(2); // reset 2msec digitalWrite(RESET_pin, HIGH); } void initOLED() { Wire.beginTransmission(OLED_ADDR); WriteCommand(0xAE); // Set Display Off WriteCommand(0xD5); // display divide ratio/osc. freq. mode WriteCommand(0x00); WriteCommand(0xA8); WriteCommand(0x3F); // Multiplex ratio mode WriteCommand(0xD3); // Set Display Offset WriteCommand(0x00); WriteCommand(0x40); // Set Display Start Line WriteCommand(0x8D); // Set Display Offset WriteCommand(0x14); WriteCommand(0xA0); // Segment Remap WriteCommand(0xC8); // Set COM Output Scan Direction WriteCommand(0xDA); // Common pads hardware: alternative WriteCommand(0x12); Wire.endTransmission(); // Wire library is limited to the transmission up to 32bytes // That's why the init sequence is splited. Wire.beginTransmission(OLED_ADDR); WriteCommand(0x81); // contrast control WriteCommand(0x7F); WriteCommand(0xD9); // Set pre-charge period WriteCommand(0xF1); WriteCommand(0xDB); // VCOM deselect level mode WriteCommand(0x40); // set Vvcomh = 0.83*Vcc WriteCommand(0xA4); // Set Entire Display On/Off WriteCommand(0xA6); // Set Normal Display WriteCommand(0xAF); // Set Display On Wire.endTransmission(); } void clearScreen() { int i, j, k; for (i = 0; i < 8; ++i) { Wire.beginTransmission(OLED_ADDR); WriteCommand(0xB0 + i); WriteCommand(0x10); WriteCommand(0x00); Wire.endTransmission(); // Need to consider the Wire library limitation of sending data up to 32 bytes. for (j = 0; j < 8; ++j) { Wire.beginTransmission(OLED_ADDR); Wire.write(0x40); for (k = 0; k < 16; ++k) { Wire.write(0x00); } Wire.endTransmission(); } } } byte on_off = 0; void demo() { byte i, j, k; byte data; on_off %= 2; for(i = 0; i < 8; ++i){ if (i % 2) data = 0xFF; else data = 0x00; if (on_off) data = ~data; Wire.beginTransmission(OLED_ADDR); WriteCommand(0xB0 + i); WriteCommand(0x10); WriteCommand(0x00); Wire.endTransmission(); for (j = 0; j < 8; ++j) { Wire.beginTransmission(OLED_ADDR); Wire.write(0x40); for (k = 0; k < 16; ++k) { Wire.write(data); } Wire.endTransmission(); } } delay(500); ++on_off; } void demo2() { byte i, j, k; byte data; on_off %= 2; for (i = 0; i < 8; ++i) { if (i % 2) data = 0x00; else data = 0xFF; if (on_off) data = ~data; Wire.beginTransmission(OLED_ADDR); WriteCommand(0xB0 + i); WriteCommand(0x10); WriteCommand(0x00); Wire.endTransmission(); for (j = 0; j < 16; ++j) { Wire.beginTransmission(OLED_ADDR); Wire.write(0x40); for (k = 0; k < 8; ++k) { if (j % 2) { Wire.write(data); } else { Wire.write(~data); } } Wire.endTransmission(); } } delay(500); ++on_off; } void setup() { pinMode(RESET_pin, OUTPUT); Wire.begin(); Serial.begin(115200); Serial.println("Reset OLED"); resetOLED(); Serial.println("\nInit OLED"); initOLED(); clearScreen(); } byte rotator = 0; byte sw = 0; void loop() { rotator %= 8; if (rotator == 0) sw = ~sw; if (sw) demo(); else demo2(); ++rotator; }
ArduinoのWireライブラリは一度に32バイトしか送れませんので、それに注意してスケッチを組みました。それでは実際の動きを見てみましょう!
無事に動きました!実際はいろいろと試行錯誤をしたんですが、思ったよりもすんなりと動いてくれました。いや~動くと思っていなかったので感無量です。
でも、これから始める方はこちらの製品を買ったほうがよいと思います。私の買ったOLED基板はハンダに手間がかかり、接触不良でハマったので・・・。
ディアイワイモール (DIYmall) iic i2c OLEDモジュール ディスプレイ 0.96インチ 51マイクロコントローラ12864 for Arduino (ホワイト)
- 出版社/メーカー: Flyfun
- メディア: おもちゃ&ホビー
恐らくOLEDモジュールは同じだと思うので、うまくすれば、このスケッチがそのまま動くと思います。(もし違ってたらゴメンナサイ)
これでArduinoに表示デバイスをつなげることができました。より一層アプリケーションが広がりそうです!
(^^)/~
DIYMALL iic i2c OLEDモジュール ディスプレイ 0.96インチ ブルー&イエロー51マイクロコントローラ12864 for Arduino
- 出版社/メーカー: DIYmall
- メディア:
MicroView - チップサイズ Arduino OLEDディスプレイ付き
- 出版社/メーカー: SparkFun
- メディア: エレクトロニクス
OLEDディスプレイ搭載 PIC32MX250F128B CPUボード K102 (OLED ディスプレイ)
- 出版社/メーカー: Yutaka Trading
- メディア: エレクトロニクス
2015-11-04 22:27
nice!(35)
コメント(2)
トラックバック(0)
誘惑に負けそうですが。。
保留です。
by まいく (2015-11-04 23:54)
まいくさん、コメントありがとうございます!ぜひ試してみてください!
by ys_oota (2015-11-06 00:27)