#include #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); } }