nrf24l01 + RC522 Программа зависает

Zhenya1511
Offline
Зарегистрирован: 27.08.2016

Подскажите пожалуйста, голову сломал уже. Подключаю nrf-ку и RFID сканер по SPI. Как только код доходит до radio.write программа зависает. Пробовал вручную выставлять SS в LOW/HIGH всё равно не помогает. 

Использую либы MFRC522.h и RF24.h

Я в отчаяние... проект под угрозой, выручайте пожалуйста (((

#include <SPI.h>
#include <MFRC522.h>
#include <RF24.h>

#define RST_PIN 9       
#define RFID_SS_PIN 10

#define RF24_CSN_PIN 7
#define RF24_SS_PIN 8


MFRC522 mfrc522(RFID_SS_PIN, RST_PIN);    // Create MFRC522 instance
RF24 radio(RF24_SS_PIN, RF24_CSN_PIN);

const uint64_t pipe = 0xE8E8F0F0E1LL;
byte sensorVal[1] = {5};

void setup() {
    Serial.begin(9600);        // Initialize serial communications with the PC
    SPI.begin();            // Init SPI bus
    mfrc522.PCD_Init();        // Init MFRC522
  radio.begin();
  radio.setDataRate(RF24_250KBPS);
  radio.openWritingPipe(pipe);
}

void loop() {
sensorVal[0] = getID();
Serial.println(sensorVal[0]);
Serial.println("---");
radio.write(sensorVal, 1);
delay(500);
}

int getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
    return 0;
  }
  // There are Mifare PICCs which have 4 byte or 7 byte UID care if you use 7 byte PICC
  Serial.println("Scanned PICC's UID:");
  for (int i = 0; i < mfrc522.uid.size; i++) {  //
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.println("");
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

> Пробовал вручную выставлять SS в LOW/HIGH всё равно не помогает.

Посмотри код бибилиотек на предмет дёганья ChipEnable (CE) в функцих. Для nRF24 такое вроде есть, а вот для твоего девайса хз.

По ссылке https://github.com/maniacbug/RF24 в примерах есть вывод информации о передатчике в начале программы.

wu4k@mail.ru
Offline
Зарегистрирован: 09.09.2017

[Цитата=Zhenya1511]

Подскажите пожалуйста, голову сломал уже. Подключаю ФНО-ку и технологии RFID сканер по СИО. Как только код доходит до радио.записи программа зависает. Пробовал вручную выставлять СС в низкий/высокий всё равно не помогает.

Использую либы MFRC522.ч и RF24.сек

Я в отчаяние... проект под угрозой, выручайте пожалуйста (((

#включить <спи.ч>
#включить <MFRC522.ч>
#включить <RF24.ч>

#определить RST_PIN 9 
#определить RFID_SS_PIN 10

#определить RF24_CSN_PIN 7
#определить RF24_SS_PIN 8


MFRC522 mfrc522(RFID_SS_PIN, RST_PIN); // создать экземпляр MFRC522
Радио RF24(RF24_SS_PIN, RF24_CSN_PIN);

с const uint64_t трубы = 0xE8E8F0F0E1LL;
байт sensorVal[1] = {5};

настройка недействительными() {
 Серийный.методы begin(9600); // Инициализируем последовательный обмен данными с ПК
 СИО.начать(); // инициализации SPI шины
 mfrc522.PCD_Init(); // инициализации MFRC522
радио.начать();
радио.setDataRate(RF24_250KBPS);
радио.openWritingPipe(трубы);
}

недействительными петля() {
sensorVal[0] = getID();
Серийный.код println(sensorVal[0]);
Серийный.код println("---");
радио.писать(sensorVal, 1);
задержка(500);
}

Тип int getID() {
 // Готовимся к чтению picc заключается в его сравнительно
 если ( ! mfrc522.PICC_IsNewCardPresent()) { //если новый ПМКД размещен на RFID считыватель продолжения
 возврат 0;
}
 если ( ! mfrc522.PICC_ReadCardSerial()) { //поскольку катетер picc вам серийный и дальше
 возврат 0;
}
 // Есть picc заключается в его сравнительно формата mifare, которые имеют 4 байт 7 байт uid не волнует, если вы используете 7 байт ПМКД
 Серийный.код println("по этой ПМКД идентификатор:");
 для (int я = 0; я < mfrc522.уид.Размер; я++) { //
 Серийный.печати(mfrc522.уид.uidByte[я], шестигранные);
}
Серийный.код println("");
 mfrc522.PICC_HaltA(); // прекратить чтение
 возвращение 1;
}

 

 

 

[/Цитата]

 

Если вы решили проблемму поделитесь, т.к. нашел в библиотеке RC522 недостаток, при быстром приложении карт она зависает, и больше не востанавливатся. Ед. вариант выключение питания..косяк какой..кто то может что то сказать.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

wu4k@mail.ru, WatchDog тебе в помощь. 

wu4k@mail.ru
Offline
Зарегистрирован: 09.09.2017
  if (!mfrc522.PICC_IsNewCardPresent())  // Наличие карты в зоне действия
  {
   return;
  }

  if (!mfrc522.PICC_ReadCardSerial())   // Выбираем одну из карт
  {
   return;
  }

Но это не дело). Вы знаете какой интересный признак, т.е. RC522 прочитывает карту 1 раз, а 2 раз читать уже не хочет. Вылетает на методах

 

freearduino
Offline
Зарегистрирован: 21.04.2014

В итоге кто нибудь подружил NRF24 и RC522?

У меня получилось один раз считывает и зависает...

Может кто делал подобное?Подскажите куда копать???

#include <Arduino.h>
#include <MFRC522.h>
#include <SPI.h>      // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h>     // Подключаем библиотеку для работы с nRF24L01+

#include <avr/wdt.h>

int NRF_CE = 9;
int NRF_CSN = 10;

RF24 radio(NRF_CE, NRF_CSN); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
int data[2];                 // Создаём массив для передачи данных (так как мы будем передавать только одно двухбайтное число, то достаточно одного элемента массива типа int)
int RST_RC = 5;
int SS_RC = 6;

int BufInt;
// Создание экземпляра объекта MFRC522
MFRC522 mfrc522(SS_RC, RST_RC);
//
//wdt_enable(WDTO_8S);
/* Возможные значения для константы
  WDTO_15MS
  WDTO_30MS
  WDTO_60MS
  WDTO_120MS
  WDTO_250MS
  WDTO_500MS
  WDTO_1S
  WDTO_2S
  WDTO_4S
  WDTO_8S
*/
void setup()
{
    //wdt_enable(WDTO_1S);
    Serial.begin(19200);
    Serial.println("Start");
    pinMode(RST_RC, OUTPUT);
    pinMode(SS_RC, OUTPUT);
    //pinMode(NRF_CSN, OUTPUT);
    digitalWrite(RST_RC, LOW);
    digitalWrite(SS_RC, HIGH);
    digitalWrite(NRF_CE, HIGH);

    SPI.begin();
    radio.begin();                         // Инициируем работу nRF24L01+, SPI запустили
    radio.setChannel(5);                   // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
    radio.setDataRate(RF24_1MBPS);         // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
    radio.setPALevel(RF24_PA_HIGH);        // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
    radio.openWritingPipe(0xAABBCCDD11LL); // Открываем трубу с идентификатором 0xAABBCCDD11 для передачи данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)

   // SPI.begin(6);
    digitalWrite(RST_RC, HIGH);
    delay(250);
    digitalWrite(SS_RC, LOW);
    mfrc522.PCD_Init(); // Init MFRC522 card
    delay(100);
    digitalWrite(RST_RC, LOW);
    digitalWrite(SS_RC, HIGH);
}

// преобразование в HEX
void view_data(byte *buf, byte size)
{

    for (byte j = 0; j < size; j++)
    {

        Serial.println(buf[j]);
        BufInt = BufInt + buf[j];
        // Serial.print(buf[j], DEC);
    }
    Serial.print("BufInt=");
    Serial.println(BufInt);
    data[0] = BufInt;
    BufInt = 0;
}

void loop()
{
    //wdt_reset();
    Serial.println("Loop");
    digitalWrite(NRF_CE, HIGH);
    delay(100);
    digitalWrite(RST_RC, HIGH);
    digitalWrite(SS_RC, LOW);

    if (!mfrc522.PICC_IsNewCardPresent())

        return;

    // чтение

    if (!mfrc522.PICC_ReadCardSerial())

        return;

    // вывод данных

    Serial.print("UID=");

    view_data(mfrc522.uid.uidByte, mfrc522.uid.size);

    Serial.println();

    Serial.print("type=");

    byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);

    Serial.print(mfrc522.PICC_GetTypeName(piccType));
    Serial.println();

    digitalWrite(SS_RC, HIGH);
    delay(250);
    digitalWrite(RST_RC, LOW);
    delay(250);
    digitalWrite(NRF_CE, LOW);
    
    Serial.println("Send");
    delay(500);
    //data[0] = 580;
    radio.write(&data, sizeof(data));
    Serial.println("Send OK");
    digitalWrite(NRF_CE, HIGH);
    //digitalWrite(NRF_CSN, HIGH);
    delay(100);
}