Display-O-Tron HAT by Pimoroni
2026.05.04
今回はPIMORONIのDisplay-O-Tron HATで遊んでみました。
Display-O-Tron HATはラズベリーパイ用の帽子で、16文字3行のキャラクタLCD、6つの区画を持つRGBバックライト、6個のタッチセンサー機能を持っています。

Display-O-Tron HAT
- 16x3キャラクタLCD
- 6ゾーンxRGBバックライト:SN3218 LEDマトリックスドライバチップ搭載
- 6x静電容量式のタッチパッド:CAP1166静電容量式タッチドライバチップ搭載
製品はすでにディスコンで販売元にはすでに在庫もないのですが、2026年4月の段階では秋月電子でお安く購入できます。

●RGBバックライト

SN3218は、18チャンネル・8ビット PWM LED ドライバです。
Display-O-Tronは、RGBバックライトを実装しており、18チャンネル/RGB3色=6区画のLEDになっています。
6つの区画は縦に6分割されています。
同時に6種類のカラーが使えるとはいえ、文字色は黒のみなので、バックライトの恩恵が激減しています。
●文字表示およびタッチセンサ

文字表示はSPIにより制御されます。
静電容量式タッチセンサーには、CAP1166、6チャンネルドライバICが使用されています。
●Pinout
ラズベリーパイに被せた際に使用されるソケットは下記の通りです。

Display-o-Tron HAT at Raspberry Pi GPIO Pinout
Display-o-Tron HAT uses both SPI and I2c to drive the LCD display, back-light and touch.
However both of these buses can be shared with other devices.
- Needs 5v and 3v3 power
- Uses 7 GPIO pins
- Communication over SPI
- Communication over I2C
- 0x54: sn3218
- 0x2c: cap1166
Raspberry Piに被せて、提供されているPython Libraryを使うだけでは面白くありません。
そこで、ESP32に繋いで柔軟な使い方を考えてみました、
| DISPLAY-O-TRON | | QT-Py ESP32S2 |
| 3v3 Power 1 | -- | 3V |
| 5v Power 2 | -- | 5V |
| I2C1 SDA 3 | -- | SDA |
| I2C1 SCL 5 | -- | SCL |
| Ground 6 | -- | GND |
| SPI0 MOSI 19 | -- | MO |
| LCD Register Select 22 | -- | A3 |
| SPI0 SCLK 23 | -- | SCK |
| LCD Chip Select 24 | -- | A2 |
| LCD Reset 32 | -- | A0 |
|
|
ESP32をDIAPLAY-O-TRONのソケットに接続する際に使用する拡張基板です。

2×20(40P)ピンヘッダーを2個はんだ付けします。

これでテスト準備完了です。
●プログラミング
ラズベリーパイに被せて使用する際に、Pythonコードが提供されていますが、今回はESP32で使用するので、Arduino用コードを利用します。

サンプルコード RogueM/rogue-labs
このコードで必要となるライブラリは下記の通りです。
SN3218ライブラリ pimoroni/pimoroni_arduino_sn3218
- sn3218.cpp
- sn3218.h
DogLcdライブラリ wayoda/DogLcd
- src -> DogLcd.cpp
- src -> DogLcd.h
SN3218 18チャンネル・8ビット PWM LEDドライバのコード要点
sn3218.begin(); // start sn3218 register access
sn3218.enable_leds(SN3218_CH_ALL); // enable all channels for access
sn3218.set( 0, 0x02); // Blue
sn3218.set( 1, 0x16); // Green
sn3218.set( 2, 0x04); // Red
sn3218.set( 3, 0x16); // Blue
sn3218.set( 4, 0x02); // Green
sn3218.set( 5, 0x04); // Red
~~~~~~
sn3218.set(15, 0x04); // Blue
sn3218.set(16, 0x02); // Green
sn3218.set(17, 0x16); // Red
sn3218.update();
DogLCDライブラリのコード要点
DogLcd lcd(MOSI, SCK, A3, A2); // MOSI, SCK, CMD, CS
// set LCD type and default contrast
lcd.begin(DOG_LCD_M163, 0x28, DOG_LCD_VCC_3V3);
lcd.setCursor(0, 0);
lcd.print("DISPLAY-O-TRON");
CAP1166静電容量式タッチドライバ用のライブラリが見つからなかったので、以前作成したPIANO HAT用ライブラリを改造しました。
PIANO HATには、CAP1188が2個搭載されています。
CAP1188は、Microchip Technology社が開発した、8チャンネルの静電容量式タッチセンサーICです。

Piano Hat for MIDI
販売元のPIMORONIから提供されているライブラリはPython2用です。
Pythonはライブラリが充実しており、雑誌掲載もコアな仕組みに触れずに済むので多く取り上げらています。
しかし、そのコアな部分を楽しむ主にとってはまったく面白くありません!
また、Pythonでは古いデバイスで動ていたシステムに新機能を追加しようとすると、動作環境を切り分けねばならず、
開発時間短縮どころか、運用管理への高負荷、スタッフの引継ぎ作業での情報欠落によるトラブルに見舞われることになります。
これは、フレームワークに強く依存するJavaでも同様です。
システム設計の美しさを追求するとやはりC言語(派生系のArduinoも同様)は捨てられません。
自作 CAP1166クラスライブラリは下記より取得してください。
CAP1166ライブラリ
#include <Wire.h> // import Wire(i2c) library
#include "sn3218.h" // import SN3218 library
#include <DogLcd.h> // import Dog LCD library
#include "CAP1166.h"
CAP1166 cap1166;
DogLcd lcd(MOSI, SCK, A3, A2); // MOSI, SCK, CMD, CS
void clear_ch_all()
{
for(int i = 0; i < SN3218_NUM_CHANNELS; i++ ) {
sn3218.set(i,0); // reset all LEDs to 0/off
sn3218.update(); // update SN3218 register
}
}
void backlight(uint8_t R, uint8_t G, uint8_t B)
{
for(int i = 0; i < 6; i++ ) {
sn3218.set(i*3, B); // Blue
sn3218.set(i*3+1, G); // Green
sn3218.set(i*3+2, R); // Red
}
sn3218.update();
}
void setup()
{
Wire.begin();
lcd.begin(DOG_LCD_M163, 0x28, DOG_LCD_VCC_3V3); // set LCD type and default contrast
sn3218.begin(); // start sn3218 register access
sn3218.enable_leds(SN3218_CH_ALL); // enable all channels for access
clear_ch_all();
cap1166.begin(&Wire);
lcd.noCursor();
}
void loop()
{
lcd.clear();
if (cap1166.isKey(DISPLAYOTRON_TOP) == (CAP1166_CHANGED | CAP1166_TOUCHED)) {
backlight(0x04,0x16,0x02);
lcd.setCursor(0, 0);
lcd.print("DISPLAY-O-TRON");
lcd.setCursor(0, 1);
lcd.print("DIRECTION: TOP");
lcd.setCursor(0, 2);
lcd.print("R:04 G:16 B:02");
}
if (cap1166.isKey(DISPLAYOTRON_UP) == (CAP1166_CHANGED | CAP1166_TOUCHED)) {
backlight(0x04,0x02,0x16);
lcd.setCursor(0, 0);
lcd.print("DISPLAY-O-TRON");
lcd.setCursor(0, 1);
lcd.print("DIRECTION: UP");
lcd.setCursor(0, 2);
lcd.print("R:04 G:02 B:16");
}
if (cap1166.isKey(DISPLAYOTRON_DOWN) == (CAP1166_CHANGED | CAP1166_TOUCHED)) {
backlight(0x16,0x04,0x02);
lcd.setCursor(0, 0);
lcd.print("DISPLAY-O-TRON");
lcd.setCursor(0, 1);
lcd.print("DIRECTION: DOWN");
lcd.setCursor(0, 2);
lcd.print("R:16 G:04 B:02");
}
if (cap1166.isKey(DISPLAYOTRON_LEFT) == (CAP1166_CHANGED | CAP1166_TOUCHED)) {
backlight(0x16,0x02,0x04);
lcd.setCursor(0, 0);
lcd.print("DISPLAY-O-TRON");
lcd.setCursor(0, 1);
lcd.print("DIRECTION: LEFT");
lcd.setCursor(0, 2);
lcd.print("R:16 G:02 B:04");
}
if (cap1166.isKey(DISPLAYOTRON_CENTER) == (CAP1166_CHANGED | CAP1166_TOUCHED)) {
backlight(0x02,0x16,0x04);
lcd.setCursor(0, 0);
lcd.print("DISPLAY-O-TRON");
lcd.setCursor(0, 1);
lcd.print("DIRECTION: CENTER");
lcd.setCursor(0, 2);
lcd.print("R:02 G:16 B:04");
}
if (cap1166.isKey(DISPLAYOTRON_RIGHT) == (CAP1166_CHANGED | CAP1166_TOUCHED)) {
backlight(0x02,0x04,0x16);
lcd.setCursor(0, 0);
lcd.print("DISPLAY-O-TRON");
lcd.setCursor(0, 1);
lcd.print("DIRECTION: RIGHT");
lcd.setCursor(0, 2);
lcd.print("R:02 G:04 B:16");
}
delay(1000);
}
ソースコードのビルドには、PlatformIOを使用しています。
Arduino開発環境構築 PlatformIO
●動作確認
タッチセンサーを押すたびにバックライトの色と表示文字が変わっています。
●その他活用方法
タッチセンサーのみを利用するのであれば接続は簡素化されます。
| DISPLAY-O-TRON | | QT-Py ESP32S2 |
| 3v3 Power 1 | -- | 3V |
| I2C1 SDA 3 | -- | SDA |
| I2C1 SCL 5 | -- | SCL |
| Ground 6 | -- | GND |
ここでは、M5Stack Library にあるM5Stack-SpaceShooter - スペースインベーダー for M5Stack の操作ボタンを差し替えてみます。

M5Stack/docs/getting_started_ja.md
下記の記事も合わせてご覧ください。

M5Stackアプリの移植
M5Stack-SpaceShooter.ino 変更の要点
boolean BtnA_isPressed() { // LEFT BUTTON
if(digitalRead(BUTTON_A_PIN)==0) return true;
return false;
}
↓変更
boolean BtnA_isPressed() {
if (cap1166.isKey(DISPLAYOTRON_LEFT) & CAP1166_TOUCHED) {
return true;
} else {
return false;
}
}
M5Stack-SpaceShooter.ino のバグ

M5Stack-SpaceShooter.ino
for()ループの変数iが初期化されていません。しかもint型なので運悪く変数値格納エリアに負の整数のゴミがあるとリブートを繰り返します。
実際に遊んでみました

ロボットカーは単なる筐体で、ESP32にST7789ディスプレイを接続しています。

DISPLAY-O-TRONの下段の3つのタッチセンサを使い、左右に移動と中央の発射ボタンでインベーダを打っています。
|
Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
KEYESTUDIO Micro:bit V2ロボットスターターキット (マイクロビットなし) MakecodeとPython用
動き、光と音の使い方、障害物の検知と回避方法、線をたどり、IRリモコンとアプリでコントロールする方法を学びます。
Maqueen Lite V5 micro:bit ロボットキット STEM用(ライントレース&障害物回避)
Maqueen Lite V5 STEMロボットは、事前調整済みのライントレースアルゴリズム、耐衝撃モーター、開封即使用可能な設計で、ストレスを解消します。
たいていのことは100日あれば、うまくいく。長田英知著
「時間がなくて、なかなか自分のやりたいことができない」
「一念発起して何かを始めても、いつも三日坊主で終わってしまう」
「色んなことを先延ばしにしたまま、時間だけが過ぎていく」
そこで本書では、そんな著者が独自に開発した、
まったく新しい目標達成メソッド「100日デザイン」について、
その知識と技術を、余すところなくご紹介します。
まんがで納得ナポレオン・ヒル 思考は現実化する
OLとして雑務をこなす日々に飽き足らず、科学者だった父が残した薬品を商品化すべく、起業を決意した内山麻由(27)。彼女はセミナーで知り合った謎の女性からサポートを得ながら、彼女と二人三脚でナポレオン・ヒルの成功哲学を実践し、さまざまな問題を乗り越えていく。
ヒル博士の<ゴールデンルール>に従い、仕事に、恋に全力疾走する彼女の、成功への物語。
今日は人生最悪で最高の日 1秒で世界を変えるたったひとつの方法 ひすいこたろう著
偉人の伝記を読むと、最悪な日は、不幸な日ではなく、新しい自分が始まる日であることがわかります。最悪な出来事は、自分の人生が、想像を超えて面白くなる兆しなのです。偉人伝を読むことで、このときの不幸があったおかげで、未来にこういう幸せがくるのかと、人生を俯瞰する視線が立ち上がるのです。
ご飯は私を裏切らない heisoku著
辛い現実から目を背けて食べるご飯は、いつも美味しく幸せを届けてくれる。
29歳、中卒、恋人いない歴イコール年齢。バイト以外の職歴もなく、短期バイトを転々とする日々。ぐるぐると思索に耽るけど、ご飯を食べると幸せになれる。奇才の新鋭・heisokuが贈るリアル労働グルメ物語!
【最新版Gemini 3に対応!】できるGemini (できるシリーズ)
Geminiを「最強の知的生産パートナー」として使いこなすための、実践的なノウハウを凝縮した一冊です。
基本的な操作方法から、具体的なビジネスシーンでの活用、日々の業務を自動化するGoogle Workspaceとの連携、さらには自分だけのオリジナルAIを作成する方法まで余すところなく解説します。
Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
Rustの各手法や考え方を幅広く解説!
500以上のサンプルを掲載。実行結果も確認。
全24章の包括的なチュートリアル。
ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS…
全WEB媒体で効果バツグン!
カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術
小型で便利な Type-C アダプター USB C オス - USB3.1 オスアダプター
Type-C端子のマイコンボードをこのアダプタを介して直接Raspberry Piに挿すことができます。ケーブルなしで便利なツールです。
Divoom Ditoo Pro ワイヤレススピーカー
15W高音質重低音/青軸キーボード/Bluetooth5.3/ピクセルアート 専用アプリ/USB接続/microSDカード
電源供給USBケーブル スリム 【5本セット】
USB電源ケーブル 5V DC電源供給ケーブル スリム 【5本セット】 電源供給 バッテリー 修理 自作 DIY 電子工作 (100cm)
|