Proyek ini menjelaskan cara membuat osiloskop sederhana yang memiliki rentang dari 10Hz hingga 50kHz. Ini adalah rentang yang sangat besar, mengingat perangkat tidak menggunakan chip konverter digital ke analog eksternal, tetapi hanya Arduino.
Hasilnya ditampilkan pada layar LCD yang relatif besar (ST7920) dengan resolusi 128x64 piksel. Area tampilan pengukuran adalah 96x64 dan area tampilan informasi adalah 32x64, di mana ditampilkan frekuensi sinyal uji, Vpp, dll.
Perangkat ini memiliki beberapa fungsi seperti:pemicu otomatis (tampilan sangat stabil), Kecepatan pemindaian:0.02ms/div~10ms/div, menurut 1-2-5 carry dan bagi menjadi sembilan level dan fungsi Hold:Membekukan bentuk gelombang dan parameter tampilan. Proyek ini dipublikasikan di blog Wu Hanqing di mana Anda dapat menemukan kode aslinya. Saya membuat sedikit perubahan karena saya sedang membangun osiloskop berdasarkan perangkat keras dari salah satu proyek saya sebelumnya. Seperti yang Anda lihat di video, instrumen memiliki tampilan yang sangat jelas karena layarnya yang besar, dan juga pemicu otomatis yang sangat bagus. Posisi vertikal gambar diatur dengan potensiometer 50 kohm, dan kontras dengan potensiometer 10 kohm. Saya menguji osiloskop dengan generator sinyal sinus dan persegi panjang.
Terakhir, meskipun bukan merupakan instrumen profesional atau sangat berguna, alat ini masih dapat digunakan untuk tujuan pendidikan atau di laboratorium Anda, untuk menguji sinyal frekuensi rendah, terutama mengetahui bahwa perangkat ini sangat mudah dibuat dan sangat murah.
Kode
Kode ArduinoC/C++
#include U8GLIB_ST7920_128X64_4X u8g(6, 5, 4); int Masukan =A0; int Kunci_tambah =8; int Kunci_sub =9; int Kunci_tahan =10; int x,y; int i,i1,i2,V_min,V_max,V_mid,t,t0,t1,sta,Kunci=1,tahan=0; frekuensi panjang; mengambang Vpp; int Y[96]; int Penyangga[192]; const uint8_t L[] PROGMEM ={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x08, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0xC0, 0x01, 0x80, 0x60, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0xFF 0x00, 0x01, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x01, 0xE3, 0xDF, 0xB6, 0x6F, 0x8F, 0,00 0x08, 0x10, 0x00, 0x00, 0x03, 0x8F, 0xFF, 0x00, 0x01, 0xE3, 0x1B, 0xB6, 0x6D, 0x9B, 0x80, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF 0x33, 0x31, 0xB6, 0x6C, 0xB1, 0x80, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x03, 0xF 3, 0x31, 0xB6, 0x6C, 0xB1, 0x80, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x06, 0x33, 0x1B, 0xB6, 0x6C, 0x9B, 0x00, 0x00, 0x00 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x06, 0x1B, 0x1F, 0xBE, 0x6C, 0x8F, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x0C, 0x00, 0x0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x0C, 0x00, 0x0F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x08, 0x10, 0x0C, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0 x08, 0x10, 0x0E, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0x1E, 0x3C, 0xF8, 0xF0, 0x00, 0x00, 0x08, 0x10, 0x0E, 0x01, 0xFF, 0xFF, 0x80, 0x0D, 0x93, 0x6E, 0xCD, 0x90, 0x00, 0x00, 0x08, 0x10, 0x0F, 0x87, 0xFF, 0xF9, 0x80, 0x00, 0x00, 0x0F, 0x30, 0xC6, 0xCF, 0xF8, 0x10,08, 0x10,08, 0x 0x0F, 0x87, 0xFF, 0xF9, 0x80, 0x00, 0x00, 0x03, 0xB0, 0xC6, 0xCF, 0x00, 0x00, 0x00, 0x08, 0x10, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x6C, 0xCD, 0xB0, 0x00, 0x00, 0x08, 0x10, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x07, 0x9E, 0x3C, 0xF9, 0xE0, 0x00, 0x00, 0x08, 0x10 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x08, 0x10, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x08, 0x10, 0x03, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0xFF, 0xFF, 0xF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x08, 0x10, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00 0x00, 0x07, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x106, 0x00 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, 0x83, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x07, 0x83, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 0, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0 x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00 }; void setup() { pinMode(Key_add,INPUT); digitalWrite(Key_add,TINGGI); pinMode(Key_sub,INPUT); digitalWrite(Key_sub,TINGGI); pinMode(Key_hold,INPUT); digitalWrite(Key_hold,TINGGI); ADMUX=0x60; ADCSRA=0xe2; u8g.setFont(u8g_font_5x7); u8g.HalamanPertama(); lakukan { u8g.drawBitmapP( 0, 0, 16, 64, L); } while( u8g.nextPage() ); penundaan(2000); } void loop() { sampel(); Ukuran( ); Transformasi(); Pemindaian_kunci(); if(hold==0) { u8g.Halaman pertama(); melakukan { menggambar(); } while( u8g.nextPage()); } } void sampel( ) { for(i =0;i <192;i++) { Penyangga[i] =ADCH; switch(Kunci) { kasus 1:istirahat; kasus 2:delayMicroseconds(4); merusak; kasus 3:delayMicroseconds(10); merusak; kasus 4:delayMicroseconds(23); merusak; kasus 5:delayMicroseconds(60); merusak; kasus 6:delayMicroseconds(123); merusak; kasus 7:delayMicroseconds (248); merusak; kasus 8:delayMicroseconds (623); merusak; kasus 9:delayMicroseconds (1247); merusak; default:istirahat; } }}Void Ukur(){ V_max=Buffer[0]; V_min=Penyangga[0]; for(i=0;i<192;i++) { if(Buffer[i]>V_max) V_max=Buffer[i]; if(Penyangga[i]=V_mid) { i1=i; merusak; } } for(i=i1+1;i<98+i1;i++) { if(Buffer[i]=V_mid) { i2=i; merusak; } } t=i2-i1; jika(t>0) Frekuensi=8000/t; else Freq=0;} void Transform( ) { for(sta=0;sta<96;sta++) { if(Buffer[sta]<128&&Buffer[sta+2]>128) break; } for(i =0;i <96;i++) Y[i] =63-(Buffer[i+sta]>>2); }void draw( ) { for(x =0;x <95;x++) u8g.drawLine(x,Y[x],x,Y[x+1]); u8g.drawFrame(0,0,97,64); u8g.drawLine(48,0,48,63); u8g.drawLine(0,32,96,32); for(x=0;x<96;x+=8) u8g.drawLine(x,31,x,33); untuk(y=0;y<64;y+=8) u8g.drawLine(47,y,49,y);untuk(x=8;x<96;x+=8) { untuk(y=8;y<64;y+=8) u8g.drawPixel(x,y); } u8g.drawStr(98,7,"MS/div"); u8g.drawStr(98,23,"V/div"); u8g.drawStr(98,30,"0.324"); u8g.drawStr(98,40,"Vpp"); u8g.setPrintPos( 98, 47); u8g.print(Vpp); u8g.drawStr(118,47,"V"); u8g.drawStr(98,55,"F(HZ)"); switch(Kunci) { kasus 1:u8g.drawStr(98,14,"0.02"); u8g.setPrintPos( 98, 62); u8g.print(Frekuensi*50); merusak; kasus 2:u8g.drawStr(98,14,"0,05"); u8g.setPrintPos( 98, 62); u8g.print(Frekuensi*20); merusak; kasus 3:u8g.drawStr(98,14," 0.1"); u8g.setPrintPos( 98, 62); u8g.print(Frekuensi*10); merusak; kasus 4:u8g.drawStr(98,14," 0.2"); u8g.setPrintPos( 98, 62); u8g.print(Frekuensi*5); merusak; kasus 5:u8g.drawStr(98,14," 0,5"); u8g.setPrintPos( 98, 62); u8g.print(Frekuensi*2); merusak; kasus 6:u8g.drawStr(98,14," 1"); u8g.setPrintPos( 98, 62); u8g.print(Frekuensi); merusak; kasus 7:u8g.drawStr(98,14," 2"); u8g.setPrintPos( 98, 62); u8g.print(Frekuensi/2); merusak; kasus 8:u8g.drawStr(98,14," 5"); u8g.setPrintPos( 98, 62); u8g.print(Frekuensi/5); merusak; kasus 9:u8g.drawStr(98,14," 10"); u8g.setPrintPos( 98, 62); u8g.print(Frekuensi/10); merusak; default:istirahat; }}void Key_scan(){ if(digitalRead(Key_add)==LOW) { while(digitalRead(Key_add)==LOW); Kunci++; if(Kunci==10) Kunci=9; penundaan (10); } if(digitalRead(Key_sub)==LOW) { while(digitalRead(Key_sub)==LOW); Kunci--; if(Kunci==0) Kunci=1; penundaan (10); } if(digitalRead(Key_hold)==LOW) { while(digitalRead(Key_hold)==LOW); tahan=~tahan; penundaan (10); }}
Skema