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

Entradas más populares de este blog

Como ser romántico nivel programador

Felicitaciones de cumpleaños para un programador [tomado de frasesparacumpleaños.com]

INDICADOR LUMINOSO DE VOLUMEN DE UN EQUIPO DE SONIDO (PROGRAMACIÓN EN ARDUINO)