jueves, 12 de mayo de 2016

Mini osciloscopio con arduino y LCD QC12864 (III). Conexión serie. (30Khz)

Antes de nada decir que tal y como compre yo mi lcd no podía comunicarse via serie con el arduino, tuve que desoldar un par de puentes que vienen en el display como resistencias 000.



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()
{

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;
   }
   }
}