[メモ] Raspberry Pi ZeroをUSBケーブル一本でインターネット接続！(キーボード・マウス・モニター必要なし)

- <font color='red'>母艦必要</font>です。 ... 

<!--だまされた、と思った人、ごめん。...`編集リクエスト`どうぞ。。-->


## 概要
- らずぱいZeroは、<font color='blue'>USBデバイス</font>になれるらしい。(Linux USB Gadget機能)
- らずぱいZeroには、Windowsから見て<font color='blue'>ネットワークアダプタ</font>となってもらって、Windowsの<font color='blue'>インターネット接続共有</font>で、ネット接続。
- キーボード・マウス・モニター接続しなくてよい。(ぷちっと、電源切るけど..)
- 参考記事: [Setting up Pi Zero OTG - The quick way (No USB keyboard, mouse, HDMI monitor needed)](https://gist.github.com/gbaman/975e2db164b3ca2b51ae11e45e8fd40a)
- Raspberry Pi 2を母艦にするのもできた(初期設定のために、キーボート＆モニター　または、UARTケーブルが必要) => その他
- (追記2017-01-08) RPi Zero v1.3 + `2016-11-25-raspbian-jessie-lite.img` で動作確認。

## 環境
- Raspberry Pi Zero (v1.2 & v1.3)
- Raspbian
    - `2016-11-25-raspbian-jessie-lite.img` (ssh有効にするため、`ssh`というファイル作るのをわすれずに)
    - `2016-05-27-raspbian-jessie-lite.img`
- microUSBケーブル
- 母艦: Windows 10 64ビット (1607ベースで、Windows Update済)
    - (2017-02-18) <font color='red'>NG: ネットワークデバイスとして認識されないので、一覧に出てきません</font><br> <del>(2017-02-15) Windows10付属ドライバ? バージョン1607 OSビルド 14393.693で存在確認しましたが、動作確認してません.. だれか試してもらえませんか？(ぉ
		1. デバイスマネージャーから、該当のデバイスを右クリック
		2. ドライバーソフトウェアの更新(P)... を選択
		3. コンピュータを参照してドライバーソフトウェアを検索します(R) を選択
		4. -> コンピュータ上のデバイスドライバーの一覧から選択します(L) を選択
		5. \[ \]互換性のあるハードウェアを表示(O) のチェックをはずす
		6. **製造元: Microsoft、モデル: リモートNDIS互換デバイス**　を選択
		7. 次へ(N) ....</del>

    - ドライバは[Acer Incorporated. - Other hardware - USB Ethernet/RNDIS Gadget](http://catalog.update.microsoft.com/v7/site/ScopedViewRedirect.aspx?updateid=37e35bd4-d788-4b83-9416-f78e439f90a2)を使う。 (cabを解凍すると、`RNDIS.inf` と `rndis.cat`が出てくる)<br>http://catalog.update.microsoft.com/v7/site/ScopedViewRedirect.aspx?updateid=37e35bd4-d788-4b83-9416-f78e439f90a2
- ※ Win7, Win8は、ネットワークアダプタ > `Microsoft Corporation` > `Remote NDIS Compatible Device` を使用できる(Win7 64ビットで確認)

- オプション
    - 外部電源 : バスパワーで、こころもとないと思ったら、電源PWR側から供給するのもよいかと。(USB3.0~900mAなら、だいじょぶだよね!?!)
    - シリアル(UART)ケーブル: 確認しながらやると、確実です。電源をぷちっと切らずに、`sudo poweroff`
  

## 手順
1. 母艦で、microSDに、Raspbian Jessie Liteを焼く。
2. microSDを一度、抜き差し（念のため）
3. BOOTパーティションにある、設定ファイル2つ編集、`ssh`というファイルをつくる
    1. `config.txt` 
        - 一番下に dtoverlay=dwc2を追加

        ```txt:config.txt_追加例
...
...
# Enable audio (loads snd_bcm2835)
#dtparam=audio=on

        dtoverlay=dwc2
```
    2. `cmdline.txt`
        - `modules-load=dwc2,g_ether`を `rootwait`と`quiet`の間に入れる.

        ```txt:cmdline.txt_できあがり例
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_ether quiet init=/usr/lib/raspi-config/init_resize.sh
```
    3. `ssh`というファイル作成する<br>2016-11-25以降のRaspbianで、sshが有効にならない。

4. 電源投入
5. 30秒位したら、microUSB ケーブルで、Windowsマシンに接続
    - デバイスマネージャを開くと、`USB シリアル デバイス(COMx)`と認識される<br>![PiZERO_USB_Gad01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/8a0ba5ae-b444-b1f8-9a1b-ec4b76b6367a.png)
    - 右クリック > ドライバーソフトウェアの更新(P)... > コンピュータを参照してドライバーソフトウェアを検索します(R) > ... と進めて、ダウンロードしたcabファイルを解凍して、`RNDIS.inf`を指定してインストールする。<br>![PiZERO_USB_Gad03.png](https://qiita-image-store.s3.amazonaws.com/0/75594/901562ff-217b-bab3-7566-d2074a6e17ec.png)
    - `USB Ethernet/RNDIS Gadget`と認識される。うまく認識されてなかったら、Win10再起動。

6. インターネットにつながってるネットワークアダプタのプロパティ(R)を開いて、\[共有\]タブを選んで、"インターネット接続の共有"で、有効にする。
    - 母艦側の`USB Ethernet/RNDIS Gadget`の IPアドレスが、`192.168.137.1 / 255.255.255.0`となる。 
    - が、この時点で、ラズパイ側は、`169.254.xxx.xxx`の様な感じになってるハズ。<br>=> なので、うまく接続できない。
    - らずぱいの電源をぷちっと切って(ちゃんとシャットダウンしないのは気持ち悪いけど)、再度、起動する。<br>=> WindowsがIPを振ってくれるので、192.168.137.XXになってる。
    - Windowsでコマンドラインを開いて、`arp -a -N 192.168.137.1`する。<br>=>`192.168.137.74`ってのが、あやしい!?
    - pingすると反応あり。。
    ![PiZERO_USB_Gad05.png](https://qiita-image-store.s3.amazonaws.com/0/75594/1e1ba322-6165-9f36-a163-21571eefbf96.png)

7. TeraTermとかで、SSHで接続する
    - ![PiZERO_USB_Gad06.png](https://qiita-image-store.s3.amazonaws.com/0/75594/dff8411a-af4e-90a1-a56c-6723e975fae9.png)
    - あとは、通常通り使える。
        - `sudo apt-get update; sudo apt-get upgrade`とかできるよ.

    

## その他
### 母艦にRaspberry Pi 2　(`2016-05-27-raspbian-jessie-lite.img`)
- 母艦の`usb0`をIP`:169.254.10.1`に固定する。
- PiZeroの`usb0`をIP:`169.254.10.2`固定、ゲートウェイIP:`169.254.10.1`(母艦)、DNS:`8.8.4.4`(ぐーぐる先生のとこ)に設定
- 母艦はインターネットに`eth0`で、接続していて、ip_forwadingとかその辺の設定をする。

```bash:PiZero側のIPを固定設定
echo -e "interface usb0 \nstatic ip_address=169.254.10.2\nstatic routers=169.254.10.1\nstatic domain_name_servers=8.8.4.4" | sudo tee -a /etc/dhcpcd.conf 
```

```bash:母艦側の設定
#コマンドラインへこぴぺ
# これは一回だけ
echo -e "interface usb0 \nstatic ip_address=169.254.10.1" | sudo tee -a /etc/dhcpcd.conf 
#
#
# /etc/sysctl.conf - net.ipv4.ip_forward=1 を有効にする
sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
#
export IF_INTERNET=eth0
export IF_G_ETHER=usb0
#
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
#
sudo iptables -t nat -A POSTROUTING -o $IF_INTERNET -j MASQUERADE
sudo iptables -A FORWARD -i $IF_INTERNET -o $IF_G_ETHER -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i $IF_G_ETHER -o $IF_INTERNET -j ACCEPT
#
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"
#
echo "iptables-restore < /etc/iptables.ipv4.nat" | sudo tee  /lib/dhcpcd/dhcpcd-hooks/70-ipv4-nat
#
sudo sync
```

- 再起動

<!--![PiZERO_USB_Gad02.png](https://qiita-image-store.s3.amazonaws.com/0/75594/83c49c4b-f569-3398-d3d4-6da954ed0a90.png)-->
<!--<br>![PiZERO_USB_Gad04.png](https://qiita-image-store.s3.amazonaws.com/0/75594/cfca13c5-5616-5a38-0fe0-eda59ceadfce.png)-->