Ethernet Shield не работает с TFT-экраном

Я пытаюсь объединить Arduino UNO, Ethernet Shield и Waveshare 2,8" TFT Shield. Поскольку я новичок в этом, я в основном занимаюсь базовыми вещами.

Мне удалось заставить Ethernet Shield и TFT Shield работать по отдельности. Затем, поскольку экран TFT не сможет использовать интерфейс ICSP, я подключил перемычки, как указано в wiki.

Конфигурация оборудования

  • При использовании платы Arduino с интерфейсом ICSP перемычки SB1, SB2 и SB3 на ЖК-модуле должны быть разомкнуты.
  • При использовании платы Arduino без интерфейса ICSP перемычки SB1, SB2 и SB3 на модуле должны быть соединены с 0R. резистор соответственно.

После этого я собрал все вместе и попытался заставить их работать с приведенным ниже кодом, но по какой-то причине, я не знаю, экран Ethernet перестал работать. Я получаю сообщение об ошибке Ethernet Shield не найден. Извините, не могу работать без оборудования. :(. Несмотря на ошибку, мой TFT-экран загорается и запускается демонстрация. Возможно, я упускаю что-то простое. Буду признателен за любую помощь или руководство.

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

IPAddress server(192, 168, 0, 107);
IPAddress ip(192, 168, 0, 177);
IPAddress myDns(192, 168, 0, 1);
IPAddress gateway(192, 168, 0, 1);
EthernetClient client;
byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x23, 0x36};

void setup()
{
  Serial.begin(9600);
  while (!Serial) {
    ; // ждем подключения последовательного порта. Требуется только для родного порта USB
  }

  /*--------- TFT Init -------------*/
  SPI.setDataMode(SPI_MODE3);
  SPI.setBitOrder(MSBFIRST);
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  SPI.begin();
  Tft.lcd_init();
  /*--------- TFT Init End -------------*/

  /*--------- Ethernet Setup -------------*/
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    } else if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
    // нет смысла продолжать, так что ничего не делайте навсегда:
    // пока (истина) {
    // delay(1);
    // }
  }
  // напечатать ваш локальный IP-адрес:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
  /*--------- Ethernet Setup End -------------*/

  /*--------- Ethernet Connection Demo Setup -------------*/
  if (client.connect(server, 3000)) {
    Serial.print("connected to ");
    Serial.println(client.remoteIP());
    // Делаем HTTP-запрос:
    client.println("GET / HTTP/1.1");
    client.println("Host: localhost");
    client.println("Connection: close");
    client.println();
  } else {
    // если вы не получили соединение с сервером:
    Serial.println("connection failed");
  }
  beginMicros = micros();
  /*--------- Ethernet Connection Demo Setup End -------------*/
}

void loop()
{
  /*--------- TFT Demo -------------*/
  Tft.lcd_clear_screen(WHITE);
  for (int x = 1; x <= 240; x++) {
    for (int y = 1; y <= 320; y++) {
      Tft.lcd_draw_rect(x, y, 1, 1, RED);
      delay(1);
    }
  }
  /*--------- TFT Demo End -------------*/

  /*--------- Ethernet Check-Up ---------*/
  switch (Ethernet.maintain()) {
    case 1:
      //обновленная ошибка
      Serial.println("Error: renewed fail");
      break;

    case 2:
      //возобновление успеха
      Serial.println("Renewed success");
      //выводим ваш локальный IP-адрес:
      Serial.print("My IP address: ");
      Serial.println(Ethernet.localIP());
      break;

    case 3:
      // повторная привязка не удалась
      Serial.println("Error: rebind fail");
      break;

    case 4:
      // успех повторной привязки
      Serial.println("Rebind success");
      //выводим ваш локальный IP-адрес:
      Serial.print("My IP address: ");
      Serial.println(Ethernet.localIP());
      break;

    default:
      //ничего не случилось
      break;
  }
  /*--------- Ethernet Check-Up End ---------*/

  /*--------- Ethernet Demo ---------*/
  int len = client.available();
  if (len > 0) {
    byte buffer[80];
    if (len > 80) len = 80;
    client.read(buffer, len);
    if (printWebData) {
      Serial.write(buffer, len); // показать в последовательном мониторе (замедляет некоторые платы)
    }
    byteCount = byteCount + len;
  }

  // если сервер отключен, останавливаем клиент:
  if (!client.connected()) {
    endMicros = micros();
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    Serial.print("Received ");
    Serial.print(byteCount);
    Serial.print(" bytes in ");
    float seconds = (float)(endMicros - beginMicros) / 1000000.0;
    Serial.print(seconds, 4);
    float rate = (float)byteCount / seconds / 1000.0;
    Serial.print(", rate = ");
    Serial.print(rate);
    Serial.print(" kbytes/second");
    Serial.println();

    // ничего не делать навсегда:
    // пока (истина) {
    // delay(1);
    // }
  }
  /*--------- Ethernet Demo End ---------*/
}

, 👍0


2 ответа


1

Сообщение об ошибке исходит от библиотеки Ethernet. Поскольку у меня нет достаточного оборудования для проверки, это указывает на конфликт контактов. Таким образом, экран ethernet v1 использует/нуждается в одном или нескольких контактах, которые использует экран ЖК-дисплея.
Как это выяснить, покопайтесь в документации схемы и посмотрите на используемые контакты.
Имейте в виду, что на сеть посвящена ethernet Shield v2, аппаратное обеспечение которого отличается от v1.

  • Схемы для Waveshare и Ethernet Shield v1
  • Проверьте также наличие коротких замыканий между разъемом USB (Arduino)/Ethernet и указанными выше экранами, я обычно изолирую их куском изоляционной ленты (на всякий случай).

ОБНОВЛЕНО
Экран Ethernet: Arduino обменивается данными как с W5100, так и с SD-картой, используя шину SPI (через заголовок ICSP). Это цифровые контакты 10, 11, 12 и 13 Uno. Контакт 10 используется для выбора W5100 и контакт 4 для SD-карты. Эти контакты нельзя использовать для общего ввода-вывода

Общий ресурс волны использует CS=D10, RS=D7, RST=D9, а SD CS можно определить, например, на SD_CS 5 с помощью этой библиотеки поскольку библиотеку waveshare нельзя использовать, кроме как для базовой игры.
Эта библиотека совместима с Adafruit_GFX, поэтому работает широкий спектр программ и других библиотек.
Так что ваш шанс

  • для переназначения SD CS с помощью программного обеспечения, если другие контакты не конфликтуют (вы должны это проверить) или
  • получить другой разъем Ethernet (не защитный, потому что он более гибкий) или
  • вручную переназначьте проводами dupont экран ЖК-дисплея (потому что он самый верхний) и измените соответствующие контакты в заголовочном файле libs.

Не обрезайте дорожки и не припаивайте их, это не стоит усилий, и вы можете что-нибудь сломать

,

Спасибо за ваш ответ. Прежде всего, я изолировал USB, как вы сказали, когда впервые установил экран. Во-вторых, поскольку я могу запускать вышеприведенный код отдельно без ошибок, я предполагаю, что мой код подходит для моих версий. Допустим, есть конфликт контактов. Есть ли у вас какие-либо идеи/предложения о том, как это исправить? Как вы думаете, я могу установить для них другой пин только с помощью кода? Библиотека Ethernet имеет функцию [Ethernet.init(sspin)](https://www.arduino.cc/en/Reference/EthernetInit). Значит ли это, что мне нужно что-то паять? Еще раз спасибо., @bennygenel

Посмотрите мое редактирование и сначала протестируйте другую библиотеку TFT без щита Ethernet., @Codebreaker007


2

Изучив схемы экрана Ethernet и экрана TFT, можно сделать вывод, что контакт выбора микросхемы (CS) экрана Ethernet использует тот же контакт (контакт D4 Arduino), что и контакт прерывания сенсорной панели на ваш экран TFT (TP_IRQ) на схеме.

Я не думаю, что вы можете решить эту проблему, не модифицируя какое-либо оборудование. Либо экран TFT, либо экран Ethernet должны быть изменены для использования другого контакта, и эти изменения должны быть отражены в базовой библиотеке.

Я предполагаю, что проще всего модифицировать экран Ethernet, так как его печатная плата доступна с двух сторон. Вы также можете отрезать контакт D4 от экрана TFT и соединить его печатную дорожку с неиспользуемым цифровым контактом через короткий провод.

,