概要

RaspBerry Pi に I2C 接続の単色 128*64 ドットの OLED(有機 EL) ディスプレイを接続して、コンソール画面(CTRL+ALT+F1 を押したときの画面)を表示するディスプレイとして使う手順です。RaspBerry Pi 本体に接続した USB キーボードから 16x8 文字表示のコンソールにログインして、シェル上で操作できます。

DHCP 環境で RaspBerry Pi にリモートでログインしたいけれども IP アドレスが分からない場合、通常は外部ディスプレイを接続する必要があって面倒ですが、このコンソール画面があれば "ifconfig | less" コマンドで調べられます。調べるだけでなく "ifconfig eth0 192.168.0.1" などとして IP アドレスを変更したり "vi /etc/dhcpcd.conf" で設定ファイルを編集することまでなんとかできます。解像度は高くありませんが、超小型(27.3mm*27.3mm)のディスプレイなので、普段から接続したままでも邪魔になりません。

zero.jpg

  • 動画 fileoled01.mpg (Twitter の動画)
  • mplayer でビデオ再生: https://www.youtube.com/watch?v=AYDwFxZyZmc&feature=youtu.be
  • 機種: RaspberryPi(Model-B, Model-B+, Zero)で動作確認
  • 動作確認した OS
    • システムの起動スクリプトが systemd の OS (Jessie 以降) の必要があるようです
    • 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 (または "/bin/chvt 1" コマンド)でコンソールに切り替えると、有機 EL ディスプレイに表示されるようになります。解像度は128*64 ドットになります。同時に HDMI にも出力されます
  • CTRL+ALT+F2 以降のコンソールに切り替えると通常通りの画面出力になります。X Window も通常通り使用できます。
  • フレームバッファ(VRAM)の内容を、バックグラウンドで動いている通常のソフトウェアで定期的に I2C で OLED に表示させることで実現しています。カーネルの修正等は必要ありません
  • コンソールからログインしたときにキーボードで "|" (パイプ文字) 等が入力できない場合は、下の方の「補足」の先頭部分を参照してください

初期設定

自動設定スクリプト(Install.sh)を使う場合

(1) 配線

  • RaspberryPi の I2C 出力と OLED ディスプレイを結線する(必要な配線は4本のみ)
  • 1,3,5,6 ピンを使用。図は RaspberryPi ModelA/B の GPIO が 26 ピンの場合だが、GPIO が 40 ピンのモデルでも同様に 1,3,5,6 ピンを接続する。
  • 電源のピン配列に注意!!: ピン配列が左から VDD-GND-SCK-SDA の順のOLEDもあり、その場合 VDDとGNDの配線がこの図と逆になります。
hardware.png

(2) fileoled.zip をダウンロードして展開し、root 権限で自動設定スクリプト Install.sh を実行する

# sh Install.sh
  • 下記の「手動で設定する場合」の (2)-(7) が自動で実行される

(3) I2C の有効化

# raspi-config
  • メニューから "Advenced Options" → "I2C" を選択して有効化
    • メニューにない場合は "Interfacing Options" → "I2C" から有効化する
  • ここで "4 Internationalisation Options" メニューから日本語キーボードの設定もできる
  • 再起動すると有機 EL ディスプレイの表示が開始する

手動で設定する場合(通常は不要です)

(1) 配線

(2) fileoled.zip をダウンロードして展開し oled コマンドを /bin/oled に置いて実行パーミションを付ける

# cp oled /bin/oled
# chmod a+x /bin/oled

(3) 8dot フォント(alt-8x8 他)をインストール

# export DEBIAN_FRONTEND=noninteractive
# apt-get install console-data
  • フォントファイルが /usr/share/consolefonts に追加される

(4) I2C の有効化

# raspi-config
  • メニューから "Advenced Options" → "I2C" を選択して有効化
    • メニューにない場合は "Interfacing 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
# After=display-manager.service
[Service]
ExecStartPre=/bin/bash -c "/bin/sleep 10; /bin/chvt 1; /bin/fbset '128x64-60'; /bin/setfont 'alt-8x8'"
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 で無効化できる)。

Raspberry Pi Zero に横向きに OLED を接続する方法

  • I2C 専用のポートでなくても、GPIO に OLED を接続することができる
    • オーバーレイという機能で GPIO でソフトウェア I2C を実現する
    • /dev/i2c-3 等としてソフトウェア I2C が使えるようになる
    • 【注意】OLED 側で I2C のプルアップが必要
      • SCK, SDA をそれぞれ 1[kΩ] でプルアップした
  • 手順
    • まず上記の「初期設定(自動設定スクリプト(Install.sh)を使う場合)」を行う
    • /boot/config.txt に下記の行を追記して再起動する
      • SDA=GPIO9, SCL=GPIO10 として /dev/i2c-3 が使えるようになる
        dtoverlay=i2c-gpio,i2c_gpio_sda=9,i2c_gpio_scl=10,i2c_gpio_delay_us=2
    • /etc/systemd/system/oled.service を修正。下記の動作をするようになる。
      • 電源用に GPIO22 を出力ピンにして 0[V] を出力する
      • 出力電流が GPIO 出力をオーバーしないように OLED の明るさを下げる
      • I2C データを /dev/i2c-3 に出力する
        [Unit]
        Description = oled daemon
        #After = multi-user.target
        After=display-manager.service
        [Service]
        ExecStartPre=/bin/bash -c "echo 22 > /sys/class/gpio/export; echo out
        > /sys/class/gpio/gpio22/direction; echo 0 > /sys/class/gpio/
        gpio22/value; /bin/sleep 10; /bin/chvt 1; /bin/fbset '128x64-60'; 
        /bin/setfont  'alt-8x8'"
        ExecStopPost=/bin/bash -c "/bin/fbset '800x600-60'; /bin/setfont 'default8x16'"
        ExecStart = /bin/oled 250 0x3c /dev/i2c-3 /dev/fb0 0
        Restart = always
        Type = simple
        [Install]
        WantedBy = multi-user.target
  • OLED を接続するピン位置 (OLED のピン配列が左から GND-VDD-SCK-SDA であることを確認してください。この順でない OLED はそのままでは使えません)
gpio-zero1.jpg
  • 表示
gpio-zero2.jpg

補足

  • USB 日本語キーボードを使うには
    • 標準ではキーバインドが日本語キーボード用になっていません。特に OLED のコンソールは画面が狭いため "|" (パイプ文字) が入力できないと、"ls | less" 等と入力できず、表示がすべてスクロールアウトしてしまい役に立ちません。下記のコマンドで日本語キーボードに変更してください。
      # loadkeys jp106 
  • 自動設定スクリプト Install.sh を書きました。oled.zip に含まれています。"sh Install.sh" を実行すると上記の (2)-(7) が自動で行われます。ただし「(4)I2Cの有効化」は別途手動で行う必要があります。
  • サービスを停止しても X-Window の解像度が 128*64 のままで、本来の解像度に戻りません 。解決方法が分かる方がいましたら教えてください
    • 原理を正確に把握していませんが、上記 (6) の /etc/systemd/system/oled.service ファイルの [Unit] セクションに "After = multi-user.target" を追加し、ExecStartPre に /bin/sleep 10 を追加してスリープを入れることで希望通りの動作になりました。すなわち、通常は本来の解像度で X Window を使うことができ、本体に接続した USB キーボードで CTRL+ALT+F1 を押したときだけ、解像度 128*64 のコンソール1が有機 EL ディスプレイに表示されます。その後 CTRL+ALT+F7 を押すと X Window に戻ります。
  • 手動でのサービスの停止と再開
    # service oled stop
    でサービスが停止し、有機 EL ディスプレイが更新されなくなり、コンソール1の解像度が 128*64 ドットから 800*600 ドットになります。
    # service oled start
    でサービスを再開します(起動前に10秒間のウェイトが入りますので時間がかかります)。
  • 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 ディスプレイに表示させることができます。
    • 編集前: xconsole に出力
      daemon.*;mail.*;\
              news.err;\
              *.=debug;*.=info;\
              *.=notice;*.=warn       |/dev/xconsole
    • 編集後: OLED(/dev/tty1) に出力
      daemon.*;mail.*;\
              news.err;\
              *.=debug;*.=info;\
              *.=notice;*.=warn       |/dev/tty1 ←この行を修正
  • 一定時間(600秒)の無操作でディスプレイ表示が OFF になります。その場合 USB キーボードのキーを押せば再度表示されます。/etc/systemd/system/oled.service の "ExecStartPre=" の行の最後に ";export TERM=linux; setterm -blank 0 > /dev/tty1" を付けると、この省電力機能が無効になります。
    • ディスプレイ OFF までの時間は /sys/module/kernel/parameters/consoleblank に記録されています
  • 下記のコマンドでカーソルが非表示になります
    # setterm -cursor off > /dev/tty1
  • プロンプトの変更
    • bash の場合 export PS1=">"
    • csh の場合 set prompt=">"
  • 文字の表示
    • コンソール(/dev/tty1) にテキストをリダイレクトで出力すれば OLED に表示されます
      (時刻を表示する例)
      # date -R > /dev/tty1
  • 画像の表示
    • 画像の表示テスト用プログラム dispImg を作成しました。oled.zip に含まれています。直接 OLED に描画するのではなく、コンソール1 に画像を表示しますので、表示するためには oled サービスが実行中である必要があります。表示できるのは 1bit・バイナリ形式の pbm ファイル(マジックナンバー P4)のみですので、下記のように ImageMagick の convert コマンド等で pbm ファイルに変換してから表示してください。画面写真にある、いぬの絵を表示するときに使用しました。
      # convert file.png file.pbm
      # dispImg file.pbm

外部リンク

ソフトウェア

ソフトウェアのダウンロード

  • oled.zip(ソース+RaspberryPiバイナリ)

oled コマンドについて

# oled [-h] waitTime i2cAddress i2cDeviceFile framebufferDeviceFile Brightness
  • フレームバッファ(VRAM)の内容を一定周期で OLED に表示するプログラムです
  • -h を付けるとヘルプを表示して終了します
  • 引数は省略可能ですが、いずれかの引数を指定する場合は、それより手前の引数は省略できません
  • エラーメッセージは syslog に出力されます(/var/log/messages 等)
  • raspi-config コマンドで RaspberryPi の I2C 通信機能を有効にしておく必要があります
引数意味省略時のデフォルト値
waitTime画面転送の周期(ms)100
i2cAddressI2C のスレーブアドレス0x3c
i2cDeviceFileI2Cのデバイスファイル名/dev/i2c-0 と /dev/i2c-1(open できたほうを使用)
framebufferDeviceFileフレームバッファのデバイスファイル名/dev/fb0
BrightnessOLED の明るさ(0-255)128
  • # oled 100 0x3c /dev/i2c-0 /dev/fb0 128

Counter: 4935, today: 1, yesterday: 11

検索用キーワード:Raspberry pi, ラズベリーパイ, ラズパイ, OLED, 有機EL, LCD, 液晶, コンソール, ログイン、USB, キーボード, スクリーンエディタ, コマンド, サービス, login


添付ファイル: filegpio-zero2.jpg 114件 [詳細] filegpio-zero1.jpg 95件 [詳細] filegpio-zero1.png 45件 [詳細] fileoled.zip 338件 [詳細] filelogin.jpg 318件 [詳細] filehardware.png 433件 [詳細] fileinu.jpg 473件 [詳細] filezero.jpg 561件 [詳細] fileconsole.png 177件 [詳細] fileoled03.jpg 182件 [詳細] fileoled02.jpg 189件 [詳細] fileoled01.mpg 396件 [詳細] fileoled-20170209.zip 158件 [詳細] fileoled01.jpg 334件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-06-25 (月) (113d)