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