/* * Programa desarrollado para 2 motores amarillos. * Segun el dato enviado distinta accion * Objetivo silla Bluetooth * Ultimas actualizacion 18-10-19 * Se agrega sensor ultrasonido * Se probara la configuracion de giro por inversion de sentido */ int num; // variable para almacenar valor leido int IN1 = 4; int IN2 = 3; int ENA = 11; //PIN PWM para variar velocidad del motor 1 int IN3 = 6; int IN4 = 5; int ENB = 9; //PIN PWM para variar velocidad del motor 2 int trespuesta =200;// tiempo de detencion en posicion int tmotadel = 200; //tiempo de espera reaccion motor principal int veloc = 0; // nivel de velocidad de motor principal (3 niveles) int luces = 0; // Estado inicial de luces 0 apagadas 1 encendidas int bocina = 0; //Estado inicial de bocina 0 apagado 1 encendidas int avance = 0; //Almacena estodo- 0 freno 1 adelante 2 atras //ULTRA 1 long distancia; long tiempo; //Fin ULTRA 1 void setup() { pinMode(IN1,OUTPUT);//Salida para IN1 del modulo pinMode(IN2,OUTPUT);//Salida para IN2 del modulo pinMode(IN3,OUTPUT);//Salida para IN3 del modulo pinMode(IN4,OUTPUT);//Salida para IN4 del modulo pinMode(12, OUTPUT);// PIN BOCINA pinMode(10, OUTPUT);// PIN LUCES digitalWrite(12,LOW);//Fija salida a bajo apagado digitalWrite(10,LOW);//Fija salida a bajo apagado //--ULTRA1--- pinMode(8, OUTPUT); /*activación del pin 8 como salida: para el pulso ultrasónico*/ pinMode(7, INPUT); /*activación del pin 7 como entrada: tiempo del rebote del ultrasonido*/ //----fin ULTRA1------ Serial.begin(9600); } void loop() { if(Serial.available()>=1) { //Delay para favorecer la lectura de caracteres delay(22);// Cambiar para simulacion Proteus 400 -Original 22 //Se crea una variable que servirá como buffer String bufferString = ""; /* * Se le indica a Arduino que mientras haya datos * disponibles para ser leídos en el puerto serie * se mantenga concatenando los caracteres en la * variable bufferString */ while (Serial.available()>0) { bufferString += (char)Serial.read(); } num = bufferString.toInt(); //Se carga lo leido en la variable entrada //Serial.println(num); analisisnum(); }// de Serial Available objetocerca(); //verifica objetos cerca versichoca(); // verifica si va a chocar- avisa y retrocede } //------------------Funcion analisisnum-------------------- void analisisnum() { //Serial.println(veloc); if (num==700)// NO USADO -DISPONIBLE { //delay(trespuesta); } if (num==800) //Giro a la izquierda { girarizquierda(); // delay(trespuesta); } if (num==750) //Giro a al derecha { girarderecha(); //delay(trespuesta); } //---------------------Adelante-------------------------------- if (num==100) //Adelante { digitalWrite(IN1,HIGH); //IN1 digitalWrite(IN2,LOW); //IN2 digitalWrite(IN3,HIGH); //IN3 digitalWrite(IN4,LOW); //IN4 avance =1; if(veloc == 0) { analogWrite(ENA,255); analogWrite(ENB,255); delay(tmotadel); delay(tmotadel); analogWrite(ENA,180); analogWrite(ENB,180); delay(tmotadel); } if(veloc == 1) { analogWrite(ENA,230); analogWrite(ENB,230); delay(tmotadel); } if(veloc == 2) { analogWrite(ENA,255); analogWrite(ENB,255); //Indica velocidad maxima digitalWrite(12,HIGH);//bocina encendida delay(50); digitalWrite(12,LOW);//bocina apagada delay(50); //Indica velocidad maxima delay(tmotadel); } veloc = veloc +1; if(veloc > 2) veloc =2; delay(tmotadel); } //-----------------Fin adelante------------------------------ if (num==200) //Atras { digitalWrite(IN1,LOW); //IN1 digitalWrite(IN2,HIGH); //IN2 digitalWrite(IN3,LOW); //IN3 digitalWrite(IN4,HIGH); //IN4 avance =2; if(veloc == 0) { analogWrite(ENA,255); analogWrite(ENB,255); delay(tmotadel); delay(tmotadel); analogWrite(ENA,180); analogWrite(ENB,180); delay(tmotadel); } if(veloc == 1) { analogWrite(ENA,230); analogWrite(ENB,230); delay(tmotadel); } if(veloc == 2) { analogWrite(ENA,255); analogWrite(ENB,255); delay(tmotadel); } veloc = veloc +1; if(veloc > 2) veloc =2; delay(tmotadel); } //-----------------Fin atras---------------------------- //----------------Freno--------------------------------- if (num==300) //FRENO { num =666; //valor neutro freno(); } //----------------FIN Freno--------------------------------- //----------------LUCES--------------------------------- if (num==400) // encendido de luces { if(luces == 0) { digitalWrite(10,HIGH);//RELE LUCES encendidas luces = 1; //Indica que luces estan encendidas } else { digitalWrite(10,LOW);//RELE LUCES apagado luces = 0; //Indica que luces estan encendidas } } //----------------FIN LUCES------------------------------- //----------------BOCINA--------------------------------- if (num==500) // encendido de bocina { if(bocina == 0) { digitalWrite(12,HIGH);//bocina encendida delay(150); digitalWrite(12,LOW);//bocina apagada delay(150); digitalWrite(12,HIGH);//bocina encendida y queda bocina = 1; //Indica que bocina esta encendida } else { digitalWrite(12,LOW);//bocina apagado bocina = 0; //Indica que bocina esta encendida } } //----------------FIN BOCINA------------------------------- }//llave fina de funcion analisisnum--- //Fin funcion analisisnum--------------------------- //--------------------Funcion Freno----------------- void freno() { analogWrite(ENA,0); analogWrite(ENB,0); digitalWrite(IN1,LOW); //IN1 digitalWrite(IN2,LOW); //IN2 digitalWrite(IN3,LOW); //IN3 digitalWrite(IN4,LOW); //IN4 avance =0; veloc = 0; delay(tmotadel); } //--------------------fin Funcion Freno----------------- //-----------Funcion girar derecha------------------- void girarderecha() { digitalWrite(IN1,LOW); //IN1 digitalWrite(IN2,HIGH); //IN2 digitalWrite(IN3,HIGH); //IN3 digitalWrite(IN4,LOW); //IN4 analogWrite(ENA,170); analogWrite(ENB,170); delay(trespuesta); } //---Fin funcion girar a la derecha ----------------- //-----------Funcion girar izquierda------------------- void girarizquierda() { digitalWrite(IN1,HIGH); //IN1 digitalWrite(IN2,LOW); //IN2 digitalWrite(IN3,LOW); //IN3 digitalWrite(IN4,HIGH); //IN4 analogWrite(ENA,170); analogWrite(ENB,170); delay(trespuesta); } //---Fin funcion girar a la izquierda---------------- //--Funcion objetocerca------------------------------ void objetocerca() { digitalWrite(8,LOW); /* Por cuestión de estabilización del sensor*/ delayMicroseconds(5);//ORIGINAL digitalWrite(8, HIGH); /* envío del pulso ultrasónico*/ delayMicroseconds(10);//ORIGINAL tiempo=pulseIn(7, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 8 empieza a recibir el rebote, HIGH, hasta que deja de hacerlo, LOW, la longitud del pulso entrante*/ distancia= int(0.017*tiempo); /*fórmula para calcular la distancia obteniendo un valor entero*/ /*Monitorización en centímetros por el monitor serial*/ // Serial.print("Distancia = "); //Serial.print(distancia); //Serial.println(" cm"); //delay(1000);// agregue esta instruccion si no logra medir } //---Fin Funcion objetocerca------------------------- //---Funcion versichoca-------- void versichoca() { if (distancia < 10) { freno(); digitalWrite(10,HIGH);// LUCES encendidas digitalWrite(12,HIGH);// bocina encendida delay (100); digitalWrite(12,LOW);//bocina encendida delay(100); digitalWrite(12,HIGH);//bocina encendida delay (100); digitalWrite(12,LOW);//bocina encendida delay(100); //retrocede un poco----- digitalWrite(IN1,LOW); //IN1 digitalWrite(IN2,HIGH); //IN2 digitalWrite(IN3,LOW); //IN3 digitalWrite(IN4,HIGH); //IN4 analogWrite(ENA,255); analogWrite(ENB,255); delay(200); freno(); digitalWrite(10,LOW);// LUCES apagadas }// de distancia < que 10- distancia para evitar choque } //---FIN Funcion versichoca--------