head

2015年10月5日月曜日

ENC28J60+ARDUINO でIoT製作 (テスト編)


いまさらですが古めの有線LANモジュール [ENC28J60]を活用して、
格安のIoTデバイス製作を検討してみました。


[概要]
Microchip 社の[ENC28J60] EtherNet Controller の対応モジュール
海外通販で4ドル前後、国内での取り扱い店舗は少ないようですが 1000[en]弱
10 base-T と速度は遅めですが、TCP送受信の文字数が少なければ、使える範囲になりそう。
有線LANですが マイコン連携できる通信デバイスとしては、格安かと思います。

入荷後、基盤を見ても型式/製造番号/メーカ等の記載がなく、、
バルク品ぽい雰囲気もありました。
ピン配置は、12ピン近くに記載されてますが、文字が小さく見にくいですが
ピン-レイアウト資料も当然なく、配線は注意が必要です。

SPI通信のARDUINOライブラリを見つけましたので
回路を調整して、クラウド連携し、Lチカ(LED制御)までテストしてみたいと思います。

*) LAN側の電源供給を VCC=3.3Vに配線してますが、
ARDUINO UNOのSPI通信のデジタル出力(D11/D12/D13)は
5V出力されていると予想されますので、ロジックコンバータなどで
降圧調整が必要と予想されます。UNO以外の3.3V仕様のARDUINOが良いかと思います

#材料費
イーサネットモジュール [M28J60] 950[en] (aitend さん)

# 配線
Git - ethercard ライブラリの README に,
記載されているピン配線を結線します。

[ENC28J60] - [ARDUINO]
SCK - D13
SO - D12
SI - D11
CS - D8

VCC,GND を結線
D7 にLED 配線

# Code, HTTP受信と Lチカ
ARDUINO-SDk 1.6.5
シリアルの通信速度= 9600 に変えてます。

#include <EtherCard.h>
// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x32 };
byte Ethernet::buffer[700];
static uint32_t timer;
const char website[] PROGMEM = "dns1234.com";
const byte mLED_pin =7;
//Struct
struct stParam{
String stat;
String kai_num_1;
};
//get_Struct
struct stParam get_Struct(String sRes4){
struct stParam param;
param.stat = sRes4.substring(0,1);
param.kai_num_1= sRes4.substring(1,4);
return param;
}
// called when the client request is complete
static void my_callback (byte status, word off, word len) {
Serial.println(">>>");
Ethernet::buffer[off+300] = 0;
Serial.print((const char*) Ethernet::buffer + off);
String response =(const char*) Ethernet::buffer + off;
Serial.println("...");
//Serial.println("response="+response);
int iSt=0;
struct stParam param;
iSt = response.indexOf("web-response1=");
if(iSt >= 0){
iSt = iSt+ 14;
String sDat = response.substring(iSt );
Serial.println("sDat=" + sDat);
param =get_Struct(sDat);
if(param.stat=="1"){
int kNum =param.kai_num_1.toInt();
if(kNum > 0){
digitalWrite( mLED_pin, HIGH);
for(int i=0;i< kNum; i++){
Serial.println("# [PIN16=HIGH], CT= "+ String( i ));
delay( 1000 );
}
digitalWrite(mLED_pin, LOW);
}
}
int kNum =param.kai_num_1.toInt();
} //end _iSt
}
void setup () {
Serial.begin( 9600);
pinMode(mLED_pin, OUTPUT);
Serial.println(F("\n[webClient]"));
if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
Serial.println(F("Failed to access Ethernet controller"));
if (!ether.dhcpSetup())
Serial.println(F("DHCP failed"));
ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);
if (!ether.dnsLookup(website))
Serial.println("DNS failed");
ether.printIp("SRV: ", ether.hisip);
delay( 5000 );
}
void loop () {
ether.packetLoop(ether.packetReceive());
if (millis() > timer) {
timer = millis() +60000;
Serial.println();
Serial.print("<<< REQ ");
ether.browseUrl(PSTR("/agrisv2/php/test_esp_2.php"), "", website, my_callback);
}
}
view raw enc28j60_01.ino hosted with ❤ by GitHub
*) macアドレスの指定は、LAN上に複数接続する場合は、重複に注意下さい。

enc28j60 ライブラリ (Git): https://github.com/jcw/ethercard
ARDUINO SDKに、インポートします。

スケッチの例を参考に、機能を追加します。
[スケッチの例] - [ethercard-master] - [webClient]

クラウド側のweb-APIから、レスポンス取得し、LED点灯時間を解析 (消えるまでの時間)、
INT型に変換します。

===
  iSt = response.indexOf("web-response1=");
  if(iSt >= 0){
    iSt = iSt+ 14;
    String sDat = response.substring(iSt );
===

消すタイミングを監視し、LOW送信
digitalWrite(mLED_pin, LOW);

*) 連携用のWEB-APIは、準備する必要があります。
参考php :
https://gist.github.com/kuc-arc-f/f84d21cd98b23d10fa34#file-php-webapi-esp8266-1-php

#テスト
電源投入後の60秒前後は、
TCP受信処理が失敗する場合がありました
LAN側が安定するまで、少し時間がかかるのかもしれません。

# クラウド側から、LED消灯までの時間を取得し、
   点灯、指定秒数後 に消灯します

# シリアルのログ




#参考の記事
https://github.com/jcw/ethercard

# 開発者向けのまとめ記事
http://knaka0209.blogspot.jp/2015/04/agri.html

0 件のコメント:

コメントを投稿

google colaboratory お試し編 、GPUも使える機械学習の環境構築

前回続き、機械学習の関連となります。 開発環境まわりの内容となり。先人様の情報を元に調査しました。 google colab(google colaboratory) を試してみました。機械学習系の いくつかのライブラリがインストール済みで、 クラウド上で、ある程度機械学...

AD-parts

Shop
Bluetooth搭載
ベース基板

Social