//-- Atmega 168, 328 - Arduino 1.0 IDE
//-- Fred Wolflink 2-23-2012
//
// runs DC motor from SN754410 motor control IC and demonstrates
// use of functions for Forward, Reverse, Stop and Coast (off)
//
//--- Set up:  > IC pins 4, 5, 12, 13 to ground; 8, 16 to +5v; motor to 3 & 6
//             > D3 to IC pin 1 (EN); D4 to pin 2 (1A); D2 to pin 7 (2A)
//             > switch pulls B0 low when closed
//
//	D3	D4	D2	Motor Ports
//	EN	1A	2A	754410 pin name
//	1	2	7	754410 pin
//      MOTOR CONTROL LOGIC
//	1	0	0	BRAKE
//	1	1	0	FORWARD
//	1	0	1	REVERSE
//	1	1	1	BRAKE
//	0	-	-	OFF - COAST
//
//  -- Wire LED from Digital Pin 7 (pin 13 on the chip) thru a 330 ohm resistor to ground
//  -- Wire a switch between Digital Pin 5 (pin 11 on the chip) and ground
//
//  2 options coded here - switch pressed - goes forward speed varies with analog input on A5
//  otherwise goes backward for 1 sec, stops for 2 secs, forward 1 sec, coasts 2 secs
//

#include <ms_arduino.h>	 // included software libraries to use
#include "lcd.h"

// define arguments to function
#define FORWARD 1
#define REVERSE 0
#define BRAKE 2
#define COAST 3

// variables
int buttonState = 0;  // create variable for storing "state" of the button
int sensorValue = 0;  // variable to store the value coming from the sensor

// define pins for 754410
int EN = 3;      // ENABLE is Digital Pin 4 (IC pin 6) (to motor control IC pin 1)
int M1A = 4;     // M1A is Digital Pin 3 (IC pin 5) (to motor control IC pin 2)
int M2A = 2;     // M2A is Digital Pin 2 (IC pin 2) (to motor control IC pin 7)
// define other pins
int sensorPin = A5;  // select the input pin for the light sensor
int ledPin = 7;      // variable for LED pin
int buttonPin = 5;   // variable for button pin

void setup(){
 pinMode(EN, OUTPUT);
 pinMode(M1A, OUTPUT);
 pinMode(M2A, OUTPUT);
 pinMode(buttonPin, INPUT);
 digitalWrite(buttonPin, HIGH);  // pullup_on
 
 lcd_init();			  // initialize LCD screen  
}

void loop() {
 buttonState = digitalRead(buttonPin); // "Read" the voltage on the pin (check switch)
 delay(100);     // delay to debounce switch

 if (buttonState == LOW) {   // switch is closed
   lcd_clear();
   lcd_instruction(GOTO_LINE1);
   lcd_text("Motor Running!");   // put text on the LCD screen
   delay(10);
   // read the value from the sensor:
   sensorValue = analogRead(sensorPin);
   digitalWrite(M1A, HIGH);         // Motor Control pins 1, 0 (FORWARD)
   digitalWrite(M2A, LOW);
   sensorValue = sensorValue >> 4;  // scale 10 bits to 8 bits for analog out
   analogWrite(EN, sensorValue);    // PWM output to motor
   digitalWrite(ledPin, HIGH);      // turn LED on: 
 }
 else {
   lcd_clear();         // switch open, run motor sequence
   lcd_instruction(GOTO_LINE1);
   lcd_text("reverse");
   motor(REVERSE);
   delay(1000);

   lcd_clear();
   lcd_instruction(GOTO_LINE1);
   lcd_text("brake");
   motor(BRAKE);
   delay(2000);

   lcd_clear();
   lcd_instruction(GOTO_LINE1);
   lcd_text("forward"); 
   motor(FORWARD);
   delay(1000);

   lcd_clear();
   lcd_instruction(GOTO_LINE1);
   lcd_text("coast");
   motor(COAST);
   delay(2000);
 }
}

void motor(char direction) {
 if (direction == 1) {
   // motor FORWARD
   digitalWrite(EN, HIGH);   // ENABLE high
   digitalWrite(M1A, HIGH);  // Motor Control pins 1, 0
   digitalWrite(M2A, LOW);
 }
 else if (direction == 0) {
   // motor REVERSE
   digitalWrite(EN, HIGH);   // ENABLE high
   digitalWrite(M1A, LOW);   // Motor Control pins 0, 1
   digitalWrite(M2A, HIGH);
 }
 else if (direction == 2) {
   // motor BRAKE
   digitalWrite(EN, HIGH);   // ENABLE high
   digitalWrite(M1A, HIGH);  // Motor Control pins 1, 1
   digitalWrite(M2A, HIGH);
 }
 else {
   // motor OFF - COAST
   digitalWrite(EN, LOW);    // ENABLE low
 }  // end IF-ELSE
}