FastLED-driven strip ведет себя странно при использовании PN532

Светодиодная лента (WS2812B, 46 штук, PIN 8) и RFID-щит Adafruit PN532 (IRQ 2) прикреплены к моему Arduino Mega 2560.

Полоса на основе GRB, кажется, отлично работает с FastLED в начале, я могу подтвердить это, циклически прокручивая все три базовых цвета в setup().

Как только я вызываю nfc.readPassiveTargetID(...) и использую на нем тег NFC, все начинает становиться странным. Всякий раз, когда я комментирую строку, она снова работает правильно. Цвета RGB случайным образом меняются местами (как если бы я прошел другой цветовой заказ), яркость также может меняться случайным образом, и иногда несколько светодиодов в начале или конце полосы имеют другую яркость / цвет, чем остальные.

Поскольку я снизил яркость до 32, я уверен, что это не проблема с питанием.

Я предполагаю, что существует либо некоторое повреждение памяти, либо какое-то вмешательство контакта в две библиотеки, хотя я не знаю, почему это происходит. Пожалуйста, найдите мой код ниже, любая помощь приветствуется.

  #include <FastLED.h>
  #include <Adafruit_PN532.h>
  
  #define LED_COUNT 46
  #define LED_DATA_PIN 8
  CRGB leds[LED_COUNT];
  
  #define PN532_IRQ (2)
  #define PN532_RESET (3) // Not connected
  
  Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);
  
  void setLeds(CRGB color) {
    Serial.print("setLeds("); Serial.print(color.r, DEC ); Serial.print(","); Serial.print(color.g, DEC ); Serial.print(","); Serial.print(color.b, DEC ); Serial.println(")");
    for (int i = 0; i < LED_COUNT; i++) {
      leds[i] = color;
    }
    FastLED.show();
  }
  
  void ledStartSequence() {
    setLeds(CRGB::Black);
    for (int crtLed = 0; crtLed < 23; crtLed++) {
      leds[crtLed] = CRGB::Blue;
      leds[crtLed + 23] = CRGB::Blue;
      FastLED.show();
      delay(20);
    }
    Serial.println("Red");
    setLeds(CRGB::Red);
    delay(1000);
    Serial.println("Green");
    setLeds(CRGB::Green);
    delay(1000);
    Serial.println("Blue");
    setLeds(CRGB::Blue);
    delay(1000);
  
    Serial.println("Off");
    setLeds(CRGB::Black);
  }
  
  void initLeds() {
    FastLED.addLeds<WS2812B, LED_DATA_PIN, GRB>(leds, LED_COUNT);
    FastLED.setBrightness(32);
  }
  
  void initSerial() {
    Serial.begin(9600);
    Serial.println("Hello!");
  }
  
  void initNFC() {
    nfc.begin();
    uint32_t versiondata = nfc.getFirmwareVersion();
    Serial.print(versiondata);
    if (! versiondata) {
      Serial.print("Error: Didn't find PN53x board");
      while (1); // halt
    }
    // Got ok data, print it out!
    Serial.print("Found chip PN5"); Serial.println((versiondata >> 24) & 0xFF, HEX);
    Serial.print("Firmware ver. "); Serial.print((versiondata >> 16) & 0xFF, DEC);
    Serial.print('.'); Serial.println((versiondata >> 8) & 0xFF, DEC);
  
    nfc.SAMConfig();
  }
  
  void setup() {
    initSerial();
    initLeds();
    initNFC();
    ledStartSequence();
  }
  
  void loop(void) {
    Serial.println("Waiting for an ISO14443A Card ...");
    setLeds(CRGB::Red); // only displayed correctly in the first iteration
    uint8_t success;
    uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
    uint8_t uidLength;
  
    success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);
    /*
     *  Here's where things start to go nuts!
    */
    delay(1000);
    setLeds(CRGB::Green); // usually not displayed correctly
    delay(1000);
    setLeds(CRGB::Blue); // usually not displayed correctly
    delay(1000);
  }

, 👍1

Обсуждение

У вас есть массив "uid" с 7 байтами. Если после nfc.readPassiveTargetID значение uidLength будет> 7, у вас будет переполнение буфера. Знаете ли вы, сколько байтов содержит UID RFID-карты? Другая возможность заключается в том, что драйвер PN532 использует таймер (например, для аппаратного I2C), который также использует LED lib. Тогда это может помочь, если вы повторно инициализируете светодиоды initLeds() после вызова readPassiveTargetID. И то, и другое - всего лишь догадки., @Peter Paul Kiefer

Что происходит, когда после задержки и до setLeds(CRGB::Green) вы отключаете прерывание 2? Или когда вы вообще не подключаете линию прерывания RFID-экрана? Просто из любопытства. См . https://www.arduino.cc/reference/en/language/functions/external-interrupts/detachinterrupt/, @ocrdu


1 ответ


Лучший ответ:

1

Потратив слишком много времени на код, я решил, что это связано с чем-то совершенно другим:

RFID-считыватель создавал радиочастотные помехи на проводе передачи данных по направлению к светодиодной ленте... Экранирование его должным образом сделало свое дело, независимо от того, какой контакт используется.

В любом случае, спасибо за помощь.

,