|
@ -0,0 +1,207 @@ |
|
|
|
|
|
#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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define LedEvasion 2
|
|
|
|
|
|
#define LedEvasionLat 3
|
|
|
|
|
|
#define LedUltra 4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SemaphoreHandle_t xSerialSemaphore; |
|
|
|
|
|
|
|
|
|
|
|
void EncontrarEnemigo( void *pvParameters ); |
|
|
|
|
|
void SensorTras( void *pvParameters ); |
|
|
|
|
|
void SensoresLateral( void *pvParameters ); |
|
|
|
|
|
|
|
|
|
|
|
void setup() { |
|
|
|
|
|
|
|
|
|
|
|
pinMode(LedEvasion,OUTPUT); |
|
|
|
|
|
pinMode(LedEvasionLat,OUTPUT); |
|
|
|
|
|
pinMode(LedUltra,OUTPUT); |
|
|
|
|
|
|
|
|
|
|
|
pinMode(Trigger, OUTPUT); //pin como salida
|
|
|
|
|
|
pinMode(Echo, INPUT); //pin como entrada
|
|
|
|
|
|
digitalWrite(Trigger, LOW);//Inicializamos el pin con 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// initialize serial communication at 9600 bits per second:
|
|
|
|
|
|
Serial.begin(9600); |
|
|
|
|
|
|
|
|
|
|
|
while (!Serial) { |
|
|
|
|
|
; // wait for serial port to connect. Needed for native USB, on LEONARDO, MICRO, YUN, and other 32u4 based boards.
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ( xSerialSemaphore == NULL ) // Check to confirm that the Serial Semaphore has not already been created.
|
|
|
|
|
|
{ |
|
|
|
|
|
xSerialSemaphore = xSemaphoreCreateMutex(); // Create a mutex semaphore we will use to manage the Serial Port
|
|
|
|
|
|
if ( ( xSerialSemaphore ) != NULL ) |
|
|
|
|
|
xSemaphoreGive( ( xSerialSemaphore ) ); // Make the Serial Port available for use, by "Giving" the Semaphore.
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Now set up two Tasks to run independently.
|
|
|
|
|
|
xTaskCreate( |
|
|
|
|
|
EncontrarEnemigo |
|
|
|
|
|
, "DigitalRead" // A name just for humans
|
|
|
|
|
|
, 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
|
|
|
|
|
|
|
|
|
|
|
|
xTaskCreate( |
|
|
|
|
|
SensorTras |
|
|
|
|
|
, "AnalogRead" // A name just for humans
|
|
|
|
|
|
, 128 // Stack size
|
|
|
|
|
|
, NULL //Parameters for the task
|
|
|
|
|
|
, 0 // Priority
|
|
|
|
|
|
, NULL ); //Task Handle
|
|
|
|
|
|
|
|
|
|
|
|
xTaskCreate( |
|
|
|
|
|
SensoresLateral |
|
|
|
|
|
, "AnalogRead" // A name just for humans
|
|
|
|
|
|
, 128 // Stack size
|
|
|
|
|
|
, NULL //Parameters for the task
|
|
|
|
|
|
, 1 // Priority
|
|
|
|
|
|
, NULL ); //Task Handle
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void loop() |
|
|
|
|
|
{ |
|
|
|
|
|
// Empty. Things are done in Tasks.
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------*/ |
|
|
|
|
|
/*---------------------- Tasks ---------------------*/ |
|
|
|
|
|
/*--------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
|
|
void EncontrarEnemigo( void *pvParameters __attribute__((unused)) ) // This is a Task.
|
|
|
|
|
|
{ |
|
|
|
|
|
/*
|
|
|
|
|
|
DigitalReadSerial |
|
|
|
|
|
Reads a digital input on pin 2, prints the result to the serial monitor |
|
|
|
|
|
|
|
|
|
|
|
This example code is in the public domain. |
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (;;) // A Task shall never return or exit.
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
long t; //timepo que demora en llegar el eco
|
|
|
|
|
|
long d; //distancia en centimetros
|
|
|
|
|
|
|
|
|
|
|
|
digitalWrite(Trigger, HIGH); |
|
|
|
|
|
delayMicroseconds(10); //Enviamos un pulso de 10us
|
|
|
|
|
|
digitalWrite(Trigger, LOW); |
|
|
|
|
|
|
|
|
|
|
|
t = pulseIn(Echo, HIGH); //obtenemos el ancho del pulso
|
|
|
|
|
|
d = t/59; //escalamos el tiempo a una distancia en cm
|
|
|
|
|
|
|
|
|
|
|
|
if ( xSemaphoreTake( xSerialSemaphore, ( TickType_t ) 5 ) == pdTRUE ) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
Serial.println(d); |
|
|
|
|
|
|
|
|
|
|
|
xSemaphoreGive( xSerialSemaphore ); // Now free or "Give" the Serial Port for others.
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
vTaskDelay(1); // one tick delay (15ms) in between reads for stability
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
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(50); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
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.
|
|
|
|
|
|
if ( xSemaphoreTake( xSerialSemaphore, ( TickType_t ) 5 ) == pdTRUE ) |
|
|
|
|
|
{ |
|
|
|
|
|
Serial.println(linea); |
|
|
|
|
|
|
|
|
|
|
|
xSemaphoreGive( xSerialSemaphore ); // Now free or "Give" the Serial Port for others.
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
vTaskDelay(1); // one tick delay (15ms) in between reads for stability
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SensoresLateral( void *pvParameters __attribute__((unused)) ) // This is a Task.
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
vTaskDelay(1); // one tick delay (15ms) in between reads for stability
|
|
|
|
|
|
} |
|
|
|
|
|
} |