MONITORING THE CURRENT OF a LINEAR ACTUATOR

About: Progressive Automations is your primary source for electric linear actuators, motion control systems and automation accessories. For over a decade, we have supplied various industries with top quality automa...

This example code uses a MegaMoto Plus and an Arduino Uno to monitor the current of a linear actuator.
/* Code to monitor the current amp draw of the actuator, and to cut power if it rises above a certain amount.

Written by Progressive Automations August 19th, 2015

Hardware: - RobotPower MegaMoto control boards - Arduino Uno - 2 pushbuttons */

const int EnablePin = 8; const int PWMPinA = 11; const int PWMPinB = 3; // pins for Megamoto

const int buttonLeft = 4; const int buttonRight = 5;//buttons to move the motor

const int CPin1 = A5; // motor feedback

int leftlatch = LOW; int rightlatch = LOW;//motor latches (used for code logic)

int hitLimits = 0;//start at 0 int hitLimitsmax = 10;//values to know if travel limits were reached

long lastfeedbacktime = 0; // must be long, else it overflows int firstfeedbacktimedelay = 750; //first delay to ignore current spike int feedbacktimedelay = 50; //delay between feedback cycles, how often you want the motor to be checked long currentTimefeedback = 0; // must be long, else it overflows

int debounceTime = 300; //amount to debounce buttons, lower values makes the buttons more sensitive long lastButtonpress = 0; // timer for debouncing long currentTimedebounce = 0;

int CRaw = 0; // input value for current readings int maxAmps = 0; // trip limit

bool dontExtend = false; bool firstRun = true; bool fullyRetracted = false;//program logic

void setup() { Serial.begin(9600); pinMode(EnablePin, OUTPUT); pinMode(PWMPinA, OUTPUT); pinMode(PWMPinB, OUTPUT);//Set motor outputs pinMode(buttonLeft, INPUT); pinMode(buttonRight, INPUT);//buttons digitalWrite(buttonLeft, HIGH); digitalWrite(buttonRight, HIGH);//enable internal pullups pinMode(CPin1, INPUT);//set feedback input currentTimedebounce = millis(); currentTimefeedback = 0;//Set initial times

maxAmps = 15;// SET MAX CURRENT HERE

}//end setup

void loop() { latchButtons();//check buttons, see if we need to move

moveMotor();//check latches, move motor in or out

}//end main loop

void latchButtons() { if (digitalRead(buttonLeft)==LOW)//left is forwards { currentTimedebounce = millis() - lastButtonpress;// check time since last press if (currentTimedebounce > debounceTime && dontExtend == false)//once you've tripped dontExtend, ignore all forwards presses { leftlatch = !leftlatch;// if motor is moving, stop, if stopped, start moving firstRun = true;// set firstRun flag to ignore current spike fullyRetracted = false; // once you move forwards, you are not fully retracted lastButtonpress = millis();//store time of last button press return; }//end if }//end btnLEFT

if (digitalRead(buttonRight)==LOW)//right is backwards { currentTimedebounce = millis() - lastButtonpress;// check time since last press

if (currentTimedebounce > debounceTime) { rightlatch = !rightlatch;// if motor is moving, stop, if stopped, start moving firstRun = true;// set firstRun flag to ignore current spike lastButtonpress = millis();//store time of last button press return; }//end if }//end btnRIGHT }//end latchButtons

void moveMotor() { if (leftlatch == HIGH) motorForward(255); //speed = 0-255 if (leftlatch == LOW) motorStop(); if (rightlatch == HIGH) motorBack(255); //speed = 0-255 if (rightlatch == LOW) motorStop();

}//end moveMotor

void motorForward(int speeed) { while (dontExtend == false && leftlatch == HIGH) { digitalWrite(EnablePin, HIGH); analogWrite(PWMPinA, speeed); analogWrite(PWMPinB, 0);//move motor if (firstRun == true) delay(firstfeedbacktimedelay); // bigger delay to ignore current spike else delay(feedbacktimedelay); //small delay to get to speed

getFeedback(); firstRun = false; latchButtons();//check buttons again }//end while

}//end motorForward

void motorBack (int speeed) { while (rightlatch == HIGH) { digitalWrite(EnablePin, HIGH); analogWrite(PWMPinA, 0); analogWrite(PWMPinB, speeed);//move motor if (firstRun == true) delay(firstfeedbacktimedelay);// bigger delay to ignore current spike else delay(feedbacktimedelay); //small delay to get to speed getFeedback();

firstRun = false; latchButtons();//check buttons again

}//end while

dontExtend = false;//allow motor to extend again, after it has been retracted

}//end motorBack

void motorStop() { analogWrite(PWMPinA, 0); analogWrite(PWMPinB, 0);

digitalWrite(EnablePin, LOW); firstRun = true;//once the motor has stopped, reenable firstRun to account for startup current spikes

}//end stopMotor

void getFeedback() { CRaw = analogRead(CPin1); // Read current

if (CRaw == 0 && hitLimits < hitLimitsmax) hitLimits = hitLimits + 1; else hitLimits = 0; // check to see if the motor is at the limits and the current has stopped

if (hitLimits == hitLimitsmax && rightlatch == HIGH) { rightlatch = LOW; // stop motor fullyRetracted = true; }//end if

else if (hitLimits == hitLimitsmax && leftlatch == HIGH) { leftlatch = LOW;//stop motor hitLimits = 0; }//end if

if (CRaw > maxAmps) { dontExtend = true; leftlatch = LOW; //stop if feedback is over maximum }//end if

lastfeedbacktime = millis();//store previous time for receiving feedback }//end getFeedback

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Share

    Recommendations

    • Indoor Lighting Contest

      Indoor Lighting Contest
    • Metal Contest

      Metal Contest
    • Make It Fly Challenge

      Make It Fly Challenge

    Discussions

    0
    None
    Penolopy Bulnick

    2 months ago

    Hello there!

    We're glad you want to share something with the Instructables community!

    And we’re here to help you out.

    In order to be published live on the site and be eligible to enter a contest, an Instructable must consist of the following things:

    - Multiple written steps showing how you made your project

    - Photos in each step

    - Only your own original images

    Check out our free online class that walks you through how to write an Instructable: https://www.instructables.com/class/How-to-Write-an-Instructable-Class/

    Beyond making your Instructable simply publishable, this guide (https://www.instructables.com/id/How-to-Create-a-Feature-Worthy-Instructable/) explains what is required to have your Instructables featured by our site editors. It’s very helpful, and definitely worth checking out.

    We would love to review your project again after you have made the necessary edits, and we will publish your project if it is eligible.

    If you have any questions, please feel free to ask right here or send us an email to service@instructables.com.

    Best,

    Instructables Community Manager