как подружить RFID-RC522 и радиомудуль NRF24L01+ ???

cron
Offline
Зарегистрирован: 01.02.2017

Друзья уже опустились руки. Перечитал все, перепробовал все!

Описание проблемы: 
Оба модуля весят на arduino mega. Ноги этих модулей(MISO, MOSI, SCK) запаралелены, т.е. соеденены. и подключены в меге в соответствующие порты. МОSI - 51, MISO - 50, SCK - 52.

Ноги SS обоих модулей в SETUP ставлю в HIGH - говоря тем самым меге что по SPI нинадо ни скем общатся.
В результате получаю полный висяк ардуины, т.е. все перестает работать.

В коде:
Перед тем как сделать отправку по радио ставлю ногу SS радиомодуля в LOW, а RFID в HIGH.
Но всеровно получаю висяк.

Пробовал наоборот тогда просто ничего не работает.
 

Отметил что если вынуть ногу MISO из Rfid то код работает и радио модуль отправляет. Но стоит их оба включить сразу висяк.

Пробовал милион комбинаций, перечитал информацию об SPI везде пишут о том что , если хочешь через SPI общатся с какимнибудь модулем поставь его ногу SS в LOW а остальные в HIGH и будет счастье. Но увы у меня не работает. 

Помогите совестом пожалуйста, как их подружить?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

cron пишет:

Пробовал милион комбинаций

А показать хоть одну - не судьба?

Rassel
Offline
Зарегистрирован: 07.11.2020

Подключите ногу MISO модуля RC-522 через сопротивление 1K, и будет вам счастье. Перед отправкой по радио ноги дергать не нужно!

DarkNight
Offline
Зарегистрирован: 22.02.2021

не поделитесь схемой включения к Mega 2560 ну или аналогию в uno? и если не сложно то было бы не плохо примерчик скетч глянуть... логика читать рфид встать на передачу и следом встать на прием чтоб получить подтверждение, или новую команду

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DarkNight, если у Вас что-то не получается с программированием, то, вероятнее всего, это из-за Вашего пренебрежительного отношения к языку, на котором Вы пишете. Ни один компилятор не пропустит текст с таким количеством ошибок, как Вы сделали в своем сообщении.

Rassel
Offline
Зарегистрирован: 07.11.2020

DarkNight не знаю насколько вам это поможет, но я приведу фрагмент своего кода, делал автономный считыватель(передатчик) NTAG213 меток. На устройстве всего одна кнопка питания, которую я в последствии заменил на сенсорную. Использовал схему самоблокировки питания, через 10 секунд бездействия или по команде,  питание выключается. Логика работы: Приемник условно постоянно находится в режиме прослушивания эфира, после получения пакета, с небольшой задержкой переключается на передачу для отправки команды и снова переходит в режим приема. Передатчик соответственно первым пакетом отправляет сигнал готовности (пакет с первым байтом 0xFF) и ждет команду, после выполнения отправляет результат...

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

/*
 Схема подключения:
 MISO, MOSI, SCK паралельно, на соответствующие аппаратные пины.
 Ногу MISO модуля RC-522 через сопротивление 1K - обязательно!
 Оставшиеся две пары ног на произвольные пины:
 */
 
MFRC522 mfrc522(8, 7);
RF24 radio(9, 10);

uint8_t data[5] = {0xFF, 0x00, 0x00, 0x00, 0x00};
const uint64_t pipes[2] = {0xFFFFFFFF01LL, 0xFFFFFFFF02LL};
const uint8_t power_pin = 6;
const uint32_t interval = 10000;

void setup() {
  pinMode(power_pin, OUTPUT); // Самоблокировка питания
  Serial.begin(9600);
  Serial.print("Power on");
  SPI.begin();
  mfrc522.PCD_Init();
  setup_radio();
}

void loop() {
  spi_data_select();
  power_off();
}

/// Инициализация радиомодуля  ///
void setup_radio() { 
  radio.begin();
  radio.setChannel(100);
  radio.setPayloadSize(sizeof(data));
  radio.setRetries(2, 10);
  radio.setPALevel(RF24_PA_LOW);
  radio.setDataRate(RF24_1MBPS);
  radio.openWritingPipe(pipes[0]); // На стороне приемника pipes[1]
  radio.openReadingPipe(1, pipes[1]); // На стороне приемника pipes[0]
  radio.startListening();
}

/// Аппаратное отключение питания  ///
void power_off() {
  while (true) {
    Serial.print("Power off");
    digitalWrite(power_pin, HIGH);
  }
}

/// Обмен данными с радио  ///
uint8_t spi_data() {
  uint32_t wait = millis();
  radio.stopListening(); // Останавливаем прослушивание эфира
  radio.write(&data, sizeof(data)); // Отправляем данные
  radio.startListening(); // Возобновляем прослушивание эфира
  while (true) {
    if (millis() - wait > interval) power_off();
    if (radio.available()) {
      radio.read(&data, sizeof(data));
      return;
    }
  }
}

/// Селектор операций ///
uint8_t spi_data_select() {
  spi_data();
  data[2] = 0x01; // Выставляем флаг успешности операции
  switch (data[1]) {
    case 0x00: power_off(); break;
    case 0x01: spi_write_number(); break;
    case 0x02: spi_clear_number(); break;
    case 0x03: spi_read_number(); break;
  }
}

/// Пишем номер ///
uint8_t spi_write_number() {
  uint32_t wait = millis();
  while (true) {
    if (millis() - wait > interval) power_off();
    if (mfrc522.PICC_IsNewCardPresent()) { // Ожидаем
      if (mfrc522.PICC_ReadCardSerial()) { // Выбираем
        // Здесь производим необходимые операции с RFID, NTAG...
        // Если операция завершилась неудачей - флаг data[2] = 0x00;
        spi_data(); // Отправляем данные
        return;
      }
    }
  }
}