bclose

Las entradas digitales de Arduino

Leyendo un pulsador con Arduino
tienda online prometec

Objetivos

.

 
    • Conocer las entradas digitales.
    • Leer el primer pulsador.
    • Presentar los valores booleanos.
    • Un operador: Negación.

 

Material requerido.

ArduinoUNO  Arduino Uno o similar. Un PC con el entorno de Arduino correctamente instalado y configurado.
Img_3_4 Una Protoboard.
componente Un diodo LED.
Img_5_1  Un pulsador.
 Img_3_5  Dos resistencias de 330 Ohmios.
Img_3_6 Algunos cables de Protoboard.

Entradas digitales

 

Con frecuencia en electrónica necesitamos saber si una luz está encendida o apagada, si alguien ha pulsado un botón o si una puerta ha quedado abierta o está cerrada.

A este tipo de señales todo / nada, SI / NO, TRUE /FALSE, 0/1  se les llama digitales, y podemos manejarlas con los pines de 0 al 13 de Arduino y por eso hablamos de pines digitales.

Muchos de los sensores y actuadores que vemos en el mundo real son digitales:

 
  • Como actuadores digitales, tenemos luces, alarmas, sirenas, desbloqueo de puertas, etc.
  • Como sensores digitales podemos mencionar botones y pulsadores, Finales de carrera, desbordamiento de nivel, sensores de llamas, humo o gases tóxicos.
 

Hemos visto que Arduino pueden usar los pines digitales como salidas todo o nada para encender un LED. De la misma manera podemos leer valores, todo o nada, del mundo exterior.

En esta sesión veremos que los pines digitales de Arduino pueden ser usados tanto de entrada como de salida. Vamos a leer un botón o pulsador externo y vamos a encender o apagar un LED en función de que el botón se pulse o no.

 

Esquema electrónico del circuito.

.

Montaremos un circuito con un diodo LED y resistencia conectado al pin digital 10 de Arduino, tal y como vimos en las sesiones previas y ademas un segundo circuuito con un pulsador S1 conectado al pin 6 con una resitencia como se muestra en el diagrama siguiente.

Circuito con pulsador

 

Obsérvese que mientras no pulsemos S1 el pin 6 de Arduino está conectado a 5V a través de la resistencia R3 forzando una lectura de tensión alta (HIGH). En cambio cuando pulsemos S1 cerraremos el circuito del pin 6 a Ground con lo que leerá tensión baja, LOW. En ambos casos tenemos un valor de tensión definido.

Si no pusiéramos la resistencia R3, al pulsar S1 leeríamos correctamente LOW en el pin 6. Pero al dejar de pulsar S1 el pin 6 estaría en un estado flotante, que es ni HIGH ni LOW  sino indeterminado. Como esto es inaceptable en circuitos digitales forzamos una lectura alta con R3.

 
  • A esta resistencia que fuerza el valor alto en vacio se le conoce como pullup Si la conectáramos a masa para forzar una lectura a Ground se le llamaría pulldown resistor.
  • Esta resistencia es clave para que las lecturas del pulsador sean consistentes. El circuito, simplemente, no funcionará bien si se omite (volveremos sobre esto).
 

Y aquí tenemos el esquema para protoboard del circuito.

Esquema protoboard

 

 
  • En este esquema hemos seguido la práctica habitual de usar cables negros para conectar a masa y cables rojos para conectar a tensión (5V).
  • Obsérvese que el pulsador S1 tiene cuatro pines (el que está sobre la resistencia horizontal). Esto es porque cada entrada del interruptor tiene dos pines conectados. En nuestro circuito simplemente ignoramos los pines secundarios.
 

 

Leyendo los pulsadores

 

Empecemos haciendo un programa que haga que el LED se encienda cuando pulsamos el botón y se apague cuando lo soltamos. Para ello pediremos a Arduino que configure el pin digital 10 (D10) como salida para manejar el LED, y el pin digital 6 (D6) como entrada para leer el botón.

Normalmente en programas sencillos basta con poner el número de pin en las instrucciones. Pero a medida que el programa se complica esto tiende a provocar errores difíciles de detectar.

Por eso es costumbre definir variables con los números de pin que usamos, de forma que podamos modificarlos tocando en un solo lugar (y no teniendo que buscar a lo largo del programa). Vamos a escribir esto un poco más elegantemente:

     int LED = 10 ;
     int boton = 6;
 
     void setup()
          {
               pinMode( LED, OUTPUT) ; // LED como salida
               pinMode( boton  , INPUT) ;            //botón  como entrada
          }
 
  • Atención: C++ diferencia entre mayúsculas y minúsculas y por tanto LED, Led y led no son lo mismo en absoluto. Del mismo modo, pinMode es correcto y en cambio pinmode generará un error de compilador fulminante.
  • He usado la variable boton sin acento porque no es recomendable usarlos ni la ñ en los nombres de variables, porque pueden pasar cosas extrañas.
 

Vimos que para encender el LED bastaba usar digitalWrite( LED, HIGH). Para leer un botón se puede hacer algo similar: digitalRead( botón). Veamos cómo podría ser nuestro loop:

     void loop()
          {
              int valor = digitalRead(boton) ;          // leemos el valor de boton en valor
              digitalWrite( LED, valor) ; 
          }

¿Fácil no? Aunque el LED está encendido hasta que pulsamos el botón y se apaga al pulsar.

¿Cómo podríamos hacer lo contrario, que el LED se encienda al pulsar y se apague si no? Bastaría con escribir en LED lo contrario de lo que leamos en el botón.

Existe un operador que hace eso exactamente el operador negación “ ! “ . Si una valor dado x es HIGH, entonces !x es LOW y viceversa.

 
  • Un operador es un símbolo que relaciona varios valores entre sí, o que modifica el valor de una variable de un modo previsible.
  • Ejemplos de operadores en C++ son los matemáticos como +,-,* , / ; y hay otros como la negación ! o el cambio de signo de una variable : – x. Iremos viendo más.
 

De hecho este tipo de operaciones son tan frecuentes que C++ incorpora un tipo llamado bool o booleano que solo acepta dos valores TRUE (cierto) y FALSE y son completamente equivalentes al 1 / 0, y al HIGH / LOW

Este nuevo programa sería algo así:

     void loop()
          {
              int valor = digitalRead(boton) ;      // leemos el valor de boton en valor
              digitalWrite( LED, !valor) ;          //Escribimos valor en LED 
           }

Hemos definido valor como bool, porque podemos usar el valor de tensión alto como TRUE y el valor bajo como FALSE.

SI el botón no está pulsado el D6 leerá TRUE y por tanto pondrá LED a FALSE. En caso contrario encenderá el LED.

De hecho podríamos escribir una variante curiosa del blinking LED usando el operador negación:

     void loop()
         {
             bool valor = digitalRead (LED) ;
             digitalWrite(  LED, !valor) ;
             delay ( 1000) ;
         }
 
  • Podemos leer la situación actual de un pin (nos devuelve su estado actual), aún cuando lo hayamos definido como salida, En cambio no podemos escribir en un pin definido como entrada.
 

La primera  linea lee la situación del LED y la invierte en la segunda línea, después escribe esto en LED. Y puestos a batir algún record, podemos escribir el blinking led en solo dos líneas:

     void loop()
          {
               digitalWrite(  LED , ! digitalRead( LED)) ;
               delay ( 1000) ;
          }
 
  • Las instrucciones dentro de los paréntesis se ejecutan antes que las que están fuera de ellos. Por eso el digitalRead se ejecuta antes que el digitaWrite..
 

 

Resumen de la sesión

.

 
 
    • Hemos visto una forma de leer señales digitales del mundo exterior además de poder enviarlas:
      • digitalRead( pin)
      • digitalWrite( pin , valor)
    • Hemos conocido un nuevo componente: el pulsador.
    • Conocemos un nuevo tipo en C++, el booleano y un nuevo operador de negación.
 

 

 

(153) Comments

    • Alexius

    Que diferencia hay entre pulldown y pullup solo el estado inicial o high pullup o low pulldown. O a se hace para evitar tanta resistencia en masa o solo por ahorrar?

    • Hola Alexius,

      En un pull up, la tension se fuerza a HIGH cunado no hay señal, mientras que en un pull down se fuerza a LOW en reposo, y en ambos casos el objetivo es evitar el contacto flotante, es decir que esta en tierra de nadie, porque no esta conectado ni a HIGH ni a LOW hasta que no se activa

    • Pedro

    Buenas.

    Muchas gracias por el curso, está muy bien.

    Una pregunta tengo: ¿Hay algún motivo en especial para que no conectemos la patilla 6 a masa con una resistencia pulldown y al cerrar el interruptor apliquemos 5V a pelo a dicha patilla, no teniendo que negar la lectura que se hace en la entrada para escribirla en la salida?

    • Ninguna Pedro. Da lo mismo que lo hagas en pullup o pulldown. Un saludo.

  • Hola tengo un problema, tengo que leer el valor de botón según entiendo pero no logro saber como, he leído como 3 o 4 veces el tema y probado y no consigo nada, por favor podrían explicarme como,
    Tengo el circuito bien colocado y pongo el comando como me dicen pero a la hora de poner el valor no se como hacerlo

    • Hola Jan Pau, la verdad es que no sé muy bien qué decirte. Casi seguro tu problema esté en el montaje porque el programa no tiene mucha complicación. De todas formas te dejo el enlace a esta misma sesión con S4A que hay esquemas con ambos montajes, a ver si te ayudan. Un saludo.

    • Ricardo albuja

    hola. trabajando con el operador de negacion y blinking led sin pulsar el boton se prende y se apaga el led ,gracias

    • No se si te entiendo la pregunta

  • Saludos

    Empece ayer con esto del arduino y a pesar de trabajar con plc(omron y siemens) hay cosas que no entiendo que puede ser debido a no haber tocado nunca la electronica a estos niveles. Bueno al lio que tengo unas dudas del copon.

    1.-En la practica anterior no se utilizo el pin 5v, porque en esta si?Por que si se quita se enciende el led?
    2.-Por que si quito el pulsador se enciende el led?
    3.-El pin 5v tiene tension respecto a masa, el pin 10 tiene tension respecto a masa, Por que el pin 6 no tiene tension respecto a masa ni con el resto de pines?

    Gracias por su tiempo y enhorabuena a los admins y a la comunidad

    • Saludos! A ver si te podemos aclarar un poco:

      1-En la anterior práctica encendíamos directamente el led desde una salida de Arduino, que da el voltaje suficiente para encenderlo.
      2-Si quitas el pulsador es lo mismo que si está abierto, y como tenemos montado el pulsador con una resistencia pull-up el led está encendido cuando el pulsador esta abierto. Por eso se enciende. Pasaría lo contrario si lo montas con la resistencia pull-down.
      3-El pin 6 lo utilizamos como entrada, mientras que el 10 como salida. Nos sirve para leer señales del exterior.

      En esta sesión de S4A explicamos los dos montajes, pull-up y pull-down, quizás pueda servirte de ayuda https://www.prometec.net/s4a-entradas-digitales/

      • Hey gracias por contestar para no rallarte mucho hare la practica 4 y si no aclaro los conceptos ya digo algo, muchisimas gracias

      • Hola he trasteado con un par de cosas

        Una forma de hacer la practica con pull down en vez de pull up cual seria? lo he intentado pero no me sale

        http://imgur.com/a/AF8Gy

    • LR2

    Saludos.
    Lo primero agradecer el curso.

    Si intento compilar y pasar el programa al arduino, tomando la alimentancion del pin 5V o VIN me da error. Si desconecto el pin que hace de alimentacion ( lo mismo da 5Vo VIN ), y despues compilo si me funciona.
    Existe alguna explicación?¿

    Saludos

    • Si le das a compilar, o sea al símbolo de la v, puedes hacerlo incluso sin el Arduino conectado (no así con subir), así que no hay ninguna razón para que ocurra eso.

    • Maria

    Buenas, nunca había programado y me aparece error: exit status 1
    stray ‘\302’ in program.
    Por lo que he visto en internet significa que hay un carácter no estándar, no lo llego a comprender pero copie el programa tal cual, y no funciona.
    Gracias de antemano.

    • Hola María, he probado todos los códigos de la sesión y me compilan bien, así que debe ser un problema al copiar y pegar, por eso normalmente solemos poner el enlace para descargar el programa. En esta sesión no lo hemos hecho por ser muy cortito. Prueba a escribirlo tú directamente (no creo que tardes más de 5 minutos) y nos cuentas si se te soluciona. Un saludo.

  • Tengo dudas con R3, pero como comentáis en el tema, ya lo veremos mas adelante. Esperaré a ver que pasa. La duda es como calcular el valor de una resistencia que trabaja en vacío, sin carga.
    Gracias por el tuto, paso al siguiente.

    • Hola Chopi.

      No hace falta realizar complicadas fórmulas para hayar el valor de R3. Sólo ten en cuenta una cosa. Observa el circuito y la circulación de la corriente con el pulsador abierto y luego con el pulsador cerrado.

      Con el pulsador abierto, el pin digital 6 “ve” los 5V que llegan desde el pin de 5V de la placa. O dicho de otro modo, le están llegando 5V a ese pin digital. La resistencia no es necesaria en este momento, los 5V llegan igualmente y podríamos pensar en quitarla.

      Con el pulsador cerrado, el pin digital 6 ya no ve los 5V de antes, pues esta tensión se va a GND directamente pues para ella es más “fácil” irse hacia ese punto que hacia cualquier otro. ¿Qué ocurre si no tenemos la R de 330 Ohm en el circuito…? Pues simplemente que estamos haciendo un cortocircuito y achicharrando nuestro Arduino, pues estamos conectando los 5V con GND sin ninguna carga en serie.
      Y para que esto no ocurra se pone una resistencia como aparece en el esquema. El valor no es crítico, y puede ser de 330, 680, 1K, etc. El valor no puede ser ni muy bajo ni muy alto, con lo que valores entre ese rango son aceptables.

      Saludos.

      • Perfecta explicación Jesús, se agradece. Es exactamente la conclusión que saqué después de esta sesión. Creo haberlo aprendido bien, si el valor de R3 fuese demasiado bajo, podríamos seguir creando un cortocircuito o un buen calentón, pero si el valor fuese excesivamente alto… ¿Podríamos llegar a tener en el pin 6 LOW en vez de HIGH? Si es así, creo que lo entendí todo.
        Saludos y gracias.

        • Por nada. En efecto, si la R es muy baja no hay resistencia suficiente y se podría chamuscar el Arduino. Y el caso contrario, pues no lo he comprobado, pero te animo a que le pongas un valor de, por ejemplo, 1 M ó 2M, y ver si el pin 6 “ve” 5V o menos. Por debajo de los 2.5V para Arduino es un cero.

          Saludos.

          • Vale, confundí conceptos. Intensidad y voltaje, lección aprendida, gracias Jesús.
            Saludos

      • Buena explicación, gracias. Al igual que ocurre con el LED, en el que la resistencia R1 está colocada después, quizás sería más fácil de entender el circuito si R3 estuviera colocado DESPUÉS del pulsador S1; puesto que R3 no hace falta con el pulsador abierto, sólo actuaría cuando el pulsado está cerrado.

    • Javier

    Hola Buenas Tardes, Primero agradecer el tutorial, tengo una duda, la resistencia se pone en el negativo del led o en el positivo??? no tengo idea de electronica y pensaba que era antes del positivo para que bajara el voltaje.

    • Hola Javier, el orden da igual, lo importante es que la intensidad que recorra el circuito no sea demasiado alta. Debes tener siempre en cuenta la ley de Ohm V=IxR. Si la resistencia baja mucho, la intensidad se dispara y se puede quemar el LED. Un saludo.

    • Jorge Escobar

    Saludos, primero que todo felicitaciones por su curso, la verdad es el mejor, he hecho el ensayo de esta leccion y definitivamente no me lee la señal que envio desde el pulsador, le puse la opcion de Serial.println( valor ); para me imprima el valor cuando pulse el botom y siempre 0, que sera lo que pasa? sera mi placa de aruino esta mala, como hago para chequearla? gracias de antemano.

    • Hola Jorge, yo revisaría bien las conexiones. Probablemente el problema venga por ahí. Un saludo.

Give a Reply

WordPress Anti-Spam by WP-SpamShield