Raspi用表示装置4種を試す -3.1-

 もともとの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