九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、ふと年が明けてからすでに2ヶ月が経っていることに気がつく瞬間がありました。
というのも、年末年始に個人的にPython
でやってみたい自由研究があり、Amazon
であるものを買ったのですが、結局仕事で時間がとれなかったからなんですね。😅
そして、そのアイデアは何かというと・・・・・・
「電子ペーパーを使った値札✨」
です。
電子ペーパーとは、あのAmazon Kindle
にも採用されているテクノロジーなのですが、何がスゴイかというと「表示を変えるときだけ電気を使う」んですね
つまり!
通常のディスプレイと違って、一度表示を変えたら、
「もう電気代はかからない👍」
という大きなメリットがあるんです。
電気代が高い昨今には、とても需要があるテクノロジーかもしれませんね。
ということで、購入した電子ペーパーはこちらです。(税込 2,199円でした)
GeeekPi 2.13インチ 250×122 SPI通信電子ペーパー モジュール
※ 残念ながら、2023.3.16現在で売り切れになっていますが他にも同じような商品があるみたいです。ぜひ探してみてください。
ちなみに、なぜ私がこの商品を購入したかというと、すでに持っているRaspberry Pi 3
に接続できるからです。
ということで、今回は「Python + Raspberry Pi」で自由に内容を変更できる値札をつくってみたいと思います。
ぜひ何かの参考になりましたら嬉しいです。😄✨
「ちょっと高い服を
通行人のバックパックに
引っ掛けられました…そして捨てた😫」
開発環境: Raspberry Pi 3、Python 3
目次
Raspberry Pi の SPI を有効にする
正直なところ、電子工作はズブの素人なのですが、どうやら購入した電子ペーパーとRaspberry Pi
をつなぐためにはSPI
というインターフェイスが有効になっている必要があるとのことで、まずはここの作業をしました。
ターミナルを開いて以下のコマンドを実行します。
sudo raspi-config
すると以下のような表示になるので、十字キーを使って「Interfacing Options」へ移動しエンターキーを押してください。
次にお目当ての「SPI」を選択&エンターキー。
「有効にする?」と聞いてくるので「はい」を選択&エンターキー。
すると、「有効になったよ👍」と言ってくれます。
これで、ターミナルでの作業は終了です。
電子ペーパーをRaspberry Pi セットする
最初まったくうまくいかなくて焦ったのですが、結論から言うと「思いっきり力を使って差し込むだけ」でOKでした。(つまり、ビビリな性格が邪魔をしてたんですね😫)
まず差し込む場所はRaspberry Pi
の赤枠の部分です。
そして、電子ペーパーを思いっきり「ぶっ刺し」ます!
※ ちなみにピンが1列や2列ずれても刺さりますのでピッタリ合うように気をつけてください。
では、これでハード側の作業は完了です❗
GitHubからリポジトリをクローン(コピー)する
では、ここからがPython
部分です。
とは言っても以下ページにサンプルコードが用意されていて、さらにGitHub
にリポジトリが公開されているので、今回はそれを拡張してコードを書いていきます。
※ ちなみにサンプルコードのライセンスはGPL
でした。
📝 サンプルページ: EP-0133 – 52Pi Wiki
📝 GitHub: https://github.com/geeekpi/epaper.git
まずは、適当なフォルダに移動し、GitHub
のリポジトリをクローンします。
以下のコマンドを実行してください。
git clone https://github.com/geeekpi/epaper.git
すると、epaper
というフォルダが作成されます。
フォントを用意する
次にコードなのですが、そのコードではフォントが必要になります。
そのため、以下のサイトからフォントをダウンロード&展開し、epaper
フォルダに「ipaexg.ttf」を移動させておいてください。
📝 参照ページ: IPA Font ダウンロード
Python で電子ペーパーの表示を変更するコードをつくる
では、epaper
フォルダの中にprice_tag.py
というファイルを作成し、そこにコードを保存します。
price_tag.py
from Epaper import * from PIL import Image #Pillow import datetime from PIL import Image from PIL import ImageFont # 画像 img = Image.new("RGB", (250, 128), color="white") # 色 color_black = '#000000' color_red = '#ed1c24' # 日付 dt = datetime.datetime.now() date_text = str(dt.month) +'月'+ str(dt.day) +'日で終了です m_ _m' # フォント small_font = ImageFont.truetype('ipaexg.ttf', 18) normal_font = ImageFont.truetype('ipaexg.ttf', 24) large_font = ImageFont.truetype('ipaexg.ttf', 32) # 文字の描画 from PIL import ImageDraw draw = ImageDraw.Draw(img) draw.text((10, 10), '高級キーボードが、', color_black, normal_font) draw.text((15, 55), 'なんと', color_black, small_font) draw.text((80, 40), '10,000円!!', color_black, large_font) draw.text((20, 90), date_text, color_black, small_font) # 線の描画 draw.line((80, 80, 230, 80), color_red, width=3) draw.line((0, 0, 250, 0), color_red, width=5) draw.line((250, 0, 250, 128), color_red, width=5) draw.line((0, 0, 0, 128), color_red, width=5) draw.line((0, 122, 250, 122), color_red, width=5) img = img.rotate(270, expand=True) img.save('price_tag.png') # ここから電子ペーパーに描画 #(https://github.com/geeekpi/epaper.git から引用) # コンフィグ X_PIXEL = 128 Y_PIXEL = 250 RED_CH = True f = Image.open('price_tag.png') f = f.convert('RGB') # conversion to RGB data = f.load() rBuf = [0] * 4000 bBuf = [0] * 4000 for y in range(250): for x in range(128): # Red CH if data[x,y] == (237,28,36) and RED_CH is True: # This algorithm has bugs if ported according to C, the solution is referred to:https://www.taterli.com/7450/ index = int(16 * y + (15 - (x - 7) / 8)) tmp = rBuf[index] rBuf[index] = tmp | (1 << (x % 8)) # Black CH elif data[x,y] == (255,255,255): index = int(16 * y + (15 - (x - 7) / 8)) tmp = bBuf[index] bBuf[index] = tmp | (1 << (x % 8)) e = Epaper(X_PIXEL,Y_PIXEL) if RED_CH is True: e.flash_red(buf=rBuf) e.flash_black(buf=bBuf) e.update()
この中でやっているのは次のとおりです。
- 電子ペーパーで表示させるための画像を Pil(Pillow)で作成
- 電子ペーパーにその内容を表示
つまり、画像をつくることができれば電子ペーパーに表示させることができるというわけです。
ただし、気をつけないといけないのが「色」です。
今回購入した電子ペーパーでは、以下3色しか使えません。
- 黒: #000000
- 白: #ffffff
- 赤: #ed1c24
また、フォントに赤色を使うと文字の周りが「#ed1c24」ではない部分ができてしまうようで、そこは黒になるようでした。
とはいえこれで作業は完了です。
お疲れ様でした😄
テストしてみる
では、実際にテストしてみましょう❗
実行は普通にPython
で先ほどのコードを実行するだけです。
以下のコマンドを実行してください。
python3 price_tag.py
今回は動画をご用意したのでどのように動くかは以下をご覧ください。
うまくいきました!
成功です😄
ちなみに、電子ペーパー最大のメリットでもある「変更後の電気は不要」がホントかもチェックしておきましょう。
電子ペーパーをRaspberry Pi
から取り外してみます。
どうなるでしょうか・・・・・・
はい❗
電気を使っていなくても表示されたままです。
しかもコードで画像を変更すれば、値段や日付だって簡単に変更できますね。
すべて成功です。😄👍✨
企業様へのご提案
この間ソフマップへ行った際、どうやら値札がこの電子ペーパーを使っているようでした。
そこには主要な商品データや値段だけでなくQRコードも表示していて、お客さんが欲しい情報がより簡単に取得できるようにしていました。
その他、来客用の名札などいろいろなユースケースが考えられます。
もしこういったご相談がございましたらぜひお問い合わせからご相談ください。
お待ちしております。😄
おわりに
ということで、今回はいつもと違って「Python + Raspberry Pi」で電子ペーパーを使ってみました。
こういう工作は大好きなのですが、いろいろと仕事に追われてしまってノビノビになっていましたので、やっと記事にできて良かったです。
もし夏休みとかでしたら、お子さんとの自由研究とかに使ってもいいかもしれませんね。
ぜひ楽しんでやってみてください。
ではでは〜❗
「大雪海のカイナ
おもしろい❗❗」