LECTOR BINARIO UTILIZANDO EL SENSOR INFRARROJO CNY70 (PROGRAMACIÓN EN ARDUINO)
ACERCA DEL SENSOR CNY70
El sensor óptico infrarrojo
de corto alcance (CNY70) se utiliza para detectar
colores de objetos y superficies.
Generalmente el uso más
común que se le da es para construir Robots seguidores de líneas. Contiene un
emisor de radiación infrarroja (fotodiodo) y un receptor (fototransistor). El
fotodiodo emite un haz de radiación infrarroja, el fototransistor recibe ese
haz de luz cuando se refleja sobre alguna superficie u objeto.
La luz emitida no es
fácilmente captada por el ojo humano. Para apreciar dicha luz, se puede
utilizar la cámara de un Smartphone.
MATERIALES NECESARIOS
·
1 tarjeta Arduino UNO
·
1 sensor óptico infrarrojo (CNY70)
·
1 pulsador
·
1 resistencia de 10K
·
1 resistencia de 220 Ohms
·
1 resistencia de 330 Ohms
·
Puentes de varios tipos
·
Protoboard
LECTOR BINARIO
El ejercicio que se va a
realizar, consiste en que cuando el sensor infrarrojo CNY70 detecte un color
negro, el valor va a ser 0, pero cuando detecte una superficie blanca, el valor
va a ser 1. Estos valores que se estarán acumulando, serán concatenados para
formar una cantidad en el sistema de base 2 (Binario), para luego hacer la
conversión al sistema Decimal.
Por ejemplo, en esta
secuencia de cuadros blanco y negro…
1
|
1
|
1
|
0
|
1
|
0
|
1
|
1
|
1
|
0
|
0
|
El numero binario formado será este: 11101011100, ya
después lo convertimos a su equivalente en el sistema decimal, el cual seria 1884.
COMO LO REALIZAMOS
El circuito va a tener un
pulsador, el cual servirá para detener la lectura de los colores, eso es opcional,
ya que la cantidad máxima de lectura establecida es de 20. Entonces solo puede
leer 20 dígitos binarios y se detiene, o con solo pulsar el botón.
El circuito
va estar dado de la siguiente manera:
· El sensor infrarrojo CNY70 va a estar conectado al pin analógico
A0 del Arduino.
·
El botón o el pulsador estará conectado al pin 8 del Arduino.
DIAGRAMA
La codificación del programa
se presenta a continuación
int
contador=0;
int
secuenciabinaria[]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
int
control=0,control2=0;
void setup()
{
Serial.begin(9600);
pinMode(8,INPUT);
}
void loop()
{
if(control==0){
delay(2000);
if(analogRead(A0)< 50 &&
contador<20)
{
secuenciabinaria[contador] = 0;
Serial.print("Negra=");
Serial.println(secuenciabinaria[contador]);
contador++;
}
if(analogRead(A0)>150 && contador<20)
{
secuenciabinaria[contador] = 1;
Serial.print("Blanca=");
Serial.println(secuenciabinaria[contador]);
contador++;
}
}
delay(500);
if(contador==20 || digitalRead(8)==LOW ){
control=1;
}
if(control==1 && control2==0){
Serial.print("Numero binario leido:
");
conversiones();
}
}
int
decimal=0;
int
exponente=1;
int suma=0;
int posicion=19;
void
conversiones(){
int i=0;
while(i<20){
if(secuenciabinaria[i]!=2){
Serial.print(secuenciabinaria[i]);
}
if(secuenciabinaria[i]==2){
posicion=i-1;
break;
}
i++;
}
while(posicion>=0){
decimal=exponente*secuenciabinaria[posicion];
suma+=decimal;
exponente=exponente*2;
posicion--;
}
Serial.println("");
Serial.print("Numero Decimal: ");
Serial.println(suma);
delay(2000);
control2=1;
}
EXPLICACION DEL CODIGO PASO
A PASO
Variables
globales
int
contador=0; (contador para controlar la cantidad de dígitos leídos)
int
secuenciabinaria[]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};(creación de un
vector de tipo entero, donde se guardan los dígitos binarios que se estarán
leyendo y se inicializan en 0)
int
control=0,control2=0;(declaración de variables de control)
Procedimiento
Setup()
void setup()
{
Serial.begin(9600); (iniciar el monitor
serial)
pinMode(8,INPUT); (establecer el pin 8 del
Arduino como Entrada de datos, ya que ahí se encuentra conectado el botón)
}
Procedimiento loop()
void loop()
{
if(control==0){ (el primer control, el
cual sirve para controlar la lectura de datos del programa, si es igual a 0,
estará leyendo datos, en cambio si se cambia a 1, entonces termina la lectura
de datos a través del sensor)
delay(2000); (retardo de dos segundos)
if(analogRead(A0)< 50 &&
contador<20) (condición para saber en que rango esta el dato arrojado por
el sensor(desde la entrada analógica A0), si es menor que 50(es de color negro)
y si el contador aun es menor que 20)
{
secuenciabinaria[contador] = 0;(se
guardan los valores 0 en el vector en la posición especificada por el contador,
si es negro)
Serial.print("Negra=");(se
imprime la leyenda ‘negra’)
Serial.println(secuenciabinaria[contador]); (se imprime el valor de
ese color, en ese caso será un 0, ya que es negro)
contador++; (se le suma 1 a la variable
contador)
}
if(analogRead(A0)>150 && contador<20) (condición para
saber en qué rango está el dato arrojado por el sensor(desde la entrada
analógica A0), si es mayor que 150(es de color blanco) y si el contador aun es
menor que 20)
{
secuenciabinaria[contador] = 1; (se
guardan los valores 1 en el vector en la posición especificada por el contador,
si el color detectado es blanco)
Serial.print("Blanca="); (se
imprime la leyenda ‘blanca’)
Serial.println(secuenciabinaria[contador]);
(se imprime el valor que corresponde al color blanco, el cual es 1)
contador++;
}
}
delay(500);
(condición
para comprobar que el contador de dígitos no sobrepase los 20, ya que si llega
a 20, el control se cambia a 1, entonces ya no seguirá leyendo. O también se
detiene la lectura accionando el botón conectado al pin 8)
if(contador==20 || digitalRead(8)==HIGH ){
control=1;
}
(en esta
parte se evalua si el control de lectura ya tiene un valor de 1, si así, se
verifica que el segundo control, en este caso es para saber si ya se ha
convertido a sistema decimal los dígitos binarios, siga en 0, o sea que no se
ha hecho ninguna conversión. Si se cumplen las dos condiciones, se llama al
procedimiento creado para la conversión llamada ‘conversiones’)
if(control==1 && control2==0){
Serial.print("Numero binario leido:
");
conversiones();
}
}
BLOQUE PARA REALIZAR LA
CONVERSION DE BINARIO A DECIMAL
Declaración
de variables que servirán en el procedimiento
int
decimal=0; (variable auxiliar, para almacenar momentáneamente los productos)
int
exponente=1; (numero por el cual se multiplicará el digito binario leído)
int suma=0; (variable
donde se estarán sumando y guardando los resultados de las operaciones)
int
posicion=19; (establecer el limite de la posicion del vector)
El
procedimiento conversiones ()
void
conversiones(){
(bucle
para conocer la posicion del ultimo digito binario ingresado, ese dato se
guarda en la variable posicion)
int i=0;
while(i<20){
if(secuenciabinaria[i]!=2){(aprovechando
el bucle, mientras recorre el vector, se imprimen los digitos almacenados en el
vector, omitiendo los digitos 2)
Serial.print(secuenciabinaria[i]);
}
(cuando encuentra el primer digito 2, se
guarda la posicion anterior y se detiene el bucle)
if(secuenciabinaria[i]==2){
posicion=i-1;
break;
}
i++;
}
(ya
teniendo la posicion del ultimo digito binario, se procede a recorrer el bucle
de regreso)
while(posicion>=0){
decimal=exponente*secuenciabinaria[posicion];
(en esta línea, en la variable decimal, se guarda el producto del valor de la
variable exponente en ese momento con el digito guardado en el vector en la
posición especificado)
suma+=decimal; (la variable guarda la suma
del valor ya guardado en ella con el valor de la variable decimal)
exponente=exponente*2; (la variable se
multiplica por 2, ya que en la siguiente se estará evaluando una segunda
posición del número binario formado)
posicion--;
}
(cuando
se recorre por completo el vector, se sale del bucle y se imprimen los datos
finales ya convertidos a sistema decimal)
Serial.println("");
Serial.print("Numero Decimal: ");
Serial.println(suma);
delay(2000);
control2=1; (el control2 se cambia a 1,
indicando que ya se hizo la conversión, para que el programa no lo vuelva a
hacer)
}
Comentarios
Publicar un comentario