Raspberry Pi 3 + 公式7インチタッチスクリーンで照度センサー対応フォトフレームを自作する【BH1750FVI + I2C + Python】

Image credit: Tomokatsu Yukishita

以前 Raspberry Pi 4 でクラウド対応フォトフレームを作りましたが、今回は余っていた Raspberry Pi 3 と公式7インチタッチスクリーンで別バージョンを構築しました。さらに照度センサーを追加して、部屋の明るさに応じてディスプレイ輝度が自動調整される機能を実装しています。

用意するもの

Raspberry Pi 3

Raspberry Pi 3 Model B シングルボードコンピュータ
Raspberry Pi 3 Model B シングルボードコンピュータ
Amazonで見る

Raspberry Pi 公式7インチタッチスクリーン

800×480px・24ビットRGBカラー・60fps対応。最大10点のマルチタッチに対応しています。

Raspberry Pi 公式 7インチ タッチスクリーン LCD
Raspberry Pi 公式 7インチ タッチスクリーン LCD
Amazonで見る

公式タッチスクリーン用ケース

Raspberry Pi 3 Model B と7インチディスプレイを一体で収納できるケースです。

Raspberry Pi & 7インチ LCDタッチスクリーン 拡張ボードケース ABS樹脂(黒)
Raspberry Pi & 7インチ LCDタッチスクリーン 拡張ボードケース ABS樹脂(黒)
Amazonで見る

ディスプレイの接続

Raspberry Pi Touch Display 公式ドキュメント を参考にリボンケーブルと電源を接続します。

Raspberry Pi を背面ディスプレイに取り付ける場合、リボンケーブルの向きに注意してください。電源ケーブル(赤/黒)は、赤を5Vピン・黒をGNDピンに接続します。

公式ディスプレイの画面回転設定

デフォルト状態では表示が180度回転しているため、設定ファイルで反転します。

以下の lcd_rotate=2Raspberry Pi OS Bullseye 以前(レガシー/FKMSモード)向けの設定です。Bookworm(2023年以降)では lcd_rotate は公式には非推奨で、画面回転には「Screen Configuration」GUIツールの使用が案内されています。

また、config.txt のパスも OS バージョンによって異なります。

  • Bullseye 以前/boot/config.txt
  • Bookworm 以降/boot/firmware/config.txt

Bullseye 以前(レガシー/FKMSモード)の場合:

sudo vi /boot/config.txt

以下を追記します。

lcd_rotate=2

スライドショー用プログラム

スライドショー制御には、別記事で紹介している自作Pythonスクリプト(photoView4)を流用しています。

ディスプレイの輝度調整

フォトフレームとして常時表示していると、夜間など暗い環境では画面が眩しく感じます。公式7インチディスプレイは、以下のコマンドでバックライト輝度を変更できます。

echo "100" | sudo tee /sys/class/backlight/rpi_backlight/brightness

/sys/class/backlight/rpi_backlight/brightness に0〜255の値を書き込むことで輝度を制御できます。

照度センサー(BH1750FVI)の追加

輝度を手動設定するだけでなく、部屋の明るさに応じて自動で輝度を変えたいと考え、照度センサーを追加しました。

使用パーツ

BH1750FVI 周囲光トランスデューサ I2C 出力 エレクトロニクス向けの連続および単一測定アプローチ 環境光観測コンポーネント
BH1750FVI 周囲光トランスデューサ I2C 出力 エレクトロニクス向けの連続および単一測定アプローチ 環境光観測コンポーネント
Amazonで見る
ELEGOO 120本 デュポンワイヤー ジャンパーワイヤー オス-メス/オス-オス/メス-メス セット
ELEGOO 120本 デュポンワイヤー ジャンパーワイヤー オス-メス/オス-オス/メス-メス セット
Amazonで見る

Raspberry Pi と I2C 接続

BH1750FVI は I2C プロトコルで通信します。Raspberry Pi GPIO ピン配置 を参照して接続します。

Raspberry Piの40ピンGPIOヘッダーのピン配置図。SDA(GPIO2, Pin3)とSCL(GPIO3, Pin5)のI2Cピン位置を示している
Raspberry Pi GPIOピン配置図(出典:Raspberry Pi公式ドキュメント)

接続対応表

Raspberry PiGPIOピン番号BH1750FVI
GPIO2 (SDA)3SDA
GPIO3 (SCL)5SCL
5V Power2VCC
Ground14ADO
Ground20GND

GY-30 BH1750FVI照度センサーをRaspberry Pi 3にジャンパーワイヤーでI2C接続した実際の配線写真
BH1750FVI をI2Cで接続した配線の様子

照度センサーの動作確認(Python)

接続後、Python で照度データを取得できるか確認します。参考コード(GitHub) を参考に実装しました。

#!/usr/bin/python3

import smbus

Bus = smbus.SMBus(1)
Addr = 0x23
LxRead = Bus.read_i2c_block_data(Addr, 0x11)
print("照度: " + str(LxRead[1] * 10) + " ルクス")
LxRead2 = Bus.read_i2c_block_data(Addr, 0x10)
print("輝度: " + str((LxRead2[0] * 256 + LxRead2[1]) / 1.2))

実行すると照度が取得できます。

root@raspi3-photo:~# python br.py
照度: 1650 ルクス
輝度: 990.8333333333334

輝度自動調整プログラムの実装

取得した照度に応じてバックライト輝度を滑らかに変化させるため、10ms周期で動作するPythonプログラムを作成しました。

仕組みは以下のとおりです:

  • 照度レベルごとにターゲット輝度を定義
  • 取得した照度に応じてディスプレイ輝度を1ステップずつインクリメント/デクリメント
  • SMBus(I2C)通信は取得間隔を300ms以上空けないと正常な値が取れないため、300ms周期でポーリング

照度センサーの設置

センサーは前面から光が当たる背面の出っぱった部分に設置しました。

GY-30 BH1750FVI照度センサーをRaspberry Pi 3公式タッチスクリーンケースの背面出っぱりに設置した実際の写真
照度センサーをケース背面に設置した様子

ソースコード

作成したプログラムはGitHubで公開しています。

GitHub - yukishita/lcdBrightness2:BH1750FVI 照度センサーで Raspberry Pi 公式ディスプレイ輝度を自動調整するプログラム

デモ動画

照度に応じてディスプレイ輝度が滑らかに変化する様子です。

まとめ

構成要素役割
Raspberry Pi 3メインコンピューター
公式7インチタッチスクリーンフォトフレーム表示(800×480px)
GY-30 BH1750FVII2C接続の照度センサー
Python(smbus)I2C通信・輝度自動調整制御

照度センサーを追加することで、昼は明るく・夜は暗くと自動で輝度が変わり、実用的なフォトフレームになりました。Raspberry Pi Zero 2 W でも同様の構成で動作すると思われます。

Tomokatsu Yukishita (雪下 智且)
Tomokatsu Yukishita (雪下 智且)
Engineering Manager / 宅地建物取引士

組み込み開発とクラウド/AI技術をつなぐEngineering Manager。ミッションクリティカル領域で培った品質基準を、現代的な開発プロセスに接続しています。

関連項目