OLED(SSD1306とSSD1309)をRaspberry Piから表示させる -U8glibを移植-

イントロ

ラズパイからディスプレイを表示させるのにOLEDを使ってみたので、その方法などを記載します。

ちょっとしたGUIを表示しようといろいろ検討してましたが、OLEDが値段とか入手性が良さそうなので、これを使いこなしてみようかと。奮闘してました。
OLEDはSSD1309をメインにすることにしましたが、その姉妹品であるSSD1306は巷では結構出回っており、情報が結構溢れてはいます. (ググったほうがいろいろな情報があります)

Arduinoを使ってやる場合は、ライブラリーがあり、U8glibが多く使われています。このライブラリーはSSD1306/9以外にも多くのディスプレイ(lc7981, pcd8544, ssd1322,ssd1325など)に対応しているため、このライブラリーを使いこなせれば、何かと便利です。SSD1309はSSD1306よりもサイズが大きくいろいろと表示できそうです。(以下の写真の上がSSD1309で下がSSD1306)

輝度も問題ないです。

ラズパイとの接続はSPI+電源+DC+RESETです。(SSD1306の通信手段としては、SPIとI2Cどちらも対応しておりますが、ボードによってデフォルトの回路が違うようです)

接続は以下です。

SPI接続 for SSD1309Raspi

CSCE0

DC(A0)GPIO25 (自由に変更可能)

RES(RESET)GPIO17(GEN0) (自由に変更可能)

SDAMOSI

SCLCLK

VCC3.3V

GNDGND

SSD130xのボードは、かなり出回っており、SSD130x側のピンの表示が若干違うようです。自分のSSD1309もSDAとSCLってI2Cのピンの表記だよなあと不安になりました汗 がSPIで正しく動作しました。DCピンがA0だったり、SDAとSCLがD0とD1だったりするようですので、購入する前に確認したほうがいいですね。

ちなみにCSとSDAとSCLは通信ピンで、DC(A0)はData/Commandピンでこれによってデータなのかコマンドなのかを見分けています。RESはその名の通りリセットピンです。電源起動後にリセットを送らないと表示されなかったり、ずれて表示されたりしましたので、これもつなぐ必要あります。

次にU8glibをラズパイ用に移植します。

U8glibの移植

こちらのライブラリーはwiringPiを使用しますので、事前にインストールします。

sudo apt-get install git-core (gitを入れていない場合は、必要に応じて)
cd ~
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

次にarduino用のU8glibライブラリーを持ってきてunzipします。

$ cd home/pi
$ wget http://dl.bintray.com/olikraus/u8glib/u8glib_arduino_v1.16.zip
$ unzip u8glib_arduino_v1.16.zip

ラズパイがネット環境にいない場合は、以下からPCでダウンロードして、メモリカードなどでラズパイにコピーでもいけます。

https://bintray.com/olikraus/u8glib/Arduino/1.16

実は、このままでは使えませんので、パッチを当てて、ラズパイ用に変換します。
パッチをここからダウンロード

*上記リンクが切れている場合は、ここに保存してあります。u8glib_1.16.RaspberryPi_v1p1.patch

これもunzipしたU8glibフォルダーがあるディレクトリと同じ場所にコピーしておきます。
実はこのパッチですが、パッチ後にできるmakefileに大事なファイルの記載がないため、以下部分(571行目あたり)にコメント(オレンジ)を追加します。(これがないと三角形を表示する関数のみが使えない)
エディタ(nanoとか)で+ utility/u8g_polygon.c \追加します。(u8glib_1.16.RaspberryPi_v1p1.patchにはすでに追加してあります)
+ utility/u8g_pb16v1.c \
+ utility/u8g_com_atmega_parallel.c \
+ utility/u8g_dev_sbn1661_122x32.c \
+ utility/u8g_dev_st7920_192x32.c \
+ utility/u8g_polygon.c \
+ utility/u8g_pb16v2.c
パッチを実行します。

以下をパッチを実行して、できたライブラリーのバイナリ(.aファイル)やヘッダーをコピーしたりします。以下のように実行します。

$ cd home/pi/U8glib/
$ patch -p1 < home/pi/u8glib_1.16.RaspberryPi.patch
$ make
$ sudo cp libU8glib.a /usr/lib
$ sudo cp U8glib.h /usr/include
$ sudo mkdir /usr/include/utility
$ sudo cp home/pi/U8glib/utility/u8g.h /usr/include/utility/
これで環境は整いました。

サンプルの実行

 U8glibのディレクトリのexamplesの中にあるGraphicsTestが動きが見えて参考になるので実行します。
$ cd home/pi/U8glib/examples/GraphicsTest

その中にあるMakefileのincludeのパスを変更します。

# INCLUDE=/opt/U8glib/include
INCLUDE=home/pi/U8glib/include

次にgraphicstest.cppを冒頭にある部分を以下のように記載します。

U8GLIB_SSD1306_128X64 u8g(10,6,0);

デフォルトでは、コメントアウトされており、それを有効にして、カッコ内の値を該当のピンに変更します。10はCE0で6は(DC/A0)で、0は(RES)になります。

実際にこの数字はwiringPiのピンのナンバーリングになっていることが注意です。

makeしてコンパイルします。

$ make
無事にmakeが通ったら、プログラムを実行します。
$sudo ./graphicstest

以上で、U8glibをラズベリーパイで実行できる環境が整いました。

SSD1306でもSSD1309も同じものが使えます。

3件のコメント »

  1. [...] OLEDに関しての前回の記事でpdから表示できるようになったので、それを流用してます。 [...]

    ピンバック by AS5048A magnetic rotary encoder とOLED表示 | Analogfeeder — 2020/01/12 @ 00:32

  2. In Running the example there is no Makefile to edit ?

    Comment by Mark Birss — 2020/02/17 @ 04:49

  3. Hi Mark
    no, you should edit to add below in makefile.
    + utility/u8g_polygon.c \

    Comment by toucyy — 2020/02/17 @ 16:31

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする