Created
December 6, 2017 14:54
-
-
Save Batname/64de2a3d71958ee618d95cca683c3ce0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <string.h> | |
#define BRAKE 0 | |
#define CW 1 | |
#define CCW 2 | |
#define CS_THRESHOLD 15 // Definition of safety current (Check: "1.3 Monster Shield Example"). | |
//MOTOR 1 | |
#define MOTOR_A1_PIN 7 | |
#define MOTOR_B1_PIN 8 | |
//MOTOR 2 | |
#define MOTOR_A2_PIN 4 | |
#define MOTOR_B2_PIN 9 | |
#define PWM_MOTOR_1 5 | |
#define PWM_MOTOR_2 6 | |
#define CURRENT_SEN_1 A2 | |
#define CURRENT_SEN_2 A3 | |
#define EN_PIN_1 A0 | |
#define EN_PIN_2 A1 | |
#define MOTOR_1 0 | |
#define MOTOR_2 1 | |
#define SERIAL_BUFFER_SIZE 255 | |
short usSpeed = 0; //default motor speed | |
unsigned short usMotor_Status = BRAKE; | |
#define MAX_SPEED 190 | |
/** | |
* Divides a given PWM pin frequency by a divisor. | |
* | |
* The resulting frequency is equal to the base frequency divided by | |
* the given divisor: | |
* - Base frequencies: | |
* o The base frequency for pins 3, 9, 10, and 11 is 31250 Hz. | |
* o The base frequency for pins 5 and 6 is 62500 Hz. | |
* - Divisors: | |
* o The divisors available on pins 5, 6, 9 and 10 are: 1, 8, 64, | |
* 256, and 1024. | |
* o The divisors available on pins 3 and 11 are: 1, 8, 32, 64, | |
* 128, 256, and 1024. | |
* | |
* PWM frequencies are tied together in pairs of pins. If one in a | |
* pair is changed, the other is also changed to match: | |
* - Pins 5 and 6 are paired on timer0 | |
* - Pins 9 and 10 are paired on timer1 | |
* - Pins 3 and 11 are paired on timer2 | |
* | |
* Note that this function will have side effects on anything else | |
* that uses timers: | |
* - Changes on pins 3, 5, 6, or 11 may cause the delay() and | |
* millis() functions to stop working. Other timing-related | |
* functions may also be affected. | |
* - Changes on pins 9 or 10 will cause the Servo library to function | |
* incorrectly. | |
* | |
* Thanks to macegr of the Arduino forums for his documentation of the | |
* PWM frequency divisors. His post can be viewed at: | |
* http://forum.arduino.cc/index.php?topic=16612#msg121031 | |
*/ | |
void setPwmFrequency(int pin, int divisor) { | |
byte mode; | |
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) { | |
switch(divisor) { | |
case 1: mode = 0x01; break; | |
case 8: mode = 0x02; break; | |
case 64: mode = 0x03; break; | |
case 256: mode = 0x04; break; | |
case 1024: mode = 0x05; break; | |
default: return; | |
} | |
if(pin == 5 || pin == 6) { | |
TCCR0B = TCCR0B & 0b11111000 | mode; | |
} else { | |
TCCR1B = TCCR1B & 0b11111000 | mode; | |
} | |
} else if(pin == 3 || pin == 11) { | |
switch(divisor) { | |
case 1: mode = 0x01; break; | |
case 8: mode = 0x02; break; | |
case 32: mode = 0x03; break; | |
case 64: mode = 0x04; break; | |
case 128: mode = 0x05; break; | |
case 256: mode = 0x06; break; | |
case 1024: mode = 0x07; break; | |
default: return; | |
} | |
TCCR2B = TCCR2B & 0b11111000 | mode; | |
} | |
} | |
void setup() | |
{ | |
pinMode(MOTOR_A1_PIN, OUTPUT); | |
pinMode(MOTOR_B1_PIN, OUTPUT); | |
pinMode(MOTOR_A2_PIN, OUTPUT); | |
pinMode(MOTOR_B2_PIN, OUTPUT); | |
pinMode(PWM_MOTOR_1, OUTPUT); | |
pinMode(PWM_MOTOR_2, OUTPUT); | |
pinMode(CURRENT_SEN_1, OUTPUT); | |
pinMode(CURRENT_SEN_2, OUTPUT); | |
pinMode(EN_PIN_1, OUTPUT); | |
pinMode(EN_PIN_2, OUTPUT); | |
// Set max Frequency to voltage control output | |
setPwmFrequency(5, 1); | |
setPwmFrequency(6, 1); | |
Serial.begin(9600); // Initiates the serial to do the monitoring | |
} | |
int incomingByte = 0; | |
char buffer[SERIAL_BUFFER_SIZE] = {0}; | |
void loop() | |
{ | |
String user_input; | |
while(Serial.available()) | |
{ | |
Serial.readBytesUntil('\n', buffer, SERIAL_BUFFER_SIZE); | |
// Copy to string | |
user_input = String(buffer); | |
// clean buffer after read and copy to string | |
memset(buffer, 0, SERIAL_BUFFER_SIZE); | |
digitalWrite(EN_PIN_1, HIGH); | |
digitalWrite(EN_PIN_2, HIGH); | |
if (user_input.equals("Stop")) | |
{ | |
Stop(); | |
Serial.println("[Arduino client] Stop"); | |
} | |
else if(user_input.equals("Forward")) | |
{ | |
Forward(); | |
Serial.println("[Arduino client] Forward"); | |
} | |
else if(user_input.equals("Reverse")) | |
{ | |
Reverse(); | |
Serial.println("[Arduino client] Reverse"); | |
} | |
else if(user_input.indexOf("Init Voltage") != -1) // Setup voltage | |
{ | |
short NewVoltage = user_input.substring(12).toInt(); | |
usSpeed = NewVoltage; | |
// Set initial speed | |
SetVoltage(); | |
// and then run motors | |
Forward(); | |
Serial.print("[Arduino client] Init: "); | |
Serial.println(usSpeed); | |
} | |
else if(user_input.indexOf("Voltage") != -1) // Setup voltage | |
{ | |
short NewVoltage = user_input.substring(7).toInt(); | |
usSpeed = NewVoltage; | |
SetVoltage(); | |
Serial.print("[Arduino client] SetVoltage: "); | |
Serial.println(usSpeed); | |
} | |
else | |
{ | |
Serial.print("Invalid option entered."); | |
Serial.println(user_input); | |
} | |
} | |
} | |
void Stop() | |
{ | |
usMotor_Status = BRAKE; | |
motorGo(MOTOR_1, usMotor_Status, 0); | |
motorGo(MOTOR_2, usMotor_Status, 0); | |
} | |
void Forward() | |
{ | |
usMotor_Status = CW; | |
motorGo(MOTOR_1, usMotor_Status, usSpeed); | |
motorGo(MOTOR_2, usMotor_Status, usSpeed); | |
} | |
void Reverse() | |
{ | |
usMotor_Status = CCW; | |
motorGo(MOTOR_1, usMotor_Status, usSpeed); | |
motorGo(MOTOR_2, usMotor_Status, usSpeed); | |
} | |
void SetVoltage() | |
{ | |
if(usSpeed > MAX_SPEED) | |
{ | |
usSpeed = MAX_SPEED; | |
} | |
if(usSpeed < 0) | |
{ | |
usSpeed = 0; | |
} | |
motorGo(MOTOR_1, usMotor_Status, usSpeed); | |
motorGo(MOTOR_2, usMotor_Status, usSpeed); | |
} | |
void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm) //Function that controls the variables: motor(0 ou 1), direction (cw ou ccw) e pwm (entra 0 e 255); | |
{ | |
if(motor == MOTOR_1) | |
{ | |
if(direct == CW) | |
{ | |
digitalWrite(MOTOR_A1_PIN, LOW); | |
digitalWrite(MOTOR_B1_PIN, HIGH); | |
} | |
else if(direct == CCW) | |
{ | |
digitalWrite(MOTOR_A1_PIN, HIGH); | |
digitalWrite(MOTOR_B1_PIN, LOW); | |
} | |
else | |
{ | |
digitalWrite(MOTOR_A1_PIN, LOW); | |
digitalWrite(MOTOR_B1_PIN, LOW); | |
} | |
analogWrite(PWM_MOTOR_1, pwm); | |
} | |
else if(motor == MOTOR_2) | |
{ | |
if(direct == CW) | |
{ | |
digitalWrite(MOTOR_A2_PIN, LOW); | |
digitalWrite(MOTOR_B2_PIN, HIGH); | |
} | |
else if(direct == CCW) | |
{ | |
digitalWrite(MOTOR_A2_PIN, HIGH); | |
digitalWrite(MOTOR_B2_PIN, LOW); | |
} | |
else | |
{ | |
digitalWrite(MOTOR_A2_PIN, LOW); | |
digitalWrite(MOTOR_B2_PIN, LOW); | |
} | |
analogWrite(PWM_MOTOR_2, pwm); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment