Come fare un oscilloscopio in Python

April 15

Oscilloscopi sono utilizzati per misurare gli intervalli di diversi tipi di onde e segnali elettrici. Le loro letture contribuire a fornire i ricercatori all'interno visione della frequenza e la forza delle onde emesse dai dispositivi elettrici ed altre fonti. Per l'hardware in un oscilloscopio per lavoro, deve essere collegato ad un programma software che interpreta i valori e li visualizza in un grafico.

istruzione

1 Aprire una applicazione di editing di codice o utilizzare un editor di testo come TextEdit in Mac OS X o il Blocco note in Microsoft Windows. Creare un nuovo documento per ospitare lo script dell'oscilloscopio Python.

2 Definire i parametri che verranno utilizzati nello script, così come le due librerie Python necessarie per lo script utilizzando il seguente codice:

os importazione, SYS
import Immagine
importazione di serie
importazione pygame
tempo di importazione

da pyBusPirateLite.UART import


da pyBusPirateLite.BitBang import

3 Definire la velocità dei dati e utilizzare la funzione di stampa per consentire il programma per rappresentare graficamente gli ingressi effettuati dal oscilloscopio:

DATA_RATE = 5720,0 # misure / secondo (experimenticaly stimato)
DEFAULT_TIME_SCALE = RES_X / DATA_RATE #default tempo in secondi per fare riempimento una finestra
pygame.init ()
BP = UART (BUS_PIRATE_DEV, 115200)
print "Immissione binmode:",
se bp.BBmode ():

print "OK."

altro:

print "failed."
sys.exit()

4 Definire i parametri per la finestra dell'applicazione utilizzando la funzione pygame.display:

window = pygame.display.set_mode ((RES_X, RES_Y))
background = (0,0,0)
line = (0,255,0)
trig_color = (100,100,0)

5 Creare lo script per l'oscilloscopio sé definendo i parametri che verranno scritte sul grafico e di fornire argomenti per la xe asse y:

bp.port.write ( "\ x15")
mentre 1:

plot = {}
voltage = {}
maxv = 0
minv = 100
time_scale = DEFAULT_TIME_SCALE * time_div
prev_voltage = 0
measure = 0;
if(trig_mode != NO_SYNC):
for k in range(1,2000):
prev_voltage = voltage
measure = bp.response(2, True)
voltage = ord(measure[0]) << 8
voltage = voltage + ord(measure[1])
voltage = (voltage/1024.0) * 6.6
#rising slope
if((voltage >= trigger_level) and (prev_voltage < (voltage * TRIG_CAL)) and (trig_mode == RISING_SLOPE)):
break
if((voltage < trigger_level) and (voltage > 0.01) and (prev_voltage > voltage/TRIG_CAL) and (trig_mode == FALLING_SLOPE)):
break
for i in range(RES_X):
for k in range(time_div - 1):
#ignoring (time_div-1) samples to achieve proper time resolution
bp.response(2, True)
measure = bp.response(2, True)
voltage = ord(measure[0]) << 8
voltage = voltage + ord(measure[1])
voltage = (voltage/1024.0) * 6.6
plot[i] = voltage
for i in range(1,RES_X):
if plot[i] > maxv:
maxv = plot[i]
if plot[i] < minv:
minv = plot[i]
y = (RES_Y) - plot[i]*(RES_Y/MAX_VOLTAGE) - OFFSET
x = i
px = i-1;
py = (RES_Y) - plot[i-1]*(RES_Y/MAX_VOLTAGE) - OFFSET
pygame.draw.line(window, line, (px, py), (x, y))
trig_y = RES_Y - trigger_level * (RES_Y/MAX_VOLTAGE)
pygame.draw.line(window, trig_color, (0, trig_y), (RES_X, trig_y))

6 Finalizzare l'oscilloscopio definendo i parametri per l'interfaccia utente grafica dell'oscilloscopio:

GUI)

font = pygame.font.Font(None, 19)
text_max_voltage = font.render("Max: %f V" % maxv, 1, (255, 255, 255))
text_min_voltage = font.render("Min: %f V" % minv, 1, (255, 255, 255))
text_time_scale = font.render("Timescale: %f s" % time_scale, 1, (255, 255, 255))
text_maxv_Rect = text_max_voltage.get_rect()
text_minv_Rect = text_min_voltage.get_rect()
text_time_scale_Rect = text_time_scale.get_rect()
text_maxv_Rect.x = 10
text_maxv_Rect.y = 10
text_minv_Rect.x = 10
text_minv_Rect.y = 30
text_time_scale_Rect.x = 10
text_time_scale_Rect.y = 50
window.blit(text_max_voltage, text_maxv_Rect)
window.blit(text_min_voltage, text_minv_Rect)
window.blit(text_time_scale, text_time_scale_Rect)