*お知らせ [#j566da27] **OMMF 2022 で 「Raspberry Pi 用 I2C OLED (有機EL) 小型ディスプレイモジュール」をご購入いただいた皆様へ [#f87daa80] --通常は Raspberry Pi でCOLOR(RED){このページの末尾にある oled.zip をダウンロードして展開し、自動設定スクリプト(Install.sh)を実行すれば}、OS 起動時にコンソール画面が oled に表示されるようになります。 ---Install.sh を実行すると必要なソフトウェアが apt-get でインストールされます ---ただし COLOR(RED){I2C を手動で有効にする必要があります} (raspi-configコマンド→Advanced Options または Interfacing Options) ---初代 Rapberry Pi で安定動作させるためには、GUI を無効にしてコンソールログインモードにしてください(raspi-config コマンド→System Options → S5 Boot / Auto Login → B2 Console Autologin) ---モジュールに同梱したマニュアル #ref(2022ommf-man.pdf) --2022/12/5: oled.zip 内の実行ファイル "oled" がダイナミックリンクになっていましたので、スタティックリンクに変更しました。動作に問題がある方はダウンロードして再度 Install.sh を実行してください。 **OMMF 2018 で 「Raspberry Pi OLED 小型ディスプレイキット」または「基板」をご購入いただいた皆様へ [#u91290fe] --基板は下記の「初期設定」の「(1) 配線」と同じ結線になっています。こちらの写真をクリックして、基板の表/裏を間違えないようにはんだ付けしてください~ &ref(oledbd.jpg,zoom,128x160); --COLOR(RED){通常は Raspberry Pi で下記の「初期設定」の「自動設定スクリプト(Install.sh)を使う場合」を実行するだけで使えます} *概要 [#nd4d04e0] 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)のディスプレイなので、普段から接続したままでも邪魔になりません。 //&ref(login.jpg,zoom,320x240); //&ref(zero.jpg,zoom,300x240); &ref(case.jpg,zoom,400x340); //&ref(inu.jpg,zoom,300x240); //&ref(oled02.jpg,zoom,300x240); //&ref(oled03.jpg,zoom,300x240); -動画 &ref(oled01.mpg); ([[Twitter:https://twitter.com/milktolait/status/827124644125609984]] の動画) -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と表記される場合もあり]) -購入元 --[[秋月:http://akizukidenshi.com/catalog/g/gP-12031/]] --[[Aitendo:http://www.aitendo.com/product/14959]] --海外: Aliexpress など *動作 [#t1aefde1] -CTRL+ALT+F1 (または "/bin/chvt 1" コマンド)でコンソールに切り替えると、有機 EL ディスプレイに表示されるようになります。解像度は128*64 ドットになります。同時に HDMI にも出力されます -CTRL+ALT+F2 以降のコンソールに切り替えると通常通りの画面出力になります。X Window も通常通り使用できます。 -フレームバッファ(VRAM)の内容を、バックグラウンドで動いている通常のソフトウェアで定期的に I2C で OLED に表示させることで実現しています。カーネルの修正等は必要ありません -COLOR(RED){コンソールからログインしたときにキーボードで "|" (パイプ文字) 等が入力できない場合は、下の方の「補足」の先頭部分を参照してください} *初期設定 [#uba4dcfc] **自動設定スクリプト(Install.sh)を使う場合 [#s155fee4] (1) 配線 -RaspberryPi の I2C 出力と OLED ディスプレイを結線する(必要な配線は4本のみ) -1,3,5,6 ピンを使用。図は RaspberryPi ModelA/B の GPIO が 26 ピンの場合だが、GPIO が 40 ピンのモデルでも同様に 1,3,5,6 ピンを接続する。 -COLOR(RED){電源のピン配列に注意!!}: ピン配列が左から VDD-GND-SCK-SDA の順のOLEDもあり、その場合 VDDとGNDの配線がこの図と逆になります。 -COLOR(RED){電源のピン配列に注意!!}: GND と VDD のピン配列が逆の OLEDもあり、その場合配線がこの図と逆になります。 #ref(hardware.png,zoom,400x340) --配線の参考にしたページ: [[Raspberry PiでI2C接続の128×64 OLEDに日本語を表示(美咲フォント):http://ytkyk.info/blog/2016/06/19/raspberry-pi%E3%81%A7128x64%E3%81%AEoled%E3%81%AB%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%92%E8%A1%A8%E7%A4%BA%E7%BE%8E%E5%92%B2%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88/]] (2) &ref(oled.zip); をダウンロードして展開し、root 権限で自動設定スクリプト Install.sh を実行する # sh Install.sh -下記の「手動で設定する場合」の (2)-(7) が自動で実行される (3) I2C の有効化 # raspi-config -メニューから "Advenced Options" → "I2C" を選択して有効化 --メニューにない場合は "Interfacing Options" → "I2C" から有効化する -ここで "4 Internationalisation Options" メニューから日本語キーボードの設定もできる -再起動すると有機 EL ディスプレイの表示が開始する **手動で設定する場合(通常は不要です) [#jd2f0d32] (1) 配線 -RaspberryPi の I2C 出力と OLED ディスプレイを結線する(上の配線図を参照) --参考ページ: [[Raspberry PiでI2C接続の128×64 OLEDに日本語を表示(美咲フォント):http://ytkyk.info/blog/2016/06/19/raspberry-pi%E3%81%A7128x64%E3%81%AEoled%E3%81%AB%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%92%E8%A1%A8%E7%A4%BA%E7%BE%8E%E5%92%B2%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88/]] (2) &ref(oled.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 に追加される //-ここでキーボードの設定もできる //&ref(console.png,zoom,300x200); (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 を接続する方法 [#l4816237] -I2C 専用のポートでなくても、GPIO に OLED を接続することができる --オーバーレイという機能で GPIO でソフトウェア I2C を実現する ---https://qiita.com/spicemanjp/items/50474e56ddccabf02b01 --/dev/i2c-3 等としてソフトウェア I2C が使えるようになる --COLOR(RED){【注意】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 を接続するピン位置 COLOR(RED){(OLED のピン配列が左から GND-VDD-SCK-SDA であることを確認してください。この順でない OLED はそのままでは使えません)} #ref(gpio-zero1.jpg,zoom,320x240) --表示 #ref(gpio-zero2.jpg,zoom,320x240) *補足 [#xdb433d7] -COLOR(RED){USB 日本語キーボードを使うには} --標準ではキーバインドが日本語キーボード用になっていません。特に OLED のコンソールは画面が狭いため "|" (パイプ文字) が入力できないと、"ls | less" 等と入力できず、表示がすべてスクロールアウトしてしまい役に立ちません。下記のコマンドで日本語キーボードに変更してください。 # loadkeys jp106 -自動設定スクリプト Install.sh を書きました。oled.zip に含まれています。"sh Install.sh" を実行すると上記の (2)-(7) が自動で行われます。ただし「(4)I2Cの有効化」は別途手動で行う必要があります。 -%%サービスを停止しても X-Window の解像度が 128*64 のままで、本来の解像度に戻りません 。COLOR(RED){解決方法が分かる方がいましたら教えてください}%% --原理を正確に把握していませんが、上記 (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=">" -COLOR(RED){文字の表示} --コンソール(/dev/tty1) にテキストをリダイレクトで出力すれば OLED に表示されます (時刻を表示する例) # date -R > /dev/tty1 -COLOR(RED){画像の表示} --画像の表示テスト用プログラム dispImg を作成しました。oled.zip に含まれています。直接 OLED に描画するのではなく、コンソール1 に画像を表示しますので、表示するためには oled サービスが実行中である必要があります。表示できるのは 1bit・バイナリ形式の pbm ファイル(マジックナンバー P4)のみですので、下記のように ImageMagick の convert コマンド等で pbm ファイルに変換してから表示してください。画面写真にある、いぬの絵を表示するときに使用しました。 # convert file.png file.pbm # dispImg file.pbm *外部リンク [#oc2baf9f] -[[raspberrypi3 yoctoでSSD1306 OLEDディスプレイを動かす:http://mickey-happygolucky.hatenablog.com/entry/2016/10/07/024608]] --後日このページの存在に気づきました。このページの方法では、システムイメージ自体を再ビルドして OLED に対応しているようです。 -[[Raspberry PiでSPIシリアルで有機ELにフレームバッファを表示する実験してみた:http://projectc3.seesaa.net/article/355913199.html]] --本記事と同様の表示を SPI 接続のカラー OLED で実現されています。 *ソフトウェア [#cae08b6d] **ソフトウェアのダウンロード(ソース+RaspberryPi用バイナリ+Install.sh) [#jbbc8ac4] -最新版 --&ref(oled.zip); -旧版 --&ref(oled.1.zip); **oled コマンドについて [#c1ee732d] # oled [-h] waitTime i2cAddress i2cDeviceFile framebufferDeviceFile Brightness -フレームバッファ(VRAM)の内容を一定周期で OLED に表示するプログラムです - -h を付けるとヘルプを表示して終了します -引数は省略可能ですが、いずれかの引数を指定する場合は、それより手前の引数は省略できません -エラーメッセージは syslog に出力されます(/var/log/messages 等) -raspi-config コマンドで RaspberryPi の I2C 通信機能を有効にしておく必要があります |引数|意味|省略時のデフォルト値| |waitTime|画面転送の周期(ms)|100| |i2cAddress|I2C のスレーブアドレス|0x3c| |i2cDeviceFile|I2Cのデバイスファイル名|/dev/i2c-0 と /dev/i2c-1(open できたほうを使用)| |framebufferDeviceFile|フレームバッファのデバイスファイル名|/dev/fb0| |Brightness|OLED の明るさ(0-255)|128| -例 # oled 100 0x3c /dev/i2c-0 /dev/fb0 128 ---- #counter 検索用キーワード:Raspberry pi, ラズベリーパイ, ラズパイ, OLED, 有機EL, LCD, 液晶, コンソール, ログイン、USB, キーボード, スクリーンエディタ, コマンド, サービス, login RIGHT:[https://goo.gl/ZAZqIj] RIGHT:fanoutsendai@lait.sakura.ne.jp