Groveで広がるArduinoの世界-Senser Kit-② Grove OLED SCREEN
Senser Kitに付属するOLED SCREENは小型の表示器です。OLEDはなかなか実用化が困難で、3M、NECをはじめ日本の家電各社は、ある時期、特許を全部韓国へ譲渡し、開発をやめてしまいました。その直後、有機ELディスプレイ用燐光発光材料メーカのユニバーサルディスプレイコーポレーション(UDC)が、寿命などの点を実用レベルにひき上げたので、現在、大型テレビもOLEDが出荷されています。
マイコン関係で使われるディスプレイの小さいのはI2Cバスで、中型はSPIバスでつなぐことが多いようです。Senser Kitに含まれているOLEDはモノクロ128×64ドット・マトリックスで、I2Cバスでつなぎます。
日本では、電子工作にキャラクタ表示の液晶ディスプレイが多く使われます。海外ではOLEDのグラフィック表示器を頻繁に見ます。
●I2Cバス
2本の信号線と電源、合計4本の信号線でつなげられるので、Groveコネクタには最適です。
Groveピン番号 | I2Cバスの信号 |
---|---|
4 | GND |
3 | Vcc |
2 | SDA |
1 | SCL |
今回、切り離していないので、配線はありません。切り離したときは、I2C(複数あるがどれでもかまわない)と書かれたGroveコネクタ同士を付属のケーブルでつなぎます。
Light Sensorを切り離した場合は、A3と書かれたGroveコネクタを、付属のケーブルでつなぎます。
AdruinoではWireライブラリを使ってI2Cバスを制御します。OLED SCREENはグラフィック・ディスプレイなので、キャラクタ表示器のようにANK(ASCII、半角カタカナ)コードを送ると文字を表示してくれる機能はありません。何らかのライブラリを使います。
Senser Kitでは、Arduino_SensorKit.hに含まれているようです。ソースは、こちらにありました。そこに書かれたolikraus/U8g2_Arduinoにソースが置いてあり、U8g2_Arduino/src/U8x8lib.cppに関数などの記述が見れます。128×64の表示域をもち、コントローラはSSD1306のようです。
●スケッチ
THE OLED SCREENのページを参考にスケッチを描きます。前回のLight Sensorのセンサ出力を使います。
#include "Arduino_SensorKit.h" int light_sensor = A3; void setup() { Serial.begin(9600); //begin Serial Communication Oled.begin(); Oled.setFlipMode(true); // Sets the rotation of the screen }
int i =0;
void loop() {
Oled.clear(); int raw_light; raw_light= analogRead(light_sensor); // read the raw value from light_sensor pin (A3) int light = map(raw_light, 0, 1023, 0, 100); // map the value from 0, 1023 to 0, 100 Serial.print("Light level: "); Serial.println(light); // print the light value in Serial Monitor Oled.setFont(u8x8_font_chroma48medium8_r); Oled.setCursor(0, 33); // Set the Coordinates Oled.print("Value:"); Oled.print(light); // Print the Values
Oled.print(" "); Oled.print(i); Oled.refreshDisplay(); // Update the Display i = i+1; delay(1000); // add a delay to only read and print every 1 second }
実行中の画面です。
画面の原点(0,0)は左上隅です。
setCursor(0, 33);
横端はx軸で座標は'0'なので、一番左、縦方向はy軸で座標は'33'です。4行目ぐらいから文字を表示し始めています。
setCursor(0, 0);
に変更すると、一番上に表示されます。128×64の表示エリアなので、y軸方向には8行の文字列が表示できます。
setCursor(0, 7);
であれば、最も下の行です。つまり、33というのがドットを意識した数値だけど、ぐるぐる折り返して、たまたま写真の位置に表示ができているということだと思われます。
x軸方向も文字単位(8ドット)で指定するようです。したがって、xは0~15、yは0~7が正しい座標の指定です。xを16にすると、同じ行の先頭に折り返します。
●主な利用できる関数
home() 原点(0,0)にカーソルを戻す clear() 画面を全部消去して、カーソルを原点に戻す noDisplay() パワーセーブ・モードに移行。画面は消える display() 画面表示をON setCursor(x,y) 座標x,yにカーソルを移動 inverse() 反転 noInverse() 反転を戻す drawGlyph(x,y,font) Oled.drawGlyph(0,0,0x0050); 座標0,0に大文字のP drawString(x,y,string) Oled.drawString(0,0,"abc"); 座標0,0にabcの文字列 大きめのフォント(16x16Font)を使う Oled.setFont(u8x8_font_px437wyse700a_2x2_r); |