やること
娘が幼稚園から持ち帰ってきたトマトの成長を自動的に記録します。
具体的には、Raspberry Piで10分ごとにトマトを撮影し、LINE BOTとして撮影した画像を投稿します。
これでいつでもどこでもLINEからトマトの成長を観察でき、振り返ることができます。
画像はイメージです。
セットアップ
用意するもの
- Raspberry Pi 4B
- カメラモジュールV2
- SDカード
- USBケーブル タイプC
- 百均で買ったアクリルケース(任意)
- 百均で買ったタブレット立て(任意)
アクリルケースはラズパイを持ち運びやすくするのと、カメラモジュールをセロハンテープで貼り付けるために使いました。
タブレット立ては上下の角度を調整するために使いました。
OS
無難にRasbianOSをRasberry Pi Imagerでインストールしました。
カメラ
-
sudo raspi-config
でカメラを有効化 - /boot/config.txtにモジュールを追記
dtoverlay=im219
- reboot
-
libcamera-hello
で確認
参考: ラズパイ新OS「Bullseye」でのカメラモジュールの使い方|libcameraの使い方も詳しく解説
大事なことは libcamera
を使うこと。raspi-steel
ではない。
よく参考書とかWebに載っているのはraspi-steel
。しかし、今はlibcamera
に置き換わったようです。2021年頃から?
プログラムの内容
写真を撮影する
#!/bin/sh
# 撮影してファイルパスを出力
# libcameraの出力は/dev/nullへ捨てる
DATE=$(date '+%Y%m%d_%H%M%S')
FILENAME=/home/u1and0/Pictures/${DATE}.jpg
# FILENAME="/home/u1and0/Pictures/test.jpg"
# タイムラプスを撮影
# 30秒間に渡って3秒ごとに撮影
# libcamera-still --width 1280 --height 960 -t 30000 --timelapse 3000 -o /home/u1and0/Pictures/${DATE}%02d.jpg
libcamera-still --vflip --width 1280 --height 960 -o ${FILENAME} 2> /dev/null &&\
echo ${FILENAME}
- --vflipで上下反転させます。(カメラモジュールの都合でアクリルケースに逆さまにしか貼り付けられなかったので。)
- --width, --heightで解像度を調整します。デフォルトだと1MB超えの写真で、無駄にでかいので。
-
2> /dev/null
でlibcamera-still
の出力を捨てます。 - 撮影に成功したらファイルパスを出力します。
LINEへ画像を投稿する
事前にLINEアクセストークンを取得します。
Messaging APIの概要
#!/bin/sh
# Usage
# ./post-picture-line.sh filepath
ACCESS_TOKEN="*******"
MSG="現在のトマトの様子をお届けします。"
PATH="$1"
URL="https://notify-api.line.me/api/notify"
# 何故かcurlでは`not found`が出てしまうので、curlのフルパス指定した
/usr/bin/curl -fsSL -X POST\
-H "Authorization: Bearer ${ACCESS_TOKEN}"\
-F "message=${MSG}"\
-F "imageFile=@${PATH}"\
${URL}
ファイルパスの前の"@"は必須です。
組み合わせる
撮影して、LINEへ投稿するようにパイプで接続します。
$ take-picture.sh | xargs post-picture-line.sh
take-picture.sh
で撮影したファイルのフルパスを出力します。
xargs
で受け取り、post-picture-line.sh
で画像ファイルをLINEへポストします。(xargs
で一旦受け取ることが大事です。)
cronへ登録する
crontab -e
でエディタを開いて下記追記します。
*/10 4-19 * * * /home/u1and0/Program/sh/take-picture.sh | xargs /home/u1and0/Program/sh/post-picture-line.sh
適宜プログラムを保存したパスに書き換えてください。
これで4時から19時50分までの間に10分ごとに撮影し、撮影のたびにLINEに画像を送信します。