2016年4月27日水曜日

Arduino UnoでaitendoのOLED(VGM12864-3S)を動かす U8GLIB編

74HC4050を使うとSPIならArduino Unoでもあまり気にせず3.3V系を操れそうなので3.3V駆動のOLEDを動作させてみた。

aitendoのOLED VGM12864-3S 



OLEDのグラフィック表示器としては安いほうだが、1,350円なのでヘタして壊したら泣ける。

I2C/SPI/パラレル接続のどれかを選択して使えるようになってるが、I2CはいろいろややこしいのでSPIでやってみた。

I2Cだと上側の7ピンで制御できるが、SPIだと左側のCSとA0ピンも必要になるのでブレッドボードで実験するためにピンソケットを使って上側からケーブルをさせるようにした。

上側の7ピンは


1 2 3 4 5 6 7
VCC GND RESET SCK SDI BS1 BS2

となっていて、VCC、GNDは電源、SCK、SDIはSPIの信号線で、BS1とBS2で通信方法のI2C/SPI/パラレルを選択する。BS1、BS2をL(GND)に落とすとSPI接続になる。

ブレッドボード図


74HC4050はSPIの信号線のロジックレベルを5V->3.3Vに変換するために使っている。ブレッドボードの電源は74HC4050、OLEDともArduino Unoから3.3V供給している。

A0(青)、CS(白)、RESET(緑)は仕様通りHかLに固定すれば動作するので(←未確認)、実質クロックとデータの2線で動かせる。(I2Cの様にデータラインが双方向ではないので、5V->3.3Vに片方向で変換できれば良い)

<追記:2016.09.05>A0とCSはU8GLIBの指定通りに配線しないと動作しません。</追記>

U8GLIB


いろいろな表示器のコントローラーに対応しているライブラリで、CPUはArduino、AVR、ARMに対応している。

Arduino Uno用のライブラリをインストールするとArduino IDEでexampleが使える様になる。

aitendoのOLED(VGM12864-3S)はコントローラーがSSD1306なのでexampleのスケッチの

//U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CS = 10, A0 = 9
//U8GLIB_SSD1306_128X64 u8g(4, 5, 6, 7); // SW SPI Com: SCK = 4, MOSI = 5, CS = 6, A0 = 7 (new white HalTec OLED)
U8GLIB_SSD1306_128X64 u8g(10, 9);  // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)


とコメントアウトされているところの「//」を削除してu8gのコンストラクタを指定すれば動く。

U8gLogoや他のスケッチも試してみたが問題なく動作する(^q^/

思ったこと


5V系->3.3V系の変換には74HC4050は結構便利。

マイコンに限ったことではないが、キャラクタLCDと違ってグラフィックLCDは文字を表示するのも一苦労する。U8GLIBはいろいろと関数が用意されているようなので、使うLCDとMPUに合致すれば便利かもしれない。

ARM用のライブラリにPSoC 5LPもあるようだ。