Running the MRFC522 Chip + Motor

Hey everyone!
I am running into an issue running a motor and the RFID reader chip at the same time from the same device. Independintly, when i upload sketches that only access one of the two functions (i.e a sketch that only target the computer or only target the motor) they work so i don't think its a circuit problem. When i try to get both working at the same time i encounter problems.

Current Setup:
I control the motor via serial coms (ultimatley want to be able to control the motor with an outside script), when i sent L the motor turns off, when i sent H the motor turns on.

While I do not send any commands the card reader reads fine, and prints the RFID-number into the serial (which i also want to be able to read with an external script)
As soon as I send a command through the serial number though, the MRFC522 Chip no longer writes anything to the serial port. (The motor still reacts to my commands though).
The code is below. Any suggestions?

/*
 *Sketch Causing Problems. 
 *Description: Currently motor pin is connected to the 5 V, and the MFRC522 Connected to the 3 V output. 
 *Desired Behaviour. Whether or not motor is running, the scans should work
 *Current Behaviour: Scans work if the motor has not been turned on yet. As soon as i turn the motor on by sending the Byte 'H' over the serial coms
 *the MRFC chip no longer scans for new cards, though the LED on the chip is still on, which indicates that power is still flowing.
 *Turning the motor off does not solve the problem. 
 *
 * 
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      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
 */

#include <SPI.h>
#include <MFRC522.h>

constexpr uint8_t RST_PIN = 9;     // Configurable, see typical pin layout above
constexpr uint8_t SS_PIN = 10;     // Configurable, see typical pin layout above
const int MOTOR_PIN = 7; // the pin that the Motor is attached to
int incomingByte;

MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class

MFRC522::MIFARE_Key key; 

// Init array that will store new NUID 
byte nuidPICC[4];

void setup() { 
  Serial.begin(9600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522 

  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }

  Serial.println(F("This code scan the MIFARE Classsic NUID."));
  Serial.print(F("Using the following key:"));
  printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
  pinMode(MOTOR_PIN, OUTPUT);    // sets the motor pin as output
}
 
void loop() {
  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    // if it's a capital H (ASCII 72), turn on the LED:
    if (incomingByte == 'H') {
      digitalWrite(MOTOR_PIN, HIGH);
    }
    // if it's an L (ASCII 76) turn off the LED:
    if (incomingByte == 'L') {
      digitalWrite(MOTOR_PIN, LOW);
    }
  }
  // Look for new cards
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
    return;

  Serial.print(F("PICC type: "));
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.println(rfid.PICC_GetTypeName(piccType));

  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("Your tag is not of type MIFARE Classic."));
    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] ) {
    Serial.println(F("A new card has been detected."));
    // Place command to helper function here

    // Store NUID into nuidPICC array
    for (byte i = 0; i < 4; i++) {
      nuidPICC[i] = rfid.uid.uidByte[i];
    }
   
    Serial.println(F("The NUID tag is:"));
    Serial.print(F("In hex: "));
    printHex(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
    Serial.print(F("In dec: "));
    printDec(rfid.uid.uidByte, rfid.uid.size);
    
    
  }
  else{
    Serial.println(F("Card read previously."));
    cardRead = true;    
    Serial.println();
   
  }

  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();

  
  
}


/**
 * Helper routine to dump a byte array as hex values to Serial. 
 */
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

/**
 * Helper routine to dump a byte array as dec values to Serial.
 */
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], DEC);
  }
}

Looks like you need to do the usual. :roll_eyes:

How do you have your motor wired up? You can not drive it directly from an arduino pin. They do not supply enough current.

Thank you for your response! You are right about not being able to run the motor with the Digital pin. I am running the motor via the 5V output and have it wired with a transistor and a diode to a digital pin. It works on its own, so both the resistor and the chip work if i upload scripts to the arduino that address them separatly, but i am not able to use them at the same time.