ラベル WIZ820IO の投稿を表示しています。 すべての投稿を表示
ラベル WIZ820IO の投稿を表示しています。 すべての投稿を表示

2013年8月27日火曜日

mbed LPC1114FN28とWIZ820ioでxivelyへ送信する




mbed対応でSPIが簡単に扱えるようになったのでLPC1114FN28にWIZ820ioを接続してxively(cosm,pachube)にデータを送るようにしてみました。

以前、FRDM-KL25Zのために作ったEthenetInterface互換のWIZ820ioInterfaceクラスを修正しました。
・dnsnameでstringクラスを使っていてコードサイズが大きくなり32Kバイトに収まらなかったので、必要なメンバー関数だけを実装したstringクラス互換を作りました。
・MACアドレスの取得にmbed_mac_address()を使っていたが、セミホストを呼んで止まってしまうので適当なMACアドレスを与えるようにしました。

Communicating with Xively
cosmの時にベータ版であったドメイン名ではなく直接IPアドレスに
tcpソケット接続してJSON形式のデータを送り込む方法はまだ使えるようでした。

以前の記事:
KL25ZとWIZ820ioでcosmへ送信する
FRDM-KL25ZとWIZ820ioでインターネット接続

(2013/8/27)
---

2013年4月12日金曜日

KL25ZとWIZ820ioでcosmへ送信する


WIZ820ioのインターフェースをEthetnetInterfaceのsocket互換に作り直して、cosmへのデータを送信しています。
cosmのベータ版ではあるが、httpプロトコルではなくてtcpプロトコルにJSON形式を載せています。
更に、DNSやDHCPを使わずにIPアドレス固定で接続することも可能です。

下のグラフは一週間の大気圧センサの値です。
あまり精度はよくないが先週末からの低気圧が通過したのがわかります。


参考:
Socket Server
https://cosm.com/docs/beta/socket_server/
IP Addresses
https://cosm.com/docs/v2/ip_addresses.html


#include "mbed.h"
#include "WIZ820ioInterface.h"
#include "MPL115A1.h"

SPI spi(PTD2,PTD3,PTD1); // SPI_0
MPL115A1 bar(spi, PTA13); // spi, cs
WIZ820ioInterface eth(&spi,PTD0,PTD5); // spi, cs, reset

#define qq(...)  #__VA_ARGS__
const char* format = qq(
{
  "method" : "put",
  "resource" : "/feeds/12345678",
  "headers" : {"X-ApiKey":"APIKEYAPIKEYAPIKEYAPIKEYAPIKEYAPIKEYAPIKEYAPIKEY"},
  "body" : {
    "datastreams" : [
      {"id":"6", "current_value":"%.2f"},
      {"id":"7", "current_value":"%.2f"}  
    ]
  }
}
);

void cosm()
{
    char buf[512];
    snprintf(buf, sizeof(buf), format, bar.readPressure() * 10, bar.readTemperature());
    TCPSocketConnection sock;
    sock.set_blocking(false);
    int ret = sock.connect("173.203.98.29", 8081); // cosm tcp server
    if (ret < 0) {
        return;
    }
    sock.send(buf, strlen(buf));
}

int main()
{
    eth.init();
    eth.connect();
    while(1) {
        cosm();
        wait_ms(30*1000);
    }   
}

(2013/4/12)
---

2013年3月24日日曜日

FRDM-KL25ZとWIZ820ioでインターネット接続


1年ほど前に作ったmbedのEthernetNetIf互換のWIZ820ioのライブラリがあったのでKL25ZでもSPI接続して動かしてみました。

KL25Z用に再コンパイルするだけで簡単かと思ったのですが、EthernetNetIfのNetServiesに依存していたために、
EthernetNetIfライブラリが存在しなくて、ソースコードファイルNetServiesSourceを探して取り込みました。

WIZ820ioは動作中は最大150mAくらい流れるのでKL25ZのP3V3からの供給では足りなくて、
SPI通信は出来るがLinkUpにならない。LANコネクタのLEDが点灯しません。mbedを3.3V電源だけに使いました。

WIZ820io(W8200)は同時に8個のソケット開けるので1つをDNS用にUDPソケットで使って、残り7個で同時接続が出来ます。HTTPクライアントとHTTPサーバーを同時に動かすことも出来ます。

WIZ820ioインターフェースライブラリ
http://mbed.org/users/va009039/code/WIZ820ioNetIf/

(2013/3/24)
WIZ820ioとFRDM-KL25Zの結線図
nRESET J2P5 --- PTD5 reset
nSS      J1P5 --- PTD0 cs
MOSI    J1P3 --- PTD2 mosi
MISO    J2P6 --- PTD3 miso
SCLK    J1P4 --- PTD1 sclk
GND     J2P1 --- GND
3V3D   J2P3 --- 外部電源3.3V
PWDN  J2P4 --- GND
(2013/3/26追加)

参考資料
NetServices Stack source
http://mbed.org/users/donatien/code/NetServicesSource/

(2013/3/27追加)
---

2012年4月19日木曜日

mbedでWIZ820io(W5200)を使ってみる(4)

mbedのためにWIZ820ioのネットワークインターフェースをライブラリとして公開してみた。

W5200(WIZ820io) network interface

TCPSOCKET,UDPSOCKET,DNSREQUESTを使っているプログラムなら修正しなくても動きます。
たとえばHTTPClient,HTTPServerは動きます。

acceptを修正。
8個までソケットを同時に開けるようにした。
SPI,CS,リセットのピン端子を設定できるようにした。
DNSリクエストでリトライするようにした。
DNSサーバーはDHCPで取得したサーバーを使うようにした。
---

2012年4月5日木曜日

mbedでWIZ820io(W5200)を使ってみる(1)

mbedに組み込み用イーサネットモジュールWIZ820io(W5200)を繋げてみた。
WIZ820io       mbed
J2P1 GND ----- p1 GND
J1P3 MOSI ---- p11 SPI(mosi)
J2P6 MISO ---- p12 SPI(miso)
J1P4 SCK ----- p13 SPI(sck)
J1P5 nSS ----- p14
J2P5 nRESET -- p15
J2P3 3V3D ---- p40 VOUT
J2P4 PWDN ---- GND
とりあえずmbedのハンドブックのようにイーサーネットのパケットを読み取れるまでは出来た。
しかし、なぜかmbedに比べてパケットサイズが極端に大きい。何か使い方を勘違いしてるのだろう。

#include "mbed.h"
#include "w5100.h"
Serial pc(USBTX, USBRX);

extern W5100Class W5100;

class MyEthernet {
    bool _init_flag;
    void _init() {
        W5100.init();
        W5100.writeSnMR(0, 0x40|SnMR::MACRAW); // S0_MR_MACRAW(0x04) and MAC filter
        W5100.execCmdSn(0, Sock_OPEN);
    }
public:
    MyEthernet() {
        _init_flag = false;
    }
    int receive() {
        if (!_init_flag) {
            _init_flag = true;
            _init();
        }
        return W5100.readSnRX_RSR(0);
    }

    int read(char* data, int size) {
        int size2 = W5100.getRXReceivedSize(0);
        unsigned char *p = new unsigned char[size2];
        W5100.recv_data_processing(0, p, size2);
        W5100.execCmdSn(0, Sock_RECV);
        int size3 = (int)(*p)<<8 | *(p+1);
        delete p;
        if (size3 > size) {
            size3 = size;
        }
        memcpy(data, p+2, size3);
        return size3;
    }
}; 

MyEthernet eth2;

int main() {
    pc.baud(460800);

    char buf[0x600];
    while(1) {
        int size = eth2.receive();
        if(size > 0) {
            printf("WIZ820io ethernet packet size: %d\n", size);
            eth2.read(buf, size);
            printf("Destination:  %02X:%02X:%02X:%02X:%02X:%02X\n",
                    buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
            printf("Source: %02X:%02X:%02X:%02X:%02X:%02X\n",
                    buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]);
        }
        wait(1);
        printf("S0_RX_RSR:%d, S0_RX_RD:%d, S0_RX_WR:%d\n",
            W5100.readSnRX_RSR(0), W5100.readSnRX_RD(0), W5100.readSnRX_WR(0));
    }
}
---