イントロ
ラズパイからディスプレイを表示させるのに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 SSD1309 – Raspi
CS – CE0
DC(A0) – GPIO25 (自由に変更可能)
RES(RESET) – GPIO17(GEN0) (自由に変更可能)
SDA – MOSI
SCL – CLK
VCC – 3.3V
GND – GND
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
+ 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/
サンプルの実行
$ 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
$sudo ./graphicstest
以上で、U8glibをラズベリーパイで実行できる環境が整いました。
SSD1306でもSSD1309も同じものが使えます。
[...] OLEDに関しての前回の記事でpdから表示できるようになったので、それを流用してます。 [...]
ピンバック by AS5048A magnetic rotary encoder とOLED表示 | Analogfeeder — 2020/01/12 @ 00:32
In Running the example there is no Makefile to edit ?
Comment by Mark Birss — 2020/02/17 @ 04:49
Hi Mark
no, you should edit to add below in makefile.
+ utility/u8g_polygon.c \
Comment by toucyy — 2020/02/17 @ 16:31