製作品 921
私のレンズにサインしてもらえますか
前口上
スポーツの試合前後にあこがれの選手からサインを貰えるチャンスがある。自分のカメラにサインをして貰う事により、サインをしている映像までもが宝物になるというカメラをRaspberry Piで製作した。
外観写真と透視図
スチレンボード製の筐体内部に、Raspberry Piとバッテリーを格納している。
アクリルパネルの前面に固定治具があり容易に取り外すことができる。
サインを書いてもらった後新しいパネルに交換をする。
なお、丸ダイヤルはダミーである。
材料
- Raspberry Pi Model A+
- Raspberry Pi Camera Module with Wide Lens
- DS3231 RTC Module
- AQM0802A 8x2 LCD Module
- 4.3inch Color LCD
- タクトスイッチ
- モバイルバッテリー
- スチレンボード
- 磁石
- アクリルパネル
ブロック図
GPIOはデフォルトPulldownで使用する。
8x2 LCD(AQM0802A)はステータス、時刻表示用である。
RTCは、LANに繋がらない屋外環境下で時間を保持するのに必要である。
4.3inch Color LCDは撮影時のモニタリング用である。
GPIOのスイッチは ONで3.3Vに接続され、Highを検出する。
Code
シェルを使用した。
GPIOスイッチに応じてraspividを起動する。
停止時は kill -9 で乱暴に終了させる。
未撮影時はLCDに時刻を表示する。
#!/bin/sh
GPIO_stil=22 #GPIO port(stil)
GPIO_movie5=23 #GPIO port(movie5fps)
GPIO_movie30=24 #GPIO port(movie30fps)
GPIO_stil5=25 #GPIO port(stil5)
GPIO_run=20 #GPIO port(shoot button)
GPIO_stop=21 #GPIO port(stop)
Holdtime=5 #Shutdown button wait time
SAVEDIR=/home/pi/picture/
### Setting ###
#echo "$GPIO_run" > /sys/class/gpio/export
#echo "in" > /sys/class/gpio/gpio$GPIO_run/direction
#echo "low" > /sys/class/gpio/gpio$GPIO_run/direction
for i in 20 21 22 23 24 25
do
echo "$i" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio$i/direction
echo "low" > /sys/class/gpio/gpio$i/direction
done
### ACT LED control ###
set_led_mode () {
echo $1 > /sys/class/leds/led0/trigger
}
set_led_value () {
echo $1 > /sys/class/leds/led0/brightness
}
### Initialize ###
/usr/local/sbin/i2c_lcd.sh -i `date +"%H:%M:%S"`
#echo > /usr/local/etc/raspicam.pid
raspicampid="" #Get PID
sleeptimez="" #sleep time serial value
### Wait n seconds ###
count=0
while [ $count -lt $Holdtime ] ; do
sleeptimecheck=`date "+%s"` #serial value
chiptemp=`cat /sys/class/thermal/thermal_zone0/temp`
chiptemp=`echo "scale=1; $chiptemp / 1000" | bc`
if [ `cat /sys/class/gpio/gpio$GPIO_run/value` -eq "1" ] ; then
# raspicampid=`cat /usr/local/etc/raspicam.pid`
if [ `cat /sys/class/gpio/gpio$GPIO_stop/value` -eq "1" ] ; then
if [ -n "$raspicampid" ] ; then
sudo kill -9 $raspicampid
raspicampid=""
/usr/local/sbin/i2c_lcd.sh -p 0 'PID:'
/usr/local/sbin/i2c_lcd.sh -p 4 ' '
/usr/local/sbin/i2c_lcd.sh -p 4 $raspicampid
/usr/local/sbin/i2c_lcd.sh -p 40 'kill -9 '
sleepenh 0.3
/usr/local/sbin/i2c_lcd.sh -p 40 ' '
/usr/local/sbin/i2c_lcd.sh -p 0 'Standby.'
sleepenh 0.2
/usr/local/sbin/i2c_lcd.sh -p 7 ' '
/usr/local/sbin/i2c_lcd.sh -p 0 ' '
else
/usr/local/sbin/i2c_lcd.sh -p 0 'CPU:'
/usr/local/sbin/i2c_lcd.sh -p 4 $chiptemp
sleepenh 0.5
fi
elif [ `cat /sys/class/gpio/gpio$GPIO_stil/value` -eq "1" ] ; then
if [ -z "$raspicampid" ] ; then
filename='image%08d.jpg'
subdir=`date +"%Y%m%d%H%M"`
mkdir $SAVEDIR$subdir
raspistill -t 0 -tl 2000 -n -ex antishake -mm matrix -o "$SAVEDIR$subdir/$filename" &
raspicampid=`pidof raspistill`
/usr/local/sbin/i2c_lcd.sh -p 0 'Shooting'
/usr/local/sbin/i2c_lcd.sh -p 40 'Jpg:2sec'
fi
elif [ `cat /sys/class/gpio/gpio$GPIO_movie5/value` -eq "1" ] ; then
if [ -z "$raspicampid" ] ; then
filename=`date +"%Y%m%d_%H%M%S_05fps.h264"`
raspivid -t 0 -fps 5 -f -awb sun -o "$SAVEDIR$filename" &
# pidof raspivid > /usr/local/etc/raspicam.pid
raspicampid=`pidof raspivid`
/usr/local/sbin/i2c_lcd.sh -p 0 'Record..'
/usr/local/sbin/i2c_lcd.sh -p 40 'H264:5f '
fi
elif [ `cat /sys/class/gpio/gpio$GPIO_movie30/value` -eq "1" ] ; then
if [ -z "$raspicampid" ] ; then
filename=`date +"%Y%m%d_%H%M%S_30fps.h264"`
raspivid -t 0 -fps 30 -n -awb sun -o "$SAVEDIR$filename" &
# pidof raspivid > /usr/local/etc/raspicam.pid
raspicampid=`pidof raspivid`
/usr/local/sbin/i2c_lcd.sh -p 0 'Record..'
/usr/local/sbin/i2c_lcd.sh -p 40 'H264:30f '
fi
elif [ `cat /sys/class/gpio/gpio$GPIO_stil5/value` -eq "1" ] ; then
if [ -z "$raspicampid" ] ; then
filename=`date +"%Y%m%d_%H%M%S_m30fps.h264"`
raspivid -t 0 -fps 30 -vs -n -awb sun -mm matrix -o "$SAVEDIR$filename" &
# pidof raspivid > /usr/local/etc/raspicam.pid
raspicampid=`pidof raspivid`
/usr/local/sbin/i2c_lcd.sh -p 0 'Record..'
/usr/local/sbin/i2c_lcd.sh -p 40 'H264:30fm'
fi
else
if [ -z $raspicampid ]; then
/usr/local/sbin/i2c_lcd.sh -p 0 'Shutdown'
/usr/local/sbin/i2c_lcd.sh -p 41 ' '
/usr/local/sbin/i2c_lcd.sh -p 40 `expr $Holdtime - $count`
fi
count=`expr $count + 1`
[ $count -eq 1 ] && set_led_mode heartbeat
fi
else
[ $count -gt 0 ] && set_led_mode mmc0
count=0
fi
sleeptimez=`sleepenh $sleeptimecheck 1`
if [ -z $raspicampid ] && [ $count -eq 0 ]; then
if [ `expr \( $sleeptimecheck + 1 \) % 30` -eq 0 ] ; then
/usr/local/sbin/i2c_lcd.sh -p 0 `date +"%H:%M:%S"`
/usr/local/sbin/i2c_lcd.sh -p 40 ' '
else
/usr/local/sbin/i2c_lcd.sh -p 0 ' '
/usr/local/sbin/i2c_lcd.sh -p 40 `date +"%H:%M:%S"`
fi
fi
done
### Shutdown (LED) ###
/usr/local/sbin/i2c_lcd.sh -c
set_led_mode none
set_led_value 1
sleep 2
set_led_value 0
set_led_mode mmc0
### Shutdown ###
#raspicampid=`cat /usr/local/etc/raspicam.pid`
if [ -n $raspicampid ]; then
sudo kill -9 $raspicampid
fi
shutdown -h now
起動時に実行させたいので /etc/rc.localに追記する。
/usr/local/bin/camera.sh &
消費電力およびファイルサイズ
外部ビデオ出力無しの状態での5V系の消費電流を測定。
5fps/1920x1080 : 0.15A
30fps/1920x1080 : 0.26A~0.33Aで揺れる
消費電力的にはフレームレートを下げるのが良いが、5fpsは映像として実用的ではない。
また、ファイルサイズは36分で4.4GBとなった。
撮影後の処理
MP4BOXを使用。
MP4Box -fps 30 -add hoge.h264 hoge.mp4
でmp4形式となる。
撮影結果
・リスト
標本化
- QRコード
- 名前
- チーム名
- レース名
- 取得場所・日付
を記載する。
QRコードは10.5mm□で、YouTubeのURLを格納している。
1
-
TairaHamilton
さんが
2021/02/28
に
編集
をしました。
(メッセージ: 初版)
-
TairaHamilton
さんが
2021/02/28
に
編集
をしました。
(メッセージ: 誤字修正)
-
TairaHamilton
さんが
2021/12/11
に
編集
をしました。
ログインしてコメントを投稿する