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