ShieldEthernet ENC28J60

Từ ChipFC Wiki
Bước tới: chuyển hướng, tìm kiếm

Editor.png

Bài viết này đang được phát triển hoặc chỉnh sửa lớn.
Bạn có thể đóng góp để bài viết hoàn thiện hơn.
Sau khi chỉnh sửa xong thông báo này sẽ được gỡ bỏ.

Giới thiệu

  • Shield Ethernet ENC28J60 là một board mạch mở rộng cho Arduino, tương thích hoàn toàn với Arduino và cả ChipPRO, ChipUNO của ChipFC. Shield này được sử dụng với Arduino để có thể lập trình truy cập qua mạng, giao tiếp mạng nội bộ hoặc mạng Internet, để từ đó có thể khám phá kho tàng dữ liệu vô tận từ hệ thống mạng máy tính đang vô cùng phát triển.
  • Ethernet Shield cung cấp cho board Arduino tất cả những thứ cần thiết để bạn có thể kết nối Ethernet, giao tiếp đơn giản, có hỗ trợ khe cắm thẻ nhớ micro sd để lưu trữ dữ liệu.

EthernetShieldTop.jpg

Đặc điểm

  • Điện thế hoạt động: 5v (cung cấp bởi Arduino Board)
  • Sử dụng chip Ethernet: ENC28J60, Tốc độ Ethernet: 10Mb/s
  • Sử dụng Ethernet Jack RJ45 chuẩn, có đèn báo tín hiệu truyền nhận
  • Hoàn toàn tương thích Arduino,Kết nối với Arduino qua SPI
  • Hỗ trợ khe cắm thẻ nhớ microSD.

Mô tả các chân kết nối

Kết nối tới Arduino

EthernetShieldSodo.png EthernetShieldSodoNguyenLy.png


Các chân kết nối
Thứ tự chân Tên gọi Loại Mô tả
1 SCK Input chân clock của SPI
2 MISO Output chân master in - slave out của SPI
3 MOSI Input chân master out - slave in của SPI
4 NET_CS Input chân select cho ethernet
5 SD_CS Input chân select cho sdcard
6 NET_INT Output chân interrupt cho ethernet
  • Các shield của chipfc được thiết kế hoàn toàn tương thích với Arduino, ChipiUno, ChipiPro ...

Sử dụng như một module độc lập

  • Không dùng Arduino? Hãy dùng hàng rào mở rộng khi bạn sử dụng Shield này như một module riêng lẻ kết nối với các loại board khác
Hàng rào mở rộng
Thứ tự chân Tên gọi Loại Mô tả
1 CLK Output
2 INT Output
3 WOL Output
4 SO Output
5 SI Output
6 SCK Output
7 CS Output
8 Reset Output
9 5V Power
10 GND Power

Sử dụng

Sử dụng ethernet với Arduino

  • Cắm shield Ethernet vào Arduino

ShieldethernetArduino.jpg

  • Cắm dây mạng đã kết nối ethernet shield Ethernet

ShieldethernetArduinoCap.jpg

  • Kết nối dây nạp cho Arduino

ShieldethernetArduinoNap.jpg

Giải nén file zip etherShield_v1.1_for_Arduino_v1.0 được 2 thư mục etherShield và ETHER28J60

Giải nén file zip Ethernet28J60Full được thư mục cùng tên

  • Sau đây là một số chương trình mẫu sử dụng Arduino với Shield Ethernet:


Chương trình 1: Làm Server mạng LAN - kho chứa thông tin

  • Kết nối Shield Ethernet với Arduino như mô tả ở trên
  • Chương trình này sử dụng thư viện Arduinno cho mạng LAN, chương trình mẫu sau đây biến Arduino với shield motor thành một server và sẽ phản hồi lại thông tin mỗi khi client hỏi, client ở đây bạn có thể dùng các trình duyệt phổ biến như IE, Firefox, Chrome ... và dùng nhập địa chỉ như bình thường.
  • Một số hàm:
    • Khai báo kiểu ETHER_28J60 để chúng ta có thể sử dụng đối tượng ethernet
  ETHER_28J60 ethernet;
    • Hàm void setup(uint8_t macAddress[], uint8_t ipAddress[], uint16_t port) sử dụng để thiết lập các thông số về địa chỉ MAC, IP, port cho shield ethernet, được gọi một lần và đầu tiên trong hàm setup.
  ethernet.setup(mac, ip, port); // thiết lập địa chỉ mac, ip và port
    • Hàm char* serviceRequest() trả về một chuỗi request nếu có, không thì trả về NULL, được sử dụng thường xuyên trong loop để lấy request
char* param = ethernet.serviceRequest()) ;
    • Hàm void print(char* text) hoặc void print(int value) dùng để thêm chuỗi kí tự hoặc giá trị vào phản hồi
  ethernet.print("<H1>ChipiUno, ChipiPro, ChipiLeo</H1>");
    • Hàm void respond() dùng để phản hồi lại cho client sau khi đã dùng những hàm print ở trên
  ethernet.respond();
  • Nạp Example có tên là EchoParams hoặc đoạn code sau tới Arduino
#include "etherShield.h"
#include "ETHER_28J60.h"

int ledPin = 5;  //Định nghĩa chân nháy led để báo tín hiệu

static uint8_t mac[6] = {0x54,0x55,0x58,0x10,0x00,0x24}; //định nghĩa địa chỉ MAC cho thiết bị
static uint8_t ip[4] = {192,168,1,15};    //định nghĩa địa chỉ IP cho shield, địa chỉ IP này có thể xem bằng lệnh ipconfig trong cmd 
static uint16_t port = 80; // định nghĩa port

ETHER_28J60 ethernet;  //Khai báo đối tượng ethernet để ta làm việc trên nó

void setup()
{ 
  ethernet.setup(mac, ip, port); // thiết lập địa chỉ mac, ip và port
}

void loop()
{
  char* param;
  if (param = ethernet.serviceRequest())  //nếu có yêu cầu tới shield này 
  {
    ethernet.print("<H1>Arduino</H1>");  // thì in ngược lại với dòng chữ Arduino và yêu cầu đó 
    ethernet.print("<H2>");
    ethernet.print(param);
    ethernet.print("</H2>");
    ethernet.respond();  //Re lệnh phản hồi lại cho client
  }
}

Sau đó bạn mở trình duyệt web trên máy bạn lên và nhập vào url như hình sau: ShieldEthernetFireFoxScreenshot.png

Như bạn thấy, sau địa chỉ IP của bo (theo code ở đây là 192.168.1.15/, có thể tùy chỉnh tùy theo mạng) là dòng lệnh gửi xuống bo Arduino và thông tin chúng ta đọc được cũng chính là dòng lệnh này

Ngoài thông tin là chữ thì bạn cũng có thể lập trình để lấy các thông tin khác như cảm biến, dữ liệu ...

Chương trình 2:điều khiển thiết bị điện qua internet

  • Kết nối Shield Ethernet với Arduino như mô tả ở trên
  • Chương trình này sử dụng thư viện Arduinno cho internet, bạn cần dùng thư viện etherCard, chương trình sẽ đóng vai trò như một client và thường xuyên gửi request tới server của chipfc tại trang cloud.chipfc.com (bạn có thể thay bằng trang server khác của ba)
  • Một số hàm:
    • Đối tượng ether đã được khai báo hiện thực sẵn trong code nên bạn không cần phải khai báo thêm, khi cần gọi hàm thì chỉ cần gọi theo cúa pháp ether.<hàm cần gọi>
    • Hàm EtherCard::begin dùng để khởi tạo ban đầu
uint8_t Ethernet::buffer[700]; // configure buffer size to 700 octets
static uint8_t mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; // define (unique on LAN) hardware (MAC) address
uint8_type nFirmwareVersion ether.begin(sizeof Ethernet::buffer, mymac);
if(0 == nFirmwareVersion)
{
    // handle failure to initiate network interface
}
    • Hàm EtherCard::dhcpSetup để thiết lập địa chỉ IP qua DHCP
if(!ether.dhcpSetup())
{
// handle failure to obtain IP address via DHCP
}
ether.printIp("IP:   ", ether.myip); // output IP address to Serial
ether.printIp("GW:   ", ether.gwip); // output gateway address to Serial
ether.printIp("Mask: ", ether.mymask); // output netmask to Serial
ether.printIp("DHCP server: ", ether.dhcpip); // output IP address of the DHCP server
    • Hàm EtherCard::staticSetup để thiết lập địa chỉ IP tĩnh
const static uint8_t ip[] = {192,168,0,100};
const static uint8_t gw[] = {192,168,0,254};
const static uint8_t dns[] = {192,168,0,1};
if(!ether.staticSetup(ip, gw, dns);
{
    // handle failure to configure static IP address (current implementation always returns true!)
}
    • Hàm EtherCard::sendUdp dùng để gủi gói tin UDP
char payload[] = "My UDP message";
uint8_t nSourcePort = 1234;
uint8_t nDestinationPort = 5678;
uint8_t ipDestinationAddress[4];
ether.parseIp(ipDestinationAddress, "192.168.0.200");
ether.sendUdp(payload, sizeof(payload), nSourcePort, ipDestinationAddress, nDestinationPort);
    • Hàm EtherCard::dnsLookup dùng để tra DNS
if(!ether.dnsLookup("google.com"))
{
    // handle failure of DNS lookup
}
ether.printIp("Server: ", ether.hispip); // Result of DNS lookup is placed in the hisip member of EtherCard.
    • Một số hàm hữu ích khác các bạn có thể tham khảo thêm tại file <etherCard.h>
  • Nạp Example có tên là controldeviceOverEthernet hoặc đoạn code sau tới Arduino
#include <EtherCard.h>

#define REQUEST_RATE 30000 // milliseconds

// ethernet interface mac address
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
// remote website name
char website[] PROGMEM = "cloud.chipfc.com";

byte Ethernet::buffer[700];
static long timer;

#define DEVICE_ID_1  "1"
#define DEVICE_ID_2  "2"

#define LED  9
#define RELAY1  3
#define RELAY2  5
#define RELAY3  6
#define RELAY4  7

// called when the client request is complete
String inString="";    // string to hold input
static void my_result_cb (byte status, word off, word len) {
  Serial.print("<<< reply ");
  Serial.print(millis() - timer);
  Serial.println(" ms");
  inString = (const char*)Ethernet::buffer + off;
   Serial.println(inString);
  if (inString.startsWith("===1===",293)){
    digitalWrite(LED,HIGH);
    digitalWrite(RELAY1,HIGH);
    
    Serial.println("LEDON");
  }
   else {
     digitalWrite(LED,LOW); 
     digitalWrite(RELAY1,LOW);
     Serial.println("LEDOFF");
   }
}

void setup () {
  Serial.begin(57600);
  Serial.println("\n[getDHCPandDNS]");
  pinMode(LED, OUTPUT); 
  pinMode(RELAY1, OUTPUT); 
  pinMode(RELAY2, OUTPUT); 
  pinMode(RELAY3, OUTPUT); 
  pinMode(RELAY4, OUTPUT); 
  digitalWrite(LED,LOW);
  digitalWrite(RELAY1,LOW);
  digitalWrite(RELAY2,LOW);
  digitalWrite(RELAY3,LOW);
  digitalWrite(RELAY4,LOW);
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller");

  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
  
  ether.printIp("My IP: ", ether.myip);
  // ether.printIp("Netmask: ", ether.mymask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
  ether.printIp("Server: ", ether.hisip);
  
  timer = - REQUEST_RATE; // start timing out right away
}


void loop () {
    
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer + REQUEST_RATE) {
    timer = millis();
    Serial.println("\n>>> REQ");
    ether.browseUrl(PSTR("/remote/device/get/"), DEVICE_ID_1, website, my_result_cb);
  }
}
    • Chương trình này sẽ biến Arduino và shield Ethernet thành một máy khách và thường xuyên gửi yêu cầu tới server (ở đây dùng server cloud.chipfc.com) để lấy trạng thái của các thiết bị.
    • Chipfc đã và đang xây dựng một web server cho các bạn có thể sử dụng để đăng kí điều khiển các thiết bị, co phép điều khiển các thiết bị trong nhà từ xa, qua mạng internet
    • Mỗi thiết bị có thể cung cấp cho server trạng thái hiện tại của các thiết bị

Sử dụng thẻ nhớ

  • IDE của Arduino cung cấp miễn phí cho bạn chương trình và rất nhiều code mẫu, trong đó có thư viện và code mẫu cho sd card
  • Bạn mở chương trình Arduino và vào File->Examples->SD, trong đó là các chương trình mẫu để xử lí sdCard như lấy thông in của sdcard, đọc viết file ...
  • Khi sử dụng kết hợp gữa sdcard và ethernet, bạn có thể làm ra những dự án vô cùng tuyệt vời

Các rắc rối có thể bạn gặp phải

Tham khảo thêm