SHIINBLOG

読者です 読者をやめる 読者になる 読者になる

走るBuffaloルータを作った。

f:id:puhitaku:20160514232222j:plain

ついに夢の【走るルータ】が実現!

Buffaloの無線ルータに履帯をつけて走らせることに成功したのでその報告を記事にしたためる。 「なぜルータでやるのか」それは私自身もよくわからないけれども、この記事を読んで少しでも笑ってもらえたなら嬉しい。

おことわり。

f:id:puhitaku:20160514220809j:plain:right:w250 この記事に登場する無線ルータはファームウェアを書き換える改造を行っており、本体内部に持つPHYで電波を発すると法律に違反する可能性がある。 今回の記事内でルータから電波を飛ばしている部分はすべて、ルータに付けたUSB Wi-Fiドングル(単体で技適認証を受けた製品)から電波を発していることに注意いただきたい。 平たく言えば、USBドングルを挿した自作PCと同じ状態と思っていただければOKだ。

TOC

走るルータこそ男の夢。

f:id:puhitaku:20160514234431j:plain:right:w250

日々世界の人々の暮らしを支えるネットワークルータ。ことに無線ルータに関しては、もはや一家に一台の普及率といっても全く過言ではない。 先日大変な反響があったルータにディスプレイを繋ぐ記事では、この身近なルータが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 2Flaskgpioctlを組み合わせて実現することにした。 ルータをアクセスポイントにしそこからFlaskでラジコンのリモコンWebアプリを配信、スマホからFlask上のREST APIを叩くという構成である。

スマホを傾けたら前後に動くというコンセプトが前からあったので、JavaScriptでスマホの加速度センサの値をとりつつ、しきい値に達したらjQueryのajaxでルータ側のREST APIを叩くコードを書くのがよさそうだ。停止・回転の境界で暴れるのを防ぐため、しきい値にはヒステリシスを持たせシュミットトリガ動作とした。 前後進のAPIに相当するURLが叩かれると、Flaskからsubprocess モジュール経由でgpioctlが呼び出される。gpioctlはGPIOの基本的な操作ができる単純なソフトだ。

そしてハードを作る。

構想は十分に練ったので、タミヤキットの組み立てからルータの改造・ソフト実装までを一気にやった。こうして出来た改造ルータの中身が以下の画像だ。 この画像を撮った後少々改良を加えたのだが、あまり変わらないので完成当時の写真で説明する。

足回り

おなじみタミヤのキットでできているので、走るルータは小学生でも再現可能だ。本体のスリムさと回路の簡単さを優先したため、前後進しかできないのはご愛嬌。旋回は次回作(あるのか?)でやりたい。なお、写真では分解を楽にするため一部のネジを取り外してある。 f:id:puhitaku:20160515171032j:plain

f:id:puhitaku:20160515171051j:plain

ルータ内部全体

f:id:puhitaku:20160512022426j:plain

AはHブリッジ基板、Bは5V→12V昇圧回路(キット)、Cはルータ基板。AとBは改造によって追加された基板だ。

Hブリッジ・昇圧回路

f:id:puhitaku:20160514231121j:plain

Hブリッジ回路は教科書に載っているお手本の回路とほぼ同じだが、ダイオードを付け忘れたためスナバ回路を欠いている。これは本当はお行儀が悪いので真似しないようにしよう。リレーの駆動はGPIOからの微弱な電流では不安定なため、トランジスタ2SC1815を使って駆動している。

昇圧回路は単につないだだけだ。念のため、出力端子部分に100μFのコンデンサをつけている。

ルータ基板 電源部

f:id:puhitaku:20160515001107j:plain

ルータの電源入力部に昇圧した12Vをつなぎ、あとは降圧された電圧をそれぞれ使う。モータの電源は元々ここから引っ張っていたが後の実験で通信が不安定になったため、昇圧前の電源から引っ張るよう変更した。

ルータ基板 GPIO部

f:id:puhitaku:20160515001829j:plain

f:id:puhitaku:20160515002138j:plain

上側の画像ではスライドスイッチからGPIOを得ている。一方下側の画像ではLEDからGPIOを得ている。細かいはんだ付けなのだが、先日購入した0.3mmポリウレタン銅線のおかげでランドに負荷を与えること無くはんだ付けできた。

さらにソフトウェアを実装する。

ハードが完成したので、ここからはソフトの実装に入ろう。相当切羽詰まっていたため、ソフトの実装は初お披露目となるlolカンファへ向かう新幹線の中で行った。2徹明けはマジで死ぬ。

github.com

動作は大体こんな感じ: ルータ内で起動しているサーバへスマホでアクセスするとjQueryでスマホの加速度を取り始める。y方向のベクトルがしきい値を超えたら前後進と停止のAPIへGETリクエストを送る。本当はフロントエンドも綺麗にしたいのだがそんな余裕はなかったため中身は大変簡単だ。 コードはこちらのサイトを参考にさせていただいた。

リポジトリを見ていただければわかる通りサーバはPython + Flask + Gunicornで実装している。ルータの起動時にサーバも起動して欲しいので、OpenWrtで使われる procd init script を追加で書いた。

gist.github.com

当初はアプリのDaemonize手法としてSupervisorを採用し、実際にOpenWrtで動かせるようにしたのだが慢性的なメモリ不足に見舞われたため断念した。

走らせよう! @lolカンファ

f:id:puhitaku:20160515161452j:plain

Photo by id:nwpct1

完成直後、高専カンファレンスlol (通称lolカンファ)でお披露目となった。詳細は別記事に記した。 ここではまだ正常動作するWi-Fiドングルを手に入れてなかったため有線LANでのデモとなり、それの影響でスマホでのデモも叶わなかった。APIへのリクエストはMacからcurlにて行っている。

本来お披露目したかった状態でデモできず悔いは残るが、当ブースの他の展示も含めて会場では大変な反響があり、様々な方に笑っていただくことができたので嬉しかった。lolなコンテンツの提供は大成功の内に終えることが出来た。

完璧な状態で走らせよう! @弊社オフィス

vine.co

上のlolカンファの後にしっかり動作するWi-Fiドングル Buffalo WLI-UC-GNM2 を手に入れたため、このドングルをWi-Fiの親としスマホを接続した。 極小Wi-Fiドングルでありがちだが発熱はやはりひどく、USBコネクタの上面に小さなヒートシンクを付けることで対策した。まあ平均温度さえ下がってくれれば…

実は大半の加工はFULLER株式会社こと弊社の私のデスクで行っている。自分の環境を本当に自由に使わせてもらえる弊社に感謝だ。 完成後、何人かの先輩社員に実際に操縦体験してもらった。

まとめ

長年考えていた「ルータを走らせる」という目標を一定のクオリティで達成できて嬉しい。子供の頃のワクワクをルータで再現できたのは感慨深い。 次回作を作るとするなら次はタイヤでやりたい。やはり左右に曲がれなくては本当の「ラジコン」とは呼べないからだ。

参考ページ

ameblo.jp

モータドライブ編

lolカンファでブース発表してきた + kosen10s LT#04行ってきた。

はてさてようやく記事になった。

先日明石高専にて開催された高専カンファレンス 101lol (通称: lolカンファ)と、kosen10sのLT会である「LT#04」に参加してきた。

とはいっても仕事とカンファ準備とでたてこんでいてほぼ2徹状態だったので案の定大事故が発生。 カンファについては結局ブース発表をするためだけに行った感じになってしまったのは悔やむところ。

とりあえずカンファの発表内容については10sメンツのもの以外では「しおみさんだけがいない会社」ぐらいしか知らないので、 報告記事を書いてる他の皆さんにお任せしたいと思う。記事末尾にリンク掲載。とりあえずカレーメシパイセン id:nwpct1 の発表は後で見たけどすごかった。

なお、今回のブース発表で展示したもののうち「走るルータ」については別に製作記事を書いたのでそっちも読んでもらえると嬉しい。

お家芸のカンファブース展示。

今回は「A Whole New Router World」と題して、その名の通り空飛ぶじゅうたん改造ルータの展示を行った。 自分ではまったく写真を撮る暇がなかったので、主になっちゃん id:marin72_com の写真をお借りしつつ紹介する。

続きを読む

SupervisorをOpenWrtで使ってみる

プログラムを簡単にDaemonizeできることで人気のSupervisorをOpenWrtでも使ってみた。

インストール

SupervisorはPure-Pythonで書かれているのでインストールは簡単。python-pipを入れると依存関係でPythonが全部入る。本当はPython 3を使いたいのだが、opkgにPILとかも揃っている (python-imglib)関係で仕方なくPython 2を使っている。

opkg update
opkg install ca-certificates python-pip
pip install supervisor
続きを読む

BuffaloルータをPCディスプレイにつなげた。

f:id:puhitaku:20160118225834j:plain

先日、Buffaloの無線ルータ WZR-450HP にDisplayLink社のUSBグラフィックスアダプターを接続して、PCモニタにshellを表示することに成功したのでそれまでの道のりを紹介しようと思う。 実験記録みたいな感じなので、単にアダプタを接続するためのHowToではないことに注意。とにかく語りたいだけ(笑)

この記事の内容は、先日弊社で開催のFULLER エンジニアミートアップで発表した未完成のスライドおよびkosen10sLT #03で発表したスライド(下記)と同一だが、内容を時間の都合で多少端折っていたので、この記事では発表でしゃべらなかった細かい所も詳細に語りたいと思う。

www.slideshare.net

事前におことわりしておくが、私は電波法を侵さないよう細心の注意を払いながら、要は電波を飛ばさないようにしてこのハックを行っている。 改造後も内蔵のPHYは使わず、外付けのUSB Wi-Fiドングル(単体で技適認定を受けた製品)をルータに接続してWi-Fiを利用している。アンテナをぶっ挿している事もあるが、その場合はすべて演出もしくは無改造のルータであることに注意頂きたい。

続きを読む

kosen10s LT #03 行ってきたぞい

f:id:puhitaku:20160202210718p:plain

kosen10s LT#03、第3回目!!

やっぱり完全同級オンリーイベは最高ですね。ムズカシイ緊張をしなくてすむってとこが。 参加者は過去最高の19人(!!)Slackもガンガン賑わってきてるところで、コミュニティの拡大を感じます。

今回も前回と同じくHiveShibuyaで開催。場所・ピザ共々岡山さん・木下さんありがとうございます!

f:id:puhitaku:20160130141345j:plain

続きを読む

高専カンファ100 in 東京に行って、聴いて、学んだ。

f:id:puhitaku:20151220121118j:plain

昨日・今日(2015年12月19日〜20日)と高専カンファ100 in 東京に参加しました! 本来なら発表レポを書くべきなんですがそれは他の方々の記事に任せるとして、今回はカンファの途中にハッとしたことを書くことにします。

続きを読む

「 ウォークゲームハッカソン in SABAE」 に参加してきました。

行ってきたぜ鯖江!!

f:id:puhitaku:20150822093546j:plain

福井県鯖江市のjig.jp本社にて「ウォークゲームハッカソン」に参加してきました。

「ウォークゲーム」はjig社の作った言葉で、「位置情報やセンサー情報などを使いながら実際に体を動かして遊ぶボードゲーム風のゲームのこと」を意味するらしいです。

ちなみに行きも帰りも(切符的な意味で)青春して、でなり君 ( id:denari01 )の家に2泊させてもらいました。マジでありがとう!!

続きを読む

Cloud LaTeXとShareLaTeX、どっちがいい?

ローカルにTeX環境を入れる必要がなく、オンラインでTeXが書ける便利サイトとして代表的なものに、

の2つがある。

私は去年吟味した結果ShareLaTeXを使っていて、卒業論文は「すべて」このShareLaTeXで書きあげたのだが、先日kosen10sのLT会に行った時にまるさ君が「Cloud LaTeX使ってる人いない?」と言っていたので、ShareとCloudの比較をしてみることにした。

機能の比較をするだけなら他サイトがやっているし、本当に必要なのは「ちゃんとしっかり使えるのか」というところだから、今日は両方使ってみてなぜShareLaTeXに軍配が上がったかを詳細に書きたいと思う。

あとお断りとして、私は普段XeLaTeXの方のみを使っているため、基本的にXeLaTeXベースの比較になる。より一般的なpLaTeXとは比較結果が異なる可能性もあるので注意してほしい。

続きを読む

kosen10s LT #01 に参加してきたゾ

kosen10sは、2010年に高専に入学した高専出身のみんなで集まるコミュニティです。 昨日(2015/5/4)は、そんなkosen10sでLT会が開かれたので参加してきました。そこで発表した内容と感想を書き記しておきます。

EDIT (20150518): みんなの記事へのリンクを更新しました。

なお、公式の説明では

高専をついこの間卒業したイケてる人たちでLT会!

本イベントは2010年に高専に入学され、「順調であれば」つい先日本科を卒業された高専出身者で集まってLT会をするものです

という感じになってます。

まずはじめに、会場手配などを率先してやってくれたでなり君(id:denari01)やなっちゃん(id:marin72_com)をはじめとする皆さん、本当にありがとう&お疲れ様でした!

続きを読む

Pythonでブルックスコーヒーの豆価格をスクレイプする

Python初のHTMLパース・スクレイプに挑戦した結果、Beautiful Soupが鼻血が出そうなぐらい便利だったのでいきさつを書き記しておく。

発端

昨日(4/14)、研究室で先生がコーヒー豆が高くなった話をしていた。

先生「いや~ブルックスのコーヒー豆の価格が上がっちゃってさ、前なんかモカは800円ぐらいだったのに今は1250円だよ。」

ぼく「めっちゃ上がってますね。ドリップ1回あたりのお金も高くなっちゃいますね。」

うちの研究室では、使った豆の分だけお金を払えば自由にコーヒーを飲むことができる。豆を挽くミルだけでなく、ハリオ V60やサイフォンまで揃ったとてもよい環境だ。 ドリップ1回に使う豆の量はどの方法でも大体20[g]と変わらないが、豆の価格が変わるとドリップ1回で払う金額も変わってくる。

ぼく「こうもレートが乱高下すると、いくら払えばいいのかその都度計算しないとわからないですね。」

先輩「豆のレートの表示板とかあればいいんじゃね?」

ぼく「あ~それ面白そうですね!」

レートの表示板、面白そうだ。なんだか銀行の為替表示板みたい。

ハードづくりとかアイデアは広がるが、とりあえずブルックスのHPからコーヒー豆の価格をスクレイプしてみることにした。ちなみに、ブルックスはWeb APIなどは公開していなかった(当たり前)。

続きを読む