Using MFRC522 with a MKRZERO board

Hi all,

I'm trying to connect a RFD reader MFRC522 to a MKRZERO board. After some digging, I have the 2 following questions:

  1. GPIO0 in ESP8266 (or D3 in Wemos D1 mini) to what PIN on MKRZERO is equivalent? As you can see in the following code, I need to change the "RST_PIN D3" (for Wemos D1 mini) to the corresponding value for the MKRZERO, and I'm a bit lost there.

  2. Also, I'm not sure how to define it on the code. The original code states:

#define RST_PIN  D3 // RST-PIN GPIO4 
#define SS_PIN  D8  // SDA-PIN GPIO2

In MKRZERo the SS_PIN (D8) translates to "11 SDA", but I'm not sure how to define this on the code. Any thougts?

This is the full program (from here):

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <SPI.h>
#include "MFRC522.h"
/* wiring the MFRC522 to ESP8266 (ESP-12)
RST     = GPIO4
SDA(SS) = GPIO2 
MOSI    = GPIO13
MISO    = GPIO12
SCK     = GPIO14
GND     = GND
3.3V    = 3.3V

RGB LED Setup
Red LED   = D1
Ground    = GND
Gr. LED   = D2
Blue LED  = D0
*/
#define RST_PIN  D3 // RST-PIN GPIO4 
#define SS_PIN  D8  // SDA-PIN GPIO2 
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance
// Wifi Connection details
const char* ssid = "xxxxx";
const char* password = "xxxxxx";

const char* mqtt_server = "xxxxxxx";
const char* mqtt_user = "xxxxxxx";
const char* mqtt_password = "xxxxxxxx";
const char* clientID = "RFID";
const char* rfid_topic = "home/rfid";
const int redPin = D1;
const int greenPin = D2;
const int idPin = D0;

WiFiClient espClient;
PubSubClient client(espClient);

long lastMsg = 0;
char msg[50];
void setup() {
  Serial.begin(115200);
  SPI.begin();           // Init SPI bus
  mfrc522.PCD_Init();    // Init MFRC522
  pinMode(redPin, OUTPUT); // Red LED
  pinMode(redPin, HIGH); 
  pinMode(greenPin, OUTPUT); // Green :LED
  pinMode(greenPin, HIGH);
  pinMode(idPin, OUTPUT); // ID :LED
  pinMode(idPin, HIGH);
  delay(2);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}
// Connect to Wifi
void setup_wifi() {
  //Turn off Access Point
  WiFi.mode(WIFI_STA);
  delay(10);
  
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
// Check for incoming messages
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.println("");
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();

  char s[20];
  
  sprintf(s, "%s", payload);

    if ( (strcmp(topic,"home/alarm")==0))
  {
    payload[length] = '\0';
    String sp = String((char*)payload);

  // Alarm is off
    if (sp == "disarmed")
    {
    Serial.println();
    Serial.print("Alarm is set to Disarmed");
    Serial.println();
    off_both_led();    
  }   
  // Alarm is Armed Home    
    else if (sp == "armed_home")
    {
    Serial.println();
    Serial.print("Alarm is set to Armed Home");
    Serial.println();
    on_green_led();     
  } 
  // Alarm is arming
      else if (sp == "pending")
    {
    Serial.println();
    Serial.print("Alarm set to Pending");
    Serial.println();
    on_both_led();    
  }   
  // Alarm is Armed Away
    else if (sp == "armed_away")
    {
    Serial.println();
    Serial.print("Alarm set to Armed Away");
    Serial.println();
    on_green_led();    
  } 
  // Alarm is Triggered
    else if (sp == "triggered")
    {
    Serial.println();
    Serial.print("Alarm is triggered!!");
    Serial.println();
    on_red_led();    
  }
}}
/* interpret the ascii digits in[0] and in[1] as hex
* notation and convert to an integer 0..255.
*/
int hex8(byte *in)
{
   char c, h;

   c = (char)in[0];

   if (c <= '9' && c >= '0') {  c -= '0'; }
   else if (c <= 'f' && c >= 'a') { c -= ('a' - 0x0a); }
   else if (c <= 'F' && c >= 'A') { c -= ('A' - 0x0a); }
   else return(-1);

   h = c;

   c = (char)in[1];

   if (c <= '9' && c >= '0') {  c -= '0'; }
   else if (c <= 'f' && c >= 'a') { c -= ('a' - 0x0a); }
   else if (c <= 'F' && c >= 'A') { c -= ('A' - 0x0a); }
   else return(-1);

   return ( h<<4 | c);
}
// Reconnect to wifi if connection lost
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(clientID, mqtt_user, mqtt_password)) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("home/rfid", "connected");
      // ... and resubscribe
      client.subscribe("home/alarm");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
// Main functions
void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    delay(50);
    return;
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    delay(50);
    return;
  }
  // Show some details of the PICC (that is: the tag/card)
  Serial.println("");
  Serial.print(F("Card UID:"));
  dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
  Serial.println();
  digitalWrite(idPin, HIGH);
  delay(500);
  digitalWrite(idPin, LOW);
  delay(500);
  // Send data to MQTT
  String rfidUid = "";
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    rfidUid += String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
    rfidUid += String(mfrc522.uid.uidByte[i], HEX);
  }
  const char* id = rfidUid.c_str();
  client.publish("home/rfid", id);
  delay(3000);
}
// LED Loop
void off_both_led(){
  Serial.println("Turning off all led");
  digitalWrite(greenPin, LOW);
  digitalWrite(redPin, LOW);
}
void flash_green_led(){
  Serial.println("Flashing Green LED");
  digitalWrite(greenPin, LOW);
  // Flash 15 times:
  for(int i = 0; i < 14; i++)
  {
  digitalWrite(greenPin, HIGH);
  delay(1000);
  digitalWrite(greenPin, LOW);
  delay(500);
}}
void flash_red_led(){
  Serial.println("Flashing Red LED");
  digitalWrite(redPin, LOW);
  // Flash 20 times:
  for(int i = 0; i < 19; i++)
  {
  digitalWrite(redPin, HIGH);
  delay(1000);
  digitalWrite(redPin, LOW);
  delay(500);
}}
void on_green_led(){
  Serial.println("Turning on green led");
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, HIGH);
}
void on_red_led(){
  Serial.println("Turning on red led");
  digitalWrite(greenPin, LOW);
  digitalWrite(redPin, HIGH);
}
void on_both_led(){
  Serial.println("Turning on both led");
  digitalWrite(greenPin, HIGH);
  digitalWrite(redPin, HIGH);
}
// Helper routine to dump a byte array as hex values to Serial
void dump_byte_array(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

to the corresponding value for the MKRZERO

The "corresponding value" for the MKRZERO would be the pin that you connected the reset pin to.

In MKRZERo the SS_PIN (D8) translates to "11 SDA",

Nonsense. "11 SDA" is NOT a number. D8 is a value. You may not know what the value is, but you can be sure that it is a numeric value, like 11 is.

The "corresponding value" for the MKRZERO would be the pin that you connected the reset pin to.

So I guess my question was more about if I can use any pin or there is some specific pins designed for this kind of things. I just was looking for a suggestion.

Nonsense. "11 SDA" is NOT a number. D8 is a value. You may not know what the value is, but you can be sure that it is a numeric value, like 11 is.

So, if for Wemos D1 mini the value D8 is correct (is very easy to find the "pinout" on the internet), but for MKRZERO doesn't seem so easy for me. All I could find is: Where is the PINOUT for MKR Zero? - MKRZero - Arduino Forum and ArduinoCore-samd/variants/mkrzero/variant.cpp at 1.6.16 · arduino/ArduinoCore-samd · GitHub and it's not clear enough what value to use. For example for A6 the value could either be: 21, A6 or PA07. Any thoughts?

For example for A6 the value could either be: 21, A6 or PA07. Any thoughts?

The name A6 has a value. Print the value (Serial.print("A6 = ");Serial.println(A6):wink: to see what it is. Your question might become a lot simpler.