Khác biệt giữa các bản “ShieldEthernet ENC28J60”
Từ ChipFC Wiki
(→Chương trình 2:điều khiển thiết bị điện qua internet) |
(→Chương trình 2:điều khiển thiết bị điện qua internet) |
||
Dòng 174: | Dòng 174: | ||
* 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) | * 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: | * 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 | ** Hàm '''EtherCard::begin''' dùng để khởi tạo ban đầu | ||
{| style="border-radius: 6px 6px 6px 6px;border: 1px dotted" | {| style="border-radius: 6px 6px 6px 6px;border: 1px dotted" | ||
Dòng 205: | Dòng 200: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|} | |} | ||
− | ** Hàm EtherCard::staticSetup để thiết lập địa chỉ IP tĩnh | + | ** Hàm '''EtherCard::staticSetup''' để thiết lập địa chỉ IP tĩnh |
{| style="border-radius: 6px 6px 6px 6px;border: 1px dotted" | {| style="border-radius: 6px 6px 6px 6px;border: 1px dotted" | ||
|<syntaxhighlight lang="cpp"> | |<syntaxhighlight lang="cpp"> | ||
Dòng 217: | Dòng 212: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|} | |} | ||
− | ** Hàm EtherCard::sendUdp dùng để gủi gói tin UDP | + | ** Hàm '''EtherCard::sendUdp''' dùng để gủi gói tin UDP |
{| style="border-radius: 6px 6px 6px 6px;border: 1px dotted" | {| style="border-radius: 6px 6px 6px 6px;border: 1px dotted" | ||
|<syntaxhighlight lang="cpp"> | |<syntaxhighlight lang="cpp"> | ||
Dòng 228: | Dòng 223: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|} | |} | ||
− | ** Hàm EtherCard::dnsLookup dùng để tra DNS | + | ** Hàm '''EtherCard::dnsLookup''' dùng để tra DNS |
{| style="border-radius: 6px 6px 6px 6px;border: 1px dotted" | {| style="border-radius: 6px 6px 6px 6px;border: 1px dotted" | ||
|<syntaxhighlight lang="cpp"> | |<syntaxhighlight lang="cpp"> |
Phiên bản lúc 15:14, ngày 5 tháng 10 năm 2014
Bài viết này đang được phát triển hoặc chỉnh sửa lớn. |
Mục lục
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.
Đặ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
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
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
- Cắm dây mạng đã kết nối ethernet shield Ethernet
- Kết nối dây nạp cho Arduino
- Cấp nguồn cho Arduino, tải thư viện cho Ethernet tại trang giới thiệu sản phẩm của chipfc và nạp chương trình mẫu
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:
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. |
- 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);
}
} |
Sau đó bạn mở trình duyệt web trên máy bạn lên,