Stepper motor heating up even when NOT turning

Hello Community,
I have the following project to control a stepper Motor Nema 11 and the project works perfect. The only problem is that the motor is packing heat even when it is NOT in use or the switch is set to OFF (see line 135 in the code). Here is the code and a LINK to the simulator.
Any ideas why it is building heat ?


#include <Servo.h>
#include <AccelStepper.h>

#define dirPin 12
#define stepPin 13
#define motorInterfaceType 1

Servo myservoRight;  // create servo object to control a servo
Servo myservoLeft;  // create servo object to control a servo
#define servoPinRight 3 //~
#define servoPinLeft 6 //~
#define pushButtonPin 2

int led = 5;         // the PWM pin the LED is attached to
int brightness = 0;  // how bright the LED is
int fadeAmount = 5;  // how many points to fade the LED by

int angleRight = 179;    // initial angle  for Right servo (beteen 1 and 179)
int angleLeft = 179;    // initial angle  for Left servo (beteen 1 and 179)

int servoAngleMax = 45;    // Minimum angle for stepper (instead of 0)
int angleStep = 1;
int stepperMotorPosition = 0;
int stepperLowestLevel = -18000;  // lowest level of stepper motor originally at -22000
int stepperHighestLevel = 22000;  // highest level of stepper motor originally at 28000
int stepperMaxSpeed = 2500.0; // max speed of stepper motor

unsigned long startMillis;
unsigned long currentMillis;
unsigned long timeSetToOff;
const unsigned long period = 40;

// initialize the stepper library on pins 8 through 11:
AccelStepper myStepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
  myStepper.setCurrentPosition(stepperLowestLevel);
  // set the speed at 30 rpm:
  //myStepper.setMaxSpeed(3000);       //set max speed the motor will turn (steps/second)
 // myStepper.setAcceleration(900);  //set acceleration (steps/second^2)

  // declare pin 5 to be an output:
  pinMode(led, OUTPUT);

  // initialize the serial port:
  Serial.begin(9600);          //  setup serial
  myservoRight.attach(servoPinRight);  // attaches the servo on pin 3 to the servo object
  myservoLeft.attach(servoPinLeft);  // attaches the servo on pin 6 to the servo object
  pinMode(pushButtonPin, INPUT_PULLUP);
  startMillis = millis();
  timeSetToOff = millis();

  myservoRight.write(angleRight);
  myservoLeft.write(angleLeft);
  //Serial.println("Servo Button ");
  //myStepper.moveTo(stepperLowestLevel);

}

void loop() {
  //myStepper.run();

  if (digitalRead(pushButtonPin) == LOW) {  //switch is ON

    currentMillis = millis();  //get the current time
    if (currentMillis - startMillis >= period)  //test whether the period has elapsed
    {
      analogWrite(led, brightness);    //set the brightness of the LED
      brightness = brightness + fadeAmount;
      if (brightness <= 0 || brightness >= 120) {
        fadeAmount = -fadeAmount;
      }
      startMillis = currentMillis;  //IMPORTANT to save the start time of the current LED brightness
      if ((currentMillis - timeSetToOff >= 3000) || (angleRight < 179)) { //add a bit of delay before the action
        if (angleLeft > servoAngleMax && angleLeft <= 180 ) {

          angleLeft = angleLeft - angleStep;

          if (angleLeft < servoAngleMax) {
            angleLeft = servoAngleMax;
          }

          else {
            myservoLeft.write(angleLeft); // move the left servo to desired angle: open doors
          }

        }

        //wait for Servo right to reach 140 degree
        if ((angleRight > servoAngleMax && angleRight <= 180) && (angleLeft <= 110 )) {

          angleRight = angleRight - angleStep;

          if (angleRight < servoAngleMax) {
            angleRight = servoAngleMax;
          }

          else {
            myservoRight.write(angleRight); // move the right servo to desired angle: open doors
          }
          //end of Servo Left logic
        }
      }
    }
    // wait for 20 milliseconds to see the dimming effect
    //delay(20);

    if ((angleLeft == servoAngleMax) && (angleRight == servoAngleMax)) { //if door is fully open raise platform
      myStepper.moveTo(stepperHighestLevel);
      //myStepper.runToPosition(stepperHighestLevel);
      myStepper.setMaxSpeed(stepperMaxSpeed);//set desired speed of stepper motor
      //myStepper.setSpeed(stepperMaxSpeed);
      myStepper.setAcceleration(900);
      myStepper.run();
      stepperMotorPosition = myStepper.currentPosition();

      //Serial.println("raising platform ");
      //Serial.println(stepperMotorPosition);

      //Serial.println(stepperMotorPosition);
    }

    //this part to switch off LEDs once doors are open
    if (stepperMotorPosition == stepperHighestLevel) {
      brightness = 0;
    }
    //end of turning OFF LEDs

    //delay(20); // waits for the servo to get there

  }


  if (digitalRead(pushButtonPin) == HIGH) { //switch is OFF
    timeSetToOff = millis();
    currentMillis = millis();
    // wait for 20 milliseconds to see the dimming effect
    //delay(20);

    myStepper.moveTo(stepperLowestLevel);
    myStepper.setMaxSpeed(stepperMaxSpeed);//set desired speed of stepper motor
    myStepper.setAcceleration(900);
    myStepper.run();
    stepperMotorPosition = myStepper.currentPosition();

    if (angleLeft >= 179 && angleRight >= 179) {
      analogWrite(led, 0); //begin LED dimming code
    }
    else {
      //get the current time
      //analogWrite(led, brightness); //begin LED dimming code
      if (currentMillis - startMillis >= period) {
        analogWrite(led, brightness); //begin LED dimming code
        // change the brightness for next time through the loop:
        brightness = brightness + fadeAmount;

        // reverse the direction of the fading at the ends of the fade:
        if (brightness <= 0 || brightness >= 120) {
          fadeAmount = -fadeAmount;
        }
        startMillis = currentMillis;

        if (stepperMotorPosition == stepperLowestLevel) {
          if (angleRight >= servoAngleMax && angleRight <= 180)  {
            angleRight = angleRight + angleStep;
            if (angleRight > 180) {
              angleRight = 179; //was set to 180 should be same as starting position
            }

            else {
              //myservoRight.write(angleRight); // move the Right servo to desired angle
              myservoRight.write(angleRight); // move the Right servo to desired angle
            }
          }

          //Wait for Left motor to move

          if ((angleLeft >= servoAngleMax && angleLeft <= 180) && (angleRight >= 100 )) {
            angleLeft = angleLeft + angleStep;
            if (angleLeft > 180) {
              angleLeft = 179; //was set to 180 should be same as starting position
            }

            else {
              myservoLeft.write(angleLeft); // move the Left servo to desired angle
              //myservoLeft.write(angleLeft); // move the Left servo to desired angle
            }
          }

        }

      }

      //Serial.println("lowering platform ");
      //Serial.println(stepperMotorPosition);

      //Serial.println("Switch is OFF");
      //Serial.println(stepperMotorPosition);

      // Servo button demo by Robojax.com


    }
    //delay(20); // waits for the servo to get there, to keep same speed this has to be the total
    //of dimming LED delay and Servo delay when switch is in ON position
  }


}

Unlike DC motors, stepper motor coils are energized even when stopped and they can run hot. The spec sheet for your motor says that its operating temperature is 50C max. If you want to de-energize the coils the A4988 has the enable input. Take that input HIGH to disable the coils. The motor will not hold position with the coils disabled.

What is the motor coil current limit set on the A4988 stepper driver? It is imperative that the coil current be set properly.
The motor and driver can run too hot if the current is not set properly. The Pololu A4988 page shows how to set the current. You must know the values of the sense resistors on YOUR A4988 boards to insert into the calculations.
You will need to look up the coil current limit for your motor part number on the page 1 of the spec sheet. You don't have to set the current to max. Set to the current that gives performance required and no missing steps. Lower current means less heat and longer life for motor and driver.

Hi,
Can we please have a circuit diagram?
An image of a hand drawn schematic will be fine, include ALL power supplies, component names and pin labels.

Please not a Fritzy / Woki picture.

Do you have a DMM?

Thanks.. Tom.. :smiley: :+1: :coffee: :australia:

1 Like

Thank you @groundFungus, that was the correct approach, that fixed it.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.