TairaHamiltonのアイコン画像
TairaHamilton 2021年02月28日作成 (2021年12月11日更新) © MIT
製作品 製作品 閲覧数 820
TairaHamilton 2021年02月28日作成 (2021年12月11日更新) © MIT 製作品 製作品 閲覧数 820

私のレンズにサインしてもらえますか

私のレンズにサインしてもらえますか

前口上

スポーツの試合前後にあこがれの選手からサインを貰えるチャンスがある。自分のカメラにサインをして貰う事により、サインをしている映像までもが宝物になるというカメラを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のアイコン画像
明和電機協同組合会員
ログインしてコメントを投稿する