¡Construye tu osciloscopio DIY con Raspberry Pi!

En la imagen se observa un generador de funciones, el Arduino Nano que adquiere los datos, la Raspberry Pi 3B+ y la señal medida en la pantalla. Vía: MagPi 71.

A veces se requiere de una forma de visualizar las señales que tiene nuestro circuito, como las de audio o TTL, de modo que podamos asegurarnos que nuestro proyecto funciona adecuadamente. Para visualizar estas señales se utiliza un osciloscopio, pero esta herramienta es por lo general costosa o de difícil acceso. Una alternativa para solucionar este problema es el utilizar una tarjeta de adquisición de datos con una computadora, que para ejemplos prácticos puede tratarse de la entrada de microfono de una tarjeta de audio.

Pero si queremos formalizar un poco más nuestro análisis (y evitar quemar nuestra tarjeta de audio) podemos utilizar un Arduino Nano y una Raspberry Pi, de modo que tengamos un osciloscopio digital con pocos recursos. Revisemos entonces el proyecto desarrollado por Mike Cook para la revista MagPi #71 y construyamos un osciloscopio.

El material que necesitamos es:

  • Arduino Uno, Nano, MEGA o cualquier otro Arduino basado en AVR
  • 3 Potenciómetros de 10kOhms
  • 4 resistores de 10 kOhms
  • 1 resistor de 1 kOhm
  • 1 capacitor de 1uF
  • 2 capacitores de 47uF
  • Socket BNC
  • Caja para proyectos
  • Varios tornillos, tuercas y espaciadores
  • Placa para prototipos

Construcción

Necesitamos construir el siguiente circuito de acoplamiento, de modo que podamos ingresar la señal a nuestro Arduino. El conector BNC puede reemplazarse por un conector banana en su defecto, pero servirá utilizar uno para utilizar puntas atenuadas.

Conexiones para controlar el cursor del tiempo, el cursor de voltaje y el voltaje de disparo. Vía: MagPi.

Para cablear los potenciómetros en la caja de proyectos podemos guiarnos con la siguiente imágen.

La tarjeta Nano se se conecta al conector BNC y los 3 potenciómetros de control. Las piezas se colocan en una caja de proyectos para hacer el dispositivo más robusto. Vía: MagPi.

Código para Arduino

Para adquirir los datos y controlar los cursores del programa necesitamos subir este código a nuestro Arduino.

// Arduino - Pi - Scope By Mike Cook
int buffer [512]; // 1K input buffer
int sample, lastSample;
int pot1, triggerVoltage;
int triggerTimeout = 1000; // time until auto trigger
unsigned long triggerStart;
char triggerType = '2';

void setup(){
  Serial.begin(115200);
  pinMode(13,OUTPUT);
  // set up fast sampling mode
  ADCSRA = (ADCSRA & 0xf8) | 0x04; // set 16 times division
}

void loop(){ 
  if( triggerType != '2') trigger(); // get a trigger 
  digitalWrite(13,HIGH);// timing marker
  for(int i=0; i<512 ; i++){
    buffer[i] = analogRead(0);
  }
  digitalWrite(13,LOW); // timing marker
  pot1 = analogRead(2); // switch channel to cursor pot
  for(int i=0; i<512 ; i++){
    Serial.write(buffer[i]>>8);
    Serial.write(buffer[i] & 0xff);
  }
  // send back pot values for cursors
  pot1 = analogRead(2);
  analogRead(3); // next cursor pot
  Serial.write(pot1>>8);
  Serial.write(pot1 & 0xff);
  pot1 = analogRead(3);
  triggerVoltage = analogRead(4);
  Serial.write(pot1>>8);
  Serial.write(pot1 & 0xff);
  triggerVoltage = analogRead(4);
  pot1 = analogRead(0); // prepair for next sample run 
  Serial.write(triggerVoltage>>8);
  Serial.write(triggerVoltage & 0xff);  
    
  while(Serial.available() == 0) { } // wait for next request
  triggerType = Serial.read(); // see what trigger to use
  while (Serial.available() != 0) { // remove any other bytes in buffer
     Serial.read();
  }
}

void trigger(){
  // trigger at rising zero crossing
  triggerStart = millis();
  sample = analogRead(0);
  do {
  lastSample = sample;
  sample = analogRead(0);
  }
  while(!(lastSample < triggerVoltage && sample > triggerVoltage) && (millis() - triggerStart < triggerTimeout));
}

Programa para la Raspberry Pi

Ahora solo queda abrir el programa en Python para la Raspberry Pi. Para esto podemos abrir el repositorio del proyecto y abrir el programa Scope.py. Se debe observar una pantalla como la que se muestra a continuación, con la señal que tratamos de medir

Pantalla de la señal tomada del programa. Se puede observar que tiene varios botones para seleccionar la división de tiempo y tensión. También tiene opciones para congelar la pantalla y guardar una captura. Vía: MagPi.

Demostración del funcionamiento

Aquí una demostración de cómo funciona el programa,

Conclusiones

Este proyecto permite visualizar señales de hasta 5.8kHz debido a la velocidad de muestreo y la amplitud de entrada no debe sobrepasar los 5Vpp para evitar saturar las entradas analógicas. Para observar señales de menor o mayor frecuencia o acopladas a DC, se requiere modificar el código del Arduino y por ende la circuitería. A pesar de esto, este proyecto servirá de una herramienta muy útil al analizar el funcionamiento de un circuito, por lo que es indispensable en nuestro laboratorio.

Referencias:

Repositorio Pi-Arduino-Scope