arduino的Ethernet Shield是大家最常使用的網路模組,在這裡分享過去遇到問題
首先是連線數問題,由於arduino是single process晶片的裝置,無法做出mutli-thread
官網有寫最多同時支援4個socket connection(TCP/UDP)
然而親自做實驗時,第4個連線經常出現封包遺漏或連線莫名中斷?
因此之後在實做時,最多同時只用到3個連線
若裝置>4個時,沒有同步操作的必要時,建議可以1個1個連線
像2x2的電視牆,同時開啟電源也會有壓降過大、可能導致某些面板無法正常啟動
這時每一台都會間隔5秒開啟,以確保順利開機
這種情況就可以使用上述的,只用一個connection來開啟
下面寫個範例供大家參考:
#include "SPI.h"
#include "Ethernet.h"
/* Serial port receive buffer */
#define BUFFER_SIZE 16
char inBuffer[BUFFER_SIZE];
/* Enter a MAC address for your controller below */
byte MAC[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress IP(192, 168, 1, 100);
/* End deivces configuration */
EthernetClient CtrlClient;
IPAddress TV1(192,168,1,101), TV2(192,168,1,102), TV3(192,168,1,103), TV4(192,168,1,104);
int NowConnect = -1; /* avoid repeated connection */
int TV_PORT = 1234; /* assume TV port is 1234 */
int idx;
void setup()
{
/* For voltage stable */
delay(300);
/* Ethernet deivce initialization */
Ethernet.begin(MAC, IP);
Serial.begin(9600);
}
void loop()
{
/* When user inputs command ..... */
while (Serial.available() > 0)
{
Serial.readBytes(inBuffer, BUFFER_SIZE);
switch(inBuffer[0])
{
case '1':
for (idx=1; idx<=4; idx++)
{
SetConnection(idx);
PowerOn();
delay(5000); // --> TV power on in every 5 seconds
}
break;
case '0':
for (idx=1; idx<=4; idx++)
{
SetConnection(idx);
PowerOff();
delay(1000); // --> TV power off in every 1 second
}
break;
default:
break;
}
}
}
void SetConnection(int _no)
{
unsigned long start;
Serial.print("Set Connection...");
Serial.println(_no);
/* Check which device hold the socket connection */
if (CtrlClient.connected())
{
if (NowConnect != _no) /* different device connection */
{
CtrlClient.stop();
Serial.println("Stopping Connection...");
}
else
return;
}
/* Connection is failed when connecting over 7 seconds */
start = millis();
switch(_no)
{
case 1: //IP: 192.168.1.101
while(!CtrlClient.connect(TV1, TV_PORT) && (millis() - start < 7000))
;
break;
case 2: //IP: 192.168.1.102
while(!CtrlClient.connect(TV2, TV_PORT) && (millis() - start < 7000))
;
break;
case 3: //IP: 192.168.1.103
while(!CtrlClient.connect(TV3, TV_PORT) && (millis() - start < 7000))
;
break;
case 4: //IP: 192.168.1.104
while(!CtrlClient.connect(TV4, TV_PORT) && (millis() - start < 7000))
;
break;
default:
break;
}
NowConnect = _no; /* remember last connection, avoid re-connection time wasting */
}
(Ethernet Shield,圖片來源 http://arduino.cc)
接下來分享以前使用網路板遇到的問題,希望對大家有幫助
拍賣上可以買得到許多家的網路板,我只能說.......一分錢一分貨!!
個人試過3家板子,有1家還特地買了兩個不同時期做出來的板子喔!
出問題的永遠是這一家............不過我是不會說是對岸的那一家做的啦~(啊....我好像說出國家了...)
遇到的問題大概有下列幾種:
1.接上電後無法正常啟動
這種情況有趣的是,有時候只要按下Reset鍵後,就會復活........當時就在推測.....
該不會用很差的被動元件,還是layout板子的技術太差導致啟動電壓未到位!?
在setup( )的第一行加入了延遲300ms,應該夠power sequence了吧!
沒有想到......竟然會成功.........事後再查了國外的論壇,有人的跟我解決方法一樣
2.跑一段時間後板子就掛
這種情況至今我也找不到解答....因為我同時間去實驗2個不同家的網路板
有一家用了大概7~15天,就會掛掉!只能做power reset的動作才回得來
我只好在arduino主程式裡加了每一個禮拜就自動software reset的程式碼
有興趣可以參考下面"代碼",提供兩種方法供客倌使用:
/* 1.Restarts program from beginning but does not reset the peripherals and registers */
void SoftwareReset()
{
asm volatile (" jmp 0");
}
/* 2.declare reset function @ address 0 */
void(* SoftwareReset)(void) = 0;
3.自己白痴眼殘不先看官網說明
官網上寫得很清楚,arduino主板和網路板是靠SPI通訊協定做溝通
在Uno上是使用到pin 10, 11, 12和13;Mega上是pin 50, 51, 52和53
要是不小心用到以上這些pin.....只能怪....年輕人終究是年輕人....不看說明就衝動亂用...嘖...
另外網路板上支援SD card存取,只是SD card和網路晶片與arduino都走同一條SPI bus
至於那一個拿到使用權與arduino溝通,SD card要靠pin 4、網路要用pin 10
Ethernet W5100 : HIGH (disable)、LOW (enable)
microSD :HIGH (disable)、LOW (enable)
所以,倘若一開要讀取SD卡裡資料做初始化的話,要加入
#include "SD.h"
void setup()
{
/* Disable W5100 SPI before beginning SD */
pinMode(10,OUTPUT);
digitalWrite(10,HIGH);
/* Start-up SD */
SD.begin(4); // pin 4 = LOW
DoSomethingOfSD();
..............
}