Projekt został stworzony w celu zobrazowania działania oscyloskopu. Sygnał wytworzony przez generator i przekształcony przez układ elektryczny jest prezentowany w formie wykresu. Użytkownik może badać działanie oscyloskopu poprzez zmianę parametrów na generatorze oraz określenie podziałki czasowej.
1. Płytka ESP8266
2. Ekran 2.4 TFT SPI 240x320
3. Generator sygnału prostokątnego XY-LPWM
4. Dioda LED
5. Kondensator 10uF 50V
6. Rezystor 330 Ohm x2
7. Rezystor 3300 Ohm
8. Kable damsko-męskie
Prosty oscylator rysuje wykres sygnału generowanego przez układ. Ze względu na czas potrzebny na rysowanie nawet pojedynczego piksela jest zbyt duży w porównaniu do częstotliwości generowanego sygnału, płytka zbiera sygnał z pewnego interwału czasowego, następnie wyświetla go na ekranie. Układ elektryczny na płytce prototypowej pełni dwie role. Po pierwsze, zawiera w sobie dzielnik napięcia, ponieważ inaczej napięcie wyjściowe byłoby za duże do odczytania przez płytkę. Po drugie, modyfikuje wygenerowany sygnał prostokątny i zwiększając czas narastania sygnału. Za pomocą przycisków na generatorze i modyfikację układu elektrycznego, można zmieniać odczytywany sygnał. Istnieje możliwość modyfikacji podziałki czasowej, definiowanej przez użytkownika w programie. Istnieją dwa tryby pracy "simple" - zalecany, nadpisuje na ekranie poprzedni wykres w czasie i "cont" - dodatkowy, przesuwa wykres, nowy sygnał rysowany jest za poprzednim, gorsza płynność.
from ili9341 import Display
import time
from machine import Pin, SPI
adc = machine.ADC(0)
#ustawienie podziałki czasowej
podzialka_czasowa_us=100
#ustawienie trybu pracy (simple - zalecany, cont - opcjonalny)
work_mode="simple"
#setup
spi = SPI(1, 40000000, 14, 13)
tft = Display(spi, dc=Pin(2), cs=Pin(4), rst=Pin(0))
tft.clear()
x_start = 11
tab=[]
#rysowanie osi
tft.draw_vline(10,0,320,0X001F)
tft.draw_hline(0,10,240,0X001F)
tft.draw_line(10,319,0,310,0X001F)
tft.draw_line(10,319,20,310,0X001F)
tft.draw_line(239,10,230,0,0X001F)
tft.draw_line(239,10,230,20,0X001F)
#rysowanie pierwszego wykresu
for i in range(310):
tab.append(adc.read())
time.sleep_us(1)
for i in range(309):
x = x_start + i # Zwiększamy wartość x za każdym razem, aby przesunąć piksel w prawo
#tft.draw_pixel(adc.read(), x, 0XF800) #opcja do rysowania wyników "na bieżąco", nie generuje czytelngo wykresu
tft.draw_pixel(tab[i], x, 0XF800)
#rysowanie podziałki czasowej
if i%podzialka_czasowa_us==0:
for j in range(6):
tft.draw_hline(j*40,x,10,0X07E0)
time.sleep(0.01)
#kontynuacja w zależności od trybu
if work_mode=="cont":
while True:
tab=[]
for i in range(309):
tab.append(adc.read())
time.sleep_us(1)
for i in range(309):
x = x_start + i # Zwiększamy wartość x za każdym razem, aby przesunąć piksel w prawo
#tft.draw_pixel(adc.read(), x, 0XF800)
tft.scroll(i)
tft.draw_hline(11,x,240-11-10,0)
tft.draw_pixel(tab[i], x, 0XF800)
if i%podzialka_czasowa_us==0:
for j in range(6):
tft.draw_hline(j*40,x,10,0X07E0)
time.sleep(0.01)
elif work_mode=="simple":
while True:
tab=[]
for i in range(309):
tab.append(adc.read())
time.sleep_us(1)
for i in range(309):
x = x_start + i # Zwiększamy wartość x za każdym razem, aby przesunąć piksel w prawo
#tft.draw_pixel(adc.read(), x, 0XF800)
tft.draw_hline(11,x,240-11-10,0)
tft.draw_pixel(tab[i], x, 0XF800)
if i%podzialka_czasowa_us==0:
for j in range(6):
tft.draw_hline(j*40,x,10,0X07E0)
time.sleep(0.01)