Raspberry Pi 3＋モバイルバッテリーでタイムラプス撮影

#概要
モバイルバッテリーで動作させたRaspberry Pi 3でタイムラプス撮影するお話です。

#使ったもの
Raspberry Pi 3 Model B
Raspberry Pi カメラモジュール 
Samsung microSDカード32GB EVO Plus Class10 UHS-I対応
モバイルバッテリー（cheero Power Plus 3）容量：13400mAh　出力：DC 5V/3.4A

#事前にやったこと　＆　参考にさせていただきました！
* Raspberry Piにカメラモジュールを接続
* タイムラプス関連

https://qiita.com/horoyoi3/items/86394408644f03bc252a

* Raspberry Piにxrdpをインストール

https://raspi.taneyats.com/entry/install-xrdp

* MonoDevelopのインストール  
Downloadのページにインストール手順の記載があります。

https://www.monodevelop.com/


# 自分でやったこと
###MonoDevelopでGUIの作成
MonoDevelopでテキトーなGUIを作成して、raspistillコマンドの各パラメータを指定できるようにしました。ついでにavconvも
![timelapse01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/f66ca6c1-3557-c388-edcb-43260fb46002.png)　![timelapse02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/69509024-ba17-381a-a1d2-01e98fffcf05.png)

```MainWindow.cs
using System;
using System.IO;
using System.Diagnostics;
using System.Linq;
using Gtk;

public partial class MainWindow: Gtk.Window
{	
	public MainWindow () : base (Gtk.WindowType.Toplevel)
	{
		Build ();
	}

	protected void OnDeleteEvent (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	}

	protected void OnBtnShotClicked (object sender, EventArgs e)
	{
		this.btnShot.Sensitive = false;

		// See below for the raspistill command
		// https://www.raspberrypi.org/documentation/accessories/camera.html

		string m_ImagePreFix = "/home/pi/Pictures/";
		string m_ImageExtent = ".jpg";

		string Width = "-w " + this.spnShotWidth.Value.ToString();
		string Height = "-h " + this.spnShotHeight.Value.ToString();
		string Quality = "-q " + this.spnShotQuality.Value.ToString();
		string TimeOut = "-t " + (this.spnShotTimeout.Value * 60 * 1000 ).ToString();
		string Timelapse = "-tl " + (this.spnShotTimelapse.Value *1000).ToString();
		string OutPut = "-o " + m_ImagePreFix + "%d" + m_ImageExtent;
		//string Preview = "-p '0, 0, 960, 540'";
		string Preview = "-n ";
		//string Imxfx = "";	//-ifx cartoon

		string Args = string.Format("{0} {1} {2} {3} {4} {5} {6}", Width, Height, Quality, TimeOut, Timelapse, OutPut, Preview);
		ProcessStartInfo psi = new ProcessStartInfo();
		psi.FileName = "raspistill";
		psi.Arguments = Args;

		System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
		p.WaitForExit ();

		//avconv -r 20 -i %d.jpg -s '1280x800' output.mp4
		//-r 20 ：フレームレート（fps）を指定
		//-i %d.jpg ：連番のjpgファイルを読み込む
		//-s '1280x800' ：出力フレームサイズ
		//output.mp4 ：出力ファイル名

		string avFps = "-r " + this.spnAvconvFps.Value.ToString();
		string avSize = "-s '" + this.spnAvconvWidth.Value.ToString() + "x" + this.spnAvconvHeight.Value.ToString() + "'";
		string avInPut = "-i " + m_ImagePreFix + "%d.jpg";
		string avOutPut = m_ImagePreFix + "output.mp4";

		Args = string.Format("{0} {1} {2} {3}", avFps, avInPut, avSize, avOutPut);
		psi = new ProcessStartInfo();
		psi.FileName = "avconv";
		psi.Arguments = Args;

		System.Diagnostics.Process avconv = System.Diagnostics.Process.Start(psi);
		avconv.WaitForExit ();

		this.btnShot.Sensitive = true;
		
		//throw new NotImplementedException ();
	}
}

```

###小学生の工作
ラズパイのカメラを固定して、モバイルバッテリーと合体させました。
![rasp01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/b6c10a5e-e5c2-e716-f2bb-07a94315faf9.png)
![rasp02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/a43a73d7-d78f-fec8-2257-313f60e51dbc.png)

###リモート操作で撮影開始
テキトーな場所に設置してモバイルバッテリーの電源ONにします。
ラズパイが起動したころを見計らって、手持ちのAndroid端末からラズパイにリモート接続します。
![rasp03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454725/2706465d-5607-3c9d-c31e-3f72854af85b.png)
リモート接続にはこのアプリを使用しました。

https://play.google.com/store/apps/details?id=com.microsoft.rdc.android&hl=ja&gl=US

### こんな感じに撮れました

窓ガラス越しに撮影したので、カメラの赤色LEDが映り込んでしまいました。。。

https://youtu.be/v1H9unfP370