Waveshare 7.5inch e-paper Bにカレンダーや写真を表示させるリポジトリ
Raspberry Pi上でFastAPIサーバを動かし、適当なブラウザでアクセスするとダッシュボードが表示されます。
calendar/image/test/clearの4モードから選んでdraw!ボタンを押下すると、その場で描画と実機表示まで行います
描画するたびに結果のプレビューPNGが src/img/image.png に同じファイル名で上書き保存されるためデバッグに有効
実行環境は raspberrypi 3b で検証、開発環境は適当なlinux環境ですが、e-paperに描画することができないので環境変数で対応しました。詳しくは後述
raspberrypi zero w でも動作検証予定
src/
├── waveshare_epd/ # Waveshare純正ドライバ
├── clear.py # e-paperを白紙に戻す手動ユーティリティ
├── main.py # FastAPIアプリ
├── google_auth_setup.py # 初回のみのOAuth認証
├── epd_7in5b_V2_test.py # テストコード
├── secret.py.example # secret.pyのひな形
├── static/index.html # ダッシュボード
├── pic/ # epd_7in5b_V2_test.pyが使うフォントと写真
├── img/ # プレビューPNGの書き出し先
└── lib/ # 描画エンジン・データ取得まわり
├── draw.py # 800x480の黒面/赤面キャンバスへの描画エンジン
├── draw_calendar.py # カレンダー画面の組み立て
├── google_calendar.py # Googleカレンダーからの予定取得
├── google_tasks.py # Google Tasksからのタスク取得
├── google_auth.py # Calendar/Tasks共通のOAuth2認証情報ロード・更新・永続化
├── epd_backend.py # EPD_MODEで実機/開発モックを切り替えるEPD生成
├── requestAPI.py # 祝日API等の汎用GETヘルパー
└── misakifont/ # 日本語ビットマップフォント
https://www.waveshare.com/pico-epaper-7.5-b.htm
必要に応じて以下のリポジトリからドライバー置き換えてください
https://github.com/waveshareteam/e-Paper/tree/master/RaspberryPi_JetsonNano/python/lib/waveshare_epd
画像サイズとかも多分変わっちゃうけど、変更してみて
cd ~/epaper
python -m venv .venv
source .venv/bin/activatespidevはCコンパイルが必要なので、先にビルド環境を入れる、開発時は不要
sudo apt install -y python3-dev build-essential swig
pip install -r requirements-hardware.txtrequirements.txt は開発ホストと実機の共通のライブラリ
実機でe-paperに実際に描画するには、追加でハードウェア制御ライブラリのインストールrequirements_hardware.txtが必要で、開発時は不要
pip install -r requirements.txt
# prod
pip install -r requirements-hardware.txt開発時は不要
sudo raspi-configInterface Options -> SPI -> Enable
有効化後は一度再起動しておくと確実です
sudo reboot開発時は不要
gpiozeroはデフォルトだとlgpio/RPi.GPIO/pigpioで不安定になることがあるのでlgpioを入れて解消
liblgpio本体はpipでは入らないので、ソースからビルドする
cd ~
git clone https://github.com/joan2937/lg.git
cd lg
make
sudo make install
sudo ldconfigワーニングかエラー出るけど、まあ大丈夫
cd ~/epaper
python src/epd_7in5b_V2_test.pyhttps://github.com/waveshareteam/e-Paper/tree/master/RaspberryPi_JetsonNano/python/lib/waveshare_epd
./src/waveshare_epd を必要に応じて↑のリポジトリから変更してください。 epdconfig.py はそのままでも大丈夫だと思う、配線ちゃんとしていれば
gpio対応は↓にまとめてます
https://nishima-tech.com/article/pico-epaper/
OAuth2でブラウザのあの認証を通してリフレッシュトークンとかが書かれた token.json を入手する必要がある
- GCP ConsoleでCalendar APIとTasks APIの両方を有効化
- APIとサービス -> 認証情報 -> 認証情報を作成 -> OAuthクライアントID -> デスクトップ アプリ を選択して作成
- 発行されたクライアントシークレットJSONをダウンロードし、
src/に配置
ファイル名は任意、secret.pyで指定
cd ~/epaper/src
cp secret.py.example secret.pysecret.py を編集し、GOOGLE_OAUTH_CLIENT_SECRET_FILE(ダウンロードしたJSONのファイル名)と GOOGLE_CALENDAERID(カレンダーID)を実際の値に書き換える
https://calendar.google.com/calendar/u/0/r/settings
カレンダーIDはGoogleカレンダーの設定を開き、左にあるマイカレンダーをクリック、下に行くとあります
デフォルトのカレンダーは自分のgmailのアドレスそのままです
ヘッドレスの場合はSSHのポートフォワードで、GUIがある場合は表示されるリンクをブラウザで開きます
**ヘッドレスの場合:**SSHクライアントからポートフォワーディングでラズパイにSSH接続する。ポート番号は43211
ssh -L 43211:localhost:43211 <user>@<Piのアドレス>cd ~/epaper
source .venv/bin/activate
cd src
python google_auth_setup.pyコンソールに表示されるURLをブラウザで開き、Googleの同意画面を通す
ブラウザはhttp://localhost:43211/...にリダイレクト、スクリプトが自動的に検知しsrc/lib/token.jsonを生成して終了する。
以降のサーバ起動時はこのファイルから自動的に認証情報を読み込む。ブラウザ操作は不要、
token.jsonの中身が失効・取り消しされた場合はgoogle_auth_setup.pyを再実行すること
cd ~/epaper
source .venv/bin/activate
uvicorn main:app --app-dir src --host 0.0.0.0 --port 8000
# dev
EPD_MODE=mock uvicorn main:app --app-dir srcポートとかhostは適当に
main.pyは環境変数EPD_MODEでe-paperへの出力先を切り替える。FastAPIエンドポイント・描画ロジックのコア自体はどちらのモードでも同じで、最後にハードウェアへ実際に描画するかどうかが変わる
EPD_MODEを省略するとハードウェア制御まで行う、開発ホストの場合はエラー出るよ
GET /— ダッシュボードsrc/static/index.htmlcalendar/image/test/clearの4モードGET /draw— カレンダーを再描画し、そのまま実機のe-paperに表示するPOST /draw/clear— e-paperを白紙にクリアする(src/clear.pyと同じ処理)。POST /draw/test—src/epd_7in5b_V2_test.pyを実行する、 https://github.com/waveshareteam/e-Paper/tree/master/RaspberryPi_JetsonNano/python/examplesPOST /draw/image— アップロードされた画像を800x480に切り抜き・リサイズして実機に表示する、multipart/form-data、フィールド名fileGET /calendar— 描画結果を黒面/赤面のバイト列として返す、廃止予定
/draw系エンドポイントはいずれも呼ぶたびに src/img/image.png にプレビュー画像を同じファイル名で上書き保存する
contact@nishima-tech.com
ps. このリポジトリは以下のリポジトリを継承・統合しています

