とらのメモ

IT関係やガジェットについての雑記

RaspberryPi zero WHとE-paper 7.5inchで電子カレンダーを作った

電子ペーパーでカレンダーを作るという面白そうな記事を何件か見つけ、
これはやってみないとな〜!と思い、電子ペーパーをポチりました。

マイコン初心者にはなかなかハードル高かったけど、物理的な接続さえどうにかしてしまえば結構簡単。

Waveshare製 e-peper + RaspberryPiのビルドログ書いたし、せっかくなのでカレンダー作った時の話も書き留めておきます。

完成品はこんな感じです。
実装だけ見たい方はGithubを見てください。

予定表はGoogleカレンダー
気象情報はOpenWeatherから取得しているため
別途 認証ファイルとAPIキーを取得する必要があります。

完全に余談ですが、部屋の温度が24℃なのに対して表示している気温が18℃だったので、
取得している都市を間違えているのかと思いましたが、アプリで確認しても18℃で困惑しました。


前準備

まずはプロジェクトをダウンロード。
適当な場所にクローンします。
https://github.com/9610r/e-paperCalendar

git clone https://github.com/9610r/e-paperCalendar.git

認証情報取得

カレンダー、気象情報を取得するための事前に必要な認証情報の取得として

  • Googleの認証情報ファイル(jsonファイル)
  • OpenWeather APIキー

の2つが必要になります。

Google Calenderの認証情報取得はこちらのステップ1までを参考に取得。 https://dev.classmethod.jp/articles/google-calendar-api-get-start/

client_secret_xxxxxxxxx-xxxxxxxxxx.apps.googleusercontent.com.jsonのような名前のファイルがダウンロードされるので、credentials.json に名前を変えてプロジェクトフォルダ直下に移動。

OpenWeatherも他サイトの取得方法を見ながらAPIキーを取得。
世界の天気API「OpenWeatherMap」の無料APIキー発行・取得、リクエスト方法 | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門
create_image.pymain.pyの10行目あたりの部分を取得したトークンに置換。

OpenWeatherToken = "<YOUR OpenWeather API AccessToken>"

基本的に私が所持している7.5inch e-Paper V2をベースに作成したものになりますが、
個人的には3色以上あったほうが見た目が良いと思います。
これから買おうと思っている人はあまり値段に差はないので7.5inch HAT(B)を買うのをお勧めします。黒/赤/白の3色です。

私はPyCharmのリモートホスト機能経由でフォルダごとアップロードしているので、
基本的にローカルに落とし込んでからやりました。
ラズパイの設定は以下を参考に設定。 Raspberry Pi Zero WHの環境構築(Mac PC)

Pythonなど、本当はPyenvなどで環境を分けたほうがいいと思いますが、これ以外に使う用途もないまっさらな環境だったので、私はPythonも直で入れてます。
通信と描画に必要なライプラリをインストール。

$ sudo pip install google-api-python-client
$ sudo pip install google-auth-httplib2
$ sudo pip install google-auth-oauthlib

$ sudo pip install pillow
$ sudo pip install RPi.GPIO
$ sudo pip install spidev

実装

とりあえずWaveshare 公式のサンプルコードを動かしましょう
Waveshareの以下のプロジェクトをgitでclone。
GitHub - waveshare/e-Pape

git clone https://github.com/waveshare/e-Paper.git
cd e-Paper-master/RaspberryPi_JetsonNano/python/examples
python3 epd_7in5_V2_test.py

サンプルが映りました。
7.5inch V2特有のバグなのかわかりませんが、画像のように接続した状態だと

DEBUG : ~: e-Paper busy


の部分で内部で無限ループすることがあるみたいです。
フォーラムを見ていたら40回に1回いけたみたいな報告もありましたが、
流石にそれでは運用できないので、少し見た目は悪くなりますが公式が回答していたジャンプワイヤを使った方法で接続しました。
そもそもの原因は電圧の問題らしいですが、加工するのが面倒だったので適当に繋ぎ直して解決。

↓これだとダメで↓

↓これだと書き込めた↓(ケースに入れてしまったので少し見にくいかも)

表示されたら電子ペーパーのテストはOK.
次は表示用の画像生成です。
ラズパイでカレンダーを定期的に取得するためにtoken.pickleを先にローカルで取得を行います。
まず下記のコマンドを打ち込みます。

$ cd e-paperCalendar
$ python3 connect_calendar.py

Please visit this URL to authorize this application: https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=969238453089-lu524s499p8dsnde7euogjfase9d9ase.apps.googleusercontent.com&redirect_uri=http.....

ブラウザが開かれて認証画面になるはずです。
取得したいカレンダーを持っているアカウントを選択して認証します。 リスト型のリザルトが返ってきて、token.pickleが作成されていたら問題ありません。
あとはローカルからラズパイにFTPなどでファイルを転送し、プログラムをcronで定期的に実行してあげるようにすると完成です。

crontab -e

で開いて、末尾に以下を追加

# 起動時に実行
@reboot bash パス/run.sh
# 20分おきに実行
*/20 * * * * bash パス/e-paperCalendar/run.sh

これで起動時と20分おきに自動で電子ペーパーが更新されるようになります。
今後アップデートするとしたら、カレンダー更新した時に自動で更新されるようにもしたいですね。

おまけ

私はiPhoneMacをメインで使用しているので、Appleのカレンダーと同期するようにしています。
Googleカレンダーの設定と共有 > カレンダーの統合 から
iCal形式の公開URL をコピーして、カレンダーに登録するとお互いのイベントが共有されます。
Appleのカレンダーでイベントの追加をGoogleカレンダーを選択して登録すると、Googleにも反映されます。
Appleユーザーの方は是非お試しを。

参考

原動力になった記事です。感謝
Googleと連動した電子ペーパー製カレンダーを作る

Waveshare E-paper HATの問題についての原因と解決策の記事です。
Waveshare E-paper HAT issues

全体のコード:

https://github.com/9610r/e-paperCalendar