Go Down

Topic: Combining project 5 & 10: DC motor no longer variable speed (Read 971 times) previous topic - next topic



in an attempt to have the set-up for a motorized vehicle I combined the circuit and code of
* project 5 in which a servo motor is used which could be used for steering and
* project 10 in which a DC motor is turned on/off and with the possibility to switch the direction. I added a little variation to the code in the book to map the potentiometer (0-1023) to the speed of the DC motor (0-255), which works fine.

However, in this combination, the DC motor only works (at full speed, 255) when the potentiometer reads 1023.
Any other potentiometer value is translated/mapped to a certain value of the motorspeed (seen in the serial monitor), however the DC motor doesn't spin at all.

If I upload the code of only project 10 to the combined circuit, I can vary the speed of the DC motor by means of the potentiometer, i.e. the circuit and the code work fine. Only in combination with the code of the servo motor (that works fine, even in the combined circuit/code) the DC motor's speed is no longer variable.

The code is underneath.

I can't find any incompatibility in the code. Is there any other reason why it doesn't do what I expect it to do?
Thanks for the help.!

  Arduino Starter Kit example
  Project 10 - Zoetrope
  Parts required:
  - two 10 kilohm resistors
  - two momentary pushbuttons
  - one 10 kilohm potentiometer
  - motor
  - 9V battery
  - H-Bridge

  Project 5 - Servo Mood Indicator
  Parts required:
  - servo motor
  - 10 kilohm potentiometer
  - two 100 uF electrolytic capacitors

// include the Servo library
#include <Servo.h>

Servo myServo;  // create a servo object

const int potPinS = A1; // analog pin used to connect the potentiometer of the servo motor
int potValS;  // variable to read the value from the analog pin of the servo motor
int angleS;   // variable to hold the angle for the servo motor

const int controlPin1 = 2; // connected to pin 7 on the H-bridge
const int controlPin2 = 3; // connected to pin 2 on the H-bridge
const int enablePin = 9;   // connected to pin 1 on the H-bridge
const int directionSwitchPin = 4;  // connected to the switch for direction
const int onOffSwitchStateSwitchPin = 5; // connected to the switch for turning the DC motor on and off
const int potPin = A0;  // connected to the potentiometer's output of the DC motor

// create some variables to hold values from your inputs of the DC motor
int onOffSwitchState = 0;  // current state of the on/off switch
int previousOnOffSwitchState = 0; // previous position of the on/off switch
int directionSwitchState = 0;  // current state of the direction switch
int previousDirectionSwitchState = 0;  // previous state of the direction switch

int potVal = 0; //of the DC motor
int motorEnabled = 0; // Turns the DC motor on/off
int motorSpeed = 0; // speed of the DC motor
int motorDirection = 1; // current direction of the DC motor

void setup() {
  myServo.attach(10); // attaches the servo on pin 10 to the servo object

// initialize the inputs and outputs  of the DC motor
  pinMode(directionSwitchPin, INPUT);
  pinMode(onOffSwitchStateSwitchPin, INPUT);
  pinMode(controlPin1, OUTPUT);
  pinMode(controlPin2, OUTPUT);
  pinMode(enablePin, OUTPUT);

  // pull the enable pin LOW to start
  digitalWrite(enablePin, LOW);
  // open a serial connection to your computer

void loop() {
  potValS = analogRead(potPinS); // read the value of the potentiometer of the servo motor
  Serial.print("potValS: "); // print out the value to the Serial Monitor

  angleS = map(potValS, 0, 1023, 0, 155); // scale the numbers from the pot of the servo motor
  Serial.print(", angleS: "); // print out the angle for the servo motor

  myServo.write(angleS); // set the servo position
  delay(15); // wait for the servo to get there

  onOffSwitchState = digitalRead(onOffSwitchStateSwitchPin); // read the value of the on/off switch

  directionSwitchState = digitalRead(directionSwitchPin); // read the value of the direction switch

  // read the value of the pot of the DC motor used for PWM
  potVal = analogRead(potPin);
  motorSpeed = map(potVal, 0, 1023, 0, 255);
  //motorSpeed = analogRead(potPin)/4; original code of project 10
  Serial.print(", PotValue = " );
  Serial.print(", Motorspeed = ");
  Serial.print(", On/Off = ");
  Serial.print(", Direction = ");
  // if the on/off button changed state since the last loop()
  if (onOffSwitchState != previousOnOffSwitchState) {
    // change the value of motorEnabled if pressed
    if (onOffSwitchState == HIGH) {
      motorEnabled = !motorEnabled;

  // if the direction button changed state since the last loop()
  if (directionSwitchState != previousDirectionSwitchState) {
    // change the value of motorDirection if pressed
    if (directionSwitchState == HIGH) {
      motorDirection = !motorDirection;

  // change the direction the motor spins by talking to the control pins
  // on the H-Bridge
  if (motorDirection == 1) {
    digitalWrite(controlPin1, HIGH);
    digitalWrite(controlPin2, LOW);
  } else {
    digitalWrite(controlPin1, LOW);
    digitalWrite(controlPin2, HIGH);

  // if the DC motor is supposed to be on
  if (motorEnabled == 1) {
    // PWM the enable pin to vary the speed
    analogWrite(enablePin, motorSpeed);
  } else { // if the DC motor is not supposed to be on
    //turn the DC motor off
    analogWrite(enablePin, 0);
  // save the current on/off switch state as the previous
  previousDirectionSwitchState = directionSwitchState;
  // save the current switch state as the previous
  previousOnOffSwitchState = onOffSwitchState;


without looking at the two projects are you using two different analog pins for the dc motor and a different one for servo angle try using another analog pin for dc motor speed like a2 and adjust the code and circuit to use a2 instead of a0 and separate pot for each also include a circuit diagram in future.

Go Up