Robot Seguidor de Linea (Simple)


Este circuito como pueden ver en las fotos es muy sencillo ya que no posee electrónica micro-controlada.
Es un circuito basado en un amplificador operacional de uso general y dos optoacopladores abiertos.
El funcionamiento se basa en detectar la linea negra que hay debajo de los dos sensores, como el color negro absorbe todos los rayos de luz, cuando el optoacoplador abierto se posicione sobre la linea negra la luz emitida por el diodo infrarrojo sera absorbida y practicamente no habrá rebote, por ende el sensor infrarrojo no lo captara y no activara su salida. Este proceso se repite para el segundo optoacoplador. Es necesario que el circuito sea doble ya que cada circuito comandara un motor, de esta forma aprovechando la lógica inversa cuando ambos sensores estén sobre la linea negra no existirá rebote y ambos motores comenzaran a girar empujando hacia adelante al robot, cuando la linea deje de ser recta alguno de los dos sensores saldrá de dicha linea y se producirá el rebote, entonces ese circuito (con ese sensor) apagara el motor inverso al sensor y producirá un pequeño giro tal que el robot se enderece encontrando la linea negra nueva mente y logre continuar con su trayectoria.
Se podría decir que el robot atraviesa la linea negra generando micro movimientos en zig zag.
El LM358 es un amplificador operacional doble de uso general que en este caso aprovecharemos cada amplificador en su interior para cada circuito, y mediante el potenciómetro de 10k graduaremos la sensibilidad de los sensores. A la salida de cada operacional nos encontramos con un transistor darlington TIP122 el cual sobra para manejar los motores.



Como pueden ver en la foto, todo el robot se encuentra montado en un protoboard, se ha aprovechado el material auto adhesivo que posee en su base para pegar los dos motores y un eje central de apoyo construido con alambre.




Frecuencimetro Hasta 30kHz

En este post, les mostrare una forma muy sencilla de realizar un frecuencímetro de uso general, aunque de bajas prestaciones.
Un frecuencímetro es un instrumento de medición que debe realizar una cuenta en un determinado tiempo.
La frecuencia en Hertz es la cantidad de veces que se repite un pulso durante el transcurso de 1s.
Por ejemplo: Si durante 1s contamos 30 pulsos, la frecuencia será de 30Hz. Si durante 1s contamos 1000 pulsos, la frecuencia será de 1kHz, y así sucesivamente para cualquier valor.
En este programa extremadamente sencillo aplicaremos esta misma lógica, utilizaremos el Timer1 para crear un temporizador de 1s (el cual genera el lapso de tiempo para contar pulsos) y durante este lapso de 1s se contaran los pulsos que ingresan en la entrada T1CKI (Timer 1 External Clock Input).
La forma de pensar esta lógica será la siguiente:

1) Encendemos el Timer
2) Demoramos 1s (el lapso de cuenta)
3) Apagamos el Timer
4) Mostramos cuantos pulsos ingresaron por T1CKI durante ese segundo.

Como pueden ver en el programa la demora no es de 1000ms (1s) sino que es de 250ms, esto es porque en la configuración del Timer1 tenemos el divisor (preescaler) por 1, si quieren poner la demora de 1000ms tienen que configurar el preescaler como divisor por 4, esto quedaría: T1_DIV_BY_4, pero el refresco del LCD en mostrar la cuenta seria de 1s por ende es un poco lento y perdemos muestras, entonces al configurar el preescaler por 1 y esperar 250ms obtenemos el mismo resultado pero el LCD y las muestras se actualizan cada 1/4s entonces el funcionamiento será más eficiente.

Claramente no es un instrumento de precisión ni mucho menos, solamente trata de explicar, mediante el uso del timer1 como temporizador, el funcionamiento básico de un frecuencímetro. El mismo está limitado en frecuencia, pero hasta los 30kHz nos mostrara una cuenta estable.
Si quieren que este frecuencímetro acepte mayor frecuencia pueden poner un preescaler externo, que podría ser un circuito con FF (donde cada FF realizara una división por 2). Si utilizamos un 4017, tendremos un divisor programable de 1 a 10, donde la máxima entrada serian 300kHz que al pasar por el divisor /10 nos dará 30kHz y no tendríamos problemas en el MCU, (dentro del MCU en el printf tendremos que compensar esta división con una multiplicación por el mismo valor para que la lectura sea correcta), esto quedaría: printf(lcd_putc,"%lu Hz",pulsos*10); entonces de este modo ingresamos 300kHz al 4017, salimos con 30kHz del 4017 que ingresaran al MCU y la lectura será de 30kHz*10=300kHz.




#include <16F628A.h>
#FUSES NOWDT
#FUSES HS
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NOBROWNOUT
#FUSES NOMCLR
#FUSES NOLVP
#FUSES NOCPD
#use delay(clock=4000000)
#define LCD_ENABLE_PIN  PIN_B7
#define LCD_RS_PIN      PIN_B4
#define LCD_RW_PIN      PIN_B5
#define LCD_DATA4       PIN_B0
#define LCD_DATA5       PIN_B1
#define LCD_DATA6       PIN_B2
#define LCD_DATA7       PIN_B3
#include <LCD.C>
void main(){
   lcd_init();
   int16 pulsos;
   while(true){
      set_timer1(0);                          //HAB Timer1
      setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); //ON Timer1 2kHz
      delay_ms(250);                          //Demora 1/4s
      setup_timer_1(T1_DISABLED);             //INHAB Timer1
      pulsos=get_timer1();                    //CONT Pulsos
      lcd_gotoxy(1,1);                        //Renglon (1,1)
      printf(lcd_putc,"%lu Hz",pulsos);       //Muestra f
   }
}



NOTA: la redefinición de pines del display LCD se ha realizado porque se necesitaba el pin T1CKI que se encontraba dentro de los pines del LCD por defecto.

Algoritmo para Regresión Estadística en MCU

Muchas veces tenemos que ingresar la señal analógica de un sensor de cualquier tipo en un microcontrolador para que esta sea tratada o mostrada en alguna pantalla.

Lo que sucede con los sensores es que no siempre tienen respuesta lineal, o bien nos entregan valores que nos sean útiles para mostrar en una pantalla.

Suponemos un sensor de temperatura que entrega un nivel de tensión no lineal en función a la medición de la temperatura.
Tomaremos 10 muestras a distintas temperaturas y crearemos una tabla de valores de x e y, donde y serán los valores de temperatura y x serán los valores de tensión medidos en función de la temperatura.

Si quisiéramos crear algún algoritmo informático por ejemplo para leer el sensor y mostrar los datos de temperatura en pantalla, por tratarse de un sensor no lineal, deberíamos aplicar algún acondicionamiento estadístico para que en la pantalla sean lineales respecto a la temperatura.
Para esto podemos aplicar una regresión estadística que alimentaremos desde los valores de la tabla de valores que detallaba anteriormente.

Existen muchos tipos de regresiones (Lineal, Logarítmica, Exponencial, Cuadrática, Polinomica, etc…), cada tipo de regresión será elegida en función al gráfico que salga de la tabla. Es decir, si la tabla de respuesta del sensor nos indica una curva similar a una parábola, claramente debemos aplicar una regresión cuadrática, lo mismo si la curva de respuesta es logarítmica, exponencial, si posee muchos picos y valles tal vez nos convenga una polinomica o una suma de funciones, claramente se puede acomplejar tanto como uno quiera, como el procesador nos permita manejar operaciones matemáticas.

El Office, en el programa Excel, nos permite a partir de una tabla, generar el gráfico de la curva y también aplicarle la regresión que queramos dejando en evidencia la ecuación de la misma.

Por razones obvias solo mostrare los cálculos y ecuaciones de una regresión lineal, ya que el resto son más complejas y no tendría sentido en el post ya que se pueden calcular con el Excel.

Primero la tabla de valores:

Ahora vamos a trazar la curva con estos valores:


Como se puede ver en el gráfico la curva es casi lineal, si bien no es una recta podemos realizar una regresión lineal y nos dará una ecuación de dispersión que nos servirá para incorporar en el proceso informático.

Como sabemos la ecuación de una recta es: y=mx+b, ahora para darle los valores correctos a m y a b, debemos aplicar las formulas de regresión lineal.

Donde:


Primero tenemos que calcular los promedios, o las medias.


Ahora ya tenemos los pre cálculos realizados, tenemos que hallar b.


Lo haremos por partes, primero el numerador y luego el denominador.


Ahora realizamos el cálculo de m.

Ahora debemos hallar b.


Quedando así la ecuación de la recta.


Si tomamos el gráfico donde mostramos la curva que representa la tabla de valores y superponemos la recta que hallamos recién, nos quedara el siguiente gráfico.


Para nuestra comprobación, aplicaremos la ecuación lineal a la tabla de valores del sensor.


Comprobando los valores resultantes de la ecuación lineal, podemos ver que en función de la temperatura real de medición y los valores de tensión entregados por el sensor, tenemos una lectura con un error pero que aproxima a los valores reales de temperatura gracias a la dispersión lineal que se puede apreciar en los gráficos.

En nuestro programa en C, entonces leeremos el ADC.

ADC configurado a 8bit (0 a 255), +Vref: 5V, -Verf: 0V.
valSensorInt = read_adc(); Leemos ADC y alojamos en variable int8.
valSensor = 5.0 * valSensorInt / 256; Convertimos a float.
valLCD = 18.70422 * valSensor – 10.78811; Aplicamos regresion lineal.