iPhone X RasPiで外出先で使える高機能なモバイルルーターを自作する
この記事は Akerun Advent Calendar 2021 - Qiita の20日目の記事です。
ハードウェアグループの石井 @ishturk です
弊社フォトシンスが提供しているAkerun入退室管理システムは
- オフィス
- プライベートサロン
- シェアスペース
- 無人のフィットネスジム
- etc...
と、いろいろなところで使われています。安定したサービスを提供するべく開発部・カスタマーサクセス部で協力しています。
顧客から問い合わせがあった場合、設置先に出向いて調査することもしばしば発生します。
そんなときに使える便利ネットワークデバイスがあったらいいのにな ((=^♀^=))
こんなこといいな
( ³з³):PCをインターネットに繋げられて、設置している弊社機器に同一ネットワークになるといいな
( ³з³):あ、ネットワークはWi-Fiと有線どっちも
( ³з³):会社の携帯がiPhoneだからiPhoneのテザリングがいい
( ³з³):電源とれないこともあるので電池じゃないと
( ³з³):客先に行くのはエンジニアじゃないこともあるから、スクリプト仕込めるといい
レシピ
- ラズパイ(最近全然買えないので、眠っているストックを。。。) Raspberry Pi 3 Model B+ | Raspberry Pi 3 B+ | RS Components
- SDカード(適当に)
- モバイルバッテリー(10000mAh程度あれば3〜5時間くらいつかえます) cheero Power Plus 3 13400mAh | 《安全安心》cheero(チーロ)モバイルバッテリー
- 電源付きUSBケーブル(RasPi電源のおすすめ。今回はケーブル部分のみ使います) Raspberry Pi用電源セット(5V 3.0A)-Pi3フル負荷検証済
- ランプ・スイッチ(RasPiのシャットダウンに使います) ainex アイネックス KM-01 [実験用スイッチ・LEDセット] https://www.yodobashi.com/product/100000001000605327/
ラズパイケース(お好みのものを)
iPhone・Lightningケーブル(手持ちを)
できたらいいな
RasPiのiPhoneテザリング
Wi-FiはPCからの接続に使用したいので、USBテザリングを選択します。 Apple公式には iTunes が必要と書いています。が、ありがたいことにLinux向けにパッケージ開発されているので、それを使用します。
sudo apt-get install ipheth-utils libimobiledevice-utils ifuse usbmuxd sudo mkdir /media/iphone sudo ifuse /media/iphone
何度か抜き挿ししているとiPhone側に 「信頼する」のポップアップが出てくるので選択
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.20.10.3 netmask 255.255.255.240 broadcast 172.20.10.15 inet6 fe80::b3a4:f864:f44a:cbe prefixlen 64 scopeid 0x20<link>
eth1 として認識されました!
WiFi設定・ルーティング設定
hostapd と dnsmasq をインストール
sudo apt install hostapd dnsmasq
ポートフォワーディング、IPマスカレードなどを設定 このあたりは情報充実しているのでそのあたりを参照ください 有線とWiFiをどちらも使うためにハマりました。その記事はまたどこかで、、、、
また、ルーターとして機能させてるのであれば OpenWrtという選択も良いと思います。RaspberrPi向けにもイメージが配布されており、GUIで設定するだけでネットワークルーターを立ち上げることができます。
[OpenWrt Wiki] Welcome to the OpenWrt Project
今回は、サポート作業用のスクリプトを実行したいという事情があったため、より汎用的なRaspberryPiOSを採用しました。
シャットダウン機能
RaspberryPiは物理スイッチがついておらず、通電で起動しますが、シャットダウンする機能はハードウェア提供されていません。
電源ぶちぎりでもよいのですが、ここはちゃんと作りましょう。
今回はスイッチとパイロットランプで実現します。LEDは5Vそのままではとても眩しかったのでPWMで輝度を落としてます。 スイッチは内部プルアップでアクティブロー(スイッチ押下で0)にしてます。
#!/usr/bin/env python3 import RPi.GPIO as GPIO import time import os from multiprocessing import Process, Condition gpio_led = 18 gpio_sw = 24 GPIO.setmode(GPIO.BCM) # LEDピンを出力に設定 GPIO.setup(gpio_led, GPIO.OUT) GPIO.setup(gpio_sw, GPIO.IN, pull_up_down=GPIO.PUD_UP) c = Condition() def led(): pin = GPIO.PWM(gpio_led, 2000) pin.start(0) pin.ChangeDutyCycle(5) c.acquire() c.wait() c.release() def sw(): while True: sw = GPIO.input(gpio_sw) if sw == 0 : c.acquire() c.notify() c.release() break time.sleep(1) if __name__ == '__main__': p1 = Process(target=led) p2 = Process(target=sw) p1.start() p2.start() p1.join() p2.join() GPIO.cleanup(gpio_led) GPIO.cleanup(gpio_sw) os.system( "sudo shutdown -h now" ) time.sleep(1000)
完成
LEDとスイッチがぷらんぷらんしているので、このままではまだ持っていくのは難しいですね。 社内に3Dプリンタ(form3)が2台あるので、いい感じにケースを自作しても良さそうです。
株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 hrmos.co
Akerun Proの購入はこちらから akerun.com