Система контроля доступа

Тема в разделе "Флудилка", создана пользователем VO_Trigun, 13 апр 2017.

  1. VO_Trigun

    VO_Trigun Нуб

    Имеется две ардуино уно, две nRF24L01+, один rfid rc522, один oled lcd display.

    К первому ардуино подключаем nRF24L01+ко второму всё остальное.

    Считываю с карточки UID отправляю его первому ардуино и если такой есть в базе отправляю назад подтверждение или оправержение. При первом включение ардуино связывается друг с другом что бы было понятно что соединение установленно а вот отправить UID никак не получается или принять не уверен что именно не так.
    Код (C++):
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <RF24_config.h>
    #include <SPI.h>
    #include <MFRC522.h>
    #include <OLED_I2C.h>

    #define SS_PIN 7 //пин rfid
    #define RST_PIN 6 //пин rfid
    MFRC522 rfid(SS_PIN, RST_PIN);

    RF24 radio(9,10);//пины rf24
    const uint64_t pipe = 123456789;// труба
    uint32_t message;
    int connectServer[1];//для проверки коннекта с сервером
    OLED myOLED(SDA, SCL, 8);//пины OLED экрана
    extern uint8_t SmallFont[];//размер шрифта

    uint32_t answServer=0;
    byte nuidPICC[4];//для записи UID

    void setup() {
    Serial.begin(9600); //скорость ком порта
    SPI.begin(); // SPI интерфейс
    rfid.PCD_Init(); // Инициализация mfrc522
    pinMode(10,OUTPUT);
    pinMode(7,OUTPUT);
    radio.begin();
    radio.enableAckPayload();
    radio.setDataRate(RF24_250KBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS
    radio.openWritingPipe(pipe);
    myOLED.begin();
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("HELLO!", CENTER, 20);
    myOLED.update();
    delay(3000);

    myOLED.print("Connecting server", CENTER, 20);
    myOLED.update();
    connectServer[0] = 1;
    radio.write(connectServer, 1);
    delay(3000);
    if ( radio.isAckPayloadAvailable()){
    radio.read(&answServer,sizeof(answServer));
    if (answServer==1){
    myOLED.clrScr();
    myOLED.print("Connection ready", CENTER, 20);
    myOLED.update();
    delay(3000);
    myOLED.clrScr();
    myOLED.print("Waiting for a card", CENTER, 20);
    myOLED.update();
    }
    }
    if(answServer==0){
    myOLED.clrScr();
    myOLED.print("ERROR Connection", CENTER, 20);
    myOLED.update();
    delay(3000);
    }
    digitalWrite(10,LOW);
    digitalWrite(7,HIGH);
    }

    void loop() {
    //ждём новую карту
    if ( ! rfid.PICC_IsNewCardPresent()){
    return;
    }//uidDec=3671577829;
    //считываем карту
    if ( ! rfid.PICC_ReadCardSerial())return;
    if (rfid.uid.uidByte[0] != nuidPICC[0] ||
    rfid.uid.uidByte[1] != nuidPICC[1] ||
    rfid.uid.uidByte[2] != nuidPICC[2] ||
    rfid.uid.uidByte[3] != nuidPICC[3] )
    {
    for (byte i = 0; i < 4; i++) {
    nuidPICC[i] = rfid.uid.uidByte[i];
    }

    }
    digitalWrite(10,LOW);
    digitalWrite(7,HIGH);
    Serial.println(nuidPICC[1]);
    radio.write(nuidPICC[1], 1);


    }
    Тут пытаюсь отправить хотя бы один эллемент массива но никак. Хотя переменная для подтверждения коннекта с вторым ардуино отправляется и возвращяется подтверждение. Может я не верно полюзуюсь SPI интерфейсом может ещё что?

    Код для приёмника
    Код (C++):
    #include <SPI.h>
    #include <RF24.h>
    RF24 radio(9, 10);
    const uint32_t pipe = 123456789;

    int massiv[1];
    unsigned long UIDmsg[4];
    void setup()
    {
    pinMode(6, OUTPUT);
    Serial.begin(57600);
    radio.begin();
    radio.enableAckPayload();
    radio.setDataRate(RF24_250KBPS); // RF24_1MBPS или RF24_2MBPS
    radio.openReadingPipe(1,pipe); // открыть канал на приём
    radio.startListening(); // приём
    }
     
  2. sslobodyan

    sslobodyan Гик

    Смешались в кучу кони, люди....
    А слабо вначале сделать тестовый скетч только для обмена одним байтом или одним пакетом по радио? Без ридеров, экранов и прочей мишуры. Просто взять и по экзамплам повторить? А потом уже "делать навороты"?
     
  3. VO_Trigun

    VO_Trigun Нуб

    Я так и сделал. Проверка связи проходит нормально, затем считывается UID с карты и записывается в массив затем должна идти отправка UID но нет, по отдельности всё работает, не могу понять в чём ошибка толи spi не передаёт управление nrf24 после считывания карты то ли приёмник принимает только один раз

    Код немного поправил для приёмника
    Код (C++):
    #include <SPI.h>
    #include <RF24.h>
    RF24 radio(9, 10);
    const uint32_t pipe = 123456789;
    bool done=false;
    byte massiv[3];

    unsigned long UIDmsg[4];
    void setup()
    {
    pinMode(6, OUTPUT);
    Serial.begin(9600);
    radio.begin();
    radio.enableAckPayload();
    radio.setDataRate(RF24_250KBPS); // RF24_1MBPS или RF24_2MBPS
    radio.openReadingPipe(1,pipe); // открыть канал на приём
    radio.startListening(); // приём
    }


    void loop()
    {
    uint32_t message = 1;
    if(radio.available())
    {
    while(!done)
    {
    radio.read(massiv, sizeof(massiv));
    if(massiv[0] == 1)
    {
    Serial.println(massiv[0]);
    digitalWrite(6, HIGH);
    radio.writeAckPayload( 1, &message, sizeof(message));
    delay(3000);
    digitalWrite(6, LOW);
    }

    if(massiv[0] == 218&&massiv[1] == 215&&massiv[2] == 212&&massiv[3] == 229)
    {
    Serial.println(massiv[0]);
    Serial.println(massiv[1]);
    Serial.println(massiv[2]);
    digitalWrite(6, HIGH);
    // radio.writeAckPayload( 1, &message, sizeof(message));
    delay(3000);
    digitalWrite(6, LOW);
    }
    memset(massiv, 0, sizeof(massiv));
    done=true;
    }
    }
    done=false;
    }
    Для передатчика
    Код (C++):
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <RF24_config.h>
    #include <SPI.h>
    #include <MFRC522.h>
    #include <OLED_I2C.h>

    #define SS_PIN 7 //пин rfid
    #define RST_PIN 6 //пин rfid
    MFRC522 rfid(SS_PIN, RST_PIN);

    RF24 radio(9,10);//пины rf24
    const uint64_t pipe = 123456789;// труба
    uint32_t message;
    byte connectServer[1];//для проверки коннекта с сервером
    OLED myOLED(SDA, SCL, 8);//пины OLED экрана
    extern uint8_t SmallFont[];//размер шрифта
    bool done= false;
    uint32_t answServer=0;
    byte nuidPICC[4];//для записи UID

    void setup() {
    Serial.begin(9600); //скорость ком порта
    SPI.begin(); // SPI интерфейс
    rfid.PCD_Init(); // Инициализация mfrc522
    pinMode(10,OUTPUT);
    pinMode(7,OUTPUT);
    digitalWrite(10,LOW);
    digitalWrite(7,HIGH);
    radio.begin();
    radio.enableAckPayload();
    radio.setDataRate(RF24_250KBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS
    radio.openWritingPipe(pipe);
    myOLED.begin();
    myOLED.clrScr();
    myOLED.setFont(SmallFont);
    myOLED.print("HELLO!", CENTER, 20);
    myOLED.update();
    delay(3000);

    myOLED.print("Connecting server", CENTER, 20);
    myOLED.update();
    connectServer[0] = 1;
    radio.write(connectServer, 1);
    delay(3000);
    if ( radio.isAckPayloadAvailable()){
    radio.read(&answServer,sizeof(answServer));
    if (answServer==1){
    myOLED.clrScr();
    myOLED.print("Connection ready", CENTER, 20);
    myOLED.update();
    delay(3000);
    myOLED.clrScr();
    myOLED.print("Waiting for a card", CENTER, 20);
    myOLED.update();
    }
    }
    if(answServer==0){
    myOLED.clrScr();
    myOLED.print("ERROR Connection", CENTER, 20);
    myOLED.update();
    delay(3000);
    }
    digitalWrite(7,LOW);
    digitalWrite(10,HIGH);
    }

    void loop() {
    //ждём новую карту
    if ( ! rfid.PICC_IsNewCardPresent() return;
    //uidDec=3671577829;
    //считываем карту
    if ( ! rfid.PICC_ReadCardSerial())return;
    if (rfid.uid.uidByte[0] != nuidPICC[0] ||
    rfid.uid.uidByte[1] != nuidPICC[1] ||
    rfid.uid.uidByte[2] != nuidPICC[2] ||
    rfid.uid.uidByte[3] != nuidPICC[3] )
    {
    for (byte i = 0; i <= 3; i++) {
    nuidPICC[i] = rfid.uid.uidByte[i];
    Serial.println(nuidPICC[i]);
    }

    }
    digitalWrite(10,LOW);
    digitalWrite(7,HIGH);

    radio.write(nuidPICC, sizeof(nuidPICC));


    }
     
    Последнее редактирование: 14 апр 2017
  4. sslobodyan

    sslobodyan Гик

    Вангую - картридер не отпускает МОСИ?
     
  5. VO_Trigun

    VO_Trigun Нуб

    Как сделать так что бы отпустил? Я читал что нужно только ставить SS на OUTPUT и активное устройство на LOW соответственно выключать на HIGH.
     
  6. Airbus

    Airbus Радиохулиган Модератор

    Зачем так сложно и нерационально?Лучше так Ардуино читает UID сам сравнивает и посылает по радио команду на другое устройство а оно уже в свою очередь делает что то.Или не делает.
     
  7. VO_Trigun

    VO_Trigun Нуб

    Нужно именно так, по тому что потом приёмник заменит компьютер на котором будут храниться данные о картах а ардуино будет выступать просто радио модулем
     
  8. sslobodyan

    sslobodyan Гик

    Под руками нет ридера для проверки, но можете самостоятельно убедиться в неотпускании. Замерьте напряжение на МИСО после опроса карты. Затем к МИСО подключите резистор в пару килоом на землю и опять замерьте напряжение. Если упадет ниже 0.7вольта - то все гуд, иначе таки не отпускает. Попробуйте послать тогда ридеру halt как то вот так mfrc522.PICC_HaltA(); после обмена. Возможно, после усыпления, придется для следующего опроса будить его, надо будет проверить. Или попробуйте после обмена перевести ридер в состояние сброса выводом reset.
    PS таки МИСО, постом выше я ошибся :)