/*##############################################################################
 Author:
 * Mirko Prosseda (01-2018)
 * email: mirko.prosseda@gmail.com
 * 
 Description:
 * Dual DC Motor Driver 30V 4A V3 test sketch v1.0
 * Speed and direction for each motor channel are regulated by
 * potentiometers attached to Arduino pins A0 and A1
 * 
 Connections:
 * BOARD -> ARDUINO
 * IN1    -> 3
 * IN2    -> 5
 * IN3    -> 6
 * IN4    -> 9
 * GND    -> GND
##############################################################################*/


// Define constants and variables
const int Dir1a = 3;
const int Dir1b = 5;
const int Dir2a = 6;
const int Dir2b = 9;
const int analogPin1 = A0;   
const int analogPin2 = A1;   

int analogValue1; 
int analogValue2; 
byte pwmValue1;
byte pwmValue2;

// Initialization
void setup() 
{
  pinMode(Dir1a, OUTPUT);
  pinMode(Dir1b, OUTPUT);
  pinMode(Dir2a, OUTPUT);
  pinMode(Dir2b, OUTPUT);
  digitalWrite(Dir1a, 0);
  digitalWrite(Dir1b, 0);
  digitalWrite(Dir2a, 0);
  digitalWrite(Dir2b, 0);
}

// main loop
void loop() 
{
  // read both potentiometers values
  analogValue1 = analogRead(analogPin1);  
  analogValue2 = analogRead(analogPin2);  

  // apply direction adjustment for channel 1
  if(analogValue1 > 512)
  {
    pwmValue1 = (analogValue1 - 512)/2; // evaluate new pwm value
    analogWrite(Dir1a,pwmValue1);
    digitalWrite(Dir1b, LOW);
  }
  else
  {
    pwmValue1 = (511 - analogValue1)/2; // evaluate new pwm value
    digitalWrite(Dir1a, LOW);
    analogWrite(Dir1b,pwmValue1);
  }

  // apply direction adjustment for channel 2
  if(analogValue2 > 512)
  {
    pwmValue2 = (analogValue2 - 512)/2; // evaluate new pwm value
    analogWrite(Dir2a,pwmValue2);
    digitalWrite(Dir2b, LOW);
  }
  else
  {
    pwmValue2 = (511 - analogValue2)/2; // evaluate new pwm value
    digitalWrite(Dir2a, LOW);
    analogWrite(Dir2b,pwmValue2);
  }
}
