車内でWi-Fiを利用するために当初はモバイルWi-FiルーターのFS030Wを車載してみましたが、電源がなかなかエンジンと連動してくれず。自動起動に失敗することが多いので、他の方法をいろいろと模索していたのですが。
ホームルーターのWiMAX HOME 02やSpeed Wi-Fi HOME L01だと確実に起動してくれるものの、本体やACアダプターがかさばって邪魔なのが気に入りませんでした。特にL01は消費電力が最大24Wもあるのが気に食わないです。まあ走行中の消費電力を実際に測定したわけではありませんが…
そこで自作ドライブレコーダーとして車載しているラズパイをLTEに対応させて、これをWi-Fiスポットとして運用することにしてみました。つまりモバイルWi-Fiルーターの自作です。
ラズパイならアクセサリーソケットから電源を取ることで確実にエンジンと連動して自動起動させることが可能ですし、消費電力はそこまで大きくありません。
また既にラズパイを持っているなら追加費用は3,000~5,000円程度で済むので、SIMフリーのホームルーターを購入するよりも低コストで自作することが可能です。
今回はラズパイにUSB型データ通信端末、USBモデムを接続してLTEや3Gといったモバイルネットワークで通信可能にするまでの方法を解説します。
なおLG製以外の端末だとまったく同じようにやっても上手くいかないかもしれません。特にUX302NCを使用する場合はこちらの記事も参照してください。
ラズパイでUSB型データ通信端末を使用するために必要な物
まずラズパイでUSB型データ通信端末を使用するために必要な物についてまとめておきます。
Raspberry Pi
ラズパイについては基本的にどのモデルでも構いません。
モバイルWi-Fiルーターとして使用するならWi-Fi機能が必要ですが、非搭載モデルでもUSB接続のWi-Fiアダプターで対応させることが可能です。
もっともUSBポートはUSB型データ通信端末で1基使用するので、無印のRaspberry Pi Zeroなどは向いていません。
またWi-Fiに対応しているRaspberry Pi Zero W/WHであっても、MicroUSBをフルサイズのUSB Standard-Aに変換するOTGケーブルが必要になる点については注意してください。
Raspberry Pi Zero W/WHのケースキットやスターターセットを購入すれば、必要な物はほぼ揃います。
ちなみに私は現在Raspberry Pi Zero WHを車載していますが、設定作業についてはとりあえずRaspberry Pi 3Bで行いました。またRaspberry Pi OSについてはLite版でもGUI版でも構いませんが、SSH接続で作業するのはモバイルネットワークの接続状態を確認するのが面倒なのでおすすめしないとは言っておきます。
USB型データ通信端末、USBモデム
ラズパイとは異なりUSB型データ通信端末、USBモデムの選択については注意が必要です。基本的にどの機種も公式に対応しているのはWindowsやMacだけで、Linuxについてはサポートされていません。
公式にサポートされていない機種でもLinuxや、LinuxのDebianをベースに開発されているRaspberry Pi OSで使用する方法はありますが、メーカーが公式に提供している手段ではないのでどの機種でも上手くいくとは限らないことに注意してください。
ググってみるとdocomoから発売されたL-03FやL-03D、L-02CといったLG製端末の動作報告が非常に多く、実際に私はL-03Fであっさりと通信することに成功しました。
Huawei製端末やZTE製端末でも動作報告はありますが、白ロムの入手しやすさ的にもLG製のL-03FかL-03Dをおすすめします。
docomoのクアッドバンドLTEに対応しているL-03Fがおすすめ
スペック的にはL-03Fが圧倒的におすすめです。docomoのクアッドバンドLTEに対応しているので、全国の広範囲なエリアで高速通信が可能です。
L-03DはLTEが2GHz帯、Band1しか対応していませんが、3GについてはFOMAプラスエリア、いわゆるプラチナバンドに対応しています。通信速度にこだわらなければ、サービスエリア的にはL-03Dでも十分でしょう。
ただしdocomoの3Gは2026年3月に停波する予定です。停波するよりも先に端末が壊れてしまいそうな気がしなくもないですが、一応ご注意を。
L-03Dと比べるとL-03Fは白ロムの流通量が少なく、価格もやや高めだったりしますが、記事公開時点ではイオシスにいくつか在庫があるので、定期的にチェックしてみると良いかもしれません。
ラズパイでUSB型データ通信端末のL-03Fを使用する方法
まずはラズパイにUSB型データ通信端末を接続して、LTEや3Gといったモバイルネットワークに接続するための設定を行います。
ラズパイにUSBモデムとして認識させる
ラズパイのUSBポートにUSB型データ通信端末を接続するだけでUSBモデムとして認識してくれれば良いのですが、実際にはCD-ROMとして認識されてしまうことが多いようです。私が使用したL-03FもCD-ROMとして認識されました。
USBモデムとして認識されてるかどうかはdmesgコマンドで確認することが可能です。
$ dmesg [5.112660] usb 1-1: New USB device found, idVendor=1004, idProduct=6367, bcdDevice= 0.00 [5.119000] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [5.122298] usb 1-1: Product: docomo L03F [5.125476] usb 1-1: Manufacturer: NTT DOCOMO, INC. [5.150982] usb-storage 1-1:1.0: USB Mass Storage device detected [5.168494] scsi host0: usb-storage 1-1:1.0 [6.250112] scsi 0:0:0:0: CD-ROM LG Autorun 2.00 PQ: 0 ANSI: 0 ・ ・ ・ [19.902250] sr 0:0:0:0: [sr0] scsi-1 drive [19.902277] cdrom: Uniform CD-ROM driver Revision: 3.20 [19.944394] sr 0:0:0:0: Attached scsi CD-ROM sr0
ここでCD-ROMにsr0という文字列が割り当てられていることを一応確認しておいてください。環境によってはsr1などになっている可能性があるかも…?
このようにCD-ROMとして認識されている場合はejectコマンドで取り出すことでUSBモデムとして認識されます。
Lite版のRaspberry Pi OSを使用している場合はまずejectを使えるようにしましょう。
$ sudo apt-get install eject
下記のコマンドでejectを実行します。
$ eject sr0
USBモデムとして認識されたらlsusbコマンドを実行してidVendorとidProduct、2つのIDの値を確認しておいてください。
ejectの前後でidProductの値が少し変わっているはずです。L-03Fなら1004:6367から1004:6366に変わります。
$ lsusb Bus 001 Device 005: ID 1004:6366 LG Electronics, Inc. Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
次にmodproveコマンドでUSBモデムをカーネルモジュールとして組み込みます。
vendorとproductの値の末尾4桁は先ほど調べたIDの値です。使用する機種によって適宜書き換えてください。
$ sudo modprobe usbserial vendor=0x1004 product=0x6366
無事組み込まれると/dev/ttyUSB*といったファイルが1個以上生成されているはずです。
下記のコマンドで該当するデバイス名が1個以上表示されるか確認してみましょう。
$ ls -l /dev/ttyUSB* crw-rw---- 1 root dialout 188, 0 8月 22 23:27 /dev/ttyUSB0 crw-rw---- 1 root dialout 188, 1 8月 22 23:27 /dev/ttyUSB1 crw-rw---- 1 root dialout 188, 2 8月 22 23:27 /dev/ttyUSB2
ttyUSB0の1つしか生成されていなければ分かりやすいのですが、L-03FだとttyUSB1とttyUSB2も存在しました。L-03Fだと基本的にはttyUSB1がUSBモデムとして動作するようですが、環境によっては変わるかもしれません。
デバイス名を固定する方法は後述するので、今は下記のQiitaの記事を参考にttyUSB1のbNumEndpointsとbInterfaceNumberを調べて控えておきましょう。
$ lsusb -d 1004:6366 -v | grep "bNumEndpoints" Couldn't open device, some information will be missing bNumEndpoints 2 bNumEndpoints 3 bNumEndpoints 3
$ lsusb -d 1004:6366 -v | grep "bInterfaceNumber" Couldn't open device, some information will be missing bInterfaceNumber 0 bInterfaceNumber 1 bInterfaceNumber 2
wvdialを設定して手動でモバイルネットワークに接続する
ここでwvdialをインストールして、ひとまず手動でモバイルネットワークに接続してみます。
$ sudo apt-get install wvdial
wvdialをインストールしたら、使用する機種やAPNに合わせて設定ファイルを編集します。
$ sudo nano /etc/wvdial.conf
[Dialer Defaults] Phone = *99***1# APN = open.mopera.net Username = mopera Password = mopera New PPPD = yes Stupid Mode = yes Init1 = ATZ Init2 = AT+CGDCONT=1,"IP","open.mopera.net" Init3 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 Dial Attempts = 3 Modem Type = Analog Modem Modem = /dev/ttyUSB1 Dial Command = ATD Baud = 460800 ISDN = 0 Carrier Check = no
APN、Username、Password、Init2、Modemの項目は各自書き換えてください。
ちなみにdocomoのmoperaに接続する場合、通常はユーザー名とパスワードは空欄でOKですが、ここでは何かを入力しておかないとエラーを吐くので両方moperaと設定してます。
先ほどのQiitaの記事だとAuto DNSやCheck Def Routeといった項目も記述していたのですが、これがあると上手くいかなかったので私は省略しました。
設定が済んだら、wvdialを実行してラズパイをモバイルネットワークに接続してみましょう。
$ sudo wvdial --> WvDial: Internet dialer version 1.61 --> Cannot get information for serial port. --> Initializing modem. --> Sending: ATZ ATZ OK --> Sending: AT+CGDCONT=1,"IP","open.mopera.net" AT+CGDCONT=1,"IP","open.mopera.net" OK --> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 OK --> Modem initialized. --> Sending: ATD*99***1# --> Waiting for carrier. ATD*99***1# CONNECT --> Carrier detected. Starting PPP immediately. --> Starting pppd at Sat Aug 22 23:52:45 2020 --> Pid of pppd: 1260 --> Using interface ppp0 --> local IP address xx.xxx.xxx.xxx --> remote IP address xx.xx.xx.xx --> primary DNS address xxx.xxx.xxx.xxx --> secondary DNS address xxx.xxx.xxx.xxx
このようなログが流れてIDアドレスが払い出されたら成功です。Wi-Fiや有線でLANに接続しなくても、インターネットを利用することが可能になります。
試しにもう1つコンソール画面を立ち上げてIPアドレスを確認してみてください。ppp0というインターフェースが追加されているはずです。
$ ip a ・ ・ ・ 5: ppp0:mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 3 link/ppp inet xx.xxx.xxx.xxx peer 10.64.64.64/32 scope global ppp0 valid_lft forever preferred_lft forever
Ctrl+Cやコンソール画面を閉じると切断されるので注意してください。またラズパイを再起動させるとejectやカーネルモジュールの読み込みもその都度やり直す必要があります。
手動でモバイルネットワークに接続することに成功したら、ラズパイの起動と同時に接続したり、USB型データ通信端末を抜き差ししても自動的に再接続されるように設定していきましょう。
udevを設定してラズパイにUSBモデムの接続を自動的に検知させる
Linuxにはデバイスが接続されたことを検出して、デバイスファイルの作成や削除を実行するudevという仕組みがあります。
このudevを利用して、ラズパイにUSB型データ通信端末が接続されたらUSBモデムとして認識させ、カーネルモジュールとして読み込むところまで自動的に実行させます。
ついでにカーネルモジュールのデバイス名が変わることがないように、任意の文字列に固定するのもudevで行っておきます。
wvdialの実行についてはsystemdで管理するので、とりあえずここまでの内容をudevのルールファイルに記述しましょう。ルールファイルの名前は「数字-文字列」の構成で設定してください。
ルールファイルの作成についてはこちらのブログ記事を参考にさせていただきました。
ルールファイルの名前は「数字-文字列」の構成で保存すればOKです。
$ sudo nano /etc/udev/rules.d/99-usbmodem.rules
完成系はこのような感じになります。
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6367", RUN+="/usr/bin/eject /dev/sr0" ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6366", RUN+="/sbin/modprobe usbserial vendor=0x1004 product=0x6366" KERNEL=="ttyUSB*", ATTRS{../idVendor}=="1004", ATTRS{../idProduct}=="6366", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="01", SYMLINK+="ttyUSBModem", GROUP="usb", TAG+="systemd", ENV{SYSTEMD_WANTS}="usbmodem.service"
1行目でCD-ROMのejectを行います。ejectする前なのでidProductは6367です。
2行目でカーネルモジュールとして読み込みます。ejectされた後なのでidProductは6366です。
3行目でttyUSB1を指定してデバイス名をttyUSBModemに固定、さらにsystemdのサービスと依存関係を持たせます。こうしておくとudevでUSBModemを検知したことをトリガーに、systemdでwvdialを自動実行させることが可能です。最後のサービスファイルの名前は任意で構いません。
ここで一旦ラズパイを再起動して、systemctlコマンドでUSBモデムが認識されているかどうか確認してみましょう。
$ systemctl --type=device --all dev-ttyUSB0.device loaded active plugged docomo_L03F dev-ttyUSB1.device loaded active plugged docomo_L03F dev-ttyUSB2.device loaded active plugged docomo_L03F dev-ttyUSBModem.device loaded active plugged docomo_L03F
数十行表示される中にdev-ttyUSBModem.deviceが含まれていればOKです。
次に作成したルールファイルと依存関係になるsystemdのサービスファイルを作成します。
systemdを設定して自動的にモバイルネットワークに接続させる
$ sudo nano /etc/systemd/system/usbmodem.service
ルールファイルに記述した名前のサービスファイルを作成して、systemdに登録します。
[Unit] Description = USBModem Service Requires = dev-ttyUSBModem.device After = dev-ttyUSBModem.device [Service] Type = simple Restart = always ExecStart = /usr/bin/wvdial
今回はUSBモデムの検知に依存するので[Install]セクションは記述しません。
[Unit]セクションでプロセスの依存関係と起動順を定義しておきます。サービスを必ず実行するためにはRequiresを記述しておきましょう。またUSBモデムを検知してからwvdialを実行するので、起動順はAfterです。
[Service]セクションのTypeはデフォルトのsimple、Restartもalwaysで良いでしょう。
サービスファイルを作成したら、ラズパイを再起動すると自動的にモバイルネットワークに繋がるはずです。
またラズパイが起動している状態でUSB型データ通信端末を抜き差ししても、自動的にUSBモデムとして認識し直されてモバイルネットワークにも再接続されます。再接続されるまで少し時間はかかりますが、手動でコマンドを打つよりは断然楽です。
何回かスピードテストを行ってみたところ、通信速度は上下ともに10~20Mbpsくらい出ていました。これなら音楽どころか動画のストリーミング再生も余裕ですね。十分過ぎます。
以上、これでWi-Fiがない環境でも簡単にラズパイをインターネットに繋ぐことが可能になりました。さらにモバイルネットワークに接続したラズパイからWi-Fiを飛ばせば、Wi-Fiスポットとして運用することが可能です。
ラズパイをホットスポット化する方法についてはまた別記事で。
まとめ
ラズパイで車載用のモバイルWi-Fiルーターを自作するために、まずはUSB型データ通信端末を使用してモバイルネットワークに接続するところまでやってみました。
L-03FやL-03Dなら中古の白ロムが格安で手に入るので、既にラズパイを車載しているなら追加費用はそれほどかからないですし、なるべく安く車にWi-Fiを導入したい場合におすすめです。
コメント