João está programando um robô carro para andar 30cm para frente e quando ele reconhecer a cor preta no chão, voltar 30 cm. Explique como João deve fazer para programar?
Soluções para a tarefa
1) Para programar esse robô João pode utilizar a plataforma Arduino integrado com um sensor optico de reconhecimento. Segue a programação do robô:
AF_DCMotor motor_esq(1); //Seleciona o motor 1
AF_DCMotor motor_dir(2); //Seleciona o motor 42
int SENSOR1, SENSOR2, //SENSOR3; Sensor de movimentação e optico
//deslocamentos de calibracao
int leftOffset = 0, rightOffset = 0, centre = 0;
//pinos para a velocidade e direcao do motor
int speed1 = 3, speed2 = 11, direction1 = 12, direction2 = 13;
//velocidade inicial e deslocamento de rotacao
int startSpeed = 30, rotate = 30; //Deslocamento de 30 cm
//limiar do sensor
int threshold = 30;
//velocidades iniciais dos motores esquerdo e direito
int left = startSpeed, right = startSpeed;
//Rotina de calibracao do sensor
void calibrate()
{
for (int x=0; x<10; x++) //Executa 10 vezes para obter uma media
{
delay(100);
SENSOR1 = analogRead(0);
SENSOR2 = analogRead(1);
SENSOR3 = analogRead(2);
leftOffset = leftOffset + SENSOR1;
centre = centre + SENSOR2;
rightOffset = rightOffset + SENSOR3;
delay(100);
}
//obtem a media para cada sensor
leftOffset = leftOffset /30; //Deslocamento para esquerda
rightOffset = rightOffset /30; //Deslocamento para direita
centre = centre / 30; //Raio de deslocamento
//calcula os deslocamentos para os sensores esquerdo e direito
leftOffset = centre - leftOffset;
rightOffset = centre - rightOffset;
}
void setup()
{
calibrate();
delay(3000);
}
void loop()
{
//utiliza a mesma velocidade em ambos os motores
left = startSpeed;
right = startSpeed;
//le os sensores e adiciona os deslocamentos
SENSOR1 = analogRead(0) + leftOffset;
SENSOR2 = analogRead(1);
SENSOR3 = analogRead(2) + rightOffset;
//Se SENSOR1 for maior do que o sensor do centro + limiar,
// vire para a direita
if (SENSOR1 > SENSOR2+threshold)
{
left = startSpeed + rotate;
right = startSpeed - rotate;
}
//Se SENSOR3 for maior do que o sensor do centro + limiar,
// vire para a esquerda
if (SENSOR3 > (SENSOR2+threshold))
{
left = startSpeed - rotate;
right = startSpeed + rotate;
}
//Envia os valores de velocidade para os motores
motor_esq.setSpeed(left);
motor_esq.run(FORWARD);
motor_dir.setSpeed(right);
motor_dir.run(FORWARD);
}