Решил подключить модуль распознавания RFID меток к ESP32 CAM. RC522 поддерживает SPI. В инете также пишут, что ESP32 CAM поддерживает SPI, но никаких конкретных данных я не нашёл.
Ну я взял скетч для считывания UID с ардуино, указал пины spi (SPI2),а он даже при компиляции выдаёт exit status 1. Когда другие скетчи спокойно загружаются.
А что, через uart не заработало, вроде через него собирались?
Не нашёл нужной библиотеки с нормальной документацией, да и теперь немного поменял концепцию и использование uart стало не так необходимо.
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 2 // Пин rfid модуля RST
#define SS_PIN 15 // Пин rfid модуля SS
MFRC522 rfid(SS_PIN, RST_PIN);
int sarfdata = 0;
int sarfdata2 = 0;
MFRC522::MIFARE_Key key; // Объект ключа
MFRC522::StatusCode status; // Объект статуса
int read_uid[4];
int uid_RuCat[4] = {109,90,165,33};
void setup() {
Serial.begin(9600); // Инициализация Serial
SPI.begin(); // Инициализация SPI
rfid.PCD_Init(); // Инициализация модуля
rfid.PCD_SetAntennaGain(rfid.RxGain_max); // Установка усиления антенны
rfid.PCD_AntennaOff(); // Перезагружаем антенну
rfid.PCD_AntennaOn(); // Включаем антенну
for (byte i = 0; i < 6; i++) { // Наполняем ключ
key.keyByte[i] = 0xFF; // Ключ по умолчанию 0xFFFFFFFFFFFF
}
}
void loop() {
// Занимаемся чем угодно
static uint32_t rebootTimer = millis(); // Важный костыль против зависания модуля!
if (millis() - rebootTimer >= 1000) { // Таймер с периодом 1000 мс
rebootTimer = millis(); // Обновляем таймер
digitalWrite(RST_PIN, HIGH); // Сбрасываем модуль
delayMicroseconds(2); // Ждем 2 мкс
digitalWrite(RST_PIN, LOW); // Отпускаем сброс
rfid.PCD_Init(); // Инициализируем заного
}
if (!rfid.PICC_IsNewCardPresent()) return; // Если новая метка не поднесена - вернуться в начало loop
if (rfid.PICC_ReadCardSerial()){
Serial.print("ID: ");
for (uint8_t i = 0; i < 4; i++) { // Цикл на 4 итерации
Serial.print(rfid.uid.uidByte[i]);
Serial.print(" ");
read_uid[i] = rfid.uid.uidByte[i];
}
} // Если метка не читается - вернуться в начало loop
else{
Serial.println("ERROR: the card is not readable");
return;
}
sarfdata = uid_RuCat[0] + uid_RuCat[1] + uid_RuCat[2] + uid_RuCat[3];
//Serial.print("data1 ");
//Serial.println(sarfdata);
sarfdata2 = read_uid[0] + read_uid[1] + read_uid[2] + read_uid[3];
//Serial.print("data2 ");
//Serial.println(sarfdata2);
if (sarfdata == sarfdata2){
Serial.println("Welcome");
delay(3000);
}
else{
Serial.println("ERROR: Identification error, try again");
delay(3000);
}
}
а вот ошибка:
c:\Users\admin\Documents\Arduino\libraries\MFRC522\src\MFRC522Extended.cpp: In member function 'MFRC522::StatusCode MFRC522Extended::TCL_Transceive(TagInfo*, byte*, byte, byte*, byte*)':
c:\Users\admin\Documents\Arduino\libraries\MFRC522\src\MFRC522Extended.cpp:824:34: error: ordered comparison of pointer with integer zero ('byte*' {aka 'unsigned char*'} and 'int')
824 | if (backData && (backLen > 0)) {
| ~~~~~~~~^~~
c:\Users\admin\Documents\Arduino\libraries\MFRC522\src\MFRC522Extended.cpp:847:42: error: ordered comparison of pointer with integer zero ('byte*' {aka 'unsigned char*'} and 'int')
847 | if (backData && (backLen > 0)) {
| ~~~~~~~~^~~
exit status 1
Compilation error: exit status 1
ДА. Теперь заработало. Да хранит Бог тех, кто сделал RandomNerdTutorials.я просто переназначил пины SPI как написано в первой ссылке которую вы мне отправляли. И он начал читать карточки.