Go Down

### Topic: DC motors controlled by arduino and limit switches (Read 236 times)previous topic - next topic

#### carlijnob

##### Jun 24, 2019, 11:28 am
Hey All, who could help me out?

At the moment, Im working on producing a table that has a sit/stand desk mechanism built in there (driven by motor 1). When the motor is at its highest point it will shake its tabledeck (by motor 0).

I have two dc motors, that are connected to a sparkfun monster motoshield on top of the arduino board.
After I wrote the code (with a little help), I found out that the switches would be Normally closed instead of Normally Open. The code is written for a sit/stand table.

How it should work:

before loop starts:
switch 2 is unpressed (it is Normally closed)
switch 1 is pressed (it is Normally closed)
motor 1 turns ON, CW  // when motor 1 starts, switch 2 presses

loop

if switch 1 unpresses:
motor 1 turns OFF
motor 2 turns ON CW for a random time period

if the random time period is over:
motor 2 turns OFF
motor 1 turns ON CCW

if switch 2 unpresses:
motor 1 turns OFF for a random time period
---

/*  MonsterMoto Shield Example Sketch
date: 5/24/11
code by: Jim Lindblom
hardware by: Nate Bernstein
SparkFun Electronics

License: CC-SA 3.0, feel free to use this code however you'd like.
Please improve upon it! Let me know how you've made it better.

This is really simple example code to get you some basic
functionality with the MonsterMoto Shield. The MonsterMote uses
two VNH2SP30 high-current full-bridge motor drivers.

Use the motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)
function to get motors going in either CW, CCW, BRAKEVCC, or
BRAKEGND. Use motorOff(int motor) to turn a specific motor off.

The motor variable in each function should be either a 0 or a 1.
pwm in the motorGo function should be a value between 0 and 255.
*/
#define BRAKEVCC 0
#define CW   1
#define CCW  2
#define BRAKEGND 3
#define CS_THRESHOLD 100

/*  VNH2SP30 pin definitions
xxx[0] controls '1' outputs
xxx[1] controls '2' outputs */
int inApin[2] = {7, 4};  // INA: Clockwise input
int inBpin[2] = {8, 9}; // INB: Counter-clockwise input
int pwmpin[2] = {5, 6}; // PWM input
int enpin[2] = {0, 1}; // EN: Status of switches output (Analog pin)

int statpin = 13;

//ButtonDebounce button1(7, 50);
//ButtonDebounce button2(4, 100);

int switch1pin=11;   // to store on or off value
int switch2pin=12;   // to store on or off value

int switch1=0;   // to store on or off value
int switch2=0;   // to store on or off value

long initialTime = 0;
long diffTime = 0;
boolean countingTime = false;
boolean switchTouching = false;

const int numberOfTimes = 3;
int randomTimes [numberOfTimes] = {20000, 16000,40000};
int randomNumber = 0;
void setup()
{
Serial.begin(9600);
pinMode(switch1pin, INPUT);
pinMode(switch2pin, INPUT);
pinMode(statpin, OUTPUT);

// Initialize digital pins as outputs
for (int i = 0; i < 2; i++)
{
pinMode(inApin, OUTPUT);
pinMode(inBpin, OUTPUT);
pinMode(pwmpin, OUTPUT);
}
// Initialize braked
for (int i = 0; i < 2; i++)
{
digitalWrite(inApin, LOW);
digitalWrite(inBpin, LOW);
}
motorGo(1, CW, 200);
Serial.println("motor 1 On in setup");
randomNumber = random(0,numberOfTimes);
Serial.print("random time =");
Serial.println(randomTimes[randomNumber]);

}

void loop(){

delay(10);
if(switch1 == HIGH && switchTouching == false){ // the switches are now working the other way around, thus they are being unpressed when motor1 needs to turn off, how does that work for these lines that are controlling the switches?

switchTouching = true;
motorGo(1, CW, 0); //motorOff(1);
Serial.println("motor 1 Off because of switch 1");
Serial.println("wait 3 seconds");
delay(3000);
Serial.println("motor 0 On");
motorGo(0, CW, 500);
motorGo(1, CW, 0); //motorOff(1);

initialTime = millis();
countingTime = true;
}

diffTime = millis() - initialTime;
if( diffTime >= randomTimes[randomNumber] && countingTime == true){
Serial.print(randomTimes[randomNumber]);
Serial.println(" seconds since timing");
Serial.println("motor 0 Off");

motorGo(0, CW, 0); // motorOff(0);

Serial.println("wait 1 second");

delay(1000);
Serial.println("motor 1 On");
motorGo(1, CCW, 200);
countingTime = false;
switchTouching = false;
}
delay(10);
if(switch2 == HIGH && switchTouching == false){
switchTouching = true;
Serial.println("motor 1 Off because of switch 2");
motorGo(1, CW, 0); // motorOff(1);
randomNumber = random(0,numberOfTimes);
delay(randomTimes[randomNumber]);
switchTouching = false;
Serial.println("wait for ");
Serial.print(randomTimes[randomNumber]);
Serial.println(" seconds");

motorGo(1, CW, 200);
randomNumber = random(0,numberOfTimes);

}

}

void motorOff(int motor)
{
// Initialize braked
for (int i = 0; i < 2; i++)
{
digitalWrite(inApin, LOW);
digitalWrite(inBpin, LOW);
}
analogWrite(pwmpin[motor], 0);
}

/* motorGo() will set a motor going in a specific direction
the motor will continue going in that direction, at that speed
until told to do otherwise.

motor: this should be either 0 or 1, will selet which of the two
motors to be controlled

direct: Should be between 0 and 3, with the following result
0: Brake to VCC
1: Clockwise
2: CounterClockwise
3: Brake to GND

pwm: should be a value between ? and 1023, higher the number, the faster
it'll go
*/
void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)
{
if (motor <= 1)
{
if (direct <= 4)
{
// Set inA[motor]
if (direct <= 1)
digitalWrite(inApin[motor], HIGH);
else
digitalWrite(inApin[motor], LOW);

// Set inB[motor]
if ((direct == 0) || (direct == 2))
digitalWrite(inBpin[motor], HIGH);
else
digitalWrite(inBpin[motor], LOW);

analogWrite(pwmpin[motor], pwm);
}
}
}

#### slipstick

#1
##### Jun 24, 2019, 11:35 am
If you're asking how to change from NO switches to NC switches try changing switch1==HIGH to switch1==LOW and similar for switch2 wherever they occur. As always that does depend on exactly how the switches are wired.

Steve

#### carlijnob

#2
##### Jun 24, 2019, 11:50 am

But does that mean that in the line:
if(switch1 == HIGH && switchTouching == false){

switchtouching should still be false?

#### slipstick

#3
##### Jun 24, 2019, 01:32 pm
Try it and see. I think 'switchTouching' is still o.k. but you're the one with the sit/stand desk so it's you that needs to do the testing.

Steve

#### slipstick

#4
##### Jun 24, 2019, 03:08 pm
You haven't said what "working in the old way" means. What exactly does it do? And are you sure it does exactly the same thing with "switch1 == LOW" and "switch2 == LOW"? Post your changed code (and please use code tags </> as described in "How to use this forum - please read" which is at the top of this and every forum).

Just to be clear the limit switches are the ones on pins 11 and 12 aren't they? How exactly are these switches wired? Since you're not using INPUT_PULLUP they need either pull-up or pull-down resistors. A wiring diagram would help.

Steve

Go Up