¿Pin como entrada (para un interruptor) y salida (para LED) con ATmega32U4?

Ya hay varias preguntas cercanas a este tema, pero son para otra familia de µC, o voltajes analógicos de lectura objetivo u otros casos especiales.

Así que aquí va: me gustaría leer un botón y controlar un LED desde el mismo pin de E/S en el ATmega32U4. ¿Hay algo malo con:

  • Pin => resistencia de 22K => botón => GND
  • Pin => Resistencia LED => LED => GND

Luego, por supuesto, el pin se pondría en modo de entrada (con pullup interno) muy a menudo, y estaría en modo de salida la mayor parte del tiempo.

Por lo que puedo decir, el pullup interno es 50-100K en ese µC, por lo que los 22K con el botón deberían poder hundir eso lo suficiente.

En el modo de salida, cuando no se presiona el botón, todo es normal; si se presiona el botón, esto agregará una ruta a través de 22K a GND, lo que podría o no hacer que el LED se oscurezca un poco; de todos modos, en mi aplicación no importaría en absoluto cómo se ve el LED mientras se presiona ese botón.

¿Alguna posibilidad de dañar algo? ¿Algún escollo que no sea obvio?

Puede calcular fácilmente el voltaje en el pin en todas las situaciones y luego ver si estos voltajes se ajustan a la definición de 1 lógico y 0 lógico para MCU. No creo que dañes nada, puede que simplemente no funcione.

Respuestas (2)

No hagas esto de la forma en que lo describes. Como entiendo, su circuito se vería así:

esquemático

simular este circuito : esquema creado con CircuitLab

Ahora, suponga que el GPIO está en modo de entrada (alta impedancia) y el botón no está presionado. El voltaje en el GPIO será aproximadamente el voltaje directo del LED. De hecho, aunque habrá muy poca corriente, hay un camino a través de Rpullup-R2-D1, y habrá alrededor de 1,8 V ~ 2,5 V (dependiendo del tipo de LED que esté usando) en el pin MCU, que significa que el nivel lógico estará fuera de las especificaciones (depende del voltaje de suministro que esté usando, pero lo más probable es que esté entre los límites de voltaje alto y bajo). Por lo tanto, la MCU no se comportará de manera consistente y realmente no podrá saber si el botón está presionado o no. La MCU también puede consumir energía excesiva en este caso.

Esto es lo que se me ocurrió:

esquemático

simular este circuito

Debe conducir el GPIO a bajo nivel para encender el LED, o configurarlo en alta impedancia para apagar el LED y, finalmente, leer el estado del botón. El GPIO nunca debe ser elevado de forma activa desde el software, porque si se presiona el botón al mismo tiempo, el pin se cortocircuitará.

El inconveniente obvio del circuito anterior es que, cuando se presiona el botón, el LED estará completamente encendido. Pero parece no ser un problema en su caso, y aparte de esto, este circuito es simple, seguro para la MCU (si sigue la regla anterior) y garantiza niveles de entrada correctos.

Suena bien. Gracias. Supongo que no hay una manera fácil de evitar ese atajo potencial (en caso de errores de programación), o lo habrías mencionado...
En realidad, hay una manera, pero requiere componentes externos adicionales. Mire en las revisiones anteriores de esta publicación, el circuito sugerido con un transistor es seguro en todos los aspectos, pero más complejo. Cambié porque pensé que no agregaba valor.
Gracias; respuesta aceptada. Me parece información digna de un libro de texto. Me resultaría útil si recuperara su variante de transistor de la revisión anterior en caso de que alguien necesite esa protección.
@AnoE Tienes razón, con algunas modificaciones, puede valer la pena. Lo haré en un rato.
Esto ofrece dos opciones, 'modo pull-up de entrada', donde el LED está encendido y se puede detectar el botón, y modo 'salida baja', donde el LED está apagado. ¿No hay una forma sensata de apagar el LED y detectar el botón? Incluso en el modo transistor este parece ser el caso; Supongo que el botón puede encenderse de vez en cuando para detectarlo.
@tedder42 en el modo pullup de entrada, el LED está APAGADO, excepto cuando se presiona el botón. En salida baja, el led está encendido. Entonces, cuando detecta, el estado del LED en realidad depende del botón. Si esto no se ajusta a sus requisitos, le sugiero que publique otra pregunta que indique exactamente lo que desea lograr. Será mucho más apropiado.

La solución simple es colocar la resistencia LED, el LED y el botón en una fila, y conectar la E/S entre el LED y el botón.

La E/S está configurada para abrir la salida de drenaje, lo que significa que solo se activa el transistor de extracción. Ahora puede leer el pin para probar el botón mientras el circuito de salida está flotando y encender el LED poniendo el circuito de salida en bajo.