最終更新日:
2010年1月29日
針式為替計
やっぱり「物理的に動くもの」をコントロールするのは面白い。ということでサーボモーターを購入。 しかし、何に使おうか。いろいろ検索しても、ただ単にサーボを動かしているだけとか、ボリュームに合わせてサーボを動かしているだけとかの動画が多いです。ネタに困っているのでしょうかねぇ。
ということで、先日購入したEthernet Shieldと組み合わせ、「普通、針で表示しないだろ」と思われるものを指針するメーターを作成してみようということで、現在の円/ドル為替レートを指針するメーターを作成しました。名付けて「円計」。
仕様
データはfinance.yahoo.comから入手することにします。Arduinoから直接アクセスするとなるとDNSとか面倒そうなので、ちょっとインチキしてまずは自宅サーバーがインターネットから取得、そしてArduinoはこの自宅サーバー上のwebサーバーからデータを入手するようにしました。webサーバーは単純に現在の為替レートのデータだけを返すようにすることで、Arduinoの処理を軽減させてます。
製作
あとは、webサーバーにアクセス、為替レートを得て、それを角度に変換し、サーボに出力するだけです。
スケッチは以下のとおり。サーボの出力端子はDIGIAL 2番ピンにしています。本当はこのあたりは#defineで定義すべきですが…。
Sketch
#include <Ethernet.h> #include <Servo.h> Servo myServo; #define ETH_BUFF_MAX 127 byte mac[] = { 0x--, 0x--, 0x--, 0x--, 0x--, 0x-- }; ←指定されたMacアドレス byte ip[] = { 192, 168, 0, 16 }; ←ArduinoのIPアドレス byte gateway[] = { 192, 168, 0, 1 }; byte subnet[] = { 255, 255, 255, 0 }; byte server[] = { 192,168,0,15 }; ←自宅サーバーのIPアドレス char read_buff[ETH_BUFF_MAX]; char buff[24]; Client client(server, 80); int eth_readString(Client theClient, char *buff, int maxLen) { int p = 0; char c; while(p < maxLen) { if(theClient.available()) { c = theClient.read(); if(c == 0x0a) { buff[p] = NULL; return(p); } else { buff[p++] = c; } continue; } else { if(!theClient.connected()) { if(p == 0) { return -1; } else { buff[p] = NULL; return p; } } } } return p; } int getRate(Client theClient) { int len; int rcode; int rate,rate0; // get responce code len = eth_readString(theClient,read_buff,ETH_BUFF_MAX); if(len < 0) return -1; // check ressponce code sscanf(read_buff,"%*s %d",&rcode); if(rcode != 200) return -1; //skip header do { len = eth_readString(theClient,read_buff,ETH_BUFF_MAX); } while(len > 1) ; // read target contents len = eth_readString(theClient,read_buff,ETH_BUFF_MAX); if(len <= 0) return -1; sscanf(read_buff,"%d.%d",&rate,&rate0); rate = rate * 100 + rate0; return rate; } void setup() { Ethernet.begin(mac, ip, gateway, subnet); myServo.attach(2); } void loop() { int rate; int angle; do { if (client.connect()) { client.println("GET /getusdjpy.php HTTP/1.0"); ←自宅サーバーから為替レートを得るURL client.println(); } else { exit; } rate = getRate(client); if(rate <= 0) exit; angle = 180- (((float)(rate - 8900) / 300) * 140 + 20); myServo.write(angle); } while(0); client.stop(); delay(5000); }
単純、簡単です。
こういったおバカな事が簡単にできてしまうのも、Arduinoの面白さです。
DNSを利用するソフトも公開されているので、今度は自宅サーバーを使用しないものも作ってみようか…なんて思ってます。