Arduino NANOでOLEDに文字を表示させる

概要

今回は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 5VOLED VCC
Arduino GNDOLED GND
Arduino A5OLED SCL
Arduino A4OLED 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);
}

動作確認

コメント

タイトルとURLをコピーしました