[メモ] Raspberry Pi Zero + Camera を USB WebCamとして使う

(追記2020-11-01) 現在のBusterのものでは動かないっぽいので、こちらを.

> [[メモ] Raspberry Pi Zero + CSI-Camera を USB WebCamとして使う(2020年夏版)](https://qiita.com/mt08/items/f869cddee89ca2ea6323)


---
Raspberry Pi Zero + Camera を USB WebCam (UVC)として使う

- Win10のデバイスマネージャでみると、UVC Cameraとでてくる<br>![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/2c435927-a60c-17cf-0858-e8b4d5e165ca.png)


- VirtualBoxのUSBの設定では、Linux Foundation Webcam gadgetとでてくる<br>![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/32f9f00f-6ed0-89d0-15fe-a5596396e118.png)

- Win10のChromeにて、[MediaDevices.getUserMedia()](https://developer.mozilla.org/ja/docs/Web/API/MediaDevices/getUserMedia)を使用して、UVCカメラにアクセス<br>![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/50109c35-2ed3-a51d-90bf-3d039dd8409d.png)





# 概要
- RPi Zero + Cameraで、[UVC](https://en.wikipedia.org/wiki/USB_video_device_class)なWebCamとして使う。
- `g_webcam` koモジュール + `uvc-gadget` を使用する
- 参考: StackExchange:: [How do you configure the Pi Zero to act as a USB webcam using the plug in camera?](https://raspberrypi.stackexchange.com/a/73859/80487) から、パッチを作られてるいる方のコードへ https://github.com/jdonald/uvc-gadget 
- `uvc-gadget`のビルド済みバイナリ　https://github.com/mt08xx/uvc-gadget/raw/dev/mt08/bin/uvc-gadget.armhf

# 環境
- Raspberry Pi Zero W +  [Camera Module](https://www.raspberrypi.org/documentation/hardware/camera/README.md) v1.3 (5MP) 
- Raspbian: `2018-04-18-raspbian-stretch-lite`

- Windows 10 x64 : WebCamのテスト

# 手順概要
- `/boot/config.txt`に 'dtoverlay=dwc2'を追加
- `/boot/cmdline.txt`に `modules-load=dwc2,g_webcam`を追加
- `/etc/modules`に`bcm2835-v4l2`を追加
- `raspi-config`で、Camera ModuleをEnabledして、有効化
- uvc-gadgetを `/usr/local/bin` にいれて、自動起動用のsystemdの設定をする


# 手順

1. Raspbianを焼く
    - 必要に応じて、`ssh`ファイルやら、設定済み`wpa_supplicant.conf`をbootパーティションに置く
2. 起動 (PWRから電源供給)
3. ログイン
    - Wifiから
    - UART-USBケーブルから
    - テレビに繋いで、直接キーボードから
  

4. `/boot/config.txt`に 'dtoverlay=dwc2'を追加

    ```bash:シェルにこぴぺ
echo dtoverlay=dwc2 | sudo tee -a /boot/config.txt
```

5. `/boot/cmdline.txt`に `modules-load=dwc2,g_webcam`を追加

    ```bash:シェルにこぴぺ
sudo sed -i -e 's/rootwait$/rootwait modules-load=dwc2,g_webcam/g' /boot/cmdline.txt
```


6. `/etc/modules`に`bcm2835-v4l2`を追加

    ```bash:シェルにこぴぺ
echo -e 'bcm2835-v4l2' | sudo tee -a /etc/modules
```

7. `raspi-config`で、Camera ModuleをEnabledして、有効化

    ```bash:シェルにこぴぺ
sudo raspi-config nonint do_camera 0
```

8. uvc-gadgetを `/usr/local/bin` にいれて、実行属性を付けて、

    ```bash:シェルにこぴぺ
sudo curl -sL https://github.com/mt08xx/uvc-gadget/raw/dev/mt08/bin/uvc-gadget.armhf -o /usr/local/bin/uvc-gadget
sudo chmod a+x /usr/local/bin/uvc-gadget
```


9. 自動起動用のsystemdの設定をする


	```bash:シェルにこぴぺ
	cat << 'EOF' | sudo tee /etc/systemd/system/uvc-gadget.service
	[Unit]
	Description = uvc-gadget
	After=local-fs.target

	[Service]
	ExecStart=/usr/local/bin/uvc-gadget -u /dev/video0 -v /dev/video1
	Restart=no
	Type=simple

	[Install]
	WantedBy=multi-user.target
	EOF

	sudo systemctl daemon-reload
	sudo systemctl enable uvc-gadget
	```

10. 再起動

	```bash:
	sudo reboot
	```



# 動作確認
## その1: Skype のWindowsのデスクトップ版のカメラ設定を開く

## その2: Chrome にて
- https://mt08xx.github.io/webcam.html にアクセス

```html:webcam.html
<!DOCTYPE html>
<html>
<head>
  <title>Webcam Test</title>
</head>
<body>
  <video id="videoIn" autoplay></video>
  <script type="text/javascript">
  var p = navigator.mediaDevices.getUserMedia({ video: true });
  p.then(function(stream){document.getElementById("videoIn").srcObject = stream;});
</script>
</body>
</html>
```

- [許可]すると<br>![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/bd1838a9-6733-80f1-7a1d-91eb30079e1f.png)

- こんなのがうつる<br>![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/50109c35-2ed3-a51d-90bf-3d039dd8409d.png)


\# httpsでアクセスしないと、カメラが使えないっぽい.




# その他
- 640 x 360 のみ動作。
- カメラの接続と動作テストは、先にやっといたほうがいいと思う。
- RPi Zero V1.3 など、ネット環境がすぐに使えないもので使用する場合は、ネットにすぐに繋がるラズパイを使って、microSDを設定しまえば、いいんじゃないかと思う。