最終更新日: 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を利用するソフトも公開されているので、今度は自宅サーバーを使用しないものも作ってみようか…なんて思ってます。



home | Elec top

inserted by FC2 system