概要
今回はArduino NANOを使用して、有機ELに文字を表示してみようと思います。
使用するもの
今回の内容で使用するものは大きく2つ
マイコン
arduino NANOを使用します。
小さくて使い勝手が良い点が個人的にはお気に入りです。
Just a moment...
通信用のUSBケーブルなどはamazonで格安で入手できるので、そちらを使うのが良いかと思います。
今回使っているもののリンクも貼っておきます。
Amazon.co.jp: USB Type C ケーブル【1m 4本セット】etguuds 3A 急速充電 タイプc 高速データ転送 超耐久ナイロン コード Galaxy S20 S10 S9 A20 A21 A22 A30, Note 8/9/10, Xperia XZ3 XZ2 XZ, LG, Sense3/4等USB-C 機種対応 : パソコン・周辺機器
Amazon.co.jp: USB Type C ケーブル【1m 4本セット】etguuds 3A 急速充電 タイプc 高速データ転送 超耐久ナイロン コード Galaxy S20 S10 S9 A20 A21 A22 A30, Note ...
液晶ディスプレイ
0.96インチの有機ELディスプレイ(OLEDと表現)を使用します。
制御はI2C。解像度は128×64。SSD1306ドライバ搭載品が一般的かと思います。
ここでは下記のようなものを使用しました。

その他配線などは適宜用意してください。
接続について
マイコンと液晶を接続します。
今回はIC2ですので、以下のようになりました。
| マイコン側 | 液晶側 |
| Arduino 5V | OLED VCC |
| Arduino GND | OLED GND |
| Arduino A5 | OLED SCL |
| Arduino A4 | OLED SDA |
こんな感じに配線↓

サンプルプログラム
動かすにはAdafruit SSD1306ライブラリが必要です。
ライブラリマネジャーから入れること。
既に入っていればそのまま動くはず。。。
//ディスプレイテスト用プログラム
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
void setup() {
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;)
;
}
display.clearDisplay();
display.display();
}
void loop() {
/*====== タイトル表示 ======*/
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 20);
display.println(F("Display"));
display.setCursor(10, 40);
display.println(F("Test"));
display.display();
delay(3000);
/*====== 文字スタイル ======*/
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Font size 1"));
display.setTextSize(2);
display.println(F("Font size 2"));
display.setTextSize(3);
display.println(F("Font size 3"));
display.display();
delay(3000);
/*====== 図形描画 ======*/
display.clearDisplay();
display.drawRect(0, 0, 127, 63, SSD1306_WHITE); // 枠
display.drawLine(0, 0, 127, 63, SSD1306_WHITE); // 線
display.drawLine(127, 0, 0, 63, SSD1306_WHITE);
display.drawCircle(64, 32, 20, SSD1306_WHITE); // 円
display.fillRect(10, 10, 20, 15, SSD1306_WHITE); // 塗りつぶし矩形
display.fillTriangle(100, 50, 110, 20, 120, 50, SSD1306_WHITE); // 三角形
display.display();
delay(3000);
/*====== ローディングバー風 ======*/
display.clearDisplay();
display.setTextSize(1);
display.setCursor(30, 0);
display.println(F("Loading..."));
for (int i = 0; i <= 100; i += 5) {
display.fillRect(10, 30, i, 10, SSD1306_WHITE);
display.display();
delay(100);
}
delay(3000);
/*====== アナログ時計 ======*/
for (int s = 0; s < 60; s++) {
display.clearDisplay();
display.drawCircle(64, 32, 30, SSD1306_WHITE);
int hx = 64 + 15 * cos(radians(-90));
int hy = 32 + 15 * sin(radians(-90));
display.drawLine(64, 32, hx, hy, SSD1306_WHITE);
int mx = 64 + 20 * cos(radians(-90 + 34 * 6));
int my = 32 + 20 * sin(radians(-90 + 34 * 6));
display.drawLine(64, 32, mx, my, SSD1306_WHITE);
int sx = 64 + 25 * cos(radians(-90 + s * 6));
int sy = 32 + 25 * sin(radians(-90 + s * 6));
display.drawLine(64, 32, sx, sy, SSD1306_WHITE);
display.display();
delay(100);
}
delay(3000);
/*====== スクロールテキスト ======*/
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println(F("Scrolling demo text!"));
display.display();
display.startscrollright(0x00, 0x0F);
delay(3000);
display.stopscroll();
display.startscrollleft(0x00, 0x0F);
delay(3000);
display.stopscroll();
delay(3000);
/*====== UI風アニメーション ======*/
for (int frame = 0; frame < 3; frame++) {
display.clearDisplay();
display.setTextSize(1);
display.setCursor(5, 0);
display.println(F("== MENU =="));
for (int i = 0; i < 3; i++) {
if (i == frame) {
display.fillRect(0, 12 + i * 16, 128, 14, SSD1306_WHITE);
display.setTextColor(SSD1306_BLACK);
display.setCursor(5, 14 + i * 16);
display.print("Item ");
display.print(i + 1);
display.setTextColor(SSD1306_WHITE);
} else {
display.setCursor(5, 14 + i * 16);
display.print("Item ");
display.print(i + 1);
}
}
display.display();
delay(1000);
}
delay(3000);
/*====== ピンボール ======*/
int x = 30, y = 30, dx = 2, dy = 2;
for (int t = 0; t < 150; t++) {
display.clearDisplay();
display.fillCircle(x, y, 5, SSD1306_WHITE);
display.display();
x += dx;
y += dy;
if (x <= 5 || x >= SCREEN_WIDTH - 5) dx = -dx;
if (y <= 5 || y >= SCREEN_HEIGHT - 5) dy = -dy;
delay(30);
}
delay(3000);
/*====== 波形表示 ======*/
display.clearDisplay();
for (int x = 0; x < 128; x++) {
int y = 32 + (int)(20 * sin(x * 0.2));
display.drawPixel(x, y, SSD1306_WHITE);
}
display.display();
delay(3000);
/*====== 端から塗りつぶす(列) ======*/
display.clearDisplay();
for (int y = 0; y < SCREEN_HEIGHT; y++) {
for (int x = 0; x < SCREEN_WIDTH; x++) {
display.drawPixel(x, y, SSD1306_WHITE);
}
display.display();
delay(10);
}
delay(3000);
/*====== 端から塗りつぶす(ドット) ======*/
display.clearDisplay();
for (int y = 0; y < SCREEN_HEIGHT; y++) {
for (int x = 0; x < SCREEN_WIDTH; x++) {
display.drawPixel(x, y, SSD1306_WHITE);
display.display(); // 1ピクセルごとに反映
delayMicroseconds(1); // 点が「ポツ…ポツ…」と見える速度
}
}
delay(3000);
}動作確認


コメント