element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • About Us
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Arduino
  • Products
  • More
Arduino
Arduino Forum Dc motor controll?
  • Blog
  • Forum
  • Documents
  • Quiz
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Arduino to participate - click to join for free!
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • State Verified Answer
  • Replies 12 replies
  • Answers 1 answer
  • Subscribers 393 subscribers
  • Views 1150 views
  • Users 0 members are here
Related

Dc motor controll?

Former Member
Former Member over 11 years ago

Hi all I have finished one part of the dc motor controll program, this has subroutines for moveForward and moveBackward.  There are also limit switches set up for leftLimit and rightLimit.

 

What I would like next is to initiate a routine by a single press of goButton.    The table would then moveForward until leftLimit goes high, then stop and moveBackward until rightLimit goes high and stop and wait for next goButton to start next cycle.   The problem is the goButton and both the limit switches will not stay high,  they will just be high for a short time to initiate  the action , but the action has to go on until the next input.

 

Hope I have explained this well.

 

Gerhard

  • Sign in to reply
  • Cancel

Top Replies

  • jvdberg@ieee.org
    jvdberg@ieee.org over 11 years ago +1
    The most reliable way is to use limit switches in series with the motor. Especially if damage might result in case the motor drives beyond the limit. Not only an error in the code but also faulty transistors…
Parents
  • jvdberg@ieee.org
    0 jvdberg@ieee.org over 11 years ago

    The most reliable way is to use limit switches in series with the motor.

    Especially if damage might result in case the motor drives beyond the limit.

    Not only an error in the code but also faulty transistors in the H-bridge will cause the motor to drive beyond the limit if there is no limit switch in series with the motor.

    Diodes are placed across the switches to enable the motor to drive in the opposite direction when a limit switch is open.

    When the transistors of the H-bridge labelled L are energized the motor will drive towards the left limit switch.

    To indicate the control system the motor is at a limit, the normal open contact of the limit switch can be used. As long as the H-bridge is driven and the motor is at the limit, this contact will be positive.

     

    image

     

    If the motor hits the limit switch at full speed this will always work.

    If the motor touches the limit switch at a low speed it might occur that the limit switch will open but the contact will not flip to the other side. In that case there is no indication.

    For a more reliable indication an optocoupler in series with a resistor can be used across the contact of the limit switch.

    The transistor of the optocoupler can be configured to create a positieve or a negative output.

     

    image

    • Cancel
    • Vote Up +1 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 11 years ago in reply to jvdberg@ieee.org

    Hi Johan

     

    Thanks for that, I see how that would make it more certain.  This is just a  experiment for me to learn the programming language.  I set myself a goal and keep fighting and figuring until I have it worked out.  in the end I hope that all the bits together would be  of some use  when I make my mill table feed.

     

    I have the switches lighting a led and when other switch is made high led switches off again.

     

    Will try to do the same with the h bridge in1 in2 and enable next.

     

    Once I have something a bit more complete I will post the sketch

     

    Gerhard

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • mcb1
    0 mcb1 over 11 years ago in reply to Former Member

    Johan

    While your approach is interesting, there are some cautions needed.

     

    IN4001 thru 1N4007 are only rated at 1Amp.

    You are also introducing a 0.6v drop on the motor which may be fine for higher voltages, but not for lower.

     

    Unless you use two switches or a double pole switch, the software can't tell the limit has been reached.

     

    The wiring to the motor needs to be significantly higher, than required for a simple switch.

    This is fine for low current motors, but 5A or more will become inpractical. The switch also needs to be rated for the motor.

     

    Unless you plan on using transistors with back emf diodes inbuilt, this design can cause issues which may destroy one of more transistors.

     

    If the motor touches the limit switch at a low speed it might occur that the limit switch will open but the contact will not flip to the other side

    The above is only applicable if you are using the limit switch to perform motor direction changing.

    In Gerhards situation he is using software to determine the direction, so the switch going open is enough.

     

     

    You are correct that a motor reaching the physical end is not desirable, however fusing it just below its stall current will ensure it doesn't get burnt out.

    The drive mechanism should be able to handle the full stall (otherwise it becomes a liability later)

     

    A more elegant version could include the normal limit switches to swap direction, and a second switch that cuts motor power positioned just after the limit switch.

     

     

     

    mark

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 11 years ago in reply to mcb1

    Yes Mark motor is 16A at max eff and 65A stall current and Yes I need the input from the limit switch to tell the arduino to change direction.

    Also decided to leave switched with pull down resistors then I can use 1 resistor network common ground for all of then????

     

     

    /* * dc moto with h-bridge and 2 potentiometers and 2 buttons * 1 button for forward at speed set by pot 1 * 2 button for bacward at speed set by pot 2 * limit switches on A4 and A5 */ /* *RS: Pin2 *E: Pin3 *D4: Pin4 *D5: Pin5 *D6: Pin6 *D7: Pin7 */ //Include Library #include //Initiate LCD object LiquidCrystal lcd(2,3,4,5,6,7); int mode1 = 28;          //switch between pin 28 int mode2 = 30;          //and pin 30 int goBut = 32;          // feed and return button pin 32 int pot1 = A0;          // potentiometer to pin A0 int pot2 = A1;          // potentiometer to pin A1 int enable = 10;      // to enable on h bridge int motorPin1 = 8;    // to In1 on h bridge int motorPin2 = 9;    // to In2 on h bride int leftBut = 24;      // button to 12 pull-down int rightBut =26;      // button to 13 pull-down int leftLimit = 11;    // limit switch to A4 int rightLimit = 12;    //limit switch to A5 int redLed = 13; void setup()                    // run once, when the sketch starts {     // Begin lcd interface:   lcd.begin(16,2);     //Print top line   lcd.clear();     Serial.begin(9600);          // set up Serial library at 9600 bps   pinMode (mode1 , INPUT);   pinMode (mode2 , INPUT);   pinMode (goBut , INPUT);   pinMode(pot1, INPUT);           pinMode(pot2,INPUT);   pinMode(enable, OUTPUT);   pinMode(motorPin1, OUTPUT);   pinMode(motorPin2, OUTPUT);   pinMode(rightBut , INPUT);   pinMode(leftBut , INPUT);   pinMode(leftLimit , INPUT);   pinMode(rightLimit , INPUT);   pinMode (redLed , INPUT);   digitalWrite (redLed , LOW);   digitalWrite (motorPin1 , LOW);   digitalWrite (motorPin2 ,LOW);   digitalWrite (enable ,LOW);   } int getSpeed1(){   int x;   x = analogRead(pot1);   x /= 10;   x = max (x , 0);   x = min (x , 100);   return x; } int getSpeed2(){   int y;   y = analogRead(pot2);   y /= 10;   y = max (y ,0);   y = min (y , 100);   return y; } int getPot1() {   int v;   v = analogRead(pot1);   v /= 4;   v = max(v, 90);   v = min(v, 255);   return v; } int getPot2() {   int w;   w = analogRead(pot2);   w /= 4;   w = max(w, 90);   w = min(w, 255);   return w; } int motorFoward() {   analogWrite(motorPin1, getPot1()); digitalWrite(enable,HIGH); digitalWrite(motorPin2,LOW); lcd.setCursor(5,1);   lcd.print("Left: ");   } int motorBackward() {   analogWrite(motorPin2, getPot2());   digitalWrite(enable,HIGH);   digitalWrite(motorPin1,LOW);   lcd.setCursor(5,1);   lcd.print("Right:");   } int allStop(){   digitalWrite (motorPin1 , LOW);   digitalWrite(motorPin2 , LOW);   digitalWrite(enable ,LOW);   lcd.setCursor(5,1);   lcd.print("Ready:");   digitalWrite(redLed , LOW); } void loop()                    // run over and over again {   lcd.setCursor(0,1);   lcd.print("  %");   lcd.setCursor(0,1);   lcd.print(getSpeed1());   lcd.setCursor(12,1);   lcd.print("  %");   lcd.setCursor(12,1);   lcd.print(getSpeed2());   delay(100);       if (digitalRead(mode1) == HIGH)   {     lcd.setCursor(0 ,0);     lcd.print("Feed mode.  ");     if (digitalRead(rightBut) == HIGH && digitalRead(leftLimit) == LOW)     {       motorFoward();     }       else if (digitalRead(leftBut) == HIGH && digitalRead(rightLimit) == LOW)     {       motorBackward();     }     else     {       allStop();     }   }   else if(digitalRead(mode2) == HIGH)   {     lcd.setCursor( 0,0);     lcd.print("Feed & Return.");     if (digitalRead(goBut) == HIGH)     {       motorFoward();     }     if (digitalRead(leftLimit) == HIGH)     {       motorBackward();     }     if (digitalRead(rightLimit) == HIGH)     {       allStop();     }         // space for the feed and return mode program        }   else   {     lcd.setCursor(0,0);     lcd.print("Select mode?");     allStop();   } }

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
  • Former Member
    0 Former Member over 11 years ago in reply to Former Member

    Can Someone please exlain how to get the code to stop bundling up like this please???? something about HTML ???

     

    Gerhard

     

     

    PS  Will correct as soon as I find out how!!

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
Reply
  • Former Member
    0 Former Member over 11 years ago in reply to Former Member

    Can Someone please exlain how to get the code to stop bundling up like this please???? something about HTML ???

     

    Gerhard

     

     

    PS  Will correct as soon as I find out how!!

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Verify Answer
    • Cancel
Children
No Data
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube