2016年08月18日

Ethernet 接続

 Arduino に Ethernet シールドを追加してネットワークに接続します。(社内のローカルネットワークに接続)
今回はArduino Mega(基板が長いやつ) の上にEthernet シールドを2階建てみたいに接続します。
 接続は UDP で行います。PC から"ON"電文をArduinoに投げる。受信するとLED を点灯し、"OFF"を受信するとLEDを消灯します。
 Arduino 側のプログラムは スケッチの例 → Ethernet → UDPSendReceiveString を参考にします。

Mega_Ether.jpg


/*
UDPSendReceiveString:
This sketch receives UDP message strings, prints them to the serial port
and sends an "acknowledge" string back to the sender

A Processing sketch is included at the end of file that can be used to send
and received messages for testing with a computer.

created 21 Aug 2010
by Michael Margolis

This code is in the public domain.
*/
/*
* Edit by kawabe 2016/08/18
*/

#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <EthernetUdp.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
// インストールしたフォルダーの配下にあります。
// \arduino-1.6.10\libraries\Ethernet\src\EthernetUdp.h

#include <string.h> // for strcmp

#define GREEN_LED_PIN 12

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x51, 0xEB };
// Ethernet シールド基板の裏側にシールが貼ってあります。
IPAddress ip(192, 168, 100, 32);

unsigned int localPort = 45600; // local port to listen on

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged"; // a string to send back

// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup() {
pinMode(GREEN_LED_PIN, OUTPUT);

// start the Ethernet and UDP:
Ethernet.begin(mac, ip);
Udp.begin(localPort);

Serial.begin(9600);
}

void loop() {
int i ;
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if (packetSize) {
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remote = Udp.remoteIP();
for (int i = 0; i < 4; i++) {
Serial.print(remote[i], DEC);
if (i < 3) {
Serial.print(".");
}
}
Serial.print(", port ");
Serial.println(Udp.remotePort());

// read the packet into packetBufffer
Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
Serial.println("Contents:");
Serial.println(packetBuffer);
if ( strcmp( packetBuffer, "ON" ) == 0 ) {
digitalWrite(GREEN_LED_PIN, HIGH); // turn the LED on (HIGH is the voltage level) ;
}
if ( strcmp( packetBuffer, "OFF" ) == 0 ) {
digitalWrite(GREEN_LED_PIN, LOW); // turn the LED on (HIGH is the voltage level) ;
}
// Clear Buffer
if ( packetSize >= UDP_TX_PACKET_MAX_SIZE ) {
packetSize = UDP_TX_PACKET_MAX_SIZE - 1 ; // 念のため
}
for ( i = 0 ; i <= packetSize ; i ++ ) {
packetBuffer[i] = 0 ;
}

// send a reply to the IP address and port that sent us the packet we received
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(ReplyBuffer);
Udp.endPacket();
}
delay(10);
}

Mega_Ether_PC.jpg

図では分かり難いので写真を載せておきます。

Arduino_Ether.jpg

PCソースファイル(C++Builder XE5 で作りました。)
UDP_Test_VCL_020.zip


posted by white at 12:57| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。