En mi Arduino, ¿por qué este LED está siempre encendido, aunque le dije que se apagara?

Soy un desarrollador de software que intenta entender cómo funcionan las computadoras a un nivel inferior.

Compré el microcontrolador Arduino Uno y seguí todos los tutoriales de LadyAda.

He notado que el LED (no el LED de encendido) siempre está ENCENDIDO a menos que parpadee, incluso si proporciono el siguiente programa, que borra la memoria y debe apagar el LED:

#include <EEPROM.h>

void setup()
{
  // write a 0 to all 512 bytes of the EEPROM
  for (int i = 0; i < 512; i++)
    EEPROM.write(i, 0);

  // turn the LED on when we're done
  digitalWrite(13, LOW);
}

void loop()
{
}

¿Por qué el LED está siempre encendido? Busqué esto en Google y leí algunas preguntas similares en otro foro como este , pero aún no he encontrado una respuesta.

¿Por qué esperarías que esté apagado? ¿Y a qué te refieres con "a menos que esté parpadeando"? ¿Dónde está el intermitente?
Desgastará la EEPROM si la escribe continuamente, supongo que está bien en su configuración, pero tenga en cuenta el número limitado de escrituras en la EEPROM. No lo hagas a menos que sea absolutamente necesario.
Si desea apagar el LED, reduzca su programa al mínimo absoluto: elimine el forbucle, agregue unpinmode(13,OUTPUT);
@Phil Frost, gracias. Porque lo estoy desactivando aquí: DigitalWrite(13,LOW); tenga en cuenta que soy un principiante, a excepción de gcse electronics hace 15 años.
@hippie, gracias. ¿Podría explicar por qué esto desgastaría la EPROM? El programa viene con el IDE.
@ woo51977 El comentario dice que lo estás encendiendo. "BAJO" no necesariamente significa "APAGADO", dependiendo de cómo esté conectado el LED.
Solo se ejecuta durante la instalación () e inicialmente no me di cuenta de eso. Pero la EEPROM tiene un número limitado de ciclos de programación (100.000) y Arduino es fácilmente capaz de desgastarla en un corto período de tiempo si se escribe una y otra vez.
Eche un vistazo a File => Examples => 01.Basics => Blinky trabaje desde allí para cambiar el comportamiento del LED.
@w0051977 ¿De qué LED está hablando? No es el LED de encendido, ¿correcto?
@Garrett Fogerlie, creo que solo hay dos LED. Una es la luz de encendido. No es la luz de encendido a la que me refiero.
¿Y cuál es el otro LED? ¿Cómo se conecta al microprocesador?
@PhilFrost, el otro LED es solo un indicador de encendido, no está conectado a la MCU. Puede ver mi respuesta original en el historial de edición para ver un ejemplo de cómo está conectado.

Respuestas (3)

Creo que su problema es que no configura ese pin como salida. Use pinMode(13, OUTPUT)para configurar el pin 13 para ser usado como salida digital. Dado que los pines GPIO se pueden usar como entrada o salida de encendido/apagado, debe informar al microcontrolador en qué modo debe configurarse ese pin.

#include <EEPROM.h>
int led = 13;

// the setup routine runs once when you press reset:
void setup() 
{                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);

  // write a 0 to all 512 bytes of the EEPROM
  for (int i = 0; i < 512; i++)
    EEPROM.write(i, 0);

  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
}

void loop() 
{
}

Puede ver el ejemplo básico de Hello World aquí , que pasa por encima del parpadeo del LED del pin 13.

Además, debe tener cuidado al escribir en la EEPROM, como se indica en los comentarios, solo tiene una vida útil de ~ 100k ciclos.

Gracias. Me refiero a A. La declaración en su respuesta no parece apagarlo.
@ w0051977 Actualicé mi respuesta.
Gracias. ¿Podría dar más detalles sobre lo que quiere decir con: "debe tener cuidado al escribir en la EPROM"? Compré esto como un tablero para "jugar" con el fin de mejorar mi comprensión. ¿No tendría que escribir en la EPROM cada vez que creo un programa en c?
@w0051977 Los AVR de Atmel tienen 3 tipos diferentes de memoria: Flash, EEPROM y RAM. Normalmente, cuando programa la placa, solo está escribiendo en la memoria Flash del AVR, por lo que la EEPROM permanece prácticamente intacta. También hay un cargador de arranque en el área de Flash, su programa se agrega al Flash después del cargador de arranque. El cargador de arranque le permite programar el procesador Atmega a través de serie (o USB a serie). Pero no tenga miedo de jugar con él, solo tenga en cuenta que tiene una vida útil limitada.
Gracias. El programa en su respuesta apagó el LED.
@ w0051977 lo apagó digitalWrite(led, HIGH)o lo usó digitalWrite(led, LOW)?
Cambié esa declaración a BAJA.

En realidad, nadie ha respondido a la pregunta. ¿Por qué el LED solo se apaga cuando el pin 13 está configurado en SALIDA con escritura digital BAJA? Claro, entiendo que en el modo INPUT-PULLUP se suministra voltaje al pin a través de una resistencia pull up que, en teoría, puede hacer que el LED brille tenuemente. Pero la realidad es que el LED brilla intensamente cuando el pin 13 es una ENTRADA, baja o alta. Si el pin 13 está configurado en INPUT/LOW (que es el valor predeterminado en el encendido), ¿de dónde proviene el voltaje y la corriente para controlar el LED? Y que nadie se atreva a hablar mal de la resistencia pull-up otra vez. Como dije, el LED es brillante independientemente de si el pin 13 es ENTRADA BAJA o ENTRADA ALTA.

Parece que el UNO r3 funciona de manera diferente a las versiones anteriores. Esquema REF: http://arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf El pin 13 es una entrada para un amplificador operacional. Si hay un voltaje en el pin 13, el amplificador operacional coincidirá con ese voltaje en su salida que impulsa el LED. Debido a que los pines de ENTRADA tienen una alta impedancia, sin una resistencia desplegable, su voltaje flotará, o tal vez haya una fuga minúscula del microcontrolador y sin una resistencia desplegable, habrá voltaje en el pin. Las entradas del amplificador operacional tienen una impedancia infinita teórica.

Esta es una mejora de diseño. Con la versión anterior, no podía usar el pin 13 como INPUT-PULLUP porque el voltaje solo sería de 1,7 V porque el LED estaba drenando la corriente que llegaba a través de la resistencia pull-up. Con el UNO R3, el amplificador operacional no drenará la corriente pull-up, lo que nos permite configurar el pin 13 como INPUT_PULL-UP. Sin embargo, el Pro-mini todavía tiene el diseño antiguo y, si desea utilizar el pin 13 como INPUT-PULLUP, debe quitar la resistencia de la placa.

Solo para tu información. Hay una pila dedicada a Arduino arduino.stackexchange.com
Esta debería ser la respuesta aceptada. La pregunta era "por qué" está pasando algo. La otra respuesta solo muestra una solución.

Todos los que tengan problemas con L (pin 13) en su Arduino Uno, pongan este código tal como está en una pantalla en blanco en la ventana IDE. Resolverá el problema.


const int led = 13;

void setup() {
  pinMode(led, OUTPUT);
}

void loop() {
  digitalWrite(led,LOW);
}

Espero que esto ayude :)