Skip to content

Instantly share code, notes, and snippets.

@Batname
Created December 6, 2017 14:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Batname/64de2a3d71958ee618d95cca683c3ce0 to your computer and use it in GitHub Desktop.
Save Batname/64de2a3d71958ee618d95cca683c3ce0 to your computer and use it in GitHub Desktop.
#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