【追記】Buffalo社のメディアにインタビューが掲載されました
ついに夢の【走るルータ】が実現!
Buffaloの無線ルータに履帯をつけて走らせることに成功したのでその報告を記事にしたためる。 「なぜルータでやるのか」それは私自身もよくわからないけれども、この記事を読んで少しでも笑ってもらえたなら嬉しい。
おことわり。
この記事に登場する無線ルータはファームウェアを書き換える改造を行っており、本体内部に持つPHYで電波を発すると法律に違反する可能性がある。 今回の記事内でルータから電波を飛ばしている部分はすべて、ルータに付けたUSB Wi-Fiドングル(単体で技適認証を受けた製品)から電波を発していることに注意いただきたい。 平たく言えば、USBドングルを挿した自作PCと同じ状態と思っていただければOKだ。
TOC
走るルータこそ男の夢。
日々世界の人々の暮らしを支えるネットワークルータ。ことに無線ルータに関しては、もはや一家に一台の普及率といっても全く過言ではない。 先日大変な反響があったルータにディスプレイを繋ぐ記事では、この身近なルータが1台のコンピュータとして活躍できる可能性を示せたが、 本記事はそこからさらに先、「人々の娯楽の対象としてのルータの可能性」について示したいと思う。
ところで、あなたはラジコンを操縦したことがあるだろうか?車、バイク、戦車に船。小学生の頃、ラジコンやミニ四駆を走らせてはしゃいでいた頃がきっとあることだろう。私も小学生の頃はバイクや車のラジコンで遊んでいた。しかし今はどうだろう?ラジコンの「ラ」の字もないような生活だ。あの頃遊んだラジコンたちは、少なくともすぐ取り出せる場所にはない。
しかし大きくなった今は技術がある。机には毎日のように改造して遊んでいるルータたちが並んでいる。 よく考えてみたら、ラジコンだってルータだって同じ電気回路の塊であり、違いといえば偶然その仕事が「走ること」か「パケットをさばくこと」かという程度しか無いじゃないか。 そこで私は思いついた。ルータをラジコンにしたらとっても面白いんじゃね? と。
どうやったら走るか掘り下げてみる。
何の変哲もないBuffaloの無線ルータを自走させるには何が必要だろうか?少し考えてみる。
1. 走るにはタイヤや履帯が必要
物理的に動くということは、タイヤや履帯(いわゆるキャタピラ)が不可欠だ。 どちらにするか悩んだが今回は「走破感」を出したかったので履帯にすることにした。これはタミヤのキットがちょうどいい。
2. 履帯を動かすにはモータが必要
履帯を付けても動かないと意味が無い。動力源のモータとギヤボックスもまた不可欠だ。これも履帯と同じくタミヤのキットでOK。 今回は変速なし・モータ1台の簡単なギヤボックスを使った。
3. モータを動かすには電源と制御回路が必要
モータは電池で回る。小学生の頃はそれでよかったが今走らせたいのはルータだ。乾電池では動かない。ルータ内部では5V・3VのDC/DCコンバータが搭載されていてここから色々電源をのばすのだが、大元の電源入力には12Vが加えられるため12Vの電源を得る必要がある。今日ではスマホ用モバイルバッテリーが安価な電源として普及しているため、これに秋月の5V→最大25V昇圧回路を組み合わせることで対処した。
電源は暫定的に確保したので、次はモータを前後に回す制御回路を考える。モータ制御ICがあれば楽勝なのだが残念ながら買い忘れてしまった。と、ここで高専の実験で学んだ「Hブリッジ回路」の記憶がよぎる。リレーやFETを使い、単一の電源でモータを前後転させることができる回路だ。この回路があれば、モータ制御ICなんて無くてもモータの制御ができる。本来はFETによるPWM制御が理想だが、今回は手間をかけたくなかったためリレーで組むことにした。
Hブリッジ回路では2つのリレーを制御するため、プログラマティックに変化させられる信号をルータ基板から得る必要がある。ここで使うのがGPIOだ。GPIOはGeneral Purpose Input Outputという正式名のとおり汎用な入出力に使える。ルータにおいては、電源ランプを光らせるための出力やモード切替スイッチからの入力にGPIOが使われているので、ここから信号を横取りすればよい。私の場合はUSBコネクタ横のLED(USB機器検知LED)とスライドスイッチが不要だったため、そのランド(ハンダが載っている部分)に0.3mmの銅線をはんだづけしてHブリッジ回路へとのばした。
4. モータ制御信号を操作するにはプログラムが必要
GPIOを制御することでモータを制御できるめどが立った。あとはGPIOをどうやって制御するかだが、これはPython 2
と Flask
と gpioctl
を組み合わせて実現することにした。
ルータをアクセスポイントにしそこからFlaskでラジコンのリモコンWebアプリを配信、スマホからFlask上のREST APIを叩くという構成である。
スマホを傾けたら前後に動くというコンセプトが前からあったので、JavaScriptでスマホの加速度センサの値をとりつつ、しきい値に達したらjQueryのajaxでルータ側のREST APIを叩くコードを書くのがよさそうだ。停止・回転の境界で暴れるのを防ぐため、しきい値にはヒステリシスを持たせシュミットトリガ動作とした。
前後進のAPIに相当するURLが叩かれると、Flaskからsubprocess
モジュール経由でgpioctlが呼び出される。gpioctlはGPIOの基本的な操作ができる単純なソフトだ。
そしてハードを作る。
構想は十分に練ったので、タミヤキットの組み立てからルータの改造・ソフト実装までを一気にやった。こうして出来た改造ルータの中身が以下の画像だ。 この画像を撮った後少々改良を加えたのだが、あまり変わらないので完成当時の写真で説明する。
足回り
おなじみタミヤのキットでできているので、走るルータは小学生でも再現可能だ。本体のスリムさと回路の簡単さを優先したため、前後進しかできないのはご愛嬌。旋回は次回作(あるのか?)でやりたい。なお、写真では分解を楽にするため一部のネジを取り外してある。
ルータ内部全体
AはHブリッジ基板、Bは5V→12V昇圧回路(キット)、Cはルータ基板。AとBは改造によって追加された基板だ。
Hブリッジ・昇圧回路
Hブリッジ回路は教科書に載っているお手本の回路とほぼ同じだが、ダイオードを付け忘れたためスナバ回路を欠いている。これは本当はお行儀が悪いので真似しないようにしよう。リレーの駆動はGPIOからの微弱な電流では不安定なため、トランジスタ2SC1815を使って駆動している。
昇圧回路は単につないだだけだ。念のため、出力端子部分に100μFのコンデンサをつけている。
ルータ基板 電源部
ルータの電源入力部に昇圧した12Vをつなぎ、あとは降圧された電圧をそれぞれ使う。モータの電源は元々ここから引っ張っていたが後の実験で通信が不安定になったため、昇圧前の電源から引っ張るよう変更した。
ルータ基板 GPIO部
上側の画像ではスライドスイッチからGPIOを得ている。一方下側の画像ではLEDからGPIOを得ている。細かいはんだ付けなのだが、先日購入した0.3mmポリウレタン銅線のおかげでランドに負荷を与えること無くはんだ付けできた。
さらにソフトウェアを実装する。
ハードが完成したので、ここからはソフトの実装に入ろう。相当切羽詰まっていたため、ソフトの実装は初お披露目となるlolカンファへ向かう新幹線の中で行った。2徹明けはマジで死ぬ。
動作は大体こんな感じ: ルータ内で起動しているサーバへスマホでアクセスするとjQueryでスマホの加速度を取り始める。y方向のベクトルがしきい値を超えたら前後進と停止のAPIへGETリクエストを送る。本当はフロントエンドも綺麗にしたいのだがそんな余裕はなかったため中身は大変簡単だ。 コードはこちらのサイトを参考にさせていただいた。
リポジトリを見ていただければわかる通りサーバはPython + Flask + Gunicornで実装している。ルータの起動時にサーバも起動して欲しいので、OpenWrtで使われる procd init script を追加で書いた。
当初はアプリのDaemonize手法としてSupervisorを採用し、実際にOpenWrtで動かせるようにしたのだが慢性的なメモリ不足に見舞われたため断念した。
走らせよう! @lolカンファ
Photo by id:nwpct1
完成直後、高専カンファレンスlol (通称lolカンファ)でお披露目となった。詳細は別記事に記した。 ここではまだ正常動作するWi-Fiドングルを手に入れてなかったため有線LANでのデモとなり、それの影響でスマホでのデモも叶わなかった。APIへのリクエストはMacからcurlにて行っている。
走るルータとそのあとバッテリーが落ちて叫ぶ @puhitaku 様子です。ご査収ください #kosenconf pic.twitter.com/AyBGdIKjZ8
— なっちゃん (@pndcat) 2016年4月30日
わたし『ルータ走らさないの』@puhitaku 「今、内部sshしてるから待って。そしたら携帯から操作できるから」 #kosenconf pic.twitter.com/WwPR3aOVF8
— なっちゃん (@pndcat) 2016年4月30日
走るルータ #kosenconf pic.twitter.com/jJYEuzhGvx
— ホテルバルティック(クローン)@築27年 (@noan6251) 2016年4月30日
本来お披露目したかった状態でデモできず悔いは残るが、当ブースの他の展示も含めて会場では大変な反響があり、様々な方に笑っていただくことができたので嬉しかった。lolなコンテンツの提供は大成功の内に終えることが出来た。
完璧な状態で走らせよう! @弊社オフィス
上のlolカンファの後にしっかり動作するWi-Fiドングル Buffalo WLI-UC-GNM2 を手に入れたため、このドングルをWi-Fiの親としスマホを接続した。 極小Wi-Fiドングルでありがちだが発熱はやはりひどく、USBコネクタの上面に小さなヒートシンクを付けることで対策した。まあ平均温度さえ下がってくれれば…
実は大半の加工はFULLER株式会社こと弊社の私のデスクで行っている。自分の環境を本当に自由に使わせてもらえる弊社に感謝だ。 完成後、何人かの先輩社員に実際に操縦体験してもらった。
まとめ
長年考えていた「ルータを走らせる」という目標を一定のクオリティで達成できて嬉しい。子供の頃のワクワクをルータで再現できたのは感慨深い。 次回作を作るとするなら次はタイヤでやりたい。やはり左右に曲がれなくては本当の「ラジコン」とは呼べないからだ。