//
表示中
モノづくり, Computer - コンピューター, Electronics - 電子工作

ArduinoとEthernetモジュールを接続する


Microchip社の少し古いEthernetモジュール(ENC28J60)と温湿度センサー(HDC1000)、Arduino Pro Miniを接続してみました。

前回、ESP-WROOM-02と温湿度センサーを使ってMQTTブローカーに定期的に温度と湿度の計測データを投げる仕組みを作りましたが、それのArduino & 有線版といったところです。

ESP-WROOM-02を使ったものは漆風呂の温湿度管理を行うのを目的としていました。何日か実験してみて、漆風呂が置かれた工房の環境に影響を受けることがよくわかったので、空調設備(エアコン)のある工房の環境をある程度安定させれば、漆風呂の中の環境がもう少し安定すると思いました。空調設備はリモコンで操作できますが、マイコンから赤外線LEDを操作すればリモコンを操作するのと同等のことがやれるはずなので、工房の温湿度を調整するためにこれで空調設備の入り切りや温度調整などができたら良いと思います。

Arduino Pro MiniとHDC1000は、ArduinoのA4をHDC1000のSDAに、A5をSCLにそれぞれ接続します。HDC1000はモジュール上でプルアップされているので抵抗などを別途配線しません。(VCCとGNDも当然接続します)

Arduino Pro MiniとENC28J60はArduinoのD13をENC28J60のSCKに、D12をSOに、D11をSIに、D8をCSにそれぞれ接続します。(VCCとGNDも当然接続します)

2016-08-24 23.40.21-.jpg

ENC28J60を制御するEtherCardライブラリはhttps://github.com/jcw/ethercardからダウンロードしたzip形式のものをArduino IDEから読み込みます。

ENC82J60のCSにはArduinoのD8を接続していますが、D10でも構いません。ソース中のether.begin()の3つ目の引数でD8ならば8を、D10なら10をセットすればいいです。

こちらが動作している様子。

2016-08-24 23.39.19-

とりあえずDHCPで自IPアドレスを取得して、WebServerとして動作するものを作って動作を確認しました。以下がそのソースコードです。EtherCardライブラリを読み込むとインストールされるサンプルスケッチ rbbb_server に少し手を加えたものです。

#include <HDC1000.h>
#include <EtherCard.h>

static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
BufferFiller bfill;
HDC1000 hdc1000;

void setup () {
 Serial.begin(57600);

 Serial.print("MAC: ");
 for (byte i = 0; i < 6; ++i) {
 Serial.print(mymac[i], HEX);
 if (i < 5)
   Serial.print(':');
 }
 Serial.println();
 
 if (ether.begin(sizeof Ethernet::buffer, mymac, 8) == 0) 
   Serial.println(F("Failed to access Ethernet controller"));

 Serial.println(F("Setting up DHCP"));
 if (!ether.dhcpSetup())
   Serial.println(F("DHCP failed"));
 
 ether.printIp("My IP: ", ether.myip);
 ether.printIp("Netmask: ", ether.netmask);
 ether.printIp("GW IP: ", ether.gwip);
 ether.printIp("DNS IP: ", ether.dnsip);
 
 hdc1000.begin();
}

void formattedFloat(float val, char buffer[]) {
 dtostrf(val, 4, 2, buffer);
}

static word homePage() {
 float h = hdc1000.getHumidity();
 float t = hdc1000.getTemperature();
 char hs[10];
 char ts[10];
 formattedFloat(h-8.0, hs);
 formattedFloat(t, ts);
 
 bfill = ether.tcpOffset();
 bfill.emit_p(PSTR(
 "HTTP/1.0 200 OK\r\n"
 "Content-Type: text/html\r\n"
 "Pragma: no-cache\r\n"
 "\r\n"
 "<html><head>"
 "<meta http-equiv='refresh' content='3'/>"
 "<title>Temp/Humid server</title></head><body>" 
 "<h1>Temperature:$S Humidity:$S</h1></body></html>"),
 ts, hs);
 return bfill.position();
}


void loop () {
 word len = ether.packetReceive();
 word pos = ether.packetLoop(len);
 
 if (pos) {
   ether.httpServerReply(homePage());
 }
}

ソースコードの冒頭部分でMacアドレスを指定していますが、これは他のネットワーク機器と重複するとまずいので、事前にarpコマンドなどで接続しているネットワーク機器のMacアドレスを調べて重複がないことを確認しておきます。

$ arp -a
? (192.168.0.2) at cc:20:e8:a8:25:f9 [ether] on wlp2s0
? (192.168.0.3) at 34:36:3b:cd:94:8e [ether] on wlp2s0
? (192.168.0.200) at 00:26:b0:f4:0b:1c [ether] on wlp2s0
? (192.168.0.4) at 00:1f:f3:4e:1e:31 [ether] on wlp2s0
? (192.168.0.201) at cc:e1:d5:4f:60:4c [ether] on wlp2s0
? (192.168.0.1) at 00:3a:9d:6e:d6:70 [ether] on wlp2s0

Arduinoではそんなに大量のトラフィックが発生するようなアプリケーションを実行することは稀かもしれませんので、今や低速な部類に入るENC28J60でも十分に利用できると思います。Arduino Pro Mini互換のブートローダーを焼いたATmega328を使えば、センサーをネットワークに接続し、リモコンを操作する程度のものならば安価に作ることができます。ホームオートメーションのようなアプリケーションを作るのには便利かもしれません。

ESP-WROOM-02、Arduino、mbed、STM32、Raspberry Piなどの開発環境はほぼOSXからUbuntuに移行できた感じです。あとは手持ちのものだとBlackfin DSP、Altera MAX10、Broadcom WICED Startの開発環境が移行できれば、オープンソースだけでソフトウェアの開発環境が構成できます。

もうちょっとだ!

kazz12211 について

Working as a OO programmer and enjoying music, bicycle and photography.

ディスカッション

コメントはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

評価

ブログ統計

  • 544,800 ヒット

カテゴリー

アーカイブ

カレンダー

2016年8月
« 7月   9月 »
 123456
78910111213
14151617181920
21222324252627
28293031  
%d人のブロガーが「いいね」をつけました。