Arduino. Reflexivo CNY70

Use este ejemplo para mi primer robot Seguidor de Lineas 

La utilizacion de valores de entrada atravez del uso de sensores permite a Arduino responder o informar del mundo que lo rodea, esta es una de las tareas mas comunes que te encontraras al implementar casi cualquier prototipo de robot, requiere ciencia, arte y preseverancia; ademas de mucho ingenio y muchas pruebas para obtener el resultado deseado. Un problema comun, es separar la señal deseada del ruido de fondo (se considera ruido a todas las perturbaciones electricas que interfieren sobre las señales transmitidas o procesadas), se puede implementar el uso de un umbral para detectar cuando una señal esta por encima de un cierto nivel, una manera sencilla seria tomar el promedio de una serie de lecturas de la muestra para suavizar los picos de ruido. Utilizar un sensor en el contexto adecuado (ubicacion, alcanze, orientacion) y limitar su exposicion a los factores que no deseas que lo activen son habilidades que se adquieren con la experiencia.

En este post:: Veremos como controlar dos dispositivos, motor cc y servomotor, atravez de los valores logicos de los sensores cny70. Los diagramas muestran como conectar los dispositivos y la corriente, el codigo demuestra como usar los valores procedentes de los sensores. Estos sensores estan diseñados para soportar un maximo de 3,3 voltios, podrias dañarlos definitivamente al conectarlos a 5 voltios, es buena idea consultar las especificaciones del dispositivo antes de conectarlo. http://www.micropik.com/pdf/cny70.pdf CNY70:   Es un Sensor  optico infrarrojo muy compacto, de un rango de corto alcance (menos de 5 cm) que se suele usar para detectar un cambio en la reflectividad, contiene un emisor de luz (Fotodiodo) infrarrojo y un receptor (Fototransistor) en la misma direccion, son capaces de detectar la presencia de un objeto utilizando la reflexion del infrarrojo sobre el objeto, (la reflexion consiste en cuando un rayo de luz que incide sobre una superficie es reflejado), Funciona asi: El fotodiodo emite un az de luz (cuya intensidad esta en funcion de la resistencia que se le conecte y la tension a la que se alimente) —> El fototransistor se encarga de recibir ese az de luz cuando se refleja sobre alguna superficie (dependiendo de la cantidad de luz recibida el dispositivo envia una señal de retorno a Arduino). En este ejemplo, cuando el sensor se encuentra en el area negra (linea) esta absorbera gran parte de la luz emitida  por el diodo, por lo que apenas tendremos intensidad a travez del transistor retornando un valor alto (HIGH) a Arduino, este valor HIGH puede considerarse tambien como un 1 logico. A su vez cuando el sensor se sitúa sobre una superficie blanca (fondo), gran parte de la luz emitida por el diodo será reflejada al fototransistor, pasando éste de su región de corte a la activa retornando un valor bajo (LOW), 0 logico.

Alambramos el servo y el motor cc de la forma que lo hemos estado las veces anteriores, junto con los interruptores (push botton’s) que representan a los sensores cny70 [dado que no encontre estos sensores en fritzing (^_^)], los interruptores retornan un valor similar al cny70 1 (HIGH cuando es presionado) y 0 (LOW al ser liberado)
Codigo:: (que de hecho no me esforce tanto porque solo ocupe dos reflexivos cny70, pero pienso usar almenos seis en el prototipo final)

 

 

#include <Servo.h>

Servo myservo;          // crea un objeto tipo servo para el control del servomotor
int sensor1 = 4; //pin de entrada al sensor 1
int valor1=0;
int sensor2 = 3; //pin de entrada al sensor 2
int valor2=0;

const int enablePin = 5; //pin que habilita el H-Bridge L293D

const int motorcc1 = 7; //pin de entrada para hilo 1 motor cc
const int motorcc2 = 6; //pin de entrada para hilo 2 motor cc

void setup() { //inicializa y prepara los valores

myservo.attach(9); //conecta el objeto servo al pin 9
pinMode(sensor1,INPUT);
pinMode(sensor2,INPUT);
pinMode(motorcc1, OUTPUT);
pinMode(motorcc2, OUTPUT);

}

void loop() {

valor1 = digitalRead(sensor1);
valor2 = digitalRead(sensor2);

int speed = map(speed,’0′, ‘9’, 0, 255);//mapea un numero desde un rango a otro

analogWrite(enablePin, speed); //pasa el valor de la velocidad al integrado L293D

//tomando HIGH como 1 logico y LOW como 0 logico

if(valor1==HIGH && valor2 == HIGH) //Si sensor1 y sensor2 HIGH (ambos sensores en negro)

          myservo.write(1200); //servo a 90 grados (frente)

          digitalWrite(motorcc1,HIGH); //motor avanza clockwise

          digitalWrite(motorcc2,LOW);

}

if(valor1==LOW && valor2 == HIGH) { //Si sensor1 LOW y sensor 2 HIGH (blanco y negro)

            myservo.write(2400); //servo a 0 grados (gira izquierda)

           digitalWrite(motorcc1,HIGH); //motor avanza clockwise

           digitalWrite(motorcc2,LOW);

}

if(valor1==HIGH && valor2 == LOW){ //Si sensor1 HIGH y sensor 2 LOW (negro y blanco)

           myservo.write(544); //servo a 180 grados (gira derecha)

          digitalWrite(motorcc1,HIGH); //motor avanza clockwise

          digitalWrite(motorcc2,LOW);

}

if(valor1==LOW && valor2 == LOW){ //Si sensor1 y sensor 2 LOW (ambos sensores en blanco)

           myservo.write(1200); //servo a 90 grados (frente)

           digitalWrite(motorcc1,LOW); //se detiene motor cc

           digitalWrite(motorcc2,LOW);

}

 

} // Fin de loop ()

 

Aqui un video del funcionamiento de los componentes de nuestro vehiculo (motor cc y servomotor) atravez de los sensores cny70::

Funcionamiento Motor CC y Servomotor atravez CNY70

Ahora a nuestro proyecto velocista que de ahora en adelante llamare F1 (Fuego 1) solo falta incorporar todos los componentes dentro del vehiculo y calibrar los sensores, ademas trabajar en el control totalmente Autonomo, Asi es usando un control PID.. bien hasta el prox post (^_^) bytes!

25 comentarios en “Arduino. Reflexivo CNY70

  1. Pingback: Arduino | Annotary
      1. Que tal buenas noches! Podrías ayudarme con lo del puente h?
        Mi proyecto es similar al tuyo, el mío tiene 4 sensores, dos para que me detecten la línea negra y dos para que se guíen con lo blanco en caso de que existan picos en la pista el carrito no se salga.
        Saludos!

  2. Que tal buenas noches! Oye lo estoy armando tal y como viene en la imagen pero no me sale igual que a ti y teno una duda con el servo que tiene 3 cables. Me podrías ayudar por favor!
    Saludos

    1. Los tres cables del servo son Alimentación a 5V (Rojo) Tierra (Negro) y Control (Amarillo). La señal de control del servo es el objeto Servo que hacemos referencia en el código:
      #include
      Servo myservo;

      myservo.attach(9)
      Cual es precisamente tu duda?

      1. Pues que tengo un servo igual pero sólo tiene 2 cables, uno café y el otro verde y otra duda sobre como se conectan los cny70 y como saber sí realmente funcionan mis sensores o no, ya que en tu video veo que están prendidos tus sensores (que tienen un destello de luz) pero los míos no prenden

      2. seguro que es un servomotor? porque si tiene dos hilos lo mas seguro es que sea un motor de corriente continua, de igual forma te puede servir pero necesitarías un control intermedio (un puente H) para poder hacerlo funcionar. El luz que emiten los cny70 es en infrarrojo no lo vemos a simple vista pero la camara si lo percibe

  3. hola amigo mucho gusto, tienes el programa final, ya que yo estoy haciendo un proyecto similar solo que en mi caso utilizo 10 CNY70 y un arduino mega, y su funcionalidad depende de detectar una aguja en un manómetro, me seria de mucha ayuda y gracias de antemano.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s