Adquisicion de Datos Con Interpolacion

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 8

UNIVERSIDAD TECNOLOGICA DE PEREIRA

INTERPOLACION Y POLINOMIOS

Presentado por:

Esnaider Idrobo Zapata

Presentado a:

Henry William Penuela M.

Pereira, Risaralda

26 de marzo del 2024

1
%% PROGRAMA PARA LA ADQUISIION DE DATOS POR MEDIO DE LA PLACA DE ARDUINO

#include <Arduino.h>

// Definiciones de pines del sensor de ultrasonido


const int trigPin = 11;
const int echoPin = 12;

// Definiciones de pines del puente H L298N


const int in3 = 8; // Pin que controla el sentido de giro Motor A
const int in4 = 9; // Pin que controla el sentido de giro Motor A
const int EnB = 10; // Pin que controla la velocidad del Motor A

// Estructura para almacenar los datos de velocidad y conteo


struct DatosVelocidad {
int velocidad;
int conteo;
};

// Arreglo para almacenar los datos de velocidad y conteo


DatosVelocidad datos[100]; // Ajustado para recoger más datos

// Variables globales
int contadorVelocidades = 0; // Contador de velocidades asignadas
int motorSpeed = 0; // Velocidad del motor (0-9)
int contadorVueltas = 0; // Contador de vueltas
unsigned long tiempoInicio = 0; // Tiempo de inicio
unsigned long tiempoActual = 0; // Tiempo actual
const int limiteDistancia = 15; // Límite de distancia del sensor ultrasónico en cm
bool registroActivo = false; // Bandera para indicar si se está realizando el
registro
bool mostrarTablaPendiente = false; // Bandera para indicar si se debe mostrar la
tabla

// Prototipos de función
void mostrarTabla();
float obtenerDistanciaPromedio();
void reiniciarSistema();

void setup() {
Serial.begin(9600); // Inicia la comunicación serial
pinMode(in3, OUTPUT); // Configura los pines del motor como salida
pinMode(in4, OUTPUT);
pinMode(EnB, OUTPUT);

pinMode(trigPin, OUTPUT); // Configura los pines del sensor de ultrasonido

2
pinMode(echoPin, INPUT);

tiempoInicio = millis(); // Inicializa el tiempo de inicio


}

void loop() {
tiempoActual = millis(); // Actualiza el tiempo actual

// Verifica si hay datos disponibles en el monitor serial


if (Serial.available() > 0) {
char command = Serial.read(); // Lee el comando del monitor serial

// Asignar velocidad
if (command >= '0' && command <= '9') { // Velocidad en el rango de 0 a 9
motorSpeed = command - '0'; // Convierte el carácter en el número
correspondiente
analogWrite(EnB, map(motorSpeed, 0, 9, 0, 255)); // Configura la velocidad
del motor
Serial.print("Velocidad asignada: ");
Serial.println(motorSpeed);

// Reiniciar el contador de vueltas


contadorVueltas = 0;
// Guardar el tiempo de inicio de la velocidad
tiempoInicio = tiempoActual;
// Activar el registro
registroActivo = true;
}

// Detener y mostrar tabla


if (command == 'S') {
mostrarTablaPendiente = true; // Configurar la bandera para mostrar la tabla
}
}

// Mostrar tabla si la bandera está activada


if (mostrarTablaPendiente) {
mostrarTabla();
mostrarTablaPendiente = false; // Reiniciar la bandera después de mostrar la
tabla
reiniciarSistema(); // Reiniciar el sistema después de mostrar la tabla
}

// Control del motor


if (motorSpeed > 0 && registroActivo) { // Si hay una velocidad asignada y el
registro está activo
digitalWrite(in3, HIGH); // Avanzar
digitalWrite(in4, LOW);
} else { // Detener el motor si no hay velocidad asignada o el registro no está
activo

3
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}

// Medir la distancia con el sensor ultrasónico si el registro está activo


if (registroActivo) {
float distanciaPromedio = obtenerDistanciaPromedio();

// Contar vueltas del motor si el objeto está dentro del rango del sensor
if (distanciaPromedio <= limiteDistancia) {
contadorVueltas++;
}
}

// Verificar si han pasado 5 segundos desde la última asignación de velocidad y


si el registro está activo
if (registroActivo && tiempoActual - tiempoInicio >= 5000) {
// Guardar los datos de velocidad y conteo
datos[contadorVelocidades].velocidad = motorSpeed;
datos[contadorVelocidades].conteo = contadorVueltas;
contadorVelocidades++;

// Reiniciar el contador de vueltas


contadorVueltas = 0;
// Detener el motor
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
// Desactivar el registro
registroActivo = false;
}
}

// Función para mostrar la tabla de tiempos y conteos


void mostrarTabla() {
Serial.println("----- Tabla de Velocidades y Conteos -----");
Serial.println("| Velocidad (%) | Conteo de Vueltas |");
Serial.println("-------------------------------------------");
for (int i = 0; i < contadorVelocidades; i++) {
Serial.print(" | ");
Serial.print(datos[i].velocidad);
Serial.print(" | ");
Serial.print(datos[i].conteo);
Serial.println(" | ");
}
Serial.println("-------------------------------------------");
}

// Función para obtener una distancia promedio del sensor ultrasónico


float obtenerDistanciaPromedio() {
const int numMediciones = 5; // Número de mediciones para promediar

4
float distanciaTotal = 0;

for (int i = 0; i < numMediciones; i++) {


digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

unsigned long duration = pulseIn(echoPin, HIGH);


float distancia = duration * 0.034 / 2;
distanciaTotal += distancia;
delay(10); // Espera entre mediciones para evitar interferencias
}

return distanciaTotal / numMediciones;


}

// Función para reiniciar el sistema y borrar los datos de la tabla


void reiniciarSistema() {
contadorVelocidades = 0; // Reiniciar contador de velocidades
}

%% INTERPOLACION Y POLINOMIO CARACTERISTICO

clc
%% Datos proporcionados
datos = [2 2;
3 7;
4 10;
5 3;
6 6;
7 10;
9 12;
8 11];

%% Dividir datos en x e y
x = datos(:, 1);
y = datos(:, 2);

%% Ajuste polinomial de grado 2


p = polyfit(x, y, 2);
x_interp = min(x):0.1:max(x); % Puntos para la interpolación
y_polinomio = polyval(p, x_interp);

%% Grafica del ajuste polinomial


figure;
plot(x, y, 'o');
hold on;
plot(x_interp, y_polinomio);

5
grid on;
xlabel('Velocidad (%)');
ylabel('Conteo de Vueltas');
title('Ajuste Polinomial de Grado 2');

%% Interpolación con diferentes algoritmos


X = min(x):0.1:max(x);
Y_spline = interp1(x, y, X, 'spline');
Y_linear = interp1(x, y, X, 'linear');
Y_pchip = interp1(x, y, X, 'pchip');

%% Graficas de interpolación
figure;
subplot(2, 2, 1);
plot(x, y, 'o', X, Y_spline);
grid on;
xlabel('Velocidad (%)');
ylabel('Conteo de Vueltas');
title('Interpolación con Spline');

subplot(2, 2, 2);
plot(x, y, 'o', X, Y_linear);
grid on;
xlabel('Velocidad (%)');
ylabel('Conteo de Vueltas');
title('Interpolación Lineal');

6
subplot(2, 2, 3);
plot(x, y, 'o', X, Y_pchip);
grid on;
xlabel('Velocidad (%)');
ylabel('Conteo de Vueltas');
title('Interpolación Pchip');

%% Unificar todas las gráficas


figure;
subplot(2, 2, 1);
plot(x, y, 'o');
hold on;
plot(x_interp, y_polinomio);
grid on;
xlabel('Velocidad (%)');
ylabel('Conteo de Vueltas');
title('Ajuste Polinomial de Grado 2');

subplot(2, 2, 2);
plot(x, y, 'o', X, Y_spline);
grid on;
xlabel('Velocidad (%)');
ylabel('Conteo de Vueltas');
title('Interpolación con Spline');

7
subplot(2, 2, 3);
plot(x, y, 'o', X, Y_linear);
grid on;
xlabel('Velocidad (%)');
ylabel('Conteo de Vueltas');
title('Interpolación Lineal');

subplot(2, 2, 4);
plot(x, y, 'o', X, Y_pchip);
grid on;
xlabel('Velocidad (%)');
ylabel('Conteo de Vueltas');
title('Interpolación Pchip');

También podría gustarte