もともとのAmazonのページには、デバイス設定用の資料として、このリンクが掲載されていた。"RUNNING SH1106 OLED IN RASPBERRY PI WITH PYTHON"というPDFファイルを見ることができる。
https://drive.google.com/file/d/1-Rut3VY1UoU4JqKlRkFZ0ODv-JZQPFfM/view
内容は、Raspbianのsources.listを改変して、raspi-configでSPI接続を有効にし、PythonパッケージであるRPI.GPIO, spidev, luma.OLEDをインストールして、最後に起動スクリプトに組み込んで自動起動する方法を解説している。写真入りで6ページの内容だ。ボタンの制御については、何も書かれていない。
luma.OLEDは、小型のLCD用コントローラーを制御するPythonモジュールでSSD13xxやSH1106に対応している。
luma.oled · PyPI
https://pypi.org/project/luma.oled/
rm-hull/luma.oled: Python module to drive a SSD1306 / SSD1309 / SSD1322 / SSD1325 / SSD1327 / SSD1331 / SSD1351 / SH1106 OLED
https://github.com/rm-hull/luma.oled
他のPython実装として、こんなものも見つかった。RPI.GPIO, spidev, PILを使って表示を行っている。
8TN/Raspberry-Pi-SH1106-oled-display: Basic python script to display an image using SPI on SH1106 128 by 64 monochrome Oled display
https://github.com/8TN/Raspberry-Pi-SH1106-oled-display
Pythonが好みでない場合は、C/C++で書かれたライブラリも見つかった。
hallard/ArduiPi_OLED: Common used OLED driver for Raspberry PI
https://github.com/hallard/ArduiPi_OLED
New Adafruit generic OLED display driver for Raspberry PI – Charles's Blog
http://hallard.me/adafruit-oled-display-driver-for-pi/
3つの候補のうち、sources.listやパッケージを汚染せずに使えて、一番シンプルそうな"Raspberry-Pi-SH1106-oled-display"を使ってみる。
スクリプト本体とサンプルイメージをダウンロードする。
pi@raspberrypi:~ $ curl -O https://raw.githubusercontent.com/8TN/Raspberry-Pi-SH1106-oled-display/master/sh1106_display_test.py
pi@raspberrypi:~ $ curl -O https://github.com/8TN/Raspberry-Pi-SH1106-oled-display/raw/master/RPi.png
Pythonのバージョンを確認して、必要なライブラリを入れる。
pi@raspberrypi:~ $ python --version
Python 2.7.16
pi@raspberrypi:~ $ sudo apt-get install python-spidev python-rpi.gpio python-pil
動かすとエラーになった。
pi@raspberrypi:~ $ sudo python sh1106_display_test.py
filename : /home/pi/RPi.png
("cause de l'arr\xc3\xaat du programme : ", (<type 'exceptions.SyntaxError'>, SyntaxError('invalid syntax', ('<string>', 1, 1, '/home/pi/RPi.png')), <traceback object at 0x767ba4e0>))
python2系を使っているので、スクリプトを修正する。
#file = input("filename : ") #ouverture du fichier, en python 2.x : raw_input
file = raw_input("filename : ") #ouverture du fichier, en python 2.x : raw_input
再度実行したが、エラーは変わらず。
pi@raspberrypi:~ $ sudo python sh1106_display_test.py
filename : /home/pi/RPi.png
("cause de l'arr\xc3\xaat du programme : ", (<type 'exceptions.IOError'>, IOError("cannot identify image file '/home/pi/RPi.png'",), <traceback object at 0x75fb0c60>))
入ったパッケージはこんな感じで、特に問題はなさそう。PILが使うようなpngとかjpegの画像関係のライブラリが入っていないのかな?
The following NEW packages will be installed:
libimagequant0 libwebpdemux2 libwebpmux3 python-olefile python-pil
python-spidev
The following packages will be upgraded:
python-rpi.gpio
PILで直接開いてみる。ひょっとして、ファイルが壊れている?
pi@raspberrypi:~ $ python
Python 2.7.16 (default, Apr 6 2019, 01:42:57)
[GCC 8.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import spidev, time, sys
>>> import RPi.GPIO as GPIO
>>> from PIL import Image
>>> img = Image.open('/home/pi/RPi.png').convert('1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 2687, in open
% (filename if filename else fp))
IOError: cannot identify image file '/home/pi/RPi.png'
やっぱり...
pi@raspberrypi:~ $ file RPi.png
RPi.png: HTML document, ASCII text, with no line terminators
再取得する。今度は間違いなくPNGファイルになっている。
pi@raspberrypi:~ $ curl -O https://raw.githubusercontent.com/8TN/Raspberry-Pi-SH1106-oled-display/master/RPi.png
pi@raspberrypi:~ $ file RPi.png
RPi.png: PNG image data, 128 x 64, 8-bit/color RGB, non-interlaced
試してみたが、エラーはなくなったものの、何も表示されなかった。
pi@raspberrypi:~ $ sudo python sh1106_display_test.py
filename : /home/pi/RPi.png
filename :
SPIのクロックスピードを下げてみる。
#spi.max_speed_hz = 1000000 #defini la vistesse de transfer (7629 125000000)
spi.max_speed_hz = 7629
速度を落としたので、処理には一呼吸必要になったが、相変わらず表示はされない。
どうも、無理そうなので、推奨の方法であるluma.oledを入れてみる。
luma.oledは、debianパッケージ化はされていないようだ。ドキュメント通りではなく、できるだけパッケージ管理を壊さない方法で環境構築を進める。
pi@raspberrypi:~ $ apt-cache search luma.oled
pipも入っていないので、インストールする。
pi@raspberrypi:~ $ dpkg -l | grep python-pip
pi@raspberrypi:~ $ sudo apt-get install python-pip
The following NEW packages will be installed:
gir1.2-glib-2.0 libexpat1-dev libgirepository-1.0-1 libjs-sphinxdoc
libjs-underscore libpython-all-dev libpython-dev libpython2-dev libpython2.7
libpython2.7-dev python-all python-all-dev python-asn1crypto
python-cffi-backend python-configparser python-crypto python-cryptography
python-dbus python-dev python-entrypoints python-enum34 python-gi
python-ipaddress python-keyring python-keyrings.alt python-pip
python-pip-whl python-pkg-resources python-secretstorage python-setuptools
python-six python-wheel python-xdg python2-dev python2.7-dev
The following packages will be upgraded:
libexpat1
python-devとlibjpeg-devも入ってなかったので入れる。libfreetype6-devはすでに入っていた。
pi@raspberrypi:~ $ sudo apt-get install python-dev libjpeg-dev
The following NEW packages will be installed:
libexpat1-dev libjpeg-dev libjpeg62-turbo-dev libpython-dev libpython2-dev
libpython2.7 libpython2.7-dev python-dev python2-dev python2.7-dev
pipを使って、pipそのものを最新版にアップグレードしておく。pipがパッケージ管理からは外れてしまうのが嫌なんだけど仕方がない。
pi@raspberrypi:~ $ sudo -H pip install --upgrade pip
(snip)
Successfully installed pip-19.3.1
luma.oledのインストールスクリプトの中でpygameをビルドしている。pygameを入れるのに必要なパッケージを入れる。どんだけ依存関係あるのさ...
pi@raspberrypi:~ $ sudo apt-get install libsdl-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsmpeg-dev libportmidi-dev libavformat-dev libswscale-dev
The following NEW packages will be installed:
fontconfig libaacs0 libaom0 libasound2-dev libavcodec-dev libavcodec58
libavformat-dev libavformat58 libavutil-dev libavutil56 libbdplus0
libblkid-dev libbluray2 libcaca-dev libcairo2 libchromaprint1
libcodec2-0.8.1 libcroco3 libdatrie1 libdrm-amdgpu1 libdrm-common libdrm-dev
libdrm-etnaviv1 libdrm-exynos1 libdrm-freedreno1 libdrm-nouveau2
libdrm-omap1 libdrm-radeon1 libdrm-tegra0 libdrm2 libegl-mesa0 libegl1
libffi-dev libflac-dev libfluidsynth1 libgbm1 libgdk-pixbuf2.0-0
libgdk-pixbuf2.0-bin libgdk-pixbuf2.0-common libgl1 libgl1-mesa-dev
libgl1-mesa-dri libgl1-mesa-glx libglapi-mesa libgles1 libgles2
libglib2.0-bin libglib2.0-dev libglib2.0-dev-bin libglu1-mesa
libglu1-mesa-dev libglvnd-core-dev libglvnd-dev libglvnd0 libglx-mesa0
libglx0 libgme0 libgraphite2-3 libgsm1 libharfbuzz0b libjack-jackd2-0
libjbig-dev libllvm8 liblzma-dev libmad0 libmad0-dev libmikmod-config
libmikmod-dev libmikmod3 libmount-dev libmp3lame0 libmpg123-0 libogg-dev
libopenal-data libopenal1 libopengl0 libopenmpt0 libopus0 libpango-1.0-0
libpangocairo-1.0-0 libpangoft2-1.0-0 libpcre16-3 libpcre3-dev libpcre32-3
libpcrecpp0v5 libpixman-1-0 libportmidi-dev libportmidi0
libpthread-stubs0-dev libpulse-dev libpulse-mainloop-glib0 librsvg2-2
librsvg2-common libsdl-image1.2 libsdl-image1.2-dev libsdl-mixer1.2
libsdl-mixer1.2-dev libsdl-ttf2.0-0 libsdl-ttf2.0-dev libsdl1.2-dev
libsdl2-2.0-0 libselinux1-dev libsensors-config libsensors5 libsepol1-dev
libshine3 libslang2-dev libsmpeg-dev libsmpeg0 libsnappy1v5 libsndio7.0
libsoxr0 libspeex1 libssh-gcrypt-4 libswresample-dev libswresample3
libswscale-dev libswscale5 libthai-data libthai0 libtheora0 libtiff-dev
libtiffxx5 libtwolame0 libva-drm2 libva-x11-2 libva2 libvdpau-va-gl1
libvdpau1 libvorbis-dev libvorbisfile3 libvpx5 libwavpack1
libwayland-client0 libwayland-cursor0 libwayland-egl1 libwayland-server0
libwebp-dev libx11-dev libx11-xcb-dev libx264-155 libx265-165 libxau-dev
libxcb-dri2-0 libxcb-dri2-0-dev libxcb-dri3-0 libxcb-dri3-dev libxcb-glx0
libxcb-glx0-dev libxcb-present-dev libxcb-present0 libxcb-randr0
libxcb-randr0-dev libxcb-render0 libxcb-render0-dev libxcb-shape0
libxcb-shape0-dev libxcb-shm0 libxcb-sync-dev libxcb-sync1 libxcb-xfixes0
libxcb-xfixes0-dev libxcb1-dev libxcursor1 libxdamage-dev libxdamage1
libxdmcp-dev libxext-dev libxfixes-dev libxfixes3 libxinerama1 libxkbcommon0
libxshmfence-dev libxshmfence1 libxss1 libxvidcore4 libxxf86vm-dev
libxxf86vm1 libzvbi-common libzvbi0 mesa-common-dev mesa-va-drivers
mesa-vdpau-drivers python3-distutils python3-lib2to3 timgm6mb-soundfont
uuid-dev va-driver-all vdpau-driver-all x11proto-core-dev
x11proto-damage-dev x11proto-dev x11proto-fixes-dev x11proto-xext-dev
x11proto-xf86vidmode-dev xorg-sgml-doctools xtrans-dev
pipでluma.oledを入れる。ようやくだ。
pi@raspberrypi:~ $ sudo pip install luma.oled
(snip)
Successfully installed luma.core-1.12.0 luma.oled-3.3.0 monotonic-1.5 smbus2-0.3.0
luma.oledには、使えそうなサンプルが入っていなかったので、Luma.Examplesのサンプルをgithubからダウンロードする。そのために、まずgit入れる。
pi@raspberrypi:~ $ sudo apt-get install git
The following NEW packages will be installed:
git git-man libcurl3-gnutls liberror-perl
表示サンプルを入れる。
pi@raspberrypi:~ $ git clone https://github.com/rm-hull/luma.examples.git
Cloning into 'luma.examples'...
remote: Enumerating objects: 858, done.
remote: Total 858 (delta 0), reused 0 (delta 0), pack-reused 858
Receiving objects: 100% (858/858), 5.34 MiB | 3.28 MiB/s, done.
Resolving deltas: 100% (551/551), done.
pi@raspberrypi:~ $ cd luma.examples/
pi@raspberrypi:~/luma.examples $ ls
conf examples README.rst setup.py tox.ini
CONTRIBUTING.rst LICENSE.rst setup.cfg tests
サンプルをビルドするのにSDLが必要なので入れる。
pi@raspberrypi:~/luma.examples $ sudo apt-get install python-sdl2 python-pygame-sdl2
The following NEW packages will be installed:
libblas3 libgfortran5 liblapack3 libmodplug1 libopusfile0 libsdl2-gfx-1.0-0
libsdl2-image-2.0-0 libsdl2-mixer-2.0-0 libsdl2-ttf-2.0-0 python-numpy
python-pygame-sdl2 python-sdl2
luma.examplesをビルドする。
pi@raspberrypi:~/luma.examples $ sudo pip install -e ./
(snip)
Successfully installed argcomplete-1.10.2 luma.emulator-1.2.0 luma.examples luma.lcd-2.2.0 luma.led-matrix-1.4.0 pygame-1.9.6 rpi-ws281x-4.2.2 ws2812-1.0.0
サンプルを見てみる。
pi@raspberrypi:~/luma.examples $ cd examples/
pi@raspberrypi:~/luma.examples/examples $ ls
3d_box.py game_of_life.py savepoint.py
animated_gif.py greyscale.py scrolling_pixelart.py
bitstamp_realtime.py hotspot sevensegment_demo.py
bitstamp_ticker.py image_composition.py sprite_animation.py
bounce.py images starfield.py
carousel.py invaders.py sys_histogram.py
chroma.py jetset_willy.py sys_info.py
clock.py larson_hue.py terminal.py
colors.py matrix.py tv_snow.py
crawl.py maze.py tweet_scroll.py
demo_opts.py perfloop.py video.py
demo.py picamera_photo.py weather.py
dotmatrixtool.py picamera_video.py welcome.py
font_awesome.py pi_logo.py
fonts runner.py
デモでよく使われてる、走っている人の表示。
pi@raspberrypi:~/luma.examples/examples $ sudo python runner.py --display sh1106 --interface spi
Version: luma.oled 3.3.0 (luma.core 1.12.0)
Display: sh1106
Interface: spi
Dimensions: 128 x 64
------------------------------------------------------------
^C
ようやく絵が出た...

これ出すためだけで、どんだけ依存パッケージ入れないといけないのさ... ちょっとありえないレベルだった。
サンプルは他にもいろいろあるので、試してみると面白い... かもしれない(苦労の割にたいして面白くない)。
さすがOLEDだけあって、ずっと動かしていても表面は冷たいままだというのはすごい。低発熱というのは、低消費電力と共にかなりのメリットが感じられる。
つづく
オリジナル投稿: Raspi用表示装置4種を試す -3.1-|kinneko|pixivFANBOX
https://www.fanbox.cc/@kinneko/posts/677048



