|  |  | @ -1,26 +1,32 @@ | 
			
		
	
		
			
				
					|  |  |  | #include <Arduino_FreeRTOS.h> | 
			
		
	
		
			
				
					|  |  |  | #include <semphr.h>  // add the FreeRTOS functions for Semaphores (or Flags). | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | const int Trigger = 5;   //Pin digital 2 para el Trigger del sensor | 
			
		
	
		
			
				
					|  |  |  | const int Echo = 6;   //Pin digital 3 para el Echo del sensor | 
			
		
	
		
			
				
					|  |  |  | const int Trigger = 6;   //Pin digital 2 para el Trigger del sensor | 
			
		
	
		
			
				
					|  |  |  | const int Echo = 7;   //Pin digital 3 para el Echo del sensor | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | #define M1Delante 2 | 
			
		
	
		
			
				
					|  |  |  | #define M1Atras 3 | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | #define LedEvasion 2 | 
			
		
	
		
			
				
					|  |  |  | #define LedEvasionLat 3 | 
			
		
	
		
			
				
					|  |  |  | #define LedUltra 4 | 
			
		
	
		
			
				
					|  |  |  | #define M2Delante 4 | 
			
		
	
		
			
				
					|  |  |  | #define M2Atras 5 | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | #define SensorTrasero 8 | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | TaskHandle_t xd; | 
			
		
	
		
			
				
					|  |  |  | SemaphoreHandle_t xSerialSemaphore; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | void EncontrarEnemigo( void *pvParameters ); | 
			
		
	
		
			
				
					|  |  |  | void SensorTras( void *pvParameters ); | 
			
		
	
		
			
				
					|  |  |  | void SensoresLateral( void *pvParameters ); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | void MotoresDelante(); | 
			
		
	
		
			
				
					|  |  |  | void MotoresGirar(); | 
			
		
	
		
			
				
					|  |  |  | void EsquivarAtras(); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | void setup() { | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | pinMode(LedEvasion,OUTPUT); | 
			
		
	
		
			
				
					|  |  |  | pinMode(LedEvasionLat,OUTPUT); | 
			
		
	
		
			
				
					|  |  |  | pinMode(LedUltra,OUTPUT); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | pinMode(Trigger, OUTPUT); //pin como salida | 
			
		
	
		
			
				
					|  |  |  | pinMode(Echo, INPUT);  //pin como entrada | 
			
		
	
	
		
			
				
					|  |  | @ -30,6 +36,14 @@ void setup() { | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | // initialize serial communication at 9600 bits per second: | 
			
		
	
		
			
				
					|  |  |  | Serial.begin(9600); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | pinMode(M1Delante,OUTPUT); | 
			
		
	
		
			
				
					|  |  |  | pinMode(M1Atras,OUTPUT); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | pinMode(M2Delante,OUTPUT); | 
			
		
	
		
			
				
					|  |  |  | pinMode(M2Atras,OUTPUT); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | pinMode(SensorTrasero,INPUT); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | while (!Serial) { | 
			
		
	
		
			
				
					|  |  |  | ; // wait for serial port to connect. Needed for native USB, on LEONARDO, MICRO, YUN, and other 32u4 based boards. | 
			
		
	
	
		
			
				
					|  |  | @ -43,6 +57,8 @@ void setup() { | 
			
		
	
		
			
				
					|  |  |  | xSemaphoreGive( ( xSerialSemaphore ) );  // Make the Serial Port available for use, by "Giving" the Semaphore. | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | // Now set up two Tasks to run independently. | 
			
		
	
		
			
				
					|  |  |  | xTaskCreate( | 
			
		
	
		
			
				
					|  |  |  | EncontrarEnemigo | 
			
		
	
	
		
			
				
					|  |  | @ -50,7 +66,7 @@ void setup() { | 
			
		
	
		
			
				
					|  |  |  | ,  128  // This stack size can be checked & adjusted by reading the Stack Highwater | 
			
		
	
		
			
				
					|  |  |  | ,  NULL //Parameters for the task | 
			
		
	
		
			
				
					|  |  |  | ,  2  // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest. | 
			
		
	
		
			
				
					|  |  |  | ,  NULL ); //Task Handle | 
			
		
	
		
			
				
					|  |  |  | ,  &xd ); //Task Handle | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | xTaskCreate( | 
			
		
	
		
			
				
					|  |  |  | SensorTras | 
			
		
	
	
		
			
				
					|  |  | @ -103,11 +119,22 @@ void EncontrarEnemigo( void *pvParameters __attribute__((unused)) )  // This is | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | t = pulseIn(Echo, HIGH); //obtenemos el ancho del pulso | 
			
		
	
		
			
				
					|  |  |  | d = t/59;             //escalamos el tiempo a una distancia en cm | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | if(d<70) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | MotoresDelante(); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | else | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | MotoresGirar(); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | if ( xSemaphoreTake( xSerialSemaphore, ( TickType_t ) 5 ) == pdTRUE ) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | Serial.println(d); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | xSemaphoreGive( xSerialSemaphore ); // Now free or "Give" the Serial Port for others. | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -119,31 +146,23 @@ void EncontrarEnemigo( void *pvParameters __attribute__((unused)) )  // This is | 
			
		
	
		
			
				
					|  |  |  | void SensorTras( void *pvParameters __attribute__((unused)) )  // This is a Task. | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (;;) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | // read the input on analog pin 0: | 
			
		
	
		
			
				
					|  |  |  | int sensorValue = analogRead(A0); | 
			
		
	
		
			
				
					|  |  |  | String linea=""; | 
			
		
	
		
			
				
					|  |  |  | if(sensorValue>512) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | linea="Linea detectada"; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | //evadir | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(LedEvasion,HIGH); | 
			
		
	
		
			
				
					|  |  |  | vTaskDelay(500); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | else | 
			
		
	
		
			
				
					|  |  |  | String estado="Normal"; | 
			
		
	
		
			
				
					|  |  |  | if(digitalRead(SensorTrasero)) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | linea="Linea no detectada"; | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(LedEvasion,LOW); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | // See if we can obtain or "Take" the Serial Semaphore. | 
			
		
	
		
			
				
					|  |  |  | // If the semaphore is not available, wait 5 ticks of the Scheduler to see if it becomes free. | 
			
		
	
		
			
				
					|  |  |  | EsquivarAtras(); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | estado="Esquivando"; | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | if ( xSemaphoreTake( xSerialSemaphore, ( TickType_t ) 5 ) == pdTRUE ) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | Serial.println(linea); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | Serial.println(estado); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | xSemaphoreGive( xSerialSemaphore ); // Now free or "Give" the Serial Port for others. | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -157,47 +176,10 @@ void SensoresLateral( void *pvParameters __attribute__((unused)) )  // This is a | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | for (;;) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | // read the input on analog pin 0: | 
			
		
	
		
			
				
					|  |  |  | int sensorValueIzq = analogRead(A1); | 
			
		
	
		
			
				
					|  |  |  | int sensorValueDer = analogRead(A2); | 
			
		
	
		
			
				
					|  |  |  | String lineaIzq=""; | 
			
		
	
		
			
				
					|  |  |  | String lineaDer=""; | 
			
		
	
		
			
				
					|  |  |  | /* if(sensorValueIzq>512) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | lineaIzq="Linea Izquierda detectada"; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | //evadir | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(LedEvasion,HIGH); | 
			
		
	
		
			
				
					|  |  |  | vTaskDelay(50); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | else | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | lineaIzq="Linea Izquierda no detectada"; | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(LedEvasion,LOW); | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | if(sensorValueDer>512) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | lineaDer="Linea Derecha detectada"; | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | //evadir | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(LedEvasion,HIGH); | 
			
		
	
		
			
				
					|  |  |  | vTaskDelay(50); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | else | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | lineaDer="Linea Derecha no detectada"; | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(LedEvasion,LOW); | 
			
		
	
		
			
				
					|  |  |  | }*/ | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | // See if we can obtain or "Take" the Serial Semaphore. | 
			
		
	
		
			
				
					|  |  |  | // If the semaphore is not available, wait 5 ticks of the Scheduler to see if it becomes free. | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | if ( xSemaphoreTake( xSerialSemaphore, ( TickType_t ) 5 ) == pdTRUE ) | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | Serial.println(lineaIzq); | 
			
		
	
		
			
				
					|  |  |  | Serial.println(lineaDer); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | xSemaphoreGive( xSerialSemaphore ); // Now free or "Give" the Serial Port for others. | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
	
		
			
				
					|  |  | @ -205,3 +187,42 @@ void SensoresLateral( void *pvParameters __attribute__((unused)) )  // This is a | 
			
		
	
		
			
				
					|  |  |  | vTaskDelay(1);  // one tick delay (15ms) in between reads for stability | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | void MotoresDelante() | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M1Delante,HIGH); | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M1Atras,LOW); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M2Delante,HIGH); | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M2Atras,LOW); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | void MotoresGirar() | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M1Delante,LOW); | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M1Atras,HIGH); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M2Delante,HIGH); | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M2Atras,LOW); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | void EsquivarAtras() | 
			
		
	
		
			
				
					|  |  |  | { | 
			
		
	
		
			
				
					|  |  |  | vTaskSuspend( xd ); | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M1Delante,HIGH); | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M1Atras,LOW); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M2Delante,LOW); | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M2Atras,HIGH); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | delay(500); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M1Delante,LOW); | 
			
		
	
		
			
				
					|  |  |  | digitalWrite(M1Atras,LOW); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | delay(500); | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | vTaskResume( xd ); | 
			
		
	
		
			
				
					|  |  |  | } |