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.
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
???
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.
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);
}
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…
Hola,
Lo compilé con la version 8.1 y se passo bien.
Muchas gracias por tu ayuda.
Thanks for an idea, you sparked at thought from a angle I hadn’t given thoguht to yet. Now lets see if I can do something with it.
+1 ))
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
I genuinely enjoy looking at on this site, it has got wonderful posts .
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.
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!
Awesome post.
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
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.
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.
I like the helpful info you provide in your articles. I’ll
bookmark your weblog and check again here regularly. I’m quite sure
I will learn plenty of new stuff right here! Best of luck for the next!
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.
I added a new list today. I’m going to try to find new sites in a slightly different way. Read all about it by clicking the link above.
I hope you all have a great week. I’ve added a new list. This is the biggest list so far.
I’ve just added a fresh new list. This is by far the biggest list to date. I hope you all are having a great week. Take care and happy link building.
I hope you all are having a great weekend. I added a new list. This one is smaller, but still useful. I think the next one will be bigger.
I just updated my site with a new list. I hope you all are having a great week.
comment
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.