概要 †
RaspBerry Pi に I2C 接続の単色 128*64 ドットの OLED(有機 EL) ディスプレイを接続して、コンソール画面(CTRL+ALT+F1 を押したときの画面)を表示するディスプレイとして使う手順です。RaspBerry Pi 本体に接続した USB キーボードから 16x8 文字表示のコンソールにログインして操作できます。
- 動画 oled01.mpg (Twitter の動画)
- 機種: RaspberryPi(Model-B, Model-B+)で動作確認
- OS
- Linux pi 4.1.13+ #826 PREEMPT Fri Nov 13 20:13:22 GMT 2015 armv6l GNU/Linux
- NOOBS v1.5.0, v1.9.2 でインストール
- Linux raspberrypi 4.4.34+ #930 Wed Nov 23 15:12:30 GMT 2016 armv6l GNU/Linux
- Raspbian Jessie Lite Release date: 2017-01-11
- OLED(有機 EL) ディスプレイ: SSD1306 制御の製品(4ピン, I2C インタフェースのもの, I2C スレーブアドレス=3CH[1bit左シフトして78Hと表記される場合もあり])
動作 †
- CTRL+ALT+F1 で表示されるコンソールが有機 EL ディスプレイに表示されます。解像度は128*64になります。同時に HDMI にも出力されます
- CTRL+ALT+F2 以降のコンソールは通常通り使用できます。X Window も通常通りです。こちらに切り替えている間は有機 EL ディスプレイには表示されません
設定 †
(1) 配線
- RaspberryPi の I2C 出力と OLED ディスプレイを結線する(4本)
(2) oled コマンド(VRAM の内容を I2C に繰り返し出力するオリジナルプログラム)を /bin/oled に置いて実行パーミションを付ける
# cp oled /bin/oled
# chmod a+x /bin/oled
(3) 8dot フォント(alt-8x8 他)をインストール
# apt-get install console-data
- フォントファイルが /usr/share/consolefonts に追加される
- ここでキーボードの設定もできる
(4) I2C の有効化
# raspi-config
- メニューから "Advenced Options" → "I2C" を選択して有効化
- ここで "4 Internationalisation Options" メニューから日本語キーボードの設定もできる
- 再起動
(5) 解像度の追加
- /etc/fb.modes を編集して、末尾に下記の行を追加
mode "128x64-60"
# D: 25.175 MHz, H: 31.469 kHz, V: 59.94 Hz
geometry 128 64 128 64 8
timings 39722 48 16 33 10 96 2
endmode
(6) oled サービスの追加
- /etc/systemd/system/oled.service を新規作成して下記の内容を入力
[Unit]
Description = oled daemon
After = multi-user.target
[Service]
ExecStartPre=/bin/bash -c "/bin/chvt 1; /bin/fbset '128x64-60'; /bin/setfont 'alt-8x8'; export TERM=linux; setterm -blank 0 > /dev/tty1"
ExecStopPost=/bin/bash -c "/bin/fbset '800x600-60'; /bin/setfont 'default8x16'"
ExecStart = /bin/oled
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target
(7) OS 起動時にサービスを開始するように指定
# systemctl enable oled
を実行する(不要になったら systemctl disable oled で無効化できる)。
補足 †
サービスを停止しても X-Window の解像度が 128*64 のままで、本来の解像度に戻りません 。解決方法が分かる方がいましたら教えてください
- 原理を正確に把握していませんが、上記 (6) の /etc/systemd/system/oled.service ファイルの [Unit] セクションに "After = multi-user.target" を追加したら、希望通りの動作をするようになりました。すなわち、通常は本来の解像度で X Window を使うことができ、本体に接続した USB キーボードで CTRL+ALT+F1 を押したときだけ、解像度 128*64 のコンソール1が有機 EL ディスプレイに表示されます。その後 CTRL+ALT+F7 を押すと X Window に戻ります。
- 手動でのサービスの停止と再開
# service oled stop
でサービスが停止し、有機 EL ディスプレイが更新されなくなり、コンソール1の解像度が 800*600 になります。
# service oled start
でサービスを再開します。
- I2C スレーブアドレスが 3CH(78H) 以外のディスプレイを使う場合はソースファイルoled.c 中の定数 OLED_ADDR を修正して再コンパイルが必要です(gcc -o oled oled.c)
- CPU 負荷を軽減するために、1フレーム表示ごとに 100ms のウェイトを入れています(10fps程度?)。top コマンドで表示される oled コマンドの CPU 負荷は 1~2% になっています。
- /etc/rsyslog.conf の末尾を次のように編集すると、システムログを OLED ディスプレイに表示させることができます。
Counter: 16393,
today: 1,
yesterday: 3