Имеется две ардуино уно, две 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(); // приём }
Смешались в кучу кони, люди.... А слабо вначале сделать тестовый скетч только для обмена одним байтом или одним пакетом по радио? Без ридеров, экранов и прочей мишуры. Просто взять и по экзамплам повторить? А потом уже "делать навороты"?
Я так и сделал. Проверка связи проходит нормально, затем считывается 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)); }
Как сделать так что бы отпустил? Я читал что нужно только ставить SS на OUTPUT и активное устройство на LOW соответственно выключать на HIGH.
Зачем так сложно и нерационально?Лучше так Ардуино читает UID сам сравнивает и посылает по радио команду на другое устройство а оно уже в свою очередь делает что то.Или не делает.
Нужно именно так, по тому что потом приёмник заменит компьютер на котором будут храниться данные о картах а ардуино будет выступать просто радио модулем
Под руками нет ридера для проверки, но можете самостоятельно убедиться в неотпускании. Замерьте напряжение на МИСО после опроса карты. Затем к МИСО подключите резистор в пару килоом на землю и опять замерьте напряжение. Если упадет ниже 0.7вольта - то все гуд, иначе таки не отпускает. Попробуйте послать тогда ридеру halt как то вот так mfrc522.PICC_HaltA(); после обмена. Возможно, после усыпления, придется для следующего опроса будить его, надо будет проверить. Или попробуйте после обмена перевести ридер в состояние сброса выводом reset. PS таки МИСО, постом выше я ошибся