Poco a poco me estoy metiendo en los circuitos y armé un atenuador LED PWM. El led es impulsado por este circuito:
Estoy manejando el PWM a través de un dispositivo BLE separado que asigna una entrada de usuario de [0, 100] a un valor de 8 bits para el PWM de arduinos [0, 255]. Aquí está el código:
int led = 9; // the PWM pin the LED is attached to
int intR;
int t;
void setup() {
Serial.begin(9600);
Serial.println("serial connected...");
// declare pin 9 to be an output:
pinMode(led, OUTPUT);
analogWrite(led, 0);
}
void loop() {
if (Serial.available() > 0) {
intR = Serial.parseInt();
t = map(intR, 0, 100, 0, 255); //remaps intR from [0, 100] -> [0, 255] to scale to PWM
Serial.print(intR);
Serial.print(" -> ");
Serial.print(t);
Serial.println("");
analogWrite(led, t);
}
}
Cada vez que configuro el valor de atenuación en 100 (100 % del ciclo de trabajo), el LED brilla con bastante intensidad, pero cuando configuro el valor en 0, el LED brilla probablemente con un brillo del 60 %.
¿Qué tendría que hacer para hacer una transición suave del LED de un estado completamente APAGADO a un estado completamente ENCENDIDO?
EDITAR:
Después de una discusión en los comentarios, actualicé mi código y circuito y algo parece estar mal. El siguiente código y el par esquemático me brindan el mejor rango de atenuación (visualmente, tal vez 10-100% de salida total) y funciona en múltiples mosfets de mi paquete.
Nuevo código y esquema del circuito:
int led = 9; // the PWM pin the LED is attached to
int intR;
void setup() {
Serial.begin(9600);
Serial.println("serial connected...");
// declare pin 9 to be an output:
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
}
void loop() {
if (Serial.available() > 0) {
intR = Serial.parseInt(); //reads the next valid integer
Serial.print(intR);
Serial.println("");
if (intR <= 255 && intR >= 0) {
if (intR == 0) {
digitalWrite(led, LOW);
} else {
analogWrite(led, intR);
}
}
}
}
Mis MOSFET están etiquetados como P30N06LE, que corresponden a esta hoja de datos RFP30N06LE . Y a menos que mis fetos se hayan hecho incorrectamente, mi drenaje realmente va directamente a GND, y mi LED negativo se alimenta a la fuente. El problema que tengo ahora es doble: 1) comprender por qué mi circuito funciona de esta manera y 2) lograr que mi LED se apague por completo al configurar el pin en BAJO.
Con la configuración anterior, cuando el pin 9 está configurado en BAJO, el LED tiene un brillo de ~ 10%, y cuando retiro físicamente el cable del pin 9 de arduino, el LED se apaga por completo. Si luego conecto el cable en varios pines sin alimentación, el LED brilla con un brillo bajo, lo que indica que hay suficiente voltaje para alimentar el fet. ¿Cómo puedo hacer que el led se apague por completo?
¿Cómo estás convirtiendo 0-100 a 0-255? Parece que estás usando la función de mapa externo . Todo se explicaría si la map
función estuviera "funcionando mal" y devolviendo 155-255 para una entrada de 0-100. Dado que 155 es el 60% de 255. Tal vez esa función no funcione de la manera que crees que funciona.
¿Por qué no simplemente ir?t = intR * 255 / 100?
De hecho, ¿por qué incluso ingresar una escala de 0-100, pensar en binario e ingresar una escala de 0-255?
void loop() { if (Serial.available() > 0) { intR = Serial.parseInt(); //reads the next valid integer Serial.print(intR); Serial.println(""); if (intR <= 255 && intR >= 0) { analogWrite(led, intR); } } }
Para solucionar problemas, quitaría de la ecuación el valor de serie recibido. solo configurat = 0;
Esto es lo que sospecho que puede estar pasando.
Esta respuesta requirió demasiadas suposiciones porque los valores recibidos no fueron explicados. Pero es una posibilidad si el MOSFET funciona correctamente.
Tengo un módulo HM10 BLE conectado al arduino. Estoy usando el escáner BLE de la aplicación de Android (para probar). Una vez que me conecto, envío una solicitud de escritura a la característica personalizada del HM10. El arduino lee los bits y analiza el número entero y luego envía los datos directamente al pin PWM.
Si entiendo correctamente, está utilizando un solo carácter ASCII serial para sus valores PWM.
Lo que no explicas es los posibles valores que se reciben en el puerto serie.
Un cero, en ASCII, sería un carácter NULL. Donde un "0" sería 32 y 100 sería "d". Suponiendo que está utilizando valores ASCII de 7 caracteres y esa es la razón por la que está utilizando valores de nivel de atenuación de 0-100.
Eso tendría sentido que en realidad esté enviando un "0" (valor de 32) en lugar de NULL (valor cero). Tu ojo podría malinterpretar fácilmente la diferencia entre el 32 % y el 60 % de intensidad luminosa.
No entiendo por qué analogWrite(led, t);
está dentro del
if (Serial.available() > 0){}
.
Solo podía enviar un solo carácter para cambiar el nivel de atenuación si
analogWrite(led, t);
no estaba entre if
corchetes.
Creo que estás enviando innecesariamente un flujo continuo de caracteres.
Serial.parseInt
. ¿Las bibliotecas de arduino no analizan correctamente el valor de texto recibido de un dispositivo ble?Serial.parseInt()
lee el valor ASCII del búfer de flujo y lo analiza en el entero lógico y no en el valor ordinal. Si el búfer contenía "5,220,70", entonces la primera llamada a Serial.parseInt()
devolverá el número entero 5, la segunda llamada devolverá 220. En mi código actualizado no estoy enviando ningún valor separado por comas, por lo que la única llamada a Serial.parseInt()
debería devolver el valor correcto valor.
τεκ
gregorioneal
broma
Andy alias
τεκ
gregorioneal
gregorioneal
broma
gregorioneal
broma
gregorioneal
broma
gregorioneal
τεκ
gregorioneal