Guía de iniciación a Arduino (9 / 15 paso)

Paso 9: Entrada de un botón

Por supuesto, puede utilizar los pines de I/O de Arduino como entradas así. En este paso, sólo usaremos los botones como dispositivos de entrada, pero por supuesto, puede utilizar cualquier interruptor.

Pull-up y pull-down

El Arduino funciona con entradas lógicas: 1 = 5v, 0 = 0v. Para hacer nuestro botón estos voltajes de salida, vamos a usar un pull-up o una resistencia de pull-down. (imagen 1 y 2)
En el caso de una resistencia de pull-down (imagen 1), conectamos una pierna del interruptor a 5v y la otra pierna a través de un resistor (10kΩ en este caso) a tierra (0v). La pierna con el resistor conectado va a la entrada de pin en el Arduino.

De esta manera, cuando el botón no es presionado (y no conecta las 2 patas), la entrada está a 0v, porque está conectada a tierra a través del resistor. Cuando usted presiona el botón, la entrada está en 5v, porque está directamente conectado a 5v a través del interruptor. La resistencia no importa cuando usted presiona el botón, hace que la entrada es 0v cuando el botón no está pulsado.

Un resistor de pull-up (imagen 2) funciona exactamente igual, pero todo se intercambia: la primera etapa está conectada a tierra, en vez de 5v, el segundo está conectado a 5v a través de una resistencia (por lo tanto, el resistor de pull-up de nombre, ya que tira de él hasta 5v). La clavija de entrada todavía conecta con el lado con la resistencia, pero ahora, es alta cuando el botón no es presionado y se baja cuando el interruptor está cerrado.

BotónPull-up estado lógicosDescendente del estado lógico
liberado10
presiona01

Ahora, conecte un pulsador con un desplegable resistente al pin 3 de Arduino y un botón con una resistencia de pull-up al pin 5. Conectar LEDs (con su correspondiente resistencia) a los pines 10 y 12. (imagen 3 y 4)

Ahora abra ejemplo button2 y abrirlo. Este programa sólo lee las dos entradas y pone las salidas en el mismo estado.

Hay sólo dos cosas nuevas, y son muy evidentes: en lugar de la constante de salida, utilizamos entrada para fijar los pernos de nuestros botones como entradas, y la función digitalRead(pin) sólo devuelve el estado de la clavija de entrada dado.

Nota: usando pinMode (pin, entrada) no es realmente necesaria, ya que todos los pines de Arduino son entradas por defecto, pero a menudo se hace de todos modos, para hacer el código más legible.

Cuando subes el bosquejo, los botones y verás que la tabla de arriba es de hecho correcta: siempre está encendido, el LED en el pin 12 hasta que pulse el botón pin 5, esto es porque tiene una resistencia de pull-up.

Si desea que los LEDs para iluminar solamente al pulsar el botón, usted puede utilizar el operador not booleano : este solo cambia un 'verdadero' en una 'falsa' (o un 1 a 0) y viceversa. En C++ (en el IDE de Arduino), este operador es un signo de exclamación (!)

Resistencias pull-up internas

Sería muy incómodo si tenemos que utilizar una resistencia extra y una pieza extra de cable, cada vez que queremos usar un interruptor normal. Es por ello que el chip en el Arduino tiene una resistencia de pull-up incorporado en cada pin.

Hay dos formas que les permitan:

Ambos tienen el mismo efecto, pero la última es preferida, porque es más fácil de leer.

Nota: si se olvida de usar pinMode (pin, salida) y luego utilizas digitalWrite (pin, alto), solo te habilita el resistor de pull-up, porque son conjunto de todos los pines como entradas por defecto.

Ahora conectar los pulsadores sin las resistencias, sólo la conexión a la tierra (como se muestra en la imagen 5)
Se puede ver que no necesitamos utilizar el pin de 5v de Arduino más, y si tuviéramos que producir esto a gran escala, esas dos resistencias ahorramos haría una diferencia significativa en el costo de producción.

Abrir el ejemplo button2-b. Como se puede ver, he usado las dos formas de habilitar las resistencias pull-up. También tenga en cuenta que he utilizado el operador 'no', por lo que los LEDs están en cuando se presiona el botón.

Resumen

  • Para utilizar interruptores y botones con tu Arduino, tienes que usar un pull-up o pull-down resistor.
  • pinMode (pin, INPUT_PULLUP); permite que las resistencias de pull-up interna de Arduino.
    digitalWrite (pin, HIGH); en un pin de entrada tiene el mismo resultado.
  • digitalRead(pin) devuelve el estado de la entrada de pin 1 = 5v, 0 = 0v.
    Si utiliza un botón con una resistencia de pull-up (por ejemplo, el uno interno), 1 significa que el botón no está pulsado, 0 significa que se presiona.
  • Usted puede utilizar el operador not (!) para intercambiar 1 y 0. Por ejemplo, ! digitalRead(pin) devuelve 0 cuando el botón no está pulsado y 1 cuando se presiona el botón.

Extra: Manipulación de Puerto directo (avanzado)

DigitalRead, digitalWrite y pinMode son funciones grandes y simples, pero son relativamente lentos. También, se puede activar en las 2 patillas y desactivar exactamente al mismo tiempo, y escribir 8 bits simultáneamente para la comunicación paralela no es posible tampoco. A veces, cuando está ejecutando corto en memoria, estas 3 funciones pueden utilizar mucho el espacio disponible, también.

La solución a estos problemas es la manipulación directa del puerto. El chip de Atmel tiene algunos (3 Arduinos mayoría) se registra para los pines de I/O, estos son sólo los bytes que almacenan la información sobre si un pin es una entrada o una salida, si se trata de conjunto de alta o baja, etc.. Cada uno de estos octetos corresponde a un pin de I/O en el Arduino.

En el Arduino Uno, puerto D contiene pins 0 a 7, Puerto B pernos 8 a 13 y Puerto C A0 a A5.

Hay 3 registros para el control de la entrada-salida (donde x es la letra de puerto):

  • DDRx: registro de dirección de datos: Esto establece si los pines del puerto son inputs(1) o salidas (0). (pinMode)
  • PORTx: registro de datos de puerto: se trata de establecer salidas de altas o bajas y desactivar o activar las resistencias de pull-up entrada. (digitalWrite)
  • PINx: registro de entrada del puerto: este byte contiene el estado de las entradas digitales. Si el pin es una salida, sólo dará usted el estado de salida.

En la imagen de arriba, se puede ver toda asignación de pines del Arduino Uno, los números de puerto son en los campos amarillos al lado de las clavijas. (crédito de la imagen)

Puesto que cada bit del byte representa uno de los pines, es más fácil escribir los valores en notación binaria. Usted puede hacer esto añadiendo un capital B antes del número, por ejemplo, B111 es 7 en decimal (22 + 21 + 20).

Asimismo, puede usar un líder 0 para usar la notación octal, o 0 x de notación hexadecimal, sin embargo en este caso usando estas dos notaciones realmente no tiene sentido.

Cuando contar pedacitos, el de la derecha (menos significativo, LSB) bit es bits 0, por lo que corresponde al primer pin del puerto, mientras que el MSB (bit más significativo) corresponde al octavo pin del puerto.

Algunos ejemplos:

Perno de ajuste 7 a una salida y 0-6 pines como entradas:

Perno de ajuste (salida) 7 alta:

Lo que permite la resistencia interna de pull-up en el pin (entrada) 6:

Leyendo el estado de los pins 0 a 7:

Sin embargo, usando como esto puede causar algunos problemas: por ejemplo, en el segundo ejemplo, pin 7 es alto, pero todos los otros pines en el puerto se ponen a cero, independientemente de su estado anterior. Para cambiar sólo uno de los pines en un momento, podemos utilizar algunos operadores bit a bit.

Para definir un poco alto, sin cambiar los otros pedacitos, podemos utilizar el bit a bit o-operador ( || ). Nota: esta es sólo una |, que es el o-operador booleano ||. BitWise significa que se aplica a cada uno por separado. Usamos una máscara para fijar la broca derecha alta: queremos alto es 1, y todos los otros bits son 0.

Si un bit en la máscara es uno, se establecerá este bit a 1 en el registro PORTD, si es cero, sólo guardará el valor en previousPORTD. Usted puede consultar las tablas de verdad y algunos ejemplos en las imágenes de arriba.

Para definir un poco baja, sin cambiar los otros pedacitos, podemos utilizar el bit a bit - operador y ( & ). Nota: esta es sólo una y, mientras que los booleanos y operadores es & &. Ahora tenemos que invertir la máscara: la broca queremos baja es cero, y todos los otros bits son uno.

Esta notación funciona muy bien, pero podemos hacer un poco más legible. En lugar de escribir un número entero binario de nuestra máscara, podemos utilizar el operador de enmascaramiento izquierdo (<<). sólo desplaza todos los dígitos a la izquierda para un número determinado de lugares. Por ejemplo: 1 << 2 = B100, B101 << 1 = B1010 y así sucesivamente. Esto también es una manera fácil para calcular potencias de dos: 1 << 7 = B10000000 = 128 = 27

Pero que vamos a utilizar para crear nuestra máscara: por ejemplo, la máscara de B10000000 puede ser escrita como 1 << 7, ahora se puede ver fácilmente que es el octavo pin en el registro, sin tener que contar los ceros.

Para crear la máscara inversa, para el y notación, podemos utilizar el bit a bit operador not ( ~ ) invertir cada bit: B01111111 puede escribirse como ~ (1 << 7). (ver imagen)

Si desea mover de un tirón uno o más bits, puede utilizar el operador or exclusivo. (xor, ^ ). Devuelve 1 si uno de los bits de entrada es uno y 0 si ambas entradas son iguales.

Podemos utilizar los operadores compuestos para reducir el tamaño del código: x = x + 1; puede ser escrito como x += 1; por ejemplo. Lo mismo ocurre con los operadores bit a bit. ¡ Ya no necesitamos la variable temporal.

Para obtener un bit específico desde el registro de entrada, por ejemplo, puede utilizar la función bitRead (byte, bit) :

puede utilizar algunas matemáticas básicas para lograr el mismo resultado:

Usa un correcto enmascaramiento (>>) y un modulo operador (%): >> hace lo mismo que <<, pero en la otra dirección. Si PIND es B10101010, por ejemplo, PIND >> 6 = B10, básicamente, chuletas de los últimos 6 dígitos (binarios). Queríamos comprobar es ahora la más a la derecha bit. Modulo te da el resto de una división, por ejemplo, 10 %3 = 1, ya que 3 * 3 + 1 = 10, 5 %6 = 5, ya que 0 * 6 + 5 = 5, 23 %8 = 7, porque 2 * 8 + 7 = 23. x 2% le dará un 0 si x es par y 1 Si x es impar. En notación binaria, el último dígito (bit más a la derecha) de un número es 0, y el último dígito de un número impar es 1. Así que si queremos conocer el último dígito de un número binario, sólo podemos usar x %2.

Otra forma de obtener sólo un bit de un número es mediante el operador condicional ( ?: ):

PIND & (1 << 6) va a mantener sólo el bit 6 de PIND, todos los otros dígitos será 0. Si PIND es B10101010, por ejemplo, PIND & (1 << 6) = B00000000, y si es de PIND B01010101, PIND & (1 << 6) = B01000000. De estos ejemplos, se puede ver que el resultado es cero si el bit 6 es 0. Así que si ponemos a prueba si este resultado == 0, sabemos que el estado del bit 6. Utilizamos el operador condicional: condición? resultIfTrue: resultIfFalse. Si la condición es true, el operador devolverá el resultIfTrue, si es false, devolverá resultIfFalse.

Nota de compatibilidad: la asignación de puerto a pin depende el chip. Esto significa que tienes que cambiar el programa si desea utilizar otro Arduino. Para uso personal, no se trata tanto de un problema, pero si estás escribiendo programas o bibliotecas para la comunidad o para compartir en línea, usted debe tomar esto en cuenta.

Referencia de Arduino: constantes de enteros

Mató a mi hilo: tutorial de manipulación de Puerto directo

Referencia de Arduino: manipulación de puertos

Hoja de datos de la Atmel ATmega 328p p.91 14.4

Referencia de Arduino: bitRead

Artículos Relacionados

BRICOLAJE casero portátil Arduino café montaña con LED de indicador de temperatura

BRICOLAJE casero portátil Arduino café montaña con LED de indicador de temperatura

Muchas cosas suceden solo por tomar café. Grandes empresas éxito ideas salen mientras gente chateando con café. Me encanta tomar café sobre todo cuando estoy en la oficina. Estoy bastante seguro de que allí todo el mundo ama el café. Pero cuando hago
Brazo robótico Arduino

Brazo robótico Arduino

Ya que es mi primer proyecto después de los 15 tutoriales de mi kit de iniciación de Arduino, el verdadero propósito de la misma es para algunos críticos, consejos, sugerencias, ideas de cualquier persona que sabe más que yo.Este proyecto trata de un
Control CC MIDI en Ableton Live con un Arduino Uno

Control CC MIDI en Ableton Live con un Arduino Uno

En este instructable utilizaremos un potenciómetro en un Arduino Uno para controlar una CC MIDI en Ableton Live. Un MIDI CC está parado para el regulador continuo, es decir, un número en el rango de 0 a 127 inclusive modular algo con. En el youtube q
Arduino All-in-One Getting Started guía

Arduino All-in-One Getting Started guía

un tutorial todo-en-uno para empezar con la plataforma de prototipado Arduino electrónica de código abierto. Esta guía está pensada para el principiante pero debe también ser útiles si ya jugar con la electrónica pero quiere iniciar con el Arduino. H
Juego el francés puede poder utilizando un Arduino y un zumbador

Juego el francés puede poder utilizando un Arduino y un zumbador

Bonjour!Hacer que tu Arduino el francés puede poder mediante una señal acústica. No pinzas. No se dispara. Es tan directo que resulta tan escandaloso el puede puede implica.Este instructivo cubre información electrónica introductorio y se centra en e
Arduino Drawbot

Arduino Drawbot

en algunas de mis anteriores instructurables Arduino tengo programa para la iniciación de Arduino en cómo controlar servos de diferentes maneras.Y en mi última instructurable he muestran la modificación de un servo de paralaje para una rotación de 36
Reflejo del dolor humano de Arduino mecatronicos

Reflejo del dolor humano de Arduino mecatronicos

Debido a su simplicidad, circuitos reflejos son un lugar obvio para comenzar cuando se trata de modelar el sistema nervioso. Opté por usar el reflejo de dolor térmico para mi primer proyecto. En este reflejo de dolor, un estímulo doloroso como una ll
Movimiento reactivo Shake the Maze Juego

Movimiento reactivo Shake the Maze Juego

Traer la magia a la vida con un movimiento automatizado, reactivo shake the maze juego! Usando componentes de un kit de iniciación de Arduino y materiales comunes alrededor de la casa, este es un juego personalizable para que pueda sentirse como un a
Detector de temperatura DIY

Detector de temperatura DIY

Ahora usted puede construir a su propio monitor de temperatura utilizando una placa Arduino. El circuito es una combinación de una placa Arduino UNO, sensor de temperatura LM35 y display de 7 segmentos. Mostrará la temperatura en el segmento de 7 gra
Automático regulador persiana Horizontal accionado Solar

Automático regulador persiana Horizontal accionado Solar

Empecé este proyecto porque tenemos algunas persianas horizontales situados en una alta ventana sobre la puerta principal de nuestra casa. Esta ventana está orientada al sur, y aquí en Colorado, significa un montón de sol. Sería bueno tener esa luz d
Una breve historia del tiempo

Una breve historia del tiempo

"La gente no entiende a tiempo. Es no lo que crees que es. - La gente asume que el tiempo es una progresión estricta de causa a efecto... pero en realidad, desde una perspectiva no lineal, no subjetiva, es más como una bola grande de wibbly-wobbly...
Haz de tu ADVERTENCIA de culo gritando dispositivo

Haz de tu ADVERTENCIA de culo gritando dispositivo

Resolución de año nuevo: no sentarse en mi culo por mucho tiempo. Así que hice un pequeño dispositivo que grita que debo levantarme, cuando me siento por mucho tiempo.Basado en el dispositivo de grabación de este Radioshack , un sensor de inclinación
Temporizador de entrenamiento AB

Temporizador de entrenamiento AB

No te pierdas ni un entrenamiento nuevo! Ahora que el tiempo es cada vez más frío, muchos de nosotros están menos motivados a correr al aire libre o ir al gimnasio. En este caso, tenemos que conseguir creativo con ejercicios que podemos hacer en casa
Torno eléctrico (actualización OFF ON interruptor de encendido ON)

Torno eléctrico (actualización OFF ON interruptor de encendido ON)

te amo mi pequeño pan tornillo lo uso para mi trabajo de reparación y para sostener placas para soldar el único problema es que la prensa sólo se mueve un poco con cada rotación por lo que va de un tablero de circuito pequeño a una gran placa de circ