Grove - OLED ディスプレイ 0.96 インチ
この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues
Grove - OLED ディスプレイ 0.96" モジュールは、Grove 4ピン I2C インターフェースを備えた OLED モノクロ 128×64 ドットマトリックスディスプレイモジュールです。LCD と比較して、OLED スクリーンは高輝度、自発光、高コントラスト比、薄型設計、広視野角、広い温度範囲、低消費電力など、多くの利点を持つため、より競争力があります。このモジュールは、OLED 96×96 よりも大きな画面を持ち、より多くのコンテンツを表示することができます。
バージョン
製品バージョン | 変更点 | リリース日 |
---|---|---|
Grove - OLED ディスプレイ 0.96 インチ V1.1 | 初版 | 2015年10月 |
特徴
- Grove 互換インターフェース
- 通信モード: I2C
- 低消費電力
- 表示色: 白
- 動作温度範囲: -20℃~70℃
- I2C アドレス 0x3C
複数の I2C デバイスを使用したい場合は、[ソフトウェア I2C](https://wiki.seeedstudio.com/ja/Arduino_Software_I2C_user_guide/) を参照してください。
注意: OLED に強い衝撃やストレスを与えると、画面が破損する可能性があります。
Grove モジュールの詳細については、[Grove システム](https://wiki.seeedstudio.com/ja/Grove_System/) を参照してください。
仕様
項目 | 最小値 | 標準値 | 最大値 | 単位 |
---|---|---|---|---|
電源電圧 (VCC) | 3.3 | 5.0 | 5.5 | V |
ドライバ IC | - | SSD1308Z | - | - |
表示色 | - | 白 | - | - |
ドットマトリックス | - | 128×64 | - | - |
パネルサイズ | - | 26.7(W)×19.26(H) | - | mm |
アクティブエリア | - | 21.74(W)×11.175(H) | - | mm |
ドットピッチ | - | 0.17(W)×0.175(H) | - | mm |
ドットサイズ | - | 0.15(W)×0.15(H) | - | mm |
動作温度範囲 | - | -20~70 | - | ℃ |
Grove モジュールの詳細については、[Grove システム](https://wiki.seeedstudio.com/ja/Grove_System/) を参照してください。
対応プラットフォーム
Arduino | Raspberry Pi |
---|---|
上記で対応していると記載されているプラットフォームは、モジュールのソフトウェアまたは理論的な互換性を示しています。ほとんどの場合、Arduinoプラットフォーム向けのソフトウェアライブラリやコード例のみを提供しています。すべての可能なMCUプラットフォーム向けにソフトウェアライブラリやデモコードを提供することは不可能です。そのため、ユーザー自身でソフトウェアライブラリを作成する必要があります。
はじめに
Arduinoを初めて使用する場合は、開始前に[Arduinoの使い方](https://wiki.seeedstudio.com/ja/Getting_Started_with_Arduino/)を必ずご覧ください。
Arduinoで遊ぶ
デモンストレーション
OLED128*64はSSD1308チップのすべてのピンを使用します。デフォルトの原点は左上隅にあります。プログラムを調整することで原点を変更し、希望するパターンを表示することもできます。詳細については、SSD1308_1.0.pdfおよびLY190-128064.pdfをご参照ください。
ハードウェア
- ステップ1. 以下のものを準備してください:
Seeeduino V4 | Base Shield | Grove - OLED Display 0.96inch |
---|---|---|
今すぐ購入 | 今すぐ購入 | 今すぐ購入 |
- ステップ2. Grove OLED Display 128*64をGrove Base ShieldのI2Cポートに接続します。
- ステップ3. Grove Base ShieldをSeeeduinoに接続します。
- ステップ4. USBケーブルを使用してSeeeduinoをPCに接続します。
Grove Base Shieldがない場合は、以下のようにGrove - OLED Display 0.96インチをSeeeduinoに直接接続することもできます。
Seeeduino | Grove - OLED Display 0.96 inch |
---|---|
5V | 赤 |
GND | 黒 |
SDA | 白 |
SCL | 黄色 |
ソフトウェア
- ステップ1. U8G2 128*64ライブラリをGithubからダウンロードします。
- ステップ2. ライブラリのインストール方法を参照して、Arduino用のライブラリをインストールします。
- ステップ3. 以下のコードをArduino IDEにコピーしてアップロードします。コードのアップロード方法がわからない場合は、コードのアップロード方法をご確認ください。
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // SSD1306とSSD1308Zは互換性があります
// U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); //低速I2C
void setup(void) {
u8g2.begin();
}
void loop(void) {
u8g2.clearBuffer(); // 内部メモリをクリア
u8g2.setFont(u8g2_font_ncenB08_tr); // 適切なフォントを選択
u8g2.drawStr(0,10,"Hello World!"); // 内部メモリに文字列を記入
u8g2.sendBuffer(); // 内部メモリをディスプレイに転送
delay(1000);
}
- ステップ3. 画面に「Hello World!」が表示されます。
Raspberry Piで遊ぶ (Grove Base Hat for Raspberry Piを使用)
ハードウェア
- ステップ1. このプロジェクトで使用するもの:
Raspberry pi | Grove Base Hat for RasPi | Grove - OLED Display 0.96 inch |
---|---|---|
今すぐ購入 | 今すぐ購入 | 今すぐ購入 |
- ステップ 2. Grove Base Hat を Raspberry に接続します。
- ステップ 3. OLED ディスプレイを Base Hat の I^2^C ポートに接続します。
- ステップ 4. Raspberry Pi を USB ケーブルを使用して PC に接続します。
ソフトウェア
**Raspberry Pi OS >= Bullseye** を搭載した Raspberry Pi を使用している場合は、**Python3** のみでこのコマンドラインを使用する必要があります。
- ステップ 1. ソフトウェアの設定 に従って開発環境を構成します。
- ステップ 2. grove.py ライブラリをクローンしてソースファイルをダウンロードします。
cd ~
git clone https://github.com/Seeed-Studio/grove.py
- ステップ 3. 以下のコマンドを実行してコードを実行します。
cd grove.py/grove
python3 grove_oled_display_128x64.py
以下は grove_oled_display_128x64.py
のコードです。
import time
from grove.i2c import Bus
_COMMAND_MODE = 0x80
_DATA_MODE = 0x40
_NORMAL_DISPLAY = 0xA6
_DISPLAY_OFF = 0xAE
_DISPLAY_ON = 0xAF
_INVERSE_DISPLAY = 0xA7
_SET_BRIGHTNESS = 0x81
BasicFont = [[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00],
[0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, 0x00],
[0x00, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, 0x00],
[0x00, 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, 0x00],
[0x00, 0x36, 0x49, 0x55, 0x22, 0x50, 0x00, 0x00],
[0x00, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x08, 0x2A, 0x1C, 0x2A, 0x08, 0x00, 0x00],
[0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x00],
[0x00, 0xA0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00],
[0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00],
[0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x00],
[0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, 0x00],
[0x00, 0x62, 0x51, 0x49, 0x49, 0x46, 0x00, 0x00],
[0x00, 0x22, 0x41, 0x49, 0x49, 0x36, 0x00, 0x00],
[0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, 0x00],
[0x00, 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, 0x00],
[0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, 0x00, 0x00],
[0x00, 0x01, 0x71, 0x09, 0x05, 0x03, 0x00, 0x00],
[0x00, 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00],
[0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00],
[0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0xAC, 0x6C, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00],
[0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x00],
[0x00, 0x41, 0x22, 0x14, 0x08, 0x00, 0x00, 0x00],
[0x00, 0x02, 0x01, 0x51, 0x09, 0x06, 0x00, 0x00],
[0x00, 0x32, 0x49, 0x79, 0x41, 0x3E, 0x00, 0x00],
[0x00, 0x7E, 0x09, 0x09, 0x09, 0x7E, 0x00, 0x00],
[0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x00],
[0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00, 0x00],
[0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, 0x00],
[0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x41, 0x51, 0x72, 0x00, 0x00],
[0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x00],
[0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, 0x00],
[0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00],
[0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00],
[0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, 0x00, 0x00],
[0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00],
[0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, 0x00],
[0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, 0x00],
[0x00, 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, 0x00],
[0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, 0x00, 0x00],
[0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, 0x00],
[0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, 0x00],
[0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, 0x00],
[0x00, 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, 0x00],
[0x00, 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, 0x00],
[0x00, 0x61, 0x51, 0x49, 0x45, 0x43, 0x00, 0x00],
[0x00, 0x7F, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00],
[0x00, 0x41, 0x41, 0x7F, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, 0x00],
[0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00],
[0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x20, 0x54, 0x54, 0x54, 0x78, 0x00, 0x00],
[0x00, 0x7F, 0x48, 0x44, 0x44, 0x38, 0x00, 0x00],
[0x00, 0x38, 0x44, 0x44, 0x28, 0x00, 0x00, 0x00],
[0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, 0x00, 0x00],
[0x00, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x00],
[0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, 0x00, 0x00],
[0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, 0x00, 0x00],
[0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00],
[0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x80, 0x84, 0x7D, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00],
[0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, 0x00, 0x00],
[0x00, 0x7C, 0x08, 0x04, 0x7C, 0x00, 0x00, 0x00],
[0x00, 0x38, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00],
[0x00, 0xFC, 0x24, 0x24, 0x18, 0x00, 0x00, 0x00],
[0x00, 0x18, 0x24, 0x24, 0xFC, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x7C, 0x08, 0x04, 0x00, 0x00, 0x00],
[0x00, 0x48, 0x54, 0x54, 0x24, 0x00, 0x00, 0x00],
[0x00, 0x04, 0x7F, 0x44, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x3C, 0x40, 0x40, 0x7C, 0x00, 0x00, 0x00],
[0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, 0x00],
[0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, 0x00],
[0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x00],
[0x00, 0x1C, 0xA0, 0xA0, 0x7C, 0x00, 0x00, 0x00],
[0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x00],
[0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x41, 0x36, 0x08, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x00, 0x00],
[0x00, 0x02, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00]]
class GroveOledDisplay128x64(object):
HORIZONTAL = 0x00
VERTICAL = 0x01
PAGE = 0x02
def __init__(self, bus=None, address=0x3C):
self.bus = Bus(bus)
self.address = address
self.off()
self.inverse = False
self.mode = self.HORIZONTAL
self.clear()
self.on()
def on(self):
self.send_command(_DISPLAY_ON)
def off(self):
self.send_command(_DISPLAY_OFF)
def send_command(self, command):
self.bus.write_byte_data(self.address, _COMMAND_MODE, command)
def send_data(self, data):
self.bus.write_byte_data(self.address, _DATA_MODE, data)
def send_commands(self, commands):
for c in commands:
self.send_command(c)
def clear(self):
self.off()
for i in range(8):
self.set_cursor(i, 0)
self.puts(' ' * 16)
self.on()
self.set_cursor(0, 0)
@property
def inverse(self):
return self._inverse
@inverse.setter
def inverse(self, enable):
self.send_command(_INVERSE_DISPLAY if enable else _NORMAL_DISPLAY)
self._inverse = enable
@property
def mode(self):
return self._mode
@mode.setter
def mode(self, mode):
self.send_command(0x20)
self.send_command(mode)
self._mode = mode
def set_cursor(self, row, column):
self.send_command(0xB0 + row)
self.send_command(0x00 + (8*column & 0x0F))
self.send_command(0x10 + ((8*column>>4)&0x0F))
def putc(self, c):
C_add = ord(c)
if C_add < 32 or C_add > 127: # 非表示可能なASCII文字を無視
c = ' '
C_add = ord(c)
for i in range(0, 8):
self.send_data(BasicFont[C_add-32][i])
def puts(self, text):
for c in text:
self.putc(c)
def show_image(self, image):
from PIL import Image
import numpy as np
im = Image.open(image)
bw = im.convert('1')
pixels = np.array(bw.getdata())
page_size = 128 * 8
self.set_cursor(0, 0)
for page in range(8):
start = page_size * page
end = start + page_size
for i in range(start, start + 128):
data = np.packbits(pixels[i:end:128][::-1])[0]
self.send_data(data)
def main():
display = GroveOledDisplay128x64()
display.set_cursor(0, 0)
display.puts('hello')
display.set_cursor(1, 4)
display.puts('world')
if __name__ == "__main__":
main()
ターミナルでは何も起こらないように見えますが、OLEDを確認するとサイバー世界で最も有名な文章が表示されていることに気付くでしょう。😄
GroveモジュールのI2CアドレスをスキャンするためにI2Cツールを使用すると、2つ以上のアドレスが見つかる場合があります。0x04は*Grove Base Hat for Raspberry Pi*のアドレスです。
Raspberry Piで遊ぶ (GrovePi_Plusを使用)
以下のBeagleBone Green用のPythonスクリプトはRaspberry Piでも動作します。ただし、I2Cバスが異なります。Raspberry Pi 2/3ではI2Cバスは1です。スクリプト内のbus=2
をbus=1
に変更すればPiで動作します。
ハードウェア
- ステップ 1. 以下のものを準備してください:
Raspberry Pi | GrovePi_Plus | Grove - OLED Display 0.96 inch |
---|---|---|
今すぐ購入 | 今すぐ購入 | 今すぐ購入 |
- ステップ 2. GrovePi_PlusをRaspberryに接続します。
- ステップ 3. Grove - OLED Display 0.96 inchをGrovePi_PlusのI2C-2ポートに接続します。
- ステップ 4. USBケーブルを使用してRaspberryをPCに接続します。
ソフトウェア
ステップ 1. ソフトウェアの設定に従って開発環境を構成します。
ステップ 2. デモのディレクトリに移動します:
cd yourpath/GrovePi/Software/Python/
- ステップ 3. コードを確認します:
nano Grove-OLED_Display_0.96inch.py # "Ctrl+x"で終了 #
import time
import smbus2 as smbus
_COMMAND_MODE = 0x80
_DATA_MODE = 0x40
_NORMAL_DISPLAY = 0xA6
_DISPLAY_OFF = 0xAE
_DISPLAY_ON = 0xAF
_INVERSE_DISPLAY = 0xA7
_SET_BRIGHTNESS = 0x81
BasicFont = [[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00],
[0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, 0x00],
[0x00, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, 0x00],
[0x00, 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, 0x00],
[0x00, 0x36, 0x49, 0x55, 0x22, 0x50, 0x00, 0x00],
[0x00, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x08, 0x2A, 0x1C, 0x2A, 0x08, 0x00, 0x00],
[0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x00],
[0x00, 0xA0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00],
[0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00],
[0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x00],
[0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, 0x00],
[0x00, 0x62, 0x51, 0x49, 0x49, 0x46, 0x00, 0x00],
[0x00, 0x22, 0x41, 0x49, 0x49, 0x36, 0x00, 0x00],
[0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, 0x00],
[0x00, 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, 0x00],
[0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, 0x00, 0x00],
[0x00, 0x01, 0x71, 0x09, 0x05, 0x03, 0x00, 0x00],
[0x00, 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00],
[0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00],
[0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0xAC, 0x6C, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00],
[0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x00],
[0x00, 0x41, 0x22, 0x14, 0x08, 0x00, 0x00, 0x00],
[0x00, 0x02, 0x01, 0x51, 0x09, 0x06, 0x00, 0x00],
[0x00, 0x32, 0x49, 0x79, 0x41, 0x3E, 0x00, 0x00],
[0x00, 0x7E, 0x09, 0x09, 0x09, 0x7E, 0x00, 0x00],
[0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x00],
[0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00, 0x00],
[0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, 0x00],
[0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x41, 0x51, 0x72, 0x00, 0x00],
[0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x00],
[0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, 0x00],
[0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00],
[0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00],
[0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, 0x00, 0x00],
[0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00],
[0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, 0x00],
[0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, 0x00],
[0x00, 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, 0x00],
[0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, 0x00, 0x00],
[0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, 0x00],
[0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, 0x00],
[0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, 0x00],
[0x00, 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, 0x00],
[0x00, 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, 0x00],
[0x00, 0x61, 0x51, 0x49, 0x45, 0x43, 0x00, 0x00],
[0x00, 0x7F, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00],
[0x00, 0x41, 0x41, 0x7F, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, 0x00],
[0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00],
[0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x20, 0x54, 0x54, 0x54, 0x78, 0x00, 0x00],
[0x00, 0x7F, 0x48, 0x44, 0x44, 0x38, 0x00, 0x00],
[0x00, 0x38, 0x44, 0x44, 0x28, 0x00, 0x00, 0x00],
[0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, 0x00, 0x00],
[0x00, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x00],
[0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, 0x00, 0x00],
[0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, 0x00, 0x00],
[0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00],
[0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x80, 0x84, 0x7D, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00],
[0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, 0x00, 0x00],
[0x00, 0x7C, 0x08, 0x04, 0x7C, 0x00, 0x00, 0x00],
[0x00, 0x38, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00],
[0x00, 0xFC, 0x24, 0x24, 0x18, 0x00, 0x00, 0x00],
[0x00, 0x18, 0x24, 0x24, 0xFC, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x7C, 0x08, 0x04, 0x00, 0x00, 0x00],
[0x00, 0x48, 0x54, 0x54, 0x24, 0x00, 0x00, 0x00],
[0x00, 0x04, 0x7F, 0x44, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x3C, 0x40, 0x40, 0x7C, 0x00, 0x00, 0x00],
[0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, 0x00],
[0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, 0x00],
[0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x00],
[0x00, 0x1C, 0xA0, 0xA0, 0x7C, 0x00, 0x00, 0x00],
[0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x00],
[0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x41, 0x36, 0x08, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x00, 0x00],
[0x00, 0x02, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00]]
class GroveOledDisplay128x64(object):
HORIZONTAL = 0x00
VERTICAL = 0x01
PAGE = 0x02
def __init__(self, bus=2, address=0x3C):
self.bus = smbus.SMBus(bus)
self.address = address
self.off()
self.inverse = False
self.mode = self.HORIZONTAL
self.clear()
self.on()
def on(self):
self.send_command(_DISPLAY_ON)
def off(self):
self.send_command(_DISPLAY_OFF)
def send_command(self, command):
self.bus.write_byte_data(self.address, _COMMAND_MODE, command)
def send_data(self, data):
self.bus.write_byte_data(self.address, _DATA_MODE, data)
def send_commands(self, commands):
for c in commands:
self.send_command(c)
def clear(self):
self.off()
for i in range(8):
self.set_cursor(i, 0)
self.puts(' ' * 16)
self.on()
self.set_cursor(0, 0)
@property
def inverse(self):
return self._inverse
@inverse.setter
def inverse(self, enable):
self.send_command(_INVERSE_DISPLAY if enable else _NORMAL_DISPLAY)
self._inverse = enable
@property
def mode(self):
return self._mode
@mode.setter
def mode(self, mode):
self.send_command(0x20)
self.send_command(mode)
self._mode = mode
def set_cursor(self, row, column):
self.send_command(0xB0 + row)
self.send_command(0x00 + (8*column & 0x0F))
self.send_command(0x10 + ((8*column>>4)&0x0F))
def putc(self, c):
C_add = ord(c)
if C_add < 32 or C_add > 127: # 非表示ASCII文字を無視
c = ' '
C_add = ord(c)
for i in range(0, 8):
self.send_data(BasicFont[C_add-32][i])
def puts(self, text):
for c in text:
self.putc(c)
def show_image(self, image):
from PIL import Image
import numpy as np
im = Image.open(image)
bw = im.convert('1')
pixels = np.array(bw.getdata())
page_size = 128 * 8
self.set_cursor(0, 0)
for page in range(8):
start = page_size * page
end = start + page_size
for i in range(start, start + 128):
data = np.packbits(pixels[i:end:128][::-1])[0]
self.send_data(data)
if __name__ == "__main__":
display = GroveOledDisplay128x64(bus=1)
display.set_cursor(0, 0)
display.puts('hello')
display.set_cursor(1, 4)
display.puts('world')
ステップ 4: smbus2ライブラリをインストールします
sudo pip install smbus2
ステップ 5: コードを実行します。Grove - OLEDが「Hello World」と出力することが確認できます。
sudo python Grove-OLED_Display_0.96inch.py
Beaglebone Greenで遊ぶ
BBG上のプログラムを編集するには、Cloud9 IDEを使用し、Beaglebone Green Wikiを参照してください。
以下は、OLEDに「Hello World」を表示する手順です。
ハードウェア
- ステップ 1. Grove - OLEDをBBGのGrove I2Cソケットに接続します。
- ステップ 2. SeeeduinoをUSBケーブルでPCに接続します。
ソフトウェア
- ステップ 1: 右上の「+」をクリックして新しいファイルを作成します。
- ステップ 2: 以下のコードを新しいタブにコピー&ペーストします。
import time
import smbus2 as smbus
_COMMAND_MODE = 0x80
_DATA_MODE = 0x40
_NORMAL_DISPLAY = 0xA6
_DISPLAY_OFF = 0xAE
_DISPLAY_ON = 0xAF
_INVERSE_DISPLAY = 0xA7
_SET_BRIGHTNESS = 0x81
BasicFont = [[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00],
[0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, 0x00],
[0x00, 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, 0x00],
[0x00, 0x23, 0x13, 0x08, 0x64, 0x62, 0x00, 0x00],
[0x00, 0x36, 0x49, 0x55, 0x22, 0x50, 0x00, 0x00],
[0x00, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x08, 0x2A, 0x1C, 0x2A, 0x08, 0x00, 0x00],
[0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x00],
[0x00, 0xA0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00],
[0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00],
[0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x00],
[0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, 0x00],
[0x00, 0x62, 0x51, 0x49, 0x49, 0x46, 0x00, 0x00],
[0x00, 0x22, 0x41, 0x49, 0x49, 0x36, 0x00, 0x00],
[0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, 0x00],
[0x00, 0x27, 0x45, 0x45, 0x45, 0x39, 0x00, 0x00],
[0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, 0x00, 0x00],
[0x00, 0x01, 0x71, 0x09, 0x05, 0x03, 0x00, 0x00],
[0x00, 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00],
[0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00],
[0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0xAC, 0x6C, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00],
[0x00, 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, 0x00],
[0x00, 0x41, 0x22, 0x14, 0x08, 0x00, 0x00, 0x00],
[0x00, 0x02, 0x01, 0x51, 0x09, 0x06, 0x00, 0x00],
[0x00, 0x32, 0x49, 0x79, 0x41, 0x3E, 0x00, 0x00],
[0x00, 0x7E, 0x09, 0x09, 0x09, 0x7E, 0x00, 0x00],
[0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, 0x00],
[0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, 0x00, 0x00],
[0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, 0x00],
[0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x41, 0x51, 0x72, 0x00, 0x00],
[0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, 0x00],
[0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, 0x00],
[0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00],
[0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00],
[0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, 0x00, 0x00],
[0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00],
[0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, 0x00],
[0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, 0x00],
[0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, 0x00],
[0x00, 0x26, 0x49, 0x49, 0x49, 0x32, 0x00, 0x00],
[0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, 0x00, 0x00],
[0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, 0x00],
[0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, 0x00],
[0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, 0x00],
[0x00, 0x63, 0x14, 0x08, 0x14, 0x63, 0x00, 0x00],
[0x00, 0x03, 0x04, 0x78, 0x04, 0x03, 0x00, 0x00],
[0x00, 0x61, 0x51, 0x49, 0x45, 0x43, 0x00, 0x00],
[0x00, 0x7F, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, 0x00],
[0x00, 0x41, 0x41, 0x7F, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x04, 0x02, 0x01, 0x02, 0x04, 0x00, 0x00],
[0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00],
[0x00, 0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x20, 0x54, 0x54, 0x54, 0x78, 0x00, 0x00],
[0x00, 0x7F, 0x48, 0x44, 0x44, 0x38, 0x00, 0x00],
[0x00, 0x38, 0x44, 0x44, 0x28, 0x00, 0x00, 0x00],
[0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, 0x00, 0x00],
[0x00, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x00],
[0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, 0x00, 0x00],
[0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, 0x00, 0x00],
[0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00],
[0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x80, 0x84, 0x7D, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00],
[0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, 0x00, 0x00],
[0x00, 0x7C, 0x08, 0x04, 0x7C, 0x00, 0x00, 0x00],
[0x00, 0x38, 0x44, 0x44, 0x38, 0x00, 0x00, 0x00],
[0x00, 0xFC, 0x24, 0x24, 0x18, 0x00, 0x00, 0x00],
[0x00, 0x18, 0x24, 0x24, 0xFC, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x7C, 0x08, 0x04, 0x00, 0x00, 0x00],
[0x00, 0x48, 0x54, 0x54, 0x24, 0x00, 0x00, 0x00],
[0x00, 0x04, 0x7F, 0x44, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x3C, 0x40, 0x40, 0x7C, 0x00, 0x00, 0x00],
[0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, 0x00],
[0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, 0x00],
[0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x00],
[0x00, 0x1C, 0xA0, 0xA0, 0x7C, 0x00, 0x00, 0x00],
[0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x00],
[0x00, 0x08, 0x36, 0x41, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x41, 0x36, 0x08, 0x00, 0x00, 0x00, 0x00],
[0x00, 0x02, 0x01, 0x01, 0x02, 0x01, 0x00, 0x00],
[0x00, 0x02, 0x05, 0x05, 0x02, 0x00, 0x00, 0x00]]
class GroveOledDisplay128x64(object):
HORIZONTAL = 0x00
VERTICAL = 0x01
PAGE = 0x02
def __init__(self, bus=2, address=0x3C):
self.bus = smbus.SMBus(bus)
self.address = address
self.off()
self.inverse = False
self.mode = self.HORIZONTAL
self.clear()
self.on()
def on(self):
self.send_command(_DISPLAY_ON)
def off(self):
self.send_command(_DISPLAY_OFF)
def send_command(self, command):
self.bus.write_byte_data(self.address, _COMMAND_MODE, command)
def send_data(self, data):
self.bus.write_byte_data(self.address, _DATA_MODE, data)
def send_commands(self, commands):
for c in commands:
self.send_command(c)
def clear(self):
self.off()
for i in range(8):
self.set_cursor(i, 0)
self.puts(' ' * 16)
self.on()
self.set_cursor(0, 0)
@property
def inverse(self):
return self._inverse
@inverse.setter
def inverse(self, enable):
self.send_command(_INVERSE_DISPLAY if enable else _NORMAL_DISPLAY)
self._inverse = enable
@property
def mode(self):
return self._mode
@mode.setter
def mode(self, mode):
self.send_command(0x20)
self.send_command(mode)
self._mode = mode
def set_cursor(self, row, column):
self.send_command(0xB0 + row)
self.send_command(0x00 + (8*column & 0x0F))
self.send_command(0x10 + ((8*column>>4)&0x0F))
def putc(self, c):
C_add = ord(c)
if C_add < 32 or C_add > 127: # Ignore non-printable ASCII characters
c = ' '
C_add = ord(c)
for i in range(0, 8):
self.send_data(BasicFont[C_add-32][i])
def puts(self, text):
for c in text:
self.putc(c)
def show_image(self, image):
from PIL import Image
import numpy as np
im = Image.open(image)
bw = im.convert('1')
pixels = np.array(bw.getdata())
page_size = 128 * 8
self.set_cursor(0, 0)
for page in range(8):
start = page_size * page
end = start + page_size
for i in range(start, start + 128):
data = np.packbits(pixels[i:end:128][::-1])[0]
self.send_data(data)
if __name__ == "__main__":
display = GroveOledDisplay128x64(bus=2)
display.set_cursor(0, 0)
display.puts('hello')
display.set_cursor(1, 4)
display.puts('world')
ステップ 3: ディスクアイコンをクリックして、ファイルを .py 拡張子で保存します。
ステップ 4: smbus2 ライブラリをインストールします。
sudo pip3 install smbus2
ステップ 5: コードを実行します。Grove - OLED が "Hello World" を出力することが確認できます。
sudo python3 Grove-OLED_Display_0.96inch.py
オンライン回路図ビューア
リソース
[PDF] Grove-OLED128x64 回路図
[PDF] Grove-OLED128x64 PCB
[Wiki] Beaglebone Green Wiki
[Eagle] Grove-OLED128x64
[ライブラリ] GitHub の OLED 用ライブラリ
[データシート] SSD1308_1.0.pdf のリソース
[データシート] LY190-128064.pdf のリソース
技術サポート & 製品ディスカッション
弊社製品をお選びいただきありがとうございます!製品をスムーズにご利用いただけるよう、さまざまなサポートをご用意しています。お客様のご希望やニーズに応じた複数のコミュニケーションチャネルをご利用いただけます。