LED y resultados extraños de varios pinModes de Arduino

1

Actualmente estoy reutilizando un antiguo proyecto Arduino, que consistía en varios LED súper brillantes conectados de acuerdo con el siguiente esquema:

La misma configuración se repite con los pines 3, 5, 6 (y no se muestra para mantener las cosas simples).

Estaba controlando las luces a través de una serie y logré PWM sin ningún problema.

Para mi proyecto actual, quiero trabajar con el código cargado a través del IDE de Arduino. Seguí obteniendo resultados extraños cuando intentaba hacerles PWM y traté de simplificar mi código hasta que llegué a los siguientes tres casos de prueba:

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

void loop() {
    digitalWrite(6, HIGH);
    delay(500);
    digitalWrite(6, LOW);
    delay(500);
}

Resultado esperado: las luces conectadas al pin 6 parpadean.

Resultado real: las luces parpadean una vez y no hacen nada.

void setup() {
    /* pinMode(6, OUTPUT); */
}

void loop() {
    digitalWrite(6, HIGH);
    delay(500);
    digitalWrite(6, LOW);
    delay(500);
}

Resultado esperado: no debería pasar nada.

Resultado real: no pasa nada.

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

void loop() {
    digitalWrite(6, HIGH);
    delay(500);
    digitalWrite(6, LOW);
    delay(500);
}

Resultado esperado: no debería pasar nada.

Resultado real: las luces conectadas al pin 6 parpadean. Espera, qué ?

Es posible que mi solución de cableado no sea la ideal, pero funcionó cuando estaba enviando instrucciones por serie. ¿Alguna idea sobre qué podría causar este comportamiento?

    
pregunta Andrey

1 respuesta

6

En Arduino, digitalWrite tiene dos propósitos diferentes:

  • Si se utiliza mientras pinMode está configurado en ENTRADA, el uso de digitalWrite (pin, HIGH) habilita las resistencias de pull-up débiles internas (20 k ohmios) en el pin respectivo.
  • Si se usa mientras pinMode está configurado en SALIDA, digitalWrite hace lo obvio, establece el pin respectivo en alto o bajo según lo esperado.

Por lo tanto, no establecer explícitamente pinMode (como sucede en su segundo y tercer caso de prueba) da como resultado uno de dos posibles resultados, dependiendo de la última configuración de pinMode, o su valor predeterminado en el encendido, INPUT.

Entonces, sin el pinMode (pin, OUTPUT), su código digitalWrite habilita y deshabilita las resistencias débiles de pull-up, lo que aumenta y disminuye el voltaje en la base de los transistores. Este es el comportamiento esperado , y dependiendo de los parámetros del transistor y cualquier otro circuito adicional, el circuito del emisor / colector debe conducir (o no) en función de esto.

El factor crítico faltante aquí es la base del voltaje que se ve en la base de cada transistor: esto es relativo a su emisor, por lo tanto, para cualquier evaluación de caso de prueba consistente, la conexión a tierra del emisor en su circuito debe estar conectada al Arduino suelo.

Si los emisores no comparten una base común con la placa Arduino, el voltaje de la base es totalmente arbitrario, y la única relación que se mantiene para este diseño se define por la presencia (y la corriente) a través de las resistencias de pull-up.

En el caso de uso de la conexión de datos en serie donde las cosas funcionaban satisfactoriamente antes, la razón más probable es que el cable en serie (o su blindaje) estaba proporcionando una conexión a tierra que era común con la tierra de la fuente de alimentación: No Un diseño ideal, pero funcionó por casualidad.

    
respondido por el Anindo Ghosh

Lea otras preguntas en las etiquetas