cursos:introrobotica:2019-1:grupo04:codigo_tp2
#include <math.h> #include <LiquidCrystal.h> #include <Adafruit_MotorShield.h> Adafruit_MotorShield AFMS = Adafruit_MotorShield(); Adafruit_DCMotor *motor1 = AFMS.getMotor(1); Adafruit_DCMotor *motor2 = AFMS.getMotor(2); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // ################################################################## // constantes para identificar as portas digitais de cada LED int RED = 23; int GREEN = 25; int BLUE = 27; // porta analogica do LDR int LDR = 8; // Matriz com os pinos onde o LED RGB vai ser conectado int matrizPinodosLEDS[] = {RED,GREEN,BLUE}; // Uma variável booleana para indicar se o sensor foi calibrado boolean balanco = false; //Matriz de floats para armazenar o valor das cores float matrizCores[] = { 0,0,0}; float matrizBranco[] = { 0,0,0}; float matrizPreto[] = { 0,0,0}; //Variável para armazenar a média das leitura int mediaLeituras; // ################################################################### int v1 = 0; // usado para aumentar a velocidade do motor 1 int v2 = 0; // usado para aumentar a velocidade do motor 2 float t_gir180 = 2.1; float t_dir90 = 1.025; float t_esq90 = 0.8; float t_dir45 = 1.5; float t_frente = 2.3; float t_re = 2; int vel1 = 97; // velocidade inicial do motor 1 - 140 int vel2 = 130;// velocidade inicial do motor 2 - 160 int vel1_frente = 0; int vel2_re = 0; void setup() { lcd.begin(16, 2); lcd.setCursor(0,0); lcd.print("Bora Time, Foco!"); lcd.setCursor(0,1); lcd.print(" "); Serial.begin(9600); AFMS.begin(); motor1->setSpeed(vel1); motor2->setSpeed(vel2); motor1->run(RELEASE); motor2->run(RELEASE); pinMode(RED,OUTPUT);//LED VERMELHO pinMode(GREEN,OUTPUT);//LED VERDE pinMode(BLUE,OUTPUT);//LED AZUL //Inicia a comunicação serial // Verifica se o Balanco de branco foi calibrado checaBalanco(); } void dir90 (float t){ t = t*1000; motor1->run(BACKWARD); motor2->run(FORWARD); delay(t); } void esq90 (float t){ t = t*1000; motor1->run(FORWARD); motor2->run(BACKWARD); delay(t); } void dir45 (float t){ t = t*1000; motor1->run(BACKWARD); motor2->run(FORWARD); delay(t); } void para(){ motor1->run(RELEASE); motor2->run(RELEASE); delay(500); } void frente(float t){ t = t*1000; motor1->run(BACKWARD); motor2->run(BACKWARD); delay(t); } void re(float t){ t = t*1000; motor1->run(FORWARD); motor2->run(FORWARD); delay(t); } void direita(float t){ t = t*1000; motor1->run(BACKWARD); motor2->run(RELEASE); delay(t); } void esquerda(float t){ t = t*1000; motor1->run(RELEASE); motor2->run(BACKWARD); delay(t); } // Aumenta velocidade motor 1 void AumentaVel1() { if (vel1 < 210){ vel1 = vel1 + 1; } else{ vel1 = 100; } } // diminui velocidade motor 1 void AumentaVel2() { if (vel1 < 210){ vel1 = vel1 - 1; } else{ vel1 = 100; } } void reta(){ frente(t_frente); para(); gira(t_gir180); para(); frente(t_frente); para(); } void triangulo(){ frente(t_frente); para(); gira(t_dir45); para(); float t = 2.8; frente(t); para(); gira(t_dir45); para(); frente(t_frente); para(); gira(t_dir90); para(); } void quadrado(){ frente(t_frente); para(); gira(t_dir90); para(); frente(t_frente); para(); gira(t_dir90); para(); frente(t_frente); para(); gira(t_dir90); para(); frente(t_frente); para(); gira(t_dir90); para(); } // gira horario void gira(float t){ t = t*1000; motor1->run(BACKWARD); motor2->run(FORWARD); delay(t); } void giraesquerda(float t){ t = t*1000; motor1->run(FORWARD); motor2->run(BACKWARD); delay(t); } //gira antihorario void giraanti(float t){ t = t*1000; motor1->run(FORWARD); motor2->run(BACKWARD); delay(t); } void esquerda(){ int tempo=0; para(); esquerda(20); para(); } void loop(){ int botao; botao = analogRead (0); //Leitura do valor da porta analógica A0 lcd.setCursor(0,1); lcd.print(vel1+v1); lcd.setCursor(12,1); lcd.print (vel2+v2); if (botao < 100) { // ---------------------- BOTAO RIGHT ----------------- lcd.setCursor(0,0); lcd.print("Quadrado "); lcd.setCursor(0,1); lcd.print(" "); quadrado(); motor1->run(RELEASE); motor2->run(RELEASE); delay(500); } else if (botao < 200) { // ---------------------- BOTAO UP ----------------- delay(300); lcd.setCursor(0,0); lcd.print("Triangulo "); lcd.setCursor(0,1); lcd.print(" "); triangulo(); motor1->run(RELEASE); motor2->run(RELEASE); } else if (botao < 400){ // -------------------- BOTAO DOWN -------------- //Checa qual é a cor checaCores(); delay (300); } else if (botao < 600){ // -------------------- BOTAO LEFT -------------- lcd.setCursor(0,0); lcd.print("Reta "); lcd.setCursor(0,1); lcd.print(" "); reta(); // -> chama a função pra fazer o robo andar reto, girar e voltar reto motor1->run(RELEASE); motor2->run(RELEASE); delay(500); } else if (botao < 800){ // BOTAO SELECT while(checaCoresParaAndar() == 0 && checaCoresParaAndar() == 3 && checaCoresParaAndar() == 4 && checaCoresParaAndar() == 5){ motor1->run(FORWARD); motor2->run(FORWARD); if(checaCoresParaAndar() == 3){ gira(t_gir180); motor1->run(FORWARD); motor2->run(FORWARD); } if(checaCoresParaAndar() == 4){ giraesquerda(t_esq90); motor1->run(FORWARD); motor2->run(FORWARD); } if(checaCoresParaAndar() == 5){ gira(t_dir90); motor1->run(FORWARD); motor2->run(FORWARD); } } if(checaCoresParaAndar() == 1){ motor1->run(RELEASE); motor2->run(RELEASE); } if(checaCoresParaAndar() == 2){ gira(t_gir180*2); } } } //############################################################################## // Verifica se o Balanco de branco foi calibrado void checaBalanco() { //checa se o balanço de branco foi feito if(balanco == false){ confBalanco(); } } //Configura o balanco de Branco void confBalanco(){ //Calibrando o branco! lcd.setCursor(0,0); lcd.print("Calibra Branco "); lcd.setCursor(0,1); lcd.print(" "); delay(5000); for(int i = 0;i<=2;i++){ digitalWrite(matrizPinodosLEDS[i],HIGH); delay(100); mediaSensor(5); matrizBranco[i] = mediaLeituras; digitalWrite(matrizPinodosLEDS[i],LOW); delay(100); } //Calibrando o preto! lcd.setCursor(0,0); lcd.print("Calibra Preto "); lcd.setCursor(0,1); lcd.print(" "); delay(5000); for(int i = 0;i<=2;i++){ digitalWrite(matrizPinodosLEDS[i],HIGH); delay(100); mediaSensor(5); matrizPreto[i] = mediaLeituras; digitalWrite(matrizPinodosLEDS[i],LOW); delay(100); } //Avisa que calibrou o sensor lcd.setCursor(0,0); lcd.print("Calibrado "); lcd.setCursor(0,1); lcd.print(" "); balanco = true; delay(3000); } //Checa a cor void checaCores(){ //testa com o led vermelho: digitalWrite(RED, HIGH); digitalWrite(matrizPinodosLEDS[0],HIGH); delay(200); mediaSensor(5); matrizCores[0] = mediaLeituras; Serial.print("Vermelho: "); Serial.print(matrizCores[0]); Serial.print("\n"); float cinzaDif = matrizBranco[0] - matrizPreto[0]; /*Serial.print("CinzaDif[0]: "); Serial.print(cinzaDif); Serial.print("\n"); */ matrizCores[0] = (matrizCores[0] - matrizPreto[0])/(cinzaDif)*255; digitalWrite(matrizPinodosLEDS[0],LOW); digitalWrite(RED, LOW); //testa com o led verde: digitalWrite(GREEN, HIGH); digitalWrite(matrizPinodosLEDS[1],HIGH); delay(200); mediaSensor(5); matrizCores[1] = mediaLeituras; Serial.print("Verde: "); Serial.print(matrizCores[1]); Serial.print("\n"); cinzaDif = matrizBranco[1] - matrizPreto[1]; Serial.print("CinzaDif[1]: "); Serial.print(cinzaDif); Serial.print("\n"); matrizCores[1] = (matrizCores[1] - matrizPreto[1])/(cinzaDif)*255; digitalWrite(matrizPinodosLEDS[1],LOW); digitalWrite(GREEN, LOW); //testa com o led azul: digitalWrite(BLUE, HIGH); digitalWrite(matrizPinodosLEDS[2],HIGH); delay(200); mediaSensor(5); matrizCores[2] = mediaLeituras; Serial.print("Azul: "); Serial.print(matrizCores[2]); Serial.print("\n"); cinzaDif = matrizBranco[2] - matrizPreto[2]; Serial.print("CinzaDif[2]: "); Serial.print(cinzaDif); Serial.print("\n"); matrizCores[2] = (matrizCores[2] - matrizPreto[2])/(cinzaDif)*255; digitalWrite(matrizPinodosLEDS[2],LOW); digitalWrite(BLUE, LOW); //passa os valores de r, g e b percebidos para a função que escreve no lcd qual a cor mostraCores(matrizCores[0],matrizCores[1],matrizCores[2]); } void mediaSensor(int vezes){ int leituras; int somatorio=0; for(int i = 0;i < vezes;i++){ leituras = analogRead(LDR); somatorio = leituras + somatorio; delay(10); } mediaLeituras = (somatorio)/vezes; Serial.print(mediaLeituras); Serial.print("\n"); } //Checa a cor int checaCoresParaAndar(){ //testa com o led vermelho: digitalWrite(RED, HIGH); digitalWrite(matrizPinodosLEDS[0],HIGH); delay(200); mediaSensor(5); matrizCores[0] = mediaLeituras; Serial.print("Vermelho: "); Serial.print(matrizCores[0]); Serial.print("\n"); float cinzaDif = matrizBranco[0] - matrizPreto[0]; /*Serial.print("CinzaDif[0]: "); Serial.print(cinzaDif); Serial.print("\n"); */ matrizCores[0] = (matrizCores[0] - matrizPreto[0])/(cinzaDif)*255; digitalWrite(matrizPinodosLEDS[0],LOW); digitalWrite(RED, LOW); //testa com o led verde: digitalWrite(GREEN, HIGH); digitalWrite(matrizPinodosLEDS[1],HIGH); delay(200); mediaSensor(5); matrizCores[1] = mediaLeituras; Serial.print("Verde: "); Serial.print(matrizCores[1]); Serial.print("\n"); cinzaDif = matrizBranco[1] - matrizPreto[1]; Serial.print("CinzaDif[1]: "); Serial.print(cinzaDif); Serial.print("\n"); matrizCores[1] = (matrizCores[1] - matrizPreto[1])/(cinzaDif)*255; digitalWrite(matrizPinodosLEDS[1],LOW); digitalWrite(GREEN, LOW); //testa com o led azul: digitalWrite(BLUE, HIGH); digitalWrite(matrizPinodosLEDS[2],HIGH); delay(200); mediaSensor(5); matrizCores[2] = mediaLeituras; Serial.print("Azul: "); Serial.print(matrizCores[2]); Serial.print("\n"); cinzaDif = matrizBranco[2] - matrizPreto[2]; Serial.print("CinzaDif[2]: "); Serial.print(cinzaDif); Serial.print("\n"); matrizCores[2] = (matrizCores[2] - matrizPreto[2])/(cinzaDif)*255; digitalWrite(matrizPinodosLEDS[2],LOW); digitalWrite(BLUE, LOW); //passa os valores de r, g e b percebidos para a função que escreve no lcd qual a cor return mostraCoresParaAndar(matrizCores[0],matrizCores[1],matrizCores[2]); } int mostraCoresParaAndar(int r, int g, int b){ if (r < 30 && g < 30 && b < 30){ lcd.setCursor(0,0); lcd.print("Preto "); lcd.setCursor(0,1); lcd.print(" "); return 1; } else if((30<=r<=600)&&(r-20>g)&&(r-20>b)){ lcd.setCursor(0,0); lcd.print("Vermelho "); lcd.setCursor(0,1); lcd.print(" "); return 2; } else if((r>200)&& (g>200) &&(r>b)&&(g>b)){ lcd.setCursor(0,0); lcd.print("Amarelo "); lcd.setCursor(0,1); lcd.print(" "); return 3; } else if((20<=g<=600)&&(g-20>r)&&(g-20>b)){ lcd.setCursor(0,0); lcd.print("Verde "); lcd.setCursor(0,1); lcd.print(" "); return 4; } else if((20<=b<=700)&&(b-20>r)&&(b-20>g)){ lcd.setCursor(0,0); lcd.print("Azul "); lcd.setCursor(0,1); lcd.print(" "); return 5; } return 0; } void mostraCores(int r, int g, int b){ if (r < 30 && g < 30 && b < 30){ lcd.setCursor(0,0); lcd.print("Preto "); lcd.setCursor(0,1); lcd.print(" "); } else if((30<=r<=600)&&(r-20>g)&&(r-20>b)){ lcd.setCursor(0,0); lcd.print("Vermelho "); lcd.setCursor(0,1); lcd.print(" "); } else if((r>200)&& (g>200) &&(r>b)&&(g>b)){ lcd.setCursor(0,0); lcd.print("Amarelo "); lcd.setCursor(0,1); lcd.print(" "); } else if((20<=g<=600)&&(g-20>r)&&(g-20>b)){ lcd.setCursor(0,0); lcd.print("Verde "); lcd.setCursor(0,1); lcd.print(" "); } else if((20<=b<=700)&&(b-20>r)&&(b-20>g)){ lcd.setCursor(0,0); lcd.print("Azul "); lcd.setCursor(0,1); lcd.print(" "); } }
cursos/introrobotica/2019-1/grupo04/codigo_tp2.txt · Última modificação: por 127.0.0.1
