Arduino Polska Forum

Pełna wersja: Arduino UNO + moduł ETH W5500 + RFID RC522
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
Dzień dobry,
mam problem z moim projektem. Korzystam z arduino UNO, do którego podłączony jest moduł ethernet W5500 oraz moduł czytnika RFID RC522. Mój projekt polega na wysyłaniu poprzez Modbus TCP/IP informacji o ID karty. Oba moduły działają poprawnie, ale jak podłączone są dwa na raz to nagle moduł ethernetu wysyła komunikat "Ethernet shield was not found.". Oczywiście korzystam z innych pinów SS dla obu urządzeń. W momencie odłączenia pinu MISO czytnika RC522 moduł W5500 zaczyna poprawnie działać. 
Poniżej kod:
Kod:
#include <SPI.h>
#include <Ethernet.h>
#include <ArduinoRS485.h> // ArduinoModbus depends on the ArduinoRS485 library
#include <ArduinoModbus.h>
#include <MFRC522.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 0, 235);

EthernetServer ethServer(502);
ModbusTCPServer modbusTCPServer;

const int ledPin = 7; // LED_BUILTIN;
const int analogPin = A0;

#define RST_PIN         9          // Configurable, see typical pin layout
#define SS_PIN          8         // Configurable, see typical pin layout

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance

void setup() {
  Ethernet.init(10); // Most Arduino shields
  Serial.begin(9600);
  while (!Serial) { /* wait for serial */ }

  // Ethernet setup
  Ethernet.begin(mac, ip);

  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.");
    while (true) { delay(1); }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  ethServer.begin();

  if (!modbusTCPServer.begin()) {
    Serial.println("Failed to start Modbus TCP Server!");
    while (1) { delay(1); }
  }

  // Modbus setup
  modbusTCPServer.configureHoldingRegisters(0x00, 2);

  // RFID setup
  SPI.begin();
  mfrc522.PCD_Init();
  delay(4); // Optional delay
  mfrc522.PCD_DumpVersionToSerial();

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
}

void loop() {
  EthernetClient client = ethServer.available();

  if (client) {
    Serial.println("New client");
    modbusTCPServer.accept(client);

    while (client.connected()) {
      modbusTCPServer.poll();
      updateLED();

      // RFID read and write to Modbus register
      if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
        String uidStr = "";
        for (byte i = 0; i < mfrc522.uid.size; i++) {
          uidStr += String(mfrc522.uid.uidByte[i], HEX);
        }

        // Write the UID to Modbus holding register at address 0x00
        modbusTCPServer.holdingRegisterWrite(0x00, uidStr.toInt()); // Convert UID to integer

        mfrc522.PICC_HaltA(); // Halt card after reading
      }

      delay(100); // Delay to reduce polling frequency
    }

    Serial.println("Client disconnected");
  } else {
    delay(100);
  }
}

void updateLED() {
  // Read the current value of the holding register at address 0x00
  int registerValue = modbusTCPServer.holdingRegisterRead(0x00);

  if (registerValue) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}
Odłącz dwa moduły daj im tylko zasilanie i zmierz napięcie na miso jak będzie różnica to 0/5V to znasz przyczynę..
Podobne problemy spotykają ludzi, którzy próbują ożenić razem osobne moduły Ethernet i SD card. Rozwiązaniem jest wtedy jeden moduł w postaci shield'a, ma odpowiednią konstrukcję, albo użycie soft SPI dla drugiego urządzenia na innych pinach. Sam na szczęście nie spotkałem się z takim problemem, bo kiedyś używałem właśnie shielda i jakoś się nie złożyło by to połączyć z czymś jeszcze na SPI, a teraz to już tylko ESP z WIFI.
Nie wiem czy 0/5V na miso da jakąś informację, może być i 0 i być źle, nieaktywny slave powinien pozostawić MISO niewysterowane, tak by inny mógł to robić, czy tu wystawi 0 czy 5V to oba źle.
Zmierzyłem oba moduły i z obu miso odczytałem napięcie 0 V. Czy w takim przypadku rozwiązaniem może okazać się wymiana modułu ethernet z W5500 na ethernet shield np. W5100?
Ale Tobie nie zakłóca pracy moduł SD, tylko moduł czytnika RFID. Na początek spróbuj soft SPI. Żeby sprawdzić co faktycznie się dzieje na magistrali trzeba niestety mieć przynajmniej jakiś analizator stanów logicznych i zarejestrować co się dzieje po starcie programu.
Oba się zakłócają, podejrzenie pada na stany miso nieaktywne są wysterowane na LOW dlatego siebie blokują, Spróbował bym je podłączyć przez rezystory.
Czy chodzi Ci o podłączenie poprzez dzielniki?
[Obrazek: 90b7d9620f31d88e701936034a9e645252655c37...5x483.jpeg]
(30-04-2024, 08:11)Cezsta napisał(a): [ -> ]Zmierzyłem oba moduły i z obu miso odczytałem napięcie 0 V. Czy w takim przypadku rozwiązaniem może okazać się wymiana modułu ethernet z W5500 na ethernet shield np. W5100?
 Zmierz te napięcia dwa razy - raz względem masy i drugi raz względem Vcc. Czyli woltomierz jedną koncówka na MISO a druga raz na masę i raz na zasilanie. Mogą wyjść ujemne wartości.
Jeśli w obu przypadkach będzie około 0V to znaczy, że nóżka faktycznie wisi w powietrzu (wysoka impedancja). Być może chwilę potrwa ustalenie się wyniku - te pojemności pinów. Dla takich typowych multimetrów nie powinno to być zauważalne, chyba że masz jakiś super-profesjonalny miernik.
Nie, połączyć rezystor około 10Kohm szeregowo w miso jedno i drugie. Choć w praktyce powinieneś podłączyć RC552 przez konwerter napięć 3.3/5V bo nie toleruje 5V na IO.
(06-05-2024, 14:56)oscarX napisał(a): [ -> ]
(30-04-2024, 08:11)Cezsta napisał(a): [ -> ]Zmierzyłem oba moduły i z obu miso odczytałem napięcie 0 V. Czy w takim przypadku rozwiązaniem może okazać się wymiana modułu ethernet z W5500 na ethernet shield np. W5100?
 Zmierz te napięcia dwa razy - raz względem masy i drugi raz względem Vcc. Czyli woltomierz jedną koncówka na MISO a druga raz na masę i raz na zasilanie. Mogą wyjść ujemne wartości.
Jeśli w obu przypadkach będzie około 0V to znaczy, że nóżka faktycznie wisi w powietrzu (wysoka impedancja). Być może chwilę potrwa ustalenie się wyniku - te pojemności pinów. Dla takich typowych multimetrów nie powinno to być zauważalne, chyba że masz jakiś super-profesjonalny miernik.
Zmierzyłem napięcia według Twoich zaleceń w przypadku modułu W5500 oba napięcia wynosiły około 0. Natomiast w przypadku modułu RC522 napięcie między MISO - 3,3V wynosiło około 3V, natomiast MISO - GND 0V.
Stron: 1 2