mbedをEthernetに繋いでhttp喋らせてみた


mbedですが、ピンにEthernetがあるのが気になっていました。だって、Arduino Duemilanove 328 (3,200円くらい)とイーサネットシールド (4,200円くらい)を足した値段より、mbed (6,000円くらい)のほうが安いのですよ。ちょいちょいとTCP/IPを喋らせられるとなると、放ってはおけません。

調べてみたところ、パルストランスを接続してやればEthernetケーブルに接続できるらしいということが分かりました。秋月で売ってないかなーと調べてみたところ、300円でパルストランス内蔵のRJ-45モジュラージャックがありました。( 通販コード P-00819 )

早速秋月で買ってくると、秋月で売っていたのは、Pulse Jackという会社のJ0011D21Bという製品でした。
こいつのTD+, TD-, RD+, RD-を接続してやれば良いはずなのだけれども、ピンが千鳥配列なために、2.54mmピッチの基板では使えない。1.27mmピッチのユニバーサル基板を買いに行くのが面倒だったので、基板を加工してみました。


で、加工した基板にパーツを合わせてみると、こんな感じです。ちょっと削りすぎましたが、まぁいいでしょう。

はんだ付けして、配線も済ませました。2列x4の8ピンのピンヘッダを使っていますが、ブレッドボードに刺したときに安定させたかっただけで、4pin(1列)しか使っていません。ピン配置はmbedと合わせてあります。
ここで、使った基板が両面じゃないことに気付いたのですが、表側からピンヘッダのピンを押し込んで、できるだけブレッドボードに刺す長さを確保しつつ、裏面ではんだ付けをしてあります。

パルストランス側からは8pin出ているのでどうしようかと思いましたが、どうやら前記の4本の信号線だけ接続すれば良いみたいです。(GNDとかCTをどうすればいいのだろう、と思ったのですが特に接続しなくても良いみたいです。)

で、mbedと共にブレッドボードに刺して、こんな感じに組んでみました。

あとはソフトウェアですが、例によってmbedのサイトでテストコードを書いてコンパイルしてやればOKです。
mbedのサイトにあったサンプルコードをそのままいただいてきただけなのですが、DHCPでのIPアドレス取得がうまくいかなかった様なので、とりあえずIPアドレスを固定で指定するようにしてあります。

まず、コードはHTTPClientというライブラリを使うので、ProgramにLibraryをImportしてやります。Programの名前のところを右クリックすると、”Import Library…”というメニューがあるので、そいつを選んでやって、次のように指定をします。

するとライブラリをインポートしてくるので、あとはコードをmain.cppに書き込んでやるだけです。
こんなコードを書きました。

main.cpp
#include "mbed.h"
// import Library from http://mbed.org/projects/cookbook/svn/EMAC/lwip/trunk
// Name: HTTPClient
#include "HTTPClient.h"

DigitalOut led(LED1);

// see http://mbed.org/projects/cookbook/api/EMAC/lwip/trunk/HTTPClient/HTTPClient#HTTPClient.HTTPClientd
HTTPClient http("mbed",                 // Brings up the device with static IP address and domain name.
                IPv4(192,168,1,100),   // IPv4 address
                IPv4(255,255,255,0),    // netmask
                IPv4(192,168,1,1),     // default gateway
                IPv4(192,168,1,1));    // dns server

LocalFileSystem local("local");

int main(void) {
  char url[256];

  // Open a file to write.
  FILE *fd = fopen("/local/hello.htm", "w");

  // Insert the search term into the URL
  sprintf(url, "http://www.google.co.jp/search?hl=en&q=%s&btnG=Search&meta=", "HelloWorld");

  // Request a page and store it into a file.
  http.get(url, fd);

  // Close the file.
  fclose(fd);

  // The file is written on the local disk.
  // "/hello.htm" Have a look.

  // Work is done!
  while(1) {
    led = !led;
    wait(0.2);
  }
}

これだけのコードを書くだけで、googleにhttpでアクセスをして、結果をローカルのファイルに書き出してくれます。素晴らしい。
Compileボタンを押して、バイナリをダウンロード、それをUSBでmbedにコピーしてやるだけで実行されます。

実行が終わるとLEDがチカチカするので、USBマスストレージでmbedを除いてやると、ファイルができているではありませんか。
こんな感じでmbedでの開発は完了です。

あ、mbedのサイトというか開発環境には、自分が書いたコードをpublishする機能があります。
ここで、今回のコードを落としてくることができます。 http://mbed.org/users/ytsuboi/programs/HTTP_Client/5ydty/
なかなか素晴らしい機能で、開発者コミュニティを作ることを考えてるなーと思いましたが、mbedしたこと無い人に雰囲気を知ってもらうためにも、とりあえず↑にコードを貼っておきますね。

とりあえずTCP/IPが簡単に使えることが分かったので、また何か試作してみたいと思います。