close

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();
..............
}

 

 

 

 

Greg / Xuite日誌 / 回應(0) / 引用(0)
沒有上一則|日誌首頁|沒有下一則
回應