電池が切れても消えないディスプレイって?電子ペーパーを使ってみた!
こんにちは、わくわくエンジニアの佐々木さんです。
みなさんは電子ペーパーを知っていますか?
電子ペーパーはその名の通り、紙のような見た目のディスプレイです。低消費電力であることや、最後に表示したものを電源がなくても保持し続けることが特徴として挙げられます。
身近なものだとAmazonのKindleで採用されています。
それでは実際に本題に入っていきましょう!
電子ペーパーの仕組み
今回使用するのは2.9inch e-Paper Moduleという電子ペーパー。
電子ペーパーは複数の表示方式がありますが、2.9inch e-Paper Moduleは電気泳動方式というものが採用されているためこちらの説明をしたいと思います。
電気泳動方式では、ディスプレイの中にマイクロカプセルという色を表現するための透明なカプセルが隙間なく並んでいます。そのマイクロカプセルの中には色のついた粒子が入っており、かける電圧で粒子を移動させることによって、見える色を変えています。電源がなくなっても粒子は移動しないので、最後に表示したものを保持し続けることができます。
従来は白黒のディスプレイが主流でしたが、現在では3色のディスプレイも多くなっています。
使ったもの
このディスプレイは白黒黄の3色を表現できるディスプレイになっています。この他にも、白黒や白黒赤などを表示することができるディスプレイもあります。
このRaspberry Pi Zero WHはIoTで使われるボードの1つです。
ディスプレイに表示させてみよう
今回は2.9inch e-Paper Module User Manualを参考にして進めていきます。
配線
GPIO | 2.9inch e-Paper Module |
---|---|
3.3V | 3.3V |
GND | GND |
MOSI | DIN |
SCLK | CLK |
CE0 | CS |
25 | DC |
17 | RST |
24 | BUSY |
環境構築
以下のコマンドが今回プログラムを実行するのに必要なものをインストールするコマンドになります。
ターミナルを開いて実行してください。
sudo apt-get install python-pip
sudo pip install spidev
sudo apt-get install libjpeg-dev
sudo pip install Image
次に、/boot/config.txt
を編集します。以下のコマンドを実行してください。
sudo nano /boot/config.txt
すると、nanoエディタが開くので、以下の手順を行なってください。
- 番下に
dtparam=spi=on
を追加 - キーボードの
controlキー
とxキー
を同時に押す yキー
を押すenterキー
を押す- 全て完了したら
reboot
コマンドで再起動
これで環境構築は完了です。
プログラム
デモプログラムが公開されているため、こちらからcurrentと書かれているものをダウンロードしてください。
ダウンロードが完了したら以下のコマンドを実行してください。
sudo apt-get install p7zip-full
7z x 2.9inch_e-paper_module_b_code.7z
上記のコマンドで出てきた中のRaspberryPi/python2
を今回は使います。
ターミナルでRaspberryPi/python2
ディレクトリに移動してpython main.py
**を実行すると、デモプログラムが起動します(※何も編集していない状態だとフォントが存在していないためエラーが発生します)。
nano main.py
でファイルを少し編集します。
main.py
には以下のようなプログラムがあります。
main.py
font24 = ImageFont.truetype('/usr/share/fonts/truetype/wqy/wqy-microhei.ttc', 24)
font18 = ImageFont.truetype('/usr/share/fonts/truetype/wqy/wqy-microhei.ttc', 18)
この'/usr/share/fonts/truetype/wqy/wqy-microhei.ttc'
という部分を
'/opt/vc/src/hello_pi/hello_font/Vera.ttf'
に変更します。
もう一度python main.py
を実行すると、画面がピカピカし始め、Hello, worldなどが画像に表示されます。
では、実際にプログラムを少し変えて見ていきましょう。
main.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
import epd2in9b
import time
from PIL import Image,ImageDraw,ImageFont
import traceback
try:
# ディスプレイの初期化処理をしています。
epd = epd2in9b.EPD()
epd.init()
print "clear"
epd.Clear(0xFF)
# ディスプレイを横に使うように設定しています。
HBlackimage = Image.new('1', (epd2in9b.EPD_HEIGHT, epd2in9b.EPD_WIDTH), 255) # 298*126
HRedimage = Image.new('1', (epd2in9b.EPD_HEIGHT, epd2in9b.EPD_WIDTH), 255) # 298*126
print "Drawing"
drawblack = ImageDraw.Draw(HBlackimage)
drawred = ImageDraw.Draw(HRedimage)
# 1つ目の引数でフォント、2つ目の引数でフォントのサイズを指定しています。
font30 = ImageFont.truetype('/opt/vc/src/hello_pi/hello_font/Vera.ttf', 30)
# 1つ目の引数で座標、2つ目に表示させたい文字列、3つ目には上記のフォントを指定します。
drawblack.text((10, 0), 'Hello, World', font = font30)
# ディスプレイに表示させます。
epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRedimage))
time.sleep(2)
print "read bmp file"
HBlackimage = Image.open('2in9b-b.bmp')
epd.display(epd.getbuffer(HBlackimage), epd.getbuffer(HRedimage))
time.sleep(2)
except Exception, e:
print 'traceback.format_exc():\n%s' % traceback.format_exc()
exit()
このプログラムを実行すると以下のようになります。
まとめ
いかがでしたでしょうか?
電子ペーパーは、低消費電力という特徴があるので、センサからとれるデータを一定時間ごとに表示したり、自分の好きなものを表示して持ち運んだりすることもできます。
電子部品の販売店に売っていたりしますが、電子ペーパーの使い方はあまり広がっていないように感じるので、この記事を参考にぜひやってみてください!