nrf24l01 + RC522 Программа зависает
- Войдите на сайт для отправки комментариев
Сб, 27/08/2016 - 11:56
Подскажите пожалуйста, голову сломал уже. Подключаю 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;
}
> Пробовал вручную выставлять SS в LOW/HIGH всё равно не помогает.
Посмотри код бибилиотек на предмет дёганья ChipEnable (CE) в функцих. Для nRF24 такое вроде есть, а вот для твоего девайса хз.
По ссылке https://github.com/maniacbug/RF24 в примерах есть вывод информации о передатчике в начале программы.
[Цитата=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 недостаток, при быстром приложении карт она зависает, и больше не востанавливатся. Ед. вариант выключение питания..косяк какой..кто то может что то сказать.
wu4k@mail.ru, WatchDog тебе в помощь.
if (!mfrc522.PICC_IsNewCardPresent()) // Наличие карты в зоне действия { return; } if (!mfrc522.PICC_ReadCardSerial()) // Выбираем одну из карт { return; }Но это не дело). Вы знаете какой интересный признак, т.е. RC522 прочитывает карту 1 раз, а 2 раз читать уже не хочет. Вылетает на методах
В итоге кто нибудь подружил 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); }