Соединение двух Ардуино через Ethernet посредством Ethernwt Shield W5100

chpock_pm
Offline
Зарегистрирован: 17.06.2014

Подскажите кто-нибудь соединял две ардуино по Ethernet на базе W5100? У меня задача передавать данные с одной дуины на другую на расстояние 15 метров, решил попробовать использовать Ethernet. Привожу в пример скетчи:

Arduino 1 (sender):

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress ip(192,168,1,101);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

EthernetServer server(23); // telnet defaults to port 23

void setup () {
  Serial.begin(115200);
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("Chat server address:");
  Serial.println(Ethernet.localIP());
 }

void loop () {
  
  EthernetClient client = server.available();
  
  if (client) {
      client.print("hello");
      client.println(" world");
  }
}

Arduino 2 (receiver):

#include <SPI.h>
#include <Ethernet.h>


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,102);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

IPAddress server(192,168,1,101);
EthernetClient client;


void setup() {

 Serial.begin(115200);

  Ethernet.begin(mac, ip);
  delay(1000);
  Serial.println("connecting...");

  if (client.connect(server, 23)) {
    Serial.println("connected");
  } 
  else {
    Serial.println("connection failed");
  }

}

void loop() {

  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    delay(1000);
  }
}

Мониторю принимающую сторону, в порту вижу "disconnecting". Несмотря на это на передающем Шилде все время мигает лампочка Tx, а на принимающем Шилде так же мигает Rx..

Помогите пожалуйста разобраться в чем дело

BeletskyAV
Offline
Зарегистрирован: 19.11.2013

Попробуй это. У меня работает.

Условно "сервер"

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE};
IPAddress ip(192, 168, 1, 100);
IPAddress ipcl(192, 168, 1, 106);
unsigned int localPort = 8888;

char packetBuffer[20];
char clearBuffer[] = "                    ";

EthernetUDP Udp;

void setup() {
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

  Serial.begin(115200);
    Udp.beginPacket(ipcl, 8888);
    Udp.write("test");
    Udp.endPacket();
}

void loop() {
  for (int i = 0; i < 19; i++) {
    packetBuffer[i] = clearBuffer[i];
  }
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    IPAddress remote = Udp.remoteIP();
    for (int i = 0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print("  ");
    Udp.read(packetBuffer, 20);
    Serial.print(packetBuffer);
    char* copy = packetBuffer + 3;
    Serial.println(copy);

    Udp.beginPacket(ipcl, 8888);
    Udp.write("test");
    Udp.endPacket();
  }
  delay(1000);
}

Условно "клиетн"

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xDE};
IPAddress ip(192, 168, 1, 106);
IPAddress ipsrv(192, 168, 1, 100);
unsigned int localPort = 8888;

char packetBuffer[20];
char clearBuffer[] = "                    ";
char* copy;

EthernetUDP Udp;

void setup() {
  Ethernet.begin(mac, ip);
  Udp.begin(localPort);

  Serial.begin(115200);
}

void loop() {
  for (int i = 0; i < 19; i++) {
    packetBuffer[i] = clearBuffer[i];
  }
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    IPAddress remote = Udp.remoteIP();
    for (int i = 0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print("  ");
    Udp.read(packetBuffer, 20);
    Serial.print(packetBuffer);
    copy = packetBuffer + 3;
    Serial.println(copy);

    Udp.beginPacket(ipsrv, 8888);
    Udp.write("test");
    Udp.endPacket();
  }
  delay(1000);
}

 

Andrey Ermakov
Offline
Зарегистрирован: 21.02.2015

Здравствуйте! Ув. BeletskyAV!

Я попробовал скетчи, выложенные Вами, но связь между двумя контроллерами установить не удалось.

Вот, что у меня получилось: слева сервер, справа клиент.

BeletskyAV
Offline
Зарегистрирован: 19.11.2013

Если честно, Я уже не помню эти сскетчи. Но судя по логам - летит "мусор", а связь есть. Другой вопрос . Что хотите получить от связи двух Ардуин? Если передавать данные и в соответствии с алгоритмом выполнить действия - то загляните сюда : http://smartliving.ru/ . Это и Ардуино и Винда ( Линукс) , и PHP ? и MySQL в одном флаконе , т.е. можно менять алгоритм на ходу не меняя скеч Ардуины.

P.S. Это не реклама , это то чем Я "заболел" и там сижу.

P.P.S. В любом случае зайдите , там связь Ардуины с Сервером и обратно построена на GET запросах - работает на все 100 . Только скечи я использую свои. Если будут вопросы пишите beletskyav@gmail.com чем смогу помогу.

Andrey Ermakov
Offline
Зарегистрирован: 21.02.2015

Спасибо! Буду разбираться.

От связи ардуин хочу получить следующее:

Из одной сделаю мастер модуль который будет раздавать команды, а остальные - разнесу по разным помещениям в качестве устройств удалённого ввода-вывода.

BeletskyAV
Offline
Зарегистрирован: 19.11.2013

Если один мастер и куча слейвов то точно MajorDoMo вам в помощь.