Sé que en otros modelos no existe ese problema y si puede conectarse así sin ningún problema, en mi modelo no, el mío se quema si no se desuelda. No solo no se ve nada sino que además se quemaría.
En esta página explico lo que tuve que desoldar en mi modelo QC 12864B -1 se hace en un momento, deja libres 5 ó 6 pines frente a la conexión en paralelo, no hay perdidas aparentes de velocidad y puedes seguir conectandolo en paralelo si quieres igual que siempre. En el tiempo que yo llevo usandolo no he notado ningún inconveniente, por lo que me pregunto porque lo venderán inutilizado para la conexión en serie. :)
IMPORTANT! For this LCD to work using this method, you need to de-solder R9 and R11 at the back panel of the LCD.
La medición máxima es hasta 5V, puede protegerse el arduino con un zener, Para medidas mayores debe usarse un divisor resistivo.
El conmutador permite cambiar entre dos modos de funcionamiento, osciloscopio o monitor, su resistencia es de 100Kohm.
Los pulsadores sirven para aumentar o disminuir el tiempo de muestreo, la resistencia es de 10Kohm, aunque en este caso si no se pone no pasa nada.
El potenciometro controla el contraste del LCD.
La máxima resolución en modo osciloscópio es de 5,5useg y en modo monitor de .16 seg.
El programa está basado en la librería u8glib , que puede descargarse aquí y permite dibujar gráficos no sólo en el
QC12864, sino también en otros muchos modelos, tanto en conexión serie como paralelo.
Modificando el Delay del final el escanéo puede ser ralentizado. La lectura que muestra es la que lee la entrada analógica, esto es entre 0 y 1024 que equivalen de 0 a 5V,
Sketch: DESCARGAR
#include "U8glib.h"
U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 ,7); //For ST7920_128X64 serie
unsigned long sensor;
int x;
int y[130];
boolean monitor;
int y2;
unsigned long ycal;
// unsigned long tpo;
byte punto;
byte y3;
float mx;
byte mc;
byte fc;
int muestreo;
int boton=6;
void setup(void) {
pinMode(3,INPUT);
pinMode(2,INPUT);
pinMode(10,INPUT);
attachInterrupt(0, mas, RISING);
attachInterrupt(1, menos, RISING);
Serial.begin(9600);
}
void loop(void) {
u8g.firstPage();
//
monitor=(digitalRead(10));
muestreo=boton*3;
Serial.println(monitor);
if (monitor==1) { // Osciloscopio
// Prescaler
switch(byte(1+6*float(muestreo/400)))
{
case 0: // =2 Malfuncionamiento
bitWrite(ADCSRA,ADPS2,0); bitWrite(ADCSRA,ADPS1,0); bitWrite(ADCSRA,ADPS0,0);
break;
case 1:
bitWrite(ADCSRA,ADPS2,0); bitWrite(ADCSRA,ADPS1,1); bitWrite(ADCSRA,ADPS0,0);
break;
case 2:
bitWrite(ADCSRA,ADPS2,0); bitWrite(ADCSRA,ADPS1,1); bitWrite(ADCSRA,ADPS0,1);
break;
case 3:
bitWrite(ADCSRA,ADPS2,1); bitWrite(ADCSRA,ADPS1,0); bitWrite(ADCSRA,ADPS0,0);
break;
case 4:
bitWrite(ADCSRA,ADPS2,1); bitWrite(ADCSRA,ADPS1,0); bitWrite(ADCSRA,ADPS0,1);
break;
case 5:
bitWrite(ADCSRA,ADPS2,1); bitWrite(ADCSRA,ADPS1,1); bitWrite(ADCSRA,ADPS0,0);
break;
case 6:
bitWrite(ADCSRA,ADPS2,1); bitWrite(ADCSRA,ADPS1,1); bitWrite(ADCSRA,ADPS0,1);;
break;
}
//Analog Input A0
ADMUX=(1<<ADLAR)|(0<<REFS1)|(1<<REFS0)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
// Lectura de datos
if (muestreo <1 br="" muestreo="" nbsp="" turbo="">
ycal = micros();
y[0] = analogReadFast();
y[1] = analogReadFast();
y[2] = analogReadFast();
y[3] = analogReadFast();
y[4] = analogReadFast();
y[5] = analogReadFast();
y[6] = analogReadFast();
y[7] = analogReadFast();
y[8] = analogReadFast();
y[9] = analogReadFast();
y[10] = analogReadFast();
y[11] = analogReadFast();
y[12] = analogReadFast();
y[13] = analogReadFast();
y[14] = analogReadFast();
y[15] = analogReadFast();
y[16] = analogReadFast();
y[17] = analogReadFast();
y[18] = analogReadFast();
y[19] = analogReadFast();
y[20] = analogReadFast();
y[21] = analogReadFast();
y[22] = analogReadFast();
y[23] = analogReadFast();
y[24] = analogReadFast();
y[25] = analogReadFast();
y[26] = analogReadFast();
y[27] = analogReadFast();
y[28] = analogReadFast();
y[29] = analogReadFast();
y[30] = analogReadFast();
y[31] = analogReadFast();
y[32] = analogReadFast();
y[33] = analogReadFast();
y[34] = analogReadFast();
y[35] = analogReadFast();
y[36] = analogReadFast();
y[37] = analogReadFast();
y[38] = analogReadFast();
y[39] = analogReadFast();
y[40] = analogReadFast();
y[41] = analogReadFast();
y[42] = analogReadFast();
y[43] = analogReadFast();
y[44] = analogReadFast();
y[45] = analogReadFast();
y[46] = analogReadFast();
y[47] = analogReadFast();
y[48] = analogReadFast();
y[49] = analogReadFast();
y[50] = analogReadFast();
y[51] = analogReadFast();
y[52] = analogReadFast();
y[53] = analogReadFast();
y[54] = analogReadFast();
y[55] = analogReadFast();
y[56] = analogReadFast();
y[57] = analogReadFast();
y[58] = analogReadFast();
y[59] = analogReadFast();
y[60] = analogReadFast();
y[61] = analogReadFast();
y[62] = analogReadFast();
y[63] = analogReadFast();
y[64] = analogReadFast();
y[65] = analogReadFast();
y[66] = analogReadFast();
y[67] = analogReadFast();
y[68] = analogReadFast();
y[69] = analogReadFast();
y[70] = analogReadFast();
y[71] = analogReadFast();
y[72] = analogReadFast();
y[73] = analogReadFast();
y[74] = analogReadFast();
y[75] = analogReadFast();
y[76] = analogReadFast();
y[77] = analogReadFast();
y[78] = analogReadFast();
y[79] = analogReadFast();
y[80] = analogReadFast();
y[81] = analogReadFast();;
y[82] = analogReadFast();
y[83] = analogReadFast();
y[84] = analogReadFast();
y[85] = analogReadFast();
y[86] = analogReadFast();
y[87] = analogReadFast();
y[88] = analogReadFast();
y[89] = analogReadFast();
y[90] = analogReadFast();
y[91] = analogReadFast();
y[92] = analogReadFast();
y[93] = analogReadFast();
y[94] = analogReadFast();
y[95] = analogReadFast();
y[96] = analogReadFast();
y[97] = analogReadFast();
y[98] = analogReadFast();
y[99] = analogReadFast();
y[100] = analogReadFast();
y[101] = analogReadFast();
y[102] = analogReadFast();
y[103] = analogReadFast();
y[104] = analogReadFast();
y[105] = analogReadFast();
y[106] = analogReadFast();
y[107] = analogReadFast();
y[108] = analogReadFast();
y[109] = analogReadFast();
y[110] = analogReadFast();
y[111] = analogReadFast();
y[112] = analogReadFast();
y[113] = analogReadFast();
y[114] = analogReadFast();
y[115] = analogReadFast();
y[116] = analogReadFast();
y[117] = analogReadFast();
y[118] = analogReadFast();
y[119] = analogReadFast();
y[120] = analogReadFast();
y[121] = analogReadFast();
y[122] = analogReadFast();
y[123] = analogReadFast();
y[124] = analogReadFast();
y[125] = analogReadFast();
y[126] = analogReadFast();
y[127] = analogReadFast();
mx= (micros() - ycal);
}
else { // muestreo con rapidez alta
muestreo=muestreo-1;
ycal = micros();
for ( punto = 0; punto <= 127; punto++ ) {
y[punto]=analogReadFast();
delayMicroseconds(muestreo);
}
mx= (micros() - ycal);
}
sensor = mx; // tpo muestreo
// fin muestro
/// Estimación frecuencia f= picos/tpo muestreo
mx=0;
for ( punto = 0; punto <= 127; punto++ ) {
mx=max(mx,y[punto]);
}
fc = 0;
mx = mx*.9 ; // Pico > 10%
for ( punto = 0; punto <= 127; punto++ ) {
if ( (mx < y[punto]) && (mc == 0)) {
fc = fc + 1;
mc = 1;
}
if (y[punto] < mx) {
mc = 0;
}
}
} // <-- br="" cierre="" nbsp="" osciloscopio="">
else { // monitoreo del pin A0
mx=millis();
y[128]=0; //media total
x=0;
y[127]=analogRead(A0)/4;
retardo();
ycal=0;
for ( punto = 0; punto <= 126; punto++ ) {
y[punto]=y[punto+1];
ycal=ycal+y[punto];
}
mx=millis()-mx;
y[128]=(ycal+y[127])/128;
} // cierre de monitoreo
/// Dibujar
do {
draw();
} while ( u8g.nextPage() );
// delay(5000); // Para congelar imagen entre muestreo y muestreo.
} // fin loop
void retardo() // retardo monitor
{
if (x<((170*(boton)))) {
y[127]=((analogRead(A0)/4)+y[127])/2;
x=x+1;
delayMicroseconds(35);
retardo();
}
}
/////////////////// GRAFICA
void draw(void) {
// graphic commands to redraw the complete screen should be placed here
// u8g.drawFrame(0,0,128,56); //marco exterior
for ( punto = 21; punto <= 106; punto = punto + 42 ) { // punto vertical cada 1V
u8g.drawPixel(punto, 10); u8g.drawPixel(punto, 21); u8g.drawPixel(punto, 32); u8g.drawPixel(punto, 43);
}
u8g.setFontPosTop();
// Grafica de la onda
y3 = 55 - 28 * float(y[0]) / 128; /// 54/1024
for ( punto = 1; punto <= 127; punto++ ) {
ycal = 55 - 28 * float(y[punto]) / 128; /// 54/1024
u8g.drawLine(punto - 1, y3, punto, ycal);
y3 = ycal;
}
// Leyenda
u8g.setFont(u8g_font_04b_03);
u8g.setPrintPos(0, 56);
if (monitor==0){
u8g.print(String(float(y[127])*5/256) +"V. /"+ String(float(.16+mx/1000)) + " Seg. Med: "+String(float(y[128])*5/256)+"V."); /// x5V
}
else {
u8g.print( String(float((sensor+.5)/1000)) + " mSeg. /Estm: " + String(long(float(1000000*fc/(sensor+.5) ))) + " Hz ");
}
}
//Read ADC
int analogReadFast()
{-->1>
ADCSRA|=(1<<ADSC);
// ADSC is cleared when the conversion finishes
while (bit_is_set(ADCSRA, ADSC));
return ADCH;
}
void mas() // aumentar tpo de muestreo
{
if (boton<175 br=""> if (boton>15){
boton=boton+5;
}
else
{
boton=boton+1;
}
}
}
void menos() // disminuir tpo de muestreo
{
if (boton>0){
if (boton>15){
boton=boton-5;
}
else
{
boton=boton-1;
}
}
}175>
2 comentarios:
Hola buen día, tengo una duda con respecto al osciloscopio, ¿como podría manipular la escala de la señal o simplemente es fija?
El arduino solo puede leer señales entre 0 y 5 voltios, pero con un divisor resistivo puedes adaptar señales mayores a ese rango, si por lo contrario la señal es muy pequeña, podrias utilizar operacionales para amplificarla seg´un un multiplicador conocido.
Publicar un comentario