Movimento simples de robot 2WD com PWM fixo

Programa de teste simples para fazer um robot 2WD deslocar-se num movimento rectilineo (andar a direito) com um valor fixo de PWM para controlar os dois motores.

Material minimo

Aos componentes abaixo indicados adicionar: fios, parafusos e porcas.

  • 1 x Chassis para robot 2WD
  • 2 x motores DC
  • 2 x roda
  • 1 x arduino (uno, nano, mega)
  • 1 x Breadboard
  • 1 x ponte-H (L298N)

O programa de teste limita-se a usar a ponte-H para:

  • Definir a direção dos 2 motores
  • Injectar um sinal PWM constante nos 2 motores

O programa tem mais linhas de código que as necessárias pois faz uso extensivo dos #defines, e usa funções.

Demonstração

Comentários

É claramente visivel que o movimento não é rectilineo, e que o robot está a curvar para a sua direita. Isto acontece porque uma roda anda mais que outra, isto porque o motor da esquerda produz mais rotação que o da direita para o mesmo valor do PWM.

Por outro lado, este movimento é continuo e não sabemos como parar.

Pelo que se torna imperativo acrescentar uns encoders ao robot.

Programa

demo_2wd_pwm_fixed

#define serialSpeed 115200

#define bodyLeftMotorPWM 110
#define bodyRightMotorPWM 110

// motor one
#define enA 5
#define in1 4
#define in2 7
// motor two
#define enB 6
#define in3 8
#define in4 12

// LeftMotor
#define bodyLeftMotorEn enA
#define bodyLeftMotorForward in1
#define bodyLeftMotorBackward in2

// RightMotor
#define bodyRightMotorEn enB
#define bodyRightMotorForward in4
#define bodyRightMotorBackward in3

unsigned long loopTimeStart = 0;

void setup() {
Serial.begin(serialSpeed); //Initialize the serial port

pinMode(bodyLeftMotorEn, OUTPUT);
pinMode(bodyLeftMotorForward, OUTPUT);
pinMode(bodyLeftMotorBackward, OUTPUT);
pinMode(bodyRightMotorEn, OUTPUT);
pinMode(bodyRightMotorForward, OUTPUT);
pinMode(bodyRightMotorBackward, OUTPUT);

delay(3000);

loopTimeStart = millis();
}

void loop() {
unsigned long loopTime = 0;

setBodyMotorLeftForward();
setBodyMotorRightForward();

analogWrite(bodyLeftMotorEn, bodyLeftMotorPWM);
analogWrite(bodyRightMotorEn, bodyRightMotorPWM);
// end loop
loopTime = millis() - loopTimeStart; 
loopTimeStart = millis();
}

void setBodyMotorLeftForward() {
digitalWrite(bodyLeftMotorForward, HIGH);
digitalWrite(bodyLeftMotorBackward, LOW);
}

void setBodyMotorRightForward() {
digitalWrite(bodyRightMotorForward, HIGH);
digitalWrite(bodyRightMotorBackward, LOW);
}

end