• 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
RFID RC522 i odbiornik nRF24L01 na jednym Arduino
#1
Witam.
Mam problem w uruchomieniu odbiornika nRf24L01 i RC522 na jednym Arduino Nano problem polega na tym gdy działa np. RC522 to nie działa nRF24L01 i na odwrót walczę już od jakiegoś czasu zatem zwracam się do Kolegów o pomoc.
Kod:
/*/Arduino NANO
                 Sterowanie zamkiem poprzez RFID RC522 Wiele TAGów breloczeków niebieskich
                 oraz radiowo poprzez nRF24L01 lub i RF RXB12
                 Januszek 
                  
           

//        Typowy układ pinów:
*/
/* -----------------------------------------------------------------------------------------
*             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino         Arduino
*             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro       Pro Mini
* Signal      Pin          Pin           Pin       Pin        Pin              Pin             Pin
* ------------------------------------------------------------------------------------------------------
* RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
* SPI SS      SDA(SS)      10            53        D10        10               10
* SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
* SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
* SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15

   Buzzer pasywny SD160701                         D7
   RXB12 zielony 1                                 3V3         3V3                             5V
                 2                                 GND         GND                             GND
                 3                                 D3          PIN2                            2
   Wyjscie na LED lub na Przekaznik                D4          PIN4
       
//======================================================================================
*/

#include <RCSwitch.h>  //Biblioteka dla RF RXB12
#include <SPI.h>
#include <MFRC522.h>
#include "nRF24L01.h" // Biblioteka dla nRF24L01
#include "RF24.h"     // Biblioteka dla nRF24L01


#define przekaznik 8  
#define ilosc_brelokow 6

const byte UID[ilosc_brelokow][6] = {
{0x24, 0xF8, 0xDD, 0x89},   // kod breloczka bez naklejki
{0xD6, 0xB0, 0xFA, 0x29},   // kod białej karty
{0x69, 0x04, 0xA6, 0xB9},  //1
{0x40, 0xD0, 0xA3, 0xB9},  //2
{0x63, 0xE7, 0xA5, 0xB9},  //3
{0x64, 0xC1, 0xA3, 0xB9}   //4
};

const byte PRZEKAZNIKI[ilosc_brelokow] = {
8,
0,
0,
0
};
         byte status=1;
int stan = 0;
int poprzedni_stan = 0;


//111111111111111111--nRF24l01--111111111111111111111
//Przechowuje dane przychodzące
int otrzymane[1]; //otrzymane

//Inicjuje planszę na piny Arduino 7 (CE) i 8 (CS)
RF24 radio(7,8);

//Ustawia adres do komunikacji między modułami
const uint64_t adres = 0xE14BC8F482LL;


//111111111111111111--nRF24l01--111111111111111111111

//Ustawia piny dla przekaźnika
//int Pk_zamka = 4;                             //D4 wsplne dla nrf RC522 RF - wyjście zamka

MFRC522 rfid(10, 9);        // PINy podłączenia karty RFID do Nano
MFRC522::MIFARE_Key key;

//=======================================================
/*
//------------------------------RF RXB12 początek-----------------------------------------------------
    RCSwitch mySwitch = RCSwitch();
//------------------------------RF RXB12 koniec------------------------------------------------------
*/
//============================================================


void setup() {
int i;
 SPI.begin();                                   // Uruchom magistralę SPI
  rfid.PCD_Init();                              // Uruchom MFRC522
   pinMode(4, OUTPUT);                   // wyjscie zamka i
                                                // Ustawienie portu Jako wyjście tu jest port #D4 @zmiana 4 na Pk_zamka
                                           
//pinMode(LED_BUILTIN, OUTPUT);
    pinMode(3, OUTPUT);       //Buzzer port D3  pinMode(3, OUTPUT)

//111111111111111111--nRF24l01--111111111111111111111

 //Określa piny dla przekaźnika i Buzzera jako wyjściowe
 pinMode(4, OUTPUT);          // Port D4 wyjście zamka ---zmiana Pk_zamka na 4
 pinMode(3, OUTPUT);             // Port D3 Buzzer  na pinMode(3, OUTPUT)

 //Inicjuje serial monitor        // serial monitor niekonieczny
//  Serial.begin(57600);
 
 //Inicjuje komunikację
 radio.begin();
// Wejdź do trybu odbioru
radio.openReadingPipe(i,adres);
 radio.startListening();
//}


//111111111111111111--nRF24l01--111111111111111111111  


/*
//------------------------------RF RXB12 początek-----------------------------------------------------
{
  mySwitch.enableReceive(0);                    // Odbiornik na przerwaniu 1 => to jest pin #D2 mySwitch.enableReceive(0) /// Leonardo pin int 1 mySwitch.enableReceive(1)//Dla PRO MINI PIN2 (0),,PIN3(1)
 
}
 //------------------------------RF RXB12 koniec-------------------

*/

for(i= 0; i < ilosc_brelokow; i++)
{
  pinMode(PRZEKAZNIKI[i], OUTPUT);
  digitalWrite(PRZEKAZNIKI[i], HIGH);
 
}

}

void wlacz_przekaznik(int ktory)
{
digitalWrite(PRZEKAZNIKI[ktory], LOW);
}

void wylacz_przekaznik(int ktory)  
{
digitalWrite(PRZEKAZNIKI[ktory], HIGH);  
}

// *
// *   // Funkcja porównuje bieżący odczyt z czujnika z globalną tabelą z UID
// *   // Jeśli którykolwiek z wpisów z tabeli jest zgodny, zwraca jego indeks
// *   // Jeśli żaden z wpisów nie pasuje, zwraca -1

int checkUid(void){

int i;

for(i= 0; i < ilosc_brelokow; i++){
  if( rfid.uid.uidByte[0] == UID[i][0] && rfid.uid.uidByte[1] == UID[i][1] && rfid.uid.uidByte[2] == UID[i][2] && rfid.uid.uidByte[3] == UID[i][3] )
    return i;
}

return -1;
}
//oooooooooooooooooooooooooooooooo- VOID LOOP -ooooooooooooooooooooooooooooooo

void loop() {



//1111111111--void loop--11111111--nRF24l01--1111--jak włczona ta czesc to nie działa RC522 --11111111111111111

{
  //Sprawdź sygnał radiowy
 if (radio.available())
 {
   bool done = false;    
   while (!done)
{
     done = radio.read(otrzymane, 1);
  ///   Serial.print("Dane otrzymane : ");    
  ///   Serial.println(otrzymane[0]);
     
     //Jeśli otrzymałeś numer 1, LED 1 czerwona  // na porcie D4 wyjście zamka
     if (otrzymane[0] == 1)
     {
      // delay(100);

       digitalWrite(4, HIGH);                // na porcie D4 wyjście zamka
       tone(3, 4000);      // Wygeneruj sygnał o częstotliwości 1000Hz na pinie D3 (to  tone(3, 3000);
                   delay(100);  
           noTone(3);          // Wyłącz generowanie sygnału
       delay(5000);
   digitalWrite(4, LOW);                      // na porcie D4 wyjście zamka
    tone(3, 3000);      // Wygeneruj sygnał o częstotliwości 1000Hz na pinie D3 (to  tone(3, 3000);
                   delay(100);  
           noTone(3);          // Wyłącz generowanie sygnału
                   delay(100);
           tone(3, 500);     // Wygeneruj sygnał o częstotliwości 1000Hz na pinie D3 (to  tone(3, 3000);
                   delay(100);
           noTone(3);         // Wyłącz generowanie sygnału
                   delay(100);  
           
     }
   
//111111111111111111--nRF24l01--111111111111111111111


int karta;

if (rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial())
{
  karta= checkUid();
 
  if ( karta >= 0)
  {
    if (digitalRead(PRZEKAZNIKI[karta]) == HIGH)

    {
   
      poprzedni_stan = 1;
      stan = 1;
                      tone(3, 1000);   // Wygeneruj sygnał o częstotliwości 1000Hz na pinie D3
                      delay(100);  
                      noTone(3);       // Wyłącz generowanie sygnału

    digitalWrite(4, HIGH);             //@ po odebtaniu sygnał z nadajnika port zostaje ustawiony za załącz stan wysoki
     delay(5000);                      // czekaj 5000 ms czyli 5 sekund po tym czasie
     digitalWrite(4, LOW);             //@ ustaw port 4 na wyłącz stan niski
                     tone(3, 1000);    // Wygeneruj sygnał o częstotliwości 1000Hz na pinie D3
                     delay(100);  
                     noTone(3);        // Wyłącz generowanie sygnału
    }
    else
    {
     
        digitalWrite(PRZEKAZNIKI[karta], LOW);
        poprzedni_stan = 0;
        stan = 0;
       
    }



  } else
  {
                     tone(3, 1000);   // Wygeneruj sygnał o częstotliwości 1000Hz na pinie D3
                     delay(500);  
                     noTone(3);       // Wyłącz generowanie sygnału
                                      // po odebtaniu Błędnego kodu TAG niewłasciwy sygnał z karty RFID RC522 port zostaje ustawiony za załącz stan wysoki Zalacza Buzzer
                                      // czekaj 3000 ms czyli 3 sekund po tym czasie
                                      // ustaw port 3 na wyłącz stan niski wylacza Buzzer

 }
  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();
 
}
}
}     // nrf
}      // nrf
  }   // nrf  
//  }    
 
Odpowiedź
#2
Na początek wywal takie kwiatki
Kod:
RF24 radio(7,8);
MFRC522 rfid(10, 9);
i zrób porządnie przez define, bo takiego bajzlu nie chce się analizować.
Z jaką prędkością działa nRf24L01 a z jaką RC522?

Gdy masz w kodzie kolejne "kwiatki" jak:
Kod:
delay(5000);                      // czekaj 5000 ms czyli 5 sekund po tym czasie
to wszystko w tym czasie stoi. Tu pewnie jest sedno problemu.
 
Odpowiedź
#3
Takie przykładowe kody służą tylko do przetestowania poszczególnych peryferii - albo radia, albo karty. To tak jakbyś nauczył się trzymać piłeczkę w ręce, niestety możesz tylko jedną. Jak chcesz używać dwóch to już trzeba się nauczyć żonglować - książki, kursy online np. kurs, analizowanie cudzych programów wielozadaniowych.  
W szczególności korzystanie z dwóch urządzeń korzystających z jednej magistrali danych (tu SPI) wymusza doskonałą znajomość używanych bibliotek - co do czego, jak używać, jakie są ograniczenia.
Pół biedy jak sobie z procka wysyłasz dane, sam sobie możesz ustalić co kiedy (bierzesz piłeczkę, odkładasz, bierzesz kolejną, itd). Na odbiór danych musisz być gotowy zawsze i żadnych delay nie powinno być w programie.
Rozumiesz już, że Twoim kodzie nie ma co poprawiać?
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#4
(26-09-2018, 16:41)kaczakat napisał(a): Takie przykładowe kody służą tylko do przetestowania poszczególnych peryferii - albo radia, albo karty. To tak jakbyś nauczył się trzymać piłeczkę w ręce, niestety możesz tylko jedną. Jak chcesz używać dwóch to już trzeba się nauczyć żonglować - książki, kursy online np. kurs, analizowanie cudzych programów wielozadaniowych.  
W szczególności korzystanie z dwóch urządzeń korzystających z jednej magistrali danych (tu SPI) wymusza doskonałą znajomość używanych bibliotek - co do czego, jak używać, jakie są ograniczenia.
Pół biedy jak sobie z procka wysyłasz dane, sam sobie możesz ustalić co kiedy (bierzesz piłeczkę, odkładasz, bierzesz kolejną, itd). Na odbiór danych musisz być gotowy zawsze i żadnych delay nie powinno być w programie.
Rozumiesz już, że Twoim kodzie nie ma co poprawiać?

Ok dzięki kolegom za i taką pomoc troszkę mnie to nakierowało, jeszcze powalczę choć dalej będzie ciężko bo programistą nie jestem to takie hobby
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości