Network Cameraを作ってみよう(1) Ethernetのハンドリング

とりあえず動くことが判ったら、その先のステップだ。今回はCookbookのサンプルを組み合わせて、Network Cameraを作ってみたいと思う。先にもちょっと触れたが、mbed.orgにはCookbookというページがある。要するに料理本で、mbedを使って「こんなものがこんな風に作れます」というサンプルである。いくつか眺めていると、シリアルポート経由で使えるカメラはなかなか面白そうである。

ただここのサンプルは、撮影した画像をSDメモリに保存するというもので、ちょっとこのままだと面白くない。そこでもう1ひねりし、mbed上でWebサーバを動かし、ここで画像ファイルを見られるという方法にした。つまりカメラで撮影した画像はEthernet経由で、離れた場所からWebブラウザで閲覧できるという仕組みだ。

さて、方向性が決まったので実際に部品を繋ぐところから始めよう。まずはEthernetだ。先にも書いたとおり、mbedはEthernetのコントローラを内蔵しており、あとはコネクタだけ取り付ければ動作する。このコネクタだが、大別して2種類ある。パルストランス内蔵タイプと非内蔵タイプである。内蔵タイプは、例えば秋月電子通商ならば300円で販売されている(Photo09~11)。

Photo07:秋月電子通商で購入したパルストランス内蔵モジュラジャック

Photo08:フロントから。PCのバックパネルなどでよく見かける、Link/ActのLEDがついたタイプ。もっともこのLEDの点滅も当然自分でやらねばいけないので、面倒ならば端折ってもいい

Photo09:裏面はこんな感じ。信号8本以外に(ちょっと見えにくいが)LED用の配線が4本出ている

Photo10:CK-18。これは千石電商で610円で購入。同社のオンライン通販ページではなぜか出てこないが、「サンハヤト CK-18」で検索すれば通販しているショップは一杯見つかるので困らない筈

Photo11:このキットは2つで1パッケージなので、ちょっと余る。基板手前にRJ-45ジャックが、奥にピンがそれぞれはんだ付けできる仕組み。これを使えば簡単にリード線を引っ張り出せる

一方パルストランス無しのものなら、例えば秋月電子通商だと100円のものがある。ただこれは(パルストランス付のものも同じだが)基板実装用なので、はんだ付けはちょっと面倒である。ちょっと値段は上がるが、サンハヤトのモジュラ用変換基盤「CK-18」を使うと、比較的簡単にはんだ付けができるだろう(Photo10,11)。もっと安く上げたい、というのであればそこらへんに落ちているであろうEthernetのケーブルを適当に切って、直接mbedに取り付けて使うことも可能だ。

ところで「ではパルストランスって何?」という話であるが、これは外部からのノイズなどの保護用である。Ethernetは10/100BASE-Tの場合、最大100mのケーブルを引っ張ることが想定されており、当然これだけ長いと色々なノイズが入ってくることが考えられる。こうしたノイズから内部のEthernetのコントローラを保護するためのものがパルストランスである。逆に言えば、実験用に短い距離しか繋がない、というのであればパルストランス無しでも使うことは可能である。筆者の場合は、一応両方試してちゃんと動作することを確認したが、このあたりはお好きなほうを、ということになる。

さて実際の配線である。ここで参考になるのはmbedのEthernet Testingである。このページで想定しているのはSPARKFunの「PRT-08534」で、秋月電子通商で販売されているのはPulseの「J0011D21B」である。両者は機械的構造が若干異なるものの、電気的には同一とみなして使うことができる。

まずパルストランス付の方をご紹介しよう。こちらの場合、図1の様な配線となる。今回の場合、手持ちのユニバーサル基板の余っていたところに1~8ピンを差込み(図1で判るとおり千鳥足構造なので、これを適当に曲げた)はんだ付けで配線を取り付け、ユニバーサル基板のほうにパーツを取り付け、そこから更にリードを出すという形で配線を行った(Photo12,13)。

Photo12:上から見た図。2本の抵抗とコンデンサが見える

Photo13:裏面はこんな感じ。お世辞にもキレイとはいえないので、このあたりは各人工夫していただければ、と思う

図1 パルストランス付とmbedの配線図

パルストランスなしのケースは更に簡単だ。配線は図2の用になる。要するにTX/RXのペア、合計4本の配線だけである。まず、付属の基板にコネクタを取り付けてはんだ付けする(Photo14)。

Photo14:とりあえずコネクタ側のはんだ付けを終えた直後。右下に見えているのが、ガイドの両側に1cmほど飛び出したピンである。これは40本が繋がった状態で100円程度で売られているので、ここから4本ずつのものを2つ切り出して、反対側(写真で言えば左上)に取り付ける

図2 パルストランスなしとmbedとの配線図

ついで、付属のピンではなく、足の長いピンを用意してこれを取り付け(Photo15)、突き出した先にやはりユニバーサル基板の余りを取り付けて、そこからリード線を引っ張り出した(Photo16)。

Photo15:付属基板に足の長いピンをはんだ付けした後の状態。ここにユニバーサル基板をかぶせる形

Photo16:配線完了の図

どちらを選んでも良いし、はんだ付けがちょっと…という人は、先に紹介した☆board Orangeなどを使っても良い。配線が完了したら、いよいよプログラミングである。

Ethernet Testerを使う前に、シリアルコンソールを準備しておく。まずこちらのページに飛び、このページからリンクされているWindows serial driverをダウンロードし、インストールを行う。インストール中に警告メッセージが出る(Photo17)が、これは無視してよい。インストールが終わると、あたらしいCOMポートが出現している筈だ(Photo18)。こちらはデバッグ用に利用する。

Photo17:このメッセージは、筆者の環境(Windows XP Professional)では2回出現した

Photo18:mbed Serial PortがCOM8:として出現しているのが判る

シリアルコンソールが準備できたら、いよいよ本番である。まずブラウザで、Ethernet Testerのページを開く(Photo19)。このページの真ん中に"Import this program"というリンクがあるので、これをクリックすると、こんなページが出現する(Photo20)。

Photo19:タブブラウザならば、これもただのクリックではなく"新しいタブで開く"にしたほうが便利

Photo20:ここではEtherTesterのプログラムを自分のワークスペースに取り込むという指定になる。他に、中央ペインのリストにある諸々のプログラムやライブラリを取り込むことも可能

ここで"Import"ボタンを押すと、自分のワークスペースに、プログラム(main.cpp)と必要なライブラリが自動的に取り込まれる。ついで、上にある"Compile"ボタンを押すと、プログラムや必要なライブラリを全部コンパイルする。問題がなければリンクが行われ、EthernetTesterのプログラムがダウンロードされる(Photo22)。

Photo21:自分のワークスペースにEthernetTesterが取り込まれた状況

Photo22:このコンパイルとかリンクはWebブラウザ上で動いているわけで、実際はそんなわけでmbed.org側でコンパイルやリンクを行っているわけだ。これが正常に終わると、そんな訳で完成したプログラムがファイルのダウンロードという形で落ちてくる

これを先ほどのHello World!と同じようにmbedにコピーしてリセットしてみよう。問題がなければMovie02のように、LED1→LED2→LED3と点滅してゆき、最後に全部点灯するはずだ。

動画
Movie02(flv形式 846KB 7秒)

このプログラムは簡単なEthernetのテスタであり、内部には非常にシンプルなWebブラウザが実装されている。IPアドレスはDHCPで取得される。ためしにWebブラウザでアクセスしてみると、こんな画面が表示される(Photo23)筈だ。

Photo23:DHCPでどんなIPアドレスが振られたか、はルータの設定画面から確認する。筆者の環境だと192.168.1.126がmbedに振られていた。日付がでたらめなのは、そもそも日付設定を行っていないからであり、Webブラウザ経由でmbedにリクエストを出す→結果が返ってくる、という過程でEthernetが上り/下りともに正しく機能していることが判る

これがうまくいかない、という場合にはいよいよシリアルコンソールの出番である。適当なシリアルターミナル(有名どころならばTeraTermとかPutty)ソフトを用意しても良いが、とりあえずWindows標準のHyperTerminalでも十分である。これを立ち上げ、先ほどのmbedのシリアルポート(Photo18の例ならCOM8:)に9600bpsで接続する。この状態でもう一度リセットを行うと、こんな具合にメッセージが表示される筈だ(Photo24)。

Photo24:これはもう初期化が終わり、実際に192.168.1.7というIPアドレスのマシンから、どんなリクエストをうけてどんな返答を返したか、を表示している図

動かない場合は、初期化の段階でエラーが出ているはずなので、当該するメッセージをmain.cppの中を探して、何が間違っているのかを確認するという形だ(もっともこのレベルだと、プログラムミスというよりは配線ミスであろうと思われるが)。