Fuente de alimentación con LCD PINGUINO

Me puse a pensar en reconstruir mi fuente de alimentación y se me ocurrió que porque no hacerla con PINGÜINO…

Tenía un LCD de 2×16… y pensé, es suficiente para poder ver el voltaje y la corriente consumida… además más adelante puedo hacer un control para subir o bajar la tensión de salida…

El circuito lo estoy terminando, en cuanto lo tenga lo subo.

Pero por ahora lo dejamos en el display…

En este caso mide la tensión (voltaje) que le llega a PINGÜINO y utilizando la ley de OHM y una resistencia de 1 OHM 1Watt … he realizado una medición del consumo del LCD…

He utilizando la idea del display de 4bits… para mi suficiente. El código está en la web… modificando un poco este código y agregando parametrizaciones de valores digitales, he podido llegar a una lectura casi real del voltaje leído.

Ya que nuestro puerto analógico lee el voltaje en su conector, con una división digital de 10bits. O sea “en criollo”, que donde dice 1023 en realidad quiere decir 5volts… y donde lee 512 quiere decir 2,5volts. Con estos datos y una regla de tres simple… se obtiene.

[sourcecode language=”py”]
volt0=analogRead(16) /16*78;
obteniendo de las lecturas por ejemplo:
1023 = 4980mVolts = 4,98Volts
512 = 2490mVolts = 2,49Volts
256 = 1240mVolts = 1,24Volts
128 = 0640mvolts = 0,64Volts
[/sourcecode]

Y obtenemos un valor muy similar a la realidad, claro en milivolts. Y con un problema de lectura, porque la librería (FLOW) no nos permite el punto decimal.

Para la corriente (Consumo) he realizado el archi-conocido como diferencia de potenciales a través de una resistencia de 1 OHM, no es exacto y en cuanto pueda lo modifico pero para ver el resultado en pantalla es perfecto…

Lo que hago es tomar dos mediciones, una en cada pata de una resistencia de 1 OHM, la cual se encuentra en serie con la fuente de alimentación, por ende la diferencia en la caída de tensión en esta resistencia, es proporcional a la corriente suministrada.

[sourcecode language=”py”]
amp1=analogRead(13);
amp2=analogRead(15);
amp1=amp1/16*78;
amp2=amp2/16*78;
if (amp1>amp2){
amp0 = amp1-amp2;
}
else{
amp0 = 0;
}
[/sourcecode]

También he utilizado un machete que he encontrado en la web de hackinglab para convertir los datos.

El código completo es:

[sourcecode language=”py”]

// POWER SUPPLY LCD
//
// Author: walii.es walterleonardo@gmail.com
//
#define LCD_RS 8
#define LCD_E 9
uchar text1;
uchar text2;
void lcdPulseEnable() {
digitalWrite(LCD_E, HIGH);
delayMicroseconds(1);
digitalWrite(LCD_E, LOW);
delayMicroseconds(1);
}
void lcdWriteNibble(uchar c){
int i;
for(i=0; i<4; i++){
digitalWrite(4+i, (c >> i) & 0x01);
}
lcdPulseEnable();
}
void lcdWriteByte(uchar c, int mode) {
digitalWrite(LCD_RS, mode);
lcdWriteNibble(c >> 4);
lcdWriteNibble(c);
}
void lcdSendControl(uchar c) {
lcdWriteByte(c, LOW);
}
void lcdSendData(uchar c) {
lcdWriteByte(c, HIGH);
}
void lcdSetAddress(uchar line, uchar column) {
lcdSendControl( 0x80 + 0x40 * (line – 1) + (column – 1));
}
void lcdPrint(char *string) {
int i;
for( i=0; string[i]; i++) {
lcdSendData(string[i]);
}
}
void Int2Char(char *Result, unsigned int ToConvert)
{
uchar Digit[5];
int c;
unsigned int H1,H2,H3;
H1=ToConvert;
H2=0;
H3=10000;
for (c=4;c>=0;c–)
{
Digit

[c][/c]

= H1/H3;
H1=ToConvert-Digit

[c][/c]

*H3-H2;
H2=H2+Digit

[c][/c]

*H3;
H3=H3/10;
Result[4-c]=Digit

[c][/c]

+48;
}
}
void lcdInit() {
int i;
pinMode(LCD_E, OUTPUT);
digitalWrite(LCD_E, LOW);
pinMode(LCD_RS, OUTPUT);
digitalWrite(LCD_RS, LOW);
for(i = 4; i < 8; i++) {
pinMode(i, OUTPUT);
}
delay(20);
lcdWriteNibble(0x03);
delayMicroseconds(1);
lcdWriteNibble(0x03);
delayMicroseconds(1);
lcdWriteNibble(0x02);
delayMicroseconds(200);
lcdSendControl(0x28); // 4 Bit, 2 Lines
delayMicroseconds(1);
lcdSendControl(0x0C); // Display On
delayMicroseconds(1);
lcdSendControl(0x01); // Clear display
delay(2);
lcdSendControl(0x02); // Cursor home
delay(2);
}
uchar line1[] = "Pinguino MADRID";
uchar line2[] = "Voltimetro walii.es";
uchar line3[] = "walii.es";
uchar line4[] = "Voltaje Consumo";
uchar volts[] = "mV ";
uchar amper[] = "mA ";
uchar Amp[5];
uchar Volt[5];
void setup() {
lcdInit();
}
void loop() {
int amp1;
int amp2;
unsigned int amp0;
unsigned int volt1;
amp1=analogRead(13);
amp2=analogRead(15);
amp1=amp1/16*78;
amp2=amp2/16*78;
if (amp1>amp2){
amp0 = amp1-amp2;
}
else{
amp0 = 0;
}
Int2Char(Amp,amp0);
volt1=(float)analogRead(16); //QUITAR ESTE FLOAT SI SE QUIERE COMPILAR EN B9.01
volt1=volt1/16*78;
Int2Char(Volt,volt1);
lcdSendControl(0x01);
delay(2);
lcdSendControl(0x02);
delay(2);
lcdSetAddress(1, 1);
lcdPrint(line1);
lcdSetAddress(2, 1);
lcdPrint(Volt);
lcdSetAddress(2, 6);
lcdPrint(volts);
lcdSetAddress(2, 9);
lcdPrint(Amp);
lcdSetAddress(2, 14);
lcdPrint(amper);
delay(1000);
lcdSendControl(0x01);
delay(2);
lcdSendControl(0x02);
delay(2);
lcdSetAddress(1, 1);
lcdPrint(line4);
lcdSetAddress(2, 1);
lcdPrint(Volt);
lcdSetAddress(2, 6);
lcdPrint(volts);
lcdSetAddress(2, 9);
lcdPrint(Amp);
lcdSetAddress(2, 14);
lcdPrint(amper);
delay(1000);
}

[/sourcecode]

NOTA: para que el código funcione en la ultima version de PINGUINO la beta9.01 
necesitamos quitar el (float) de la linea 111, utilizada para el analogRead... 
que parece que hay un problema en la nueva version con las variables... 
lo voy a estudiar... esta version la había compilado en el IDE 8 por eso 
no vi el inconveniente... lo siento.

26 Replies to “Fuente de alimentación con LCD PINGUINO”

  1. ola, tengo varios problemas en compilation, quien me puede ayudar !!!! GRACIAS.
    D:\PINGUINO\pinguinobeta9-01\source\/user.c:115: warning 112: function ‘analogRead’ implicit declaration
    D:\PINGUINO\pinguinobeta9-01\source\/user.c:115: error 101: too many parameters
    D:\PINGUINO\pinguinobeta9-01\source\/user.c:115: error 47: indirections to different types assignment
    from type ‘void’
    to type ‘unsigned-int fixed’
    D:\PINGUINO\pinguinobeta9-01\source\main.c:77: warning 197: keyword ‘interrupt’ is deprecated, use ‘__interrupt’ instead
    D:\PINGUINO\pinguinobeta9-01\source\main.c:110: warning 197: keyword ‘interrupt’ is deprecated, use ‘__interrupt’ instead
    erreur en compilant le fichierD:\PINGUINO\pinguinobeta9-01\examples\FUENTE\Fuente

  2. ???
    no entiendo que quieres hacer???
    respondeme algunas preguntas de rigor.
    que codigo estas queriendo ejecutar???
    que version de PYTHON tienes y donde se encuentra instalada.?
    copia el codigo y asi puedo corregirtelo y verificar que no tenga errores…

    saludos.

  3. ola,
    El codigo es el sigiente, (Fuente de alimentación con LCD PINGUINO) copiado de aqui mismo.
    uso pinguino beta 9-1 (el ultimo de JP Mandon) tengo Windows2000 y PYTHON 25.
    otros ejemplos se ejecutan bien con mis instalasion. Yo pinso que algunas instructiones (como analogRead) estan mal escritas ..

    Perdona mi escritura (soy frances)
    Gracias.

    El código completo es:
    // POWER SUPPLY LCD
    //
    // Author: walii.es walterleonardo@gmail.com
    //
    #define LCD_RS 8
    #define LCD_E 9
    uchar text1;
    uchar text2;
    void lcdPulseEnable() {
    digitalWrite(LCD_E, HIGH);
    delayMicroseconds(1);
    digitalWrite(LCD_E, LOW);
    delayMicroseconds(1);
    }
    void lcdWriteNibble(uchar c){
    int i;
    for(i=0; i> i) & 0x01);
    }
    lcdPulseEnable();
    }
    void lcdWriteByte(uchar c, int mode) {
    digitalWrite(LCD_RS, mode);
    lcdWriteNibble(c >> 4);
    lcdWriteNibble(c);
    }
    void lcdSendControl(uchar c) {
    lcdWriteByte(c, LOW);
    }
    void lcdSendData(uchar c) {
    lcdWriteByte(c, HIGH);
    }
    void lcdSetAddress(uchar line, uchar column) {
    lcdSendControl( 0x80 + 0x40 * (line – 1) + (column – 1));
    }
    void lcdPrint(char *string) {
    int i;
    for( i=0; string[i]; i++) {
    lcdSendData(string[i]);
    }
    }
    void Int2Char(char *Result, unsigned int ToConvert)
    {
    uchar Digit[5];
    int c;
    unsigned int H1,H2,H3;
    H1=ToConvert;
    H2=0;
    H3=10000;
    for (c=4;c>=0;c–)
    {
    Digit[c] = H1/H3;
    H1=ToConvert-Digit[c]*H3-H2;
    H2=H2+Digit[c]*H3;
    H3=H3/10;
    Result[4-c]=Digit[c]+48;
    }
    }
    void lcdInit() {
    int i;
    pinMode(LCD_E, OUTPUT);
    digitalWrite(LCD_E, LOW);
    pinMode(LCD_RS, OUTPUT);
    digitalWrite(LCD_RS, LOW);
    for(i = 4; i amp2){
    amp0 = amp1-amp2;
    }
    else{
    amp0 = 0;
    }
    Int2Char(Amp,amp0);
    volt1=(float)analogRead(16);
    volt1=volt1/16*78;
    Int2Char(Volt,volt1);
    lcdSendControl(0x01);
    delay(2);
    lcdSendControl(0x02);
    delay(2);
    lcdSetAddress(1, 1);
    lcdPrint(line1);
    lcdSetAddress(2, 1);
    lcdPrint(Volt);
    lcdSetAddress(2, 6);
    lcdPrint(volts);
    lcdSetAddress(2, 9);
    lcdPrint(Amp);
    lcdSetAddress(2, 14);
    lcdPrint(amper);
    delay(1000);
    lcdSendControl(0x01);
    delay(2);
    lcdSendControl(0x02);
    delay(2);
    lcdSetAddress(1, 1);
    lcdPrint(line4);
    lcdSetAddress(2, 1);
    lcdPrint(Volt);
    lcdSetAddress(2, 6);
    lcdPrint(volts);
    lcdSetAddress(2, 9);
    lcdPrint(Amp);
    lcdSetAddress(2, 14);
    lcdPrint(amper);
    delay(1000);
    }

  4. HOla… gracias por tus preguntas… el problema es que lo he compilado con la version IDE 8… y por lo visto la 9.01 tiene problemas con las funciones matematicas… y no es compatible con el (FLOAT) de la linea de analogRead…

  5. Hey there just wanted to give you a quick heads up. The text in your article seem to be running off the screen in Ie. I’m not sure if this is a formatting issue or something to do with web browser compatibility but I figured I’d post to let you know. The style and design look great though! Hope you get the problem solved soon. Thanks

  6. Thanks a ton for your time and effort to have had these things together on this site. Emily and that i very much treasured your insight through the articles over certain things. I understand that you have a number of demands on your own program hence the fact that a person like you took equally as much time like you did to steer people like us by way of this article is definitely highly prized.

  7. Pretty great post. I simply stumbled upon your blog and wanted to mention that I’ve really enjoyed surfing around your weblog posts. In any case I’ll be subscribing in your rss feed and I hope you write once more very soon!

  8. Una duda “electrónica”, la alimentación del pic no es lo que coge como referencia de la tensión máxima, quiero decir que si tu alimentas a 5V el pic y le pones la alimentación a uno de los pines analógicos no leerás siempre 1023? (yo tenía entendido que para hacer esto se ponían un par de resistencias para dividir la tensión y un zener para establecer la tensión de referencia… que conste que no he probado ninguna de las dos cosas nunca).

    salu2

  9. No realmente… el 1023 es la tensión de alimentación… no importa que sea 5, 3 o 4.5 1023 será siempre esa tensión… en un puerto analógico.
    para tener un valor de referencia tienes que generarlo tu… yo lo que suelo hacer es poner un diodo común como si fuese un zener, en una patilla analógica, este diodo con una resistencia grande, de por ejemplo 100Kohm, esto genera en la patilla analógica una tensión de 0.7 volts… y es muy estable.
    con esta tensión tienes un valor fijo de cerca de 120 dentro de un rango de 0 a 1023. Luego tu haces las cuentas… pero es lo mejor… si tomas de referencia el valor de alimentación, este puede bajar por consumo, y terminas leyendo 1023 y quizás tienes 4 o 4.3 volts… y el pic sigue funcionando pero tus lecturas se trastocan.

  10. vale, vale… es que cuando leí el artículo me pareció que era conectarlo y ya está….

    Yo tenía la idea de que se ponía un par de resistencias (una conectada a la fuente de alimentación, la otra conectada a masa y ambos conectados a una patilla analógica), realmente se hacía un divisor de tensión… y luego en la línea vref metías el zener una tensión rebajada con el zener… por que de esta forma era muy estable…

    estaría bien que hubiese estado el esquema (para no haberte dejado este comentario 🙂

    Gracias por la explicación.

  11. I simply want to say I am just newbie to weblog and seriously liked your web site. Most likely I’m likely to bookmark your blog post . You amazingly come with tremendous articles. With thanks for revealing your webpage.

  12. I have learned some new things from your internet site about desktops. Another thing I’ve always assumed is that laptop computers have become an item that each household must have for some reasons. They offer convenient ways in which to organize the home, pay bills, go shopping, study, hear music and in some cases watch television shows. An innovative method to complete every one of these tasks is with a mobile computer. These computer systems are portable ones, small, powerful and lightweight.

  13. Some tips i have observed in terms of pc memory is always that there are specifications such as SDRAM, DDR and so on, that must fit the specs of the mother board. If the personal computer’s motherboard is reasonably current while there are no os issues, changing the storage space literally requires under an hour. It’s one of the easiest computer system upgrade types of procedures one can visualize. Thanks for revealing your ideas.

  14. Thanks for the recommendations you have provided here. Something else I would like to state is that pc memory requirements generally go up along with other developments in the engineering. For instance, if new generations of processors are introduced to the market, there is usually an equivalent increase in the dimensions preferences of all laptop or computer memory and hard drive space. This is because the program operated by way of these processor chips will inevitably increase in power to take advantage of the new technological innovation.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.