• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino UNO + moduł ETH W5500 + RFID RC522
#1
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);
  }
}
 
Odpowiedź
#2
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ę..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#4
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?
 
Odpowiedź
#5
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#6
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.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#7
Czy chodzi Ci o podłączenie poprzez dzielniki?
[Obrazek: 90b7d9620f31d88e701936034a9e645252655c37...5x483.jpeg]
 
Odpowiedź
#8
(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.
 
Odpowiedź
#9
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.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#10
(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.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości