Avance.Lab

実験

電子ペーパーとラズパイで自動更新するスケジュール表を作る

公開日:2022.09.09 更新日:2022.09.09

tag: IoTRaspberry Pi

はじめまして、アバンセシステムのTIGERです。
よろしくお願いします。

今回はRaspberryPiと電子ペーパーを使った簡単なスケジュール表を作ります。

電子ペーパーを使用するメリットとして画面の表示中に電力を消費せず、電力源を絶っても画面は表示し続けます。視野角も広く170°まで視認することができる仕様です。
デメリットとしては、今回選択した電気泳動式2色の電子ペーパーは全画面更新が6秒ほどかかります。この方式では1色ずつ描画されていく為、色が増えるほど更新時間は増えていきます。例として、同サイズの3色のものは全画面更新時間が16秒です。

今回作成するようなスケジュール表など画面の更新頻度が少なく、常時表示しておきたい文章の表示をするには低電力で目に優しい優秀なディスプレイです。
表示する予定表はGoogleカレンダーから情報を取得します。

1. 機材準備

下記の機材を使用します。

機材数量備考
Raspberry Pi zero WH1 
Waveshare E-paper1今回は白/黒の2カラー
7.5インチの物
PC1MacOS Big Sur
無線LANルーター1 
microSDカード1容量: 32GBのものを使用
SDカード リーダー/ライター1microSD対応
USB to MicroUSBケーブル1電源供給で使用
Google開発用アカウント1Googleカレンダーイベント取得の為

ピンヘッダと通信モジュールがついたボードであれば、Raspberry Pi zero WHでなくても問題ありません。

2. ラズパイのセットアップ

弊社のGTが執筆した下記の記事を参考にRaspberry Piセットアップをします。
今回はGPIOとWi-Fi通信を使用する為、第2回の章 Pythonパッケージソフトウェアインストールのパッケージはインストールを行わなくて問題ありません。

第1回 ラズパイを使用したBLE通信 ~ ディスプレイ、キーボード、マウスを接続しないで設定 前編 ~

第2回 ラズパイを使用したBLE通信 ~ ディスプレイ、キーボード、マウスを接続しないで設定 後編 ~

上記の記事の設定ができたら一度ラズパイにsshで接続し、追加の設定と通信と電子ペーパーの描画に必要なライブラリをインストールしていきます。

ロケールの追加

下記のコマンドを実行して、Raspberry Piにインストール済みのロケールの一覧を取得します。

$ locale -a
> C
> C.UTF-8
> POSIX

一覧の中にja_JP.UTF-8がなかった場合は、追加するための操作を行います。

$ sudo raspi-config

上記のコマンドで、設定を開き
5.Localisation Options > 1.Locale と進んでいきます。
ja_JP.UTF-8が出てくるまで↓矢印を押してスクロールしていきます。

項目を見つけたらスペースキーを押して選択。エンターキーで終了してインストールします。

ラズパイのロケール設定画面

正常にインストールされたログが出ればOKです。

Generating locales (this might take a while)...
  en_GB.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.

ライブラリのインストール

インターネット通信と描画に必要なパッケージをインストールします。

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

$ sudo pip3 install pillow
$ sudo pip3 install python-dateutil
$ sudo pip3 install RPi.GPIO
$ sudo pip3 install spidev

ケーブルの接続

ラズパイの電源を切ってからピンヘッダにケーブルの接続を行います。
電子ペーパー購入元のWaveShare様のマニュアルを参照し、ボードと電子ペーパーを適切に接続します。

e-PaperRaspberry Pi
VCC3.3V
GNDGND
DIN19
CLK23
CS24
DC22
RST11
BUSY18

参考: Waveshare – 7.5inch e-Paper HAT Manual


使用するボードと電子ペーパーによっては接続するピンが変わる為、注意が必要です。

カレンダーIDの設定

最後に取得するカレンダーのIDを環境変数に登録します。
https://calendar.google.com/calendar/u/0/r
上記のURLにアクセスして、取得したいカレンダーの縦三点リーダーをクリックします。
リスト内の設定と共有をクリックして、カレンダーの設定画面を開きます。

画像に表示されている 赤枠内のカレンダーIDを使用します。

$ vi~/.bash_profile

末尾にCALENDER_IDを追加して、上書き保存します。

export CALENDER_ID=Googleカレンダーで取得したカレンダーid

これでRaspberry Piの設定は準備完了です。

3. 認証情報取得

今回のタスク表にはGoogleカレンダーの情報を取得するため、
API認証情報とアクセストークンが必要になります。

ラズパイで行うと時間がかかる為、この章はPC上で作業を行います。
まず、Githubからプロジェクトをダウンロードします。

$ git clone https://github.com/tiger-nk/E-PaperScheduleTable.git

定期的にGoogleカレンダーから情報を読み取る為にGoogle CloudにてWebアプリケーションとして登録を行います。

Google Cloud コンソールを開き、新しくプロジェクトを作成します。
プロジェクト名はわかりやすい名前にすれば何でも問題ありません。
プロジェクトを作成したら、APIとサービス > OAuth同意画面と進み、
同意画面を作成します。ここは入力必須*部分の記入だけで問題ありません。


同意画面を作成したら、認証情報のタブに戻ります。
画面上部の 認証情報を作成 から OAuth クライアントIDを選ぶと、OAuth クライアント ID の作成画面に移ります。
アプリケーションの種類で「デスクトップアプリ」を選択し、作成ボタンを押して作成します。
この時に出てきたウインドウ内の「JSONをダウンロード」をクリックして、ダウンロードをします。


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

参考: Google Workspace for Developers – Create access credentials

次にGoogle Calender APIのサンプルコードを参考に認証ファイルをPickleに変換して取得していきます。

  1. Python用のGoogleクライアントライブラリをインストールします。
$ pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
  1. 先ほどダウンロードしたプロジェクト内のスクリプトを使い、認証ファイルを取得します。
$ cd E-PaperScheduleTable
$ python3 connect_calendar.py

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

上記のスクリプトを実行すると、URLとログが表示され、
PCのデフォルトブラウザが起動してGoogleアカウント認証画面に表示されます。
この時に自動的に遷移しない場合はログに表示されたURL(https://accounts.google.com/o/oauth2/…)に手動でアクセスしてください。
認証画面にて開発用Googleアカウントを選択して認証します。
リスト型の結果が出力されて、token.pickleが作成されていたら問題ありません。

参考: Google Calender- Python Quickstart


最終的に下記のツリーのような構成になっていればOKです。

E-PaperScheduleTable
├── Fonts
├── LICENSE
├── README.md
├── connect_calender.py
├── create_image.py
├── credentials.json
├── image.bmp
├── lib
├── main.py
├── run.sh
└── token.pickle

上記で変更を加えたプロジェクトフォルダをラズパイに送信します。
Mac上でターミナルを開き、下記のコマンドを入力します。

$ scp -r E-PaperScheduleTable pi@[ラズパイのIPアドレス]:~/home/pi

PCでの操作は以上になります。
次の章からはラズパイでの動作確認です。

4. 実行

いよいよ、Raspberry Piで電子ペーパーを動かします。

$ cd E-PaperScheduleTable
$ python3 main.py

電子ペーパーが何回か点滅した後に画像が表示されたら接続と設定は問題ありません。

最後に自動で更新が行われるようにスクリプトファイルをcrontabで定期的に実行するように設定します。
下記のコマンドを入力し、crontabに設定を追加します。

$ crontab -e

末尾に以下の文を追加します。
フォルダパスの部分はプロジェクトフォルダの保存箇所に置換してください。

# 起動時に実行
@reboot bash パス/run.sh
# 20分おきに実行
*/20 * * * * bash フォルダパス/E-PaperScheduleTable/run.sh

これで起動時と毎時20分おきに自動でスクリプトが実行されて、画面が更新されるようになりました。
今回はカレンダーからのスケジュールを反映させていますが、外部のAPIから天気情報などを抜き出して表示しても便利そうですね。

5. 参考

今回使用したコード:
GitHub – tiger-nk/E-PaperScheduleTable

WaveShare社製 電子ペーパーのパッケージ:
GitHub – waveshare/e-Paper

TIGER

月一でキャンプに行きます。最近は3Dプリンタを使ってよく遊んでいます。               

関連記事