クルマにバックカメラと液晶モニタを取り付けてみた：GL-AR150/OpenWRTとAmazon Dash ButtonとUSBハブを使って

はじめに
---


クルマなんて動けばいい、少し前までそんなふうに思っていました。
最近老朽化でしかたなく車を買い替えたのですが、中古車購入で装備も十分とは言い難い状態、最初のうちは何も気にせず運転していました。
巷ではあおり運転が社会問題化、それで念の為フロントとリアに安価なドライブレコーダを取り付けたんですが、それがきっかけで少しクルマに興味を持ち始めたみたいです。

私も結構な年齢になってバックする時に少し不安があるので、まずはバックカメラと液晶モニタを取り付けることにしました。と言っても、バックライトからバックカメラの電源を取ったり、内装を剥がして配線とか怖くてできないので、もっとゆるい感じでの実装です。

せっかくなので**クルマのIoT化**を少し意識したシステム構成にしてみました。


システム構成
---

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/a646538c-665b-5ade-318f-4a4019fe3559.png">

- 電源供給はUSBポート5Vですが、12V対応機器があるので、5Vを12VにDC/DC変換しています。
- ダヴ Dash Buttonを押すと、30秒だけバックカメラの映像を液晶モニタに映します。
- GL-AR150/OpenWRTから電源連動節電機能付きUSBハブをON/OFFして、バックカメラの電源制御をします。液晶モニタはバックカメラのON/OFFに連動します。
- システム設定中はインターネット接続環境が必要ですが、済んでしまえばインターネット接続環境は必須ではありません。

||商品名|購入時価格|数量|小計|備考|
|:-:|:--|--:|--:|--:|--:|
|1|[DBPOWER バックカメラ 高画質防水等級IP67/IP68 170度広角レンズ480TVL 車載カメラ](https://www.amazon.co.jp/gp/product/B00Y7X679O/ref=oh_aui_detailpage_o05_s00?ie=UTF8&psc=1)|1,090円|1個|1,090円||
|2|[LANMU USB 5V-9V/5V-12V DC電源供給ケーブル 電源ケーブルUSB→DC(外径5.5mm内径2.1mm)](https://www.amazon.co.jp/gp/product/B01G3ERI6U/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1) |799円|1個|799円|バックカメラ用電源ケーブル|
|3|[iBUFFALO USB2.0リピーターケーブル (A to A) 5.0m ブラックスケルトン BSUAAR250BS](https://www.amazon.co.jp/gp/product/B0081BO08S/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1)|867円|1個|867円|バックカメラ用USB延長ケーブル|
|4|[iBUFFALO 電源連動節電機能付き 4ポートセルフパワーハブ ブラック BSH4AE12BK](https://www.amazon.co.jp/gp/product/B01GPLB2VI/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1)|1,081円|1個|1,081円|バックカメラON/OFF用USBハブ|
|5|[【ノーブランド品】2系統の映像入力 12V車用 ミニオンダッシュ液晶モニター 4.3インチ バック切替可能](https://www.amazon.co.jp/gp/product/B0079RJ4AE/ref=oh_aui_detailpage_o05_s00?ie=UTF8&psc=1)|1,340円|1個|1,340円||
|6|[POWSEED 車載充電器 12W 3V 4.5V 5V 6V 7.5V 9V 12V 電圧自動調整 ユニバーサル カーチャージャー DCアダプター DC充電器 シガーソケットチャージャー シガーチャージャー メデラ パンプ スピーカー及びスマホ等マイクロUSBデバイスなど対応 交換代用電源アダプター (New Tips*8) ](https://www.amazon.co.jp/gp/product/B077CMD2CL/ref=oh_aui_detailpage_o04_s00?ie=UTF8&psc=1)|1,299円|1個|1,299円|液晶モニタ用電源アダプタ|
|7|[GL-AR150 ar9331 150 150mbpsの無線lan無線ルータ無線lanリピータopenwrtのファームウェア外部/内部アンテナサポートpoeモジュール](https://ja.aliexpress.com/item/GL-AR150-AR9331-802-11n-150Mbps-WiFi-Wireless-Router-WiFi-Repeater-OPENWRT-Firmware-External-Internal-Antenna/32556315152.html?spm=a2g0s.9042311.0.0.8af64c4dwaq95t)|2,612円|1個|2,612円||
|8|[iBUFFALO 4ポート バスパワー スタンダードUSBハブ ブラック BSH4U25BK](https://www.amazon.co.jp/gp/product/B018MZKKQ8/ref=oh_aui_detailpage_o09_s00?ie=UTF8&psc=1)|546円|1個|546円|GL-AR150/OpenWRT USBポート増設用|
|9|[Anker PowerDrive 2 (24W/4.8A 2ポート USBカーチャージャー) iPhone、Android、IQOS対応 (ブラック)](https://www.amazon.co.jp/gp/product/B00VTIF6FG/ref=oh_aui_detailpage_o05_s00?ie=UTF8&psc=1)|999円|1個|999円|GL-AR150/OpenWRT電源供給用|
|10|[ダヴ Dash Button](https://www.amazon.co.jp/Amazon-JK29LP-ダヴ-Dash-Button/dp/B06ZZFMLFK)|100円|1個|100円|バックカメラON/OFF用|
|11|[プレミアムレッド Dash Button](https://www.amazon.co.jp/Amazon-JK29LP-プレミアムレッド-Dash-Button/dp/B01L2WS06U)|100円|1個|100円|GL-AR150/OpenWRTシャットダウン用|
||合計|||10,833円||

設置
---

|バックカメラ（下）です。車内取り付けです。|液晶モニタです。|
|:--:|:--:|
|<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/41be501f-9e46-977d-cfcb-100d49967d50.jpeg">|<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/0c141fe1-574c-1a89-5b2f-76cc8d9cf9a3.jpeg">|
|**Dash Buttonです。車内で平面なところは意外と少ないです。**|**ダイソーで買ったクリアボックスに収納しています。助手席の足元に置いています。**|
|<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/60d19f41-125b-56a4-0d39-37073e006f87.jpeg">|<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/c111a6c6-f256-143c-393b-3e1dbe0d273d.jpeg">|

GL-AR150/OpenWRTのhub-ctrlを使い、USBハブの電源制御を行います。
---

一時的にGL-AR150/OpenWRTをインターネットに接続できるようにします。どのような接続環境でも構いません。[GL-AR150とL-02CでLTEモバイルルータを作ってみた](https://qiita.com/somainit/items/912ad0b4542f7b315f1f)を参考にどうぞ。それからパッケージhub-ctrlをインストールします。

hub-ctrlでUSBハブをポート単位で電源制御できるようになります。Per-port power switching仕様だとできますが、それに対応したUSBハブがなかなかありません。**iBUFFALO 電源連動節電機能付き 4ポートセルフパワーハブ ブラック BSH4AE12BK**だと、**USBハブ単位で電源制御できる**のでそれを利用することにしました。

参考：

- [memoメモ - LinuxからUSB HUBの電源のON/OFFを制御してみる](http://atotto.hatenadiary.jp/entry/linux-sugoi-usb-hub-power-ctrl)
- [怠惰の形而上学 - Raspberry Pi + L-02C でバッチリ安定する多機能 LTE ルータをつくったメモ](https://oppekepe.org/1598)
- [GitHub - probonopd/hub-ctrl-for-openwrt
](https://github.com/probonopd/hub-ctrl-for-openwrt)

:one: パッケージhub-ctrlをインストールします。

```shell-session
root@GL-AR150:~# opkg update
root@GL-AR150:~# opkg install hub-ctrl
```

:two: USBデバイスの情報を確認します。困ったことに iBUFFALO BSH4AE12BK(電源連動節電機能付きハブ)、iBUFFALO BSH4U25BK(ただのハブ) どちらも "**Genesys Logic, Inc. Hub**" と認識されます。iBUFFALO BSH4U25BK(ただのハブ) に iBUFFALO BSH4AE12BK(電源連動節電機能付きハブ) をぶら下げているので、"**Hub #0 at 001:004**"が iBUFFALO BSH4AE12BK(電源連動節電機能付きハブ) とわかります。

```shell-session
root@GL-AR150:~# lsusb
Bus 001 Device 004: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 005: ID 1004:618f LG Electronics, Inc. Ally/Optimus One
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

root@GL-AR150:~# lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-platform/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 3: Dev 5, If 0, Class=Vendor Specific Class, Driver=option, 480M
        |__ Port 3: Dev 5, If 1, Class=Vendor Specific Class, Driver=option, 480M
        |__ Port 3: Dev 5, If 2, Class=Vendor Specific Class, Driver=option, 480M
        |__ Port 3: Dev 5, If 3, Class=Vendor Specific Class, Driver=option, 480M
        |__ Port 4: Dev 4, If 0, Class=Hub, Driver=hub/4p, 480M
```

:three: iBUFFALO BSH4AE12BK(電源連動節電機能付きハブ) "Hub #0 at **001**:**004**"のポートをON/OFFしてみます。どれか一つのポートをON/OFFすると、すべてのポートがON/OFFになります。
"-P 1"はポート1、"-p 1"はON、"-p 0"はOFFになります。

```shell-session
root@GL-AR150:~# hub-ctrl -v
Hub #0 at 001:004
 INFO: ganged switching.
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0100 power
   Port 3: 0000.0100 power
   Port 4: 0000.0100 power
Hub #1 at 001:002
 INFO: ganged switching.
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0100 power
   Port 3: 0000.0503 highspeed power enable connect
   Port 4: 0000.0503 highspeed power enable connect
Hub #2 at 001:001
 INFO: individual power switching.
 WARN: Port indicators are NOT supported.
 Hub Port Status:
   Port 1: 0000.0503 highspeed power enable connect

root@GL-AR150:~# hub-ctrl -b 001 -d 004 -P 1 -p 1 
root@GL-AR150:~# hub-ctrl -b 001 -d 004 -P 1 -p 0
```

:four: iBUFFALO BSH4AE12BK(電源連動節電機能付きハブ)をON/OFFするスクリプト**/root/bin/usbhub-switch.sh**を作成します。

```shell-session
root@GL-AR150:~# mkdir -p /root/bin
root@GL-AR150:~# vi /root/bin/usbhub-switch.sh
```

```shell:/root/bin/usbhub-switch.sh
#!/bin/sh

HUB=`/usr/bin/lsusb -v 2>/dev/null | grep ^Bus | grep "Genesys Logic, Inc. Hub" | head -1`
BUS=`echo $HUB | awk '{print $2}'`
DEV=`echo $HUB | awk '{print $4}' | sed -e "s/\(.*\)\:/\1/p;d"`

for i in 1 2 3 4
do
    if   [ "$1" == "on"  ]; then
        /usr/sbin/hub-ctrl -b $BUS -d $DEV -P $i -p 1
    elif [ "$1" == "off" ]; then
        /usr/sbin/hub-ctrl -b $BUS -d $DEV -P $i -p 0
    fi
done
```

```shell-session
root@GL-AR150:~# chmod 755 /root/bin/usbhub-switch.sh
```

:five: GL-AR150/OpenWRTの電源投入時はiBUFFALO BSH4AE12BK(電源連動節電機能付きハブ)がONになるので、OFFにするよう初期スクリプト**/etc/init.d/usbhub-switch**を作成します。つまり液晶モニタには何も表示されないようにします。

```shell-session
root@GL-AR150:~# vi /etc/init.d/usbhub-switch
```

```shell:/etc/init.d/usbhub-switch
#!/bin/sh /etc/rc.common

START=99
STOP=99

boot() {
    echo boot
    /root/bin/usbhub-switch.sh off
}

start() {        
    echo start
}                 

stop() {          
    echo stop
}
```

```shell-session
root@GL-AR150:~# chmod 755 /etc/init.d/usbhub-switch
root@GL-AR150:~# /etc/init.d/usbhub-switch enable
```

ダヴ Dash Buttonを押すと、バックカメラの映像を30秒間液晶モニタに表示するようにします。プレミアムレッド Dash Buttonを押すと、GL-AR150/OpenWRTをシャットダウンするようにします。
---


参考：

- [Amazon Dash ButtonをIoTボタンとして使う第三の方法：DHCPサーバ設定でスクリプトを起動する](https://qiita.com/hnw/items/f7172dd295f04701c38d)

:one: スマホのAmazonショッピングアプリでAmazon Dash Buttonの設定をします。

一時的にGL-AR150/OpenWRTをインターネットに接続できるようにします。
スマホもAmazon Dash Buttonも、**Wi-FiネットワークでGL-AR150/OpenWRTのWi-Fiアクセスポイントを指定します。**

具体的な設定方法は[ラズパイがないとAmazon Dash Buttonをハックできない、そんなふうに考えていた時期が私にもありました](https://qiita.com/somainit/items/00c4e9967ac4348a5501)の、**【設定→:two:Amazon Dash Buttonのセットアップ**】に書かれています。

:two: Amazon Dash ButtonのMACアドレスを調べます。

Amazon Dash Buttonを押すと、ARPテーブルにそのMACアドレスが登録されるので、それを控えます。どれかわからない場合は[MACアドレス検索](https://uic.jp/mac/)でチェックし、**Amazon Technologies Inc.**と出ればOKです。

```shell-session
root@GL-AR150:~# arp
IP address       HW type     Flags       HW address            Mask     Device
192.168.3.109    0x1         0x2         aa:aa:aa:aa:aa:aa     *        eth0
192.168.3.1      0x1         0x2         bb:bb:bb:bb:bb:bb     *        eth0
192.168.8.246    0x1         0x0         cc:cc:cc:cc:cc:cc     *        br-lan
192.168.8.247    0x1         0x0         dd:dd:dd:dd:dd:dd     *        br-lan
```

:three: Amazon Dash Buttonを押して、IPアドレスが新規割当または更新されたら、スクリプト**/root/bin/dnsmasq-script.sh**を実行するようにします。

```shell-session
root@GL-AR150:~# cp -p /etc/dnsmasq.conf /etc/dnsmasq.conf.org
root@GL-AR150:~# vi /etc/dnsmasq.conf
### Add 1 line at the end of the file ###
dhcp-script=/root/bin/dnsmasq-script.sh
```

:four: スクリプト**/root/bin/dnsmasq-script.sh**を作成します。

```shell-session
root@GL-AR150:~# vi /root/bin/dnsmasq-script.sh
```

```shell:/root/bin/dnsmasq-script.sh
#!/bin/sh

/bin/echo `/bin/date +"%F %T"` $* >> /tmp/dnsmasq.script.log

MAC_ADDR_DOVE="cc:cc:cc:cc:cc:cc"
MAC_ADDR_PREMIUM_RED="dd:dd:dd:dd:dd:dd"

if [ "$2" == ${MAC_ADDR_DOVE} -a "$4" == "WINC-00-00" ]; then
    /root/bin/usbhub-switch.sh on
    sleep 30
    /root/bin/usbhub-switch.sh off
elif [ "$2" == ${MAC_ADDR_PREMIUM_RED} -a "$4" == "WINC-00-00" ]; then
    /sbin/poweroff
fi
```

```shell-session
root@GL-AR150:~# chmod 755 /root/bin/dnsmasq-script.sh
```

:five: GL-AR150/OpenWrtを再起動し、ダヴ Dash Buttonを押したら、バックカメラの映像が液晶モニタに表示されるか確認します。更にプレミアムレッド Dash Buttonを押したら、GL-AR150/OpenWrtがシャットダウンされるか確認します。

```shell-session
root@GL-AR150:~# reboot
```

課題
---

- これでバックカメラが使えるようになりましたが、やはりDash Button **ひと押しなし**が便利です。これを何とか自動化させたいです。

これから
---

- GL-AR150/OpenWRTにL-02Cを繋げてLTE通信できる環境ができているので、まだまだいろんなことができそうです。(=^・^=)