Introdução
Antes de ler este artigo deve ler os artigos seguintes:
- Robot material reciclado – https://cluberobotica.wordpress.com/2017/12/01/robot-com-material-reciclado/
- Seguidor de luz – https://cluberobotica.wordpress.com/2018/01/13/seguidor-de-luz/
Este trabalho resulta da junção dos programas dos dois artigos. No entanto este artigo não está completo e ainda vai estar sujeito à confirmação dos dados apresentados, nomeadamente no que diz respeito ao funcionamento eficaz do programa.
Objetivo do trabalho
- O robot deve movimentar-se acompanhando o movimento da luz utilizando a leitura de 2 resistências LDR
- O movimento dos motores é controlado pelo motor shield
- O sensor ultrasónico deve impedir que o robot choque de frente com os obstaculos
Material necessário
- 1 Arduíno Uno
- 1 Breadborad
- 2 Resistências LDR
- 2 Resistências 10KOhms
- 3 Resistências 230 Ohms
- 3 Led’s (1 vermelho + 1 verde + 1 amarela)
- 1 Arduíno Motor shield
- 1 Chassis de robot
- 1 par de motores DC + rodas
- Condutores de ligação
Esquema

Programa
/* Robot com motores CC 5V, motor shield, sensor ultrasonic e 2 resistencias LDR * Programa realizado poelo Prof. Ramiro Martins Clube de Robotica ESGC * O objetivo é o robot seguir a luz e não colidir com os objetos */ // Bilblioteca do uktrasonico e definição das portas do trigger e echo #include <Ultrasonic.h> #define TRIGGER_PIN 5 // pin 5 ligado ao trigger #define ECHO_PIN 6 // pin 6 ligado ao echo Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN); //Portas analógicas dos LDR e valores iniciais int Ent_FR_Esq = A4; // Variavel da entrada analógico da fotoresistencia esquerda no pino 0 do arduino int Ent_FR_Dt = A5; // Variavel da entrada analógico da fotoresistencia direta no pino 0 do arduino int LFRESQ = 0; // Guarda as leituras da fotoresistencia esquerda. int LFRDT = 0; // Guarda as leituras da fotoresistencia direita. //Motor shield const int PWM_A = 3, PWM_B = 11, DIR_A = 12, DIR_B = 13, BRAKE_A = 9, BRAKE_B = 8, SNS_A = A0, SNS_B = A1; int LED1 = 10; // Define-se o Pin 10 como sendo do LED1 de perigo int LED2 = 2; // Define-se o Pin 2 como sendo do LED2 de perigo int LED3 = 4; // Define-se o Pin 4 como sendo do LED3 de perigo void setup() { // Configurar as saidas dos LEDs pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); // Configuração da saída do motor A pinMode(BRAKE_A, OUTPUT); //Pin de paragem do motor A pinMode(DIR_A, OUTPUT); //Pin de direção do motor A - Para a fente ou para trás // Configuração da saída do motor B pinMode(BRAKE_B, OUTPUT); // pin de paragem do motor B pinMode(DIR_B, OUTPUT); // Pin de direção do motor B - Para a fente ou para trás int a = 35; Serial.begin(9600); // inicialização da comunicação } void loop() { // Lêem os valores das fotoresistencias (LDR) da esquerda e da direita. LFRESQ = analogRead (Ent_FR_Esq); LFRDT = analogRead (Ent_FR_Dt); Serial.println (LFRESQ); Serial.println (LFRDT); // Verifica se a leitura da direita é maior que a da esquerda, se assim for, vai para a direita. if (LFRESQ> (LFRDT +20)) // +20 para compensar zonas mortas, para que não volte ao ponto anterior. { esquerda(); } if (LFRDT> (LFRESQ +20)) // +20 para compensar zonas mortas, para que não volte ao ponto anterior. { direita(); } // Leitura do sensor ultrasónico float cmMsec, inMsec; long microsec = ultrasonic.timing(); cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); inMsec = ultrasonic.convert(microsec, Ultrasonic::IN); Serial.print("Distancia CM: "); Serial.println(cmMsec); delay(100); int a = cmMsec; // a distancia aos objetos pode ser alterada neste programa definimos 25 cm if (a < 25) { rodar(); digitalWrite(LED1, HIGH);// Perigo float cmMsec, inMsec; long microsec = ultrasonic.timing(); cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); inMsec = ultrasonic.convert(microsec, Ultrasonic::IN); Serial.print("Distancia CM: "); Serial.println(cmMsec); int a = cmMsec; } else { andar(); digitalWrite(LED1, LOW); } } void andar() { // rotina para o robot anda em frente digitalWrite(BRAKE_A, LOW); // funcao de paragem a zero, paragem do motor A desligada digitalWrite(DIR_A, HIGH); // funcao para andar, o motor A roda para a frente analogWrite(PWM_A, 70); // velocidade do motor A esta definida a 70, 255 valor max. digitalWrite(BRAKE_B, LOW); // funcao de paragem a zero, paragem do motor B desligada digitalWrite(DIR_B, HIGH); // funcao para andar, o motor B roda para a frente analogWrite(PWM_B, 70); // velocidade do motor B esta definida a 70, 255 valor max. Serial.println("Estou a andar para a frente"); } void rodar() { // rotina para o robot parar e andar para trás e roda digitalWrite(BRAKE_A, HIGH); // funcao de paragem a zero, paragem do motor A desligada digitalWrite(BRAKE_B, HIGH); // funcao de paragem a zero, paragem do motor B desligada delay (200); // Espera 0,2 s digitalWrite(BRAKE_A, LOW); // funcao de paragem a zero, paragem do motor A desligada digitalWrite(DIR_A, LOW); // funcao para andar, o motor A roda para trás analogWrite(PWM_A, 70); // velocidade do motor A esta definida a 70, 255 valor max. digitalWrite(BRAKE_B, LOW); // funcao de paragem a zero, paragem do motor B desligada digitalWrite(DIR_B, LOW); // funcao para andar, o motor B roda para trás analogWrite(PWM_B, 70); // velocidade do motor B esta definida a 70, 255 valor max. Serial.println("Estou a andar para trás"); delay (500); // Espera 0,5 s digitalWrite(BRAKE_A, LOW); // funcao de paragem a zero, paragem do motor A desligada digitalWrite(DIR_A, HIGH); // funcao para andar a um, o motor A roda para a frente analogWrite(PWM_A, 0); // velocidade do motor A esta definida a 0, 255 valor max. digitalWrite(BRAKE_B, LOW); // funcao de paragem a zero, paragem do motor B desligada digitalWrite(DIR_B, HIGH); // funcao para andar a um, o motor B roda para a frente analogWrite(PWM_B, 100); // velocidade do motor B esta definida a 100, 255 valor max. Serial.println("Estou a rodar"); delay (200); // Espera 0,2 s analogWrite(PWM_A, 0); analogWrite(PWM_A, 0); delay (50); // Espera 0,05 s } void esquerda() { // Motor A é o da esquerda digitalWrite(LED2, HIGH); // Sinalização de luz à esquerda digitalWrite(LED3, LOW); // Desligada a sinalização de luz à direita digitalWrite(BRAKE_A, LOW); // funcao de paragem a zero, paragem do motor A desligada digitalWrite(DIR_A, HIGH); // funcao para andar a um, o motor A roda para a frente analogWrite(PWM_A, 10); // velocidade do motor A esta definida a 10, 255 valor max. digitalWrite(BRAKE_B, LOW); // funcao de paragem a zero, paragem do motor B desligada digitalWrite(DIR_B, HIGH); // funcao para andar a um, o motor B roda para a frente analogWrite(PWM_B, 80); // velocidade do motor B esta definida a 80, 255 valor max. Serial.println("Estou a rodar para a esquerda"); delay (50); // Espera 0,05 s } void direita() { // Motor B é o da direita digitalWrite(LED2, LOW); // Desligada a sinalização de luz à esquerda digitalWrite(LED3, HIGH); // Sinalização de luz à direita digitalWrite(BRAKE_A, LOW); // funcao de paragem a zero, paragem do motor A desligada digitalWrite(DIR_A, HIGH); // funcao para andar a um, o motor A roda para a frente analogWrite(PWM_A, 80); // velocidade do motor A esta definida a 80, 255 valor max. digitalWrite(BRAKE_B, LOW); // funcao de paragem a zero, paragem do motor B desligada digitalWrite(DIR_B, HIGH); // funcao para andar a um, o motor B roda para a frente analogWrite(PWM_B, 10); // velocidade do motor B esta definida a 10, 255 valor max. Serial.println("Estou a rodar para a direita"); delay (50); // Espera 0,05 s }
Fotos e videos
Brevemente
Anúncios

