پروژه ساخت اسیلوسکوپ با آردوینو
اسیلوسکوپ یکی از ابزار های مورد استفاده مهندسین برق است . فرقی نمی کند شما طراح مدارات مخابراتی باشید یا مدارات دیجتال و امبدد ، برای مانیتورنگ سیگنال های مختلف باید از اسلوسکوپ استفاده کنید . شما در این پروژه می تواندی بک اسیلوسکوپ کاربردی بسازید . می توانید از این اسیلوسکوپ برای نمایش ارتباط های I2C ، SPI و… استفاده کنید .
این اسیلوسکوپ می تواند سیگنال های با فرکانس 10Hz تا 50KHz را مانیتور کند . همچنین قابلیت تغییر سرعت نمونه برداری و هولد کردن را دارد . می توانید آردوینو و اتصالات آن رو داخل یک جعبه تعبیه کنید و از آن به عنوان یک اسکوپ پرتال استفاده کنید . اگر چه این ابزار یک وسیله حرفه ای نیست اما میتواند در بسیار از موارد استفاده شود و یا از آن برای اهداف آموزشی استفاده کرد .
در این پروژه به قطعات زیر نیاز دارید :
1-آردوینو UNO یا مدل های با هسته ATmega328 
2-LCD گرافیکی 64×128 با درایور ST7920
شماتیک مدار :
کد های پروژه :
#include <U8glib.h>
U8GLIB_ST7920_128X64_4X u8g(6, 5, 4);
int Input = A0;
int Key_add = 8;
int Key_sub = 9;
int Key_hold = 10;
int x,y;
int i,i1,i2,V_min,V_max,V_mid,t,t0,t1,sta,Key=1,hold=0;
long Freq;
float Vpp;
int Y[96];
int Buffer[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, 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, 0x00, 0x01, 0xE0, 0x00,
0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00,
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, 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, 0x00, 0x08,
0x10, 0x00, 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, 0x00, 0x01, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x08,
0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x01, 0xE3, 0xDF, 0xB6, 0x6F, 0x8F, 0x00, 0x00, 0x08,
0x10, 0x00, 0x00, 0x03, 0x8F, 0xFF, 0x00, 0x01, 0xE3, 0x1B, 0xB6, 0x6D, 0x9B, 0x80, 0x00, 0x08,
0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x03, 0x33, 0x31, 0xB6, 0x6C, 0xB1, 0x80, 0x00, 0x08,
0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x03, 0xF3, 0x31, 0xB6, 0x6C, 0xB1, 0x80, 0x00, 0x08,
0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x06, 0x33, 0x1B, 0xB6, 0x6C, 0x9B, 0x00, 0x00, 0x08,
0x10, 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, 0x00, 0x00, 0x08,
0x10, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
0x10, 0x00, 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, 0x00, 0x08,
0x10, 0x00, 0x00, 0x03, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
0x10, 0x0C, 0x00, 0x0F, 0xF8, 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, 0x00, 0x08,
0x10, 0x0C, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
0x10, 0x0E, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x0F, 0x1E, 0x3C, 0xF8, 0xF0, 0x00, 0x00, 0x08,
0x10, 0x0E, 0x01, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x0D, 0x93, 0x6E, 0xCD, 0x90, 0x00, 0x00, 0x08,
0x10, 0x0F, 0x87, 0xFF, 0xF9, 0x80, 0x00, 0x00, 0x0F, 0x30, 0xC6, 0xCF, 0xF8, 0x00, 0x00, 0x08,
0x10, 0x0F, 0x87, 0xFF, 0xF9, 0x80, 0x00, 0x00, 0x03, 0xB0, 0xC6, 0xCF, 0x00, 0x00, 0x00, 0x08,
0x10, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x0D, 0x9B, 0x6C, 0xCD, 0xB0, 0x00, 0x00, 0x08,
0x10, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x07, 0x9E, 0x3C, 0xF9, 0xE0, 0x00, 0x00, 0x08,
0x10, 0x0F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x08,
0x10, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x08,
0x10, 0x03, 0xFF, 0xFF, 0xE0, 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, 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, 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, 0x00, 0x08,
0x10, 0x00, 0x07, 0xCF, 0x00, 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,
0x10, 0x00, 0x07, 0x83, 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, 0x00, 0x08,
0x10, 0x00, 0x06, 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, 0x00, 0x08,
0x10, 0x00, 0x07, 0x83, 0xC0, 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, 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, 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, 0x00, 0x01, 0x80,
0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00,
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, 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, 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
};
void setup( )
{
pinMode(Key_add,INPUT);
digitalWrite(Key_add,HIGH);
pinMode(Key_sub,INPUT);
digitalWrite(Key_sub,HIGH);
pinMode(Key_hold,INPUT);
digitalWrite(Key_hold,HIGH);
ADMUX=0x60;
ADCSRA=0xe2;
u8g.setFont(u8g_font_5x7);
u8g.firstPage();
do {
u8g.drawBitmapP( 0, 0, 16, 64, L);
} while( u8g.nextPage() );
delay(2000);
}
void loop( )
{
sample( );
Measure( );
Transform( );
Key_scan( );
if(hold==0)
{
u8g.firstPage( );
do
{
draw( );
}
while( u8g.nextPage( ));
}
}
void sample( )
{ for(i = 0;i < 192;i++)
{
Buffer[i] = ADCH;
switch(Key)
{
case 1:
break;
case 2:
delayMicroseconds(4);
break;
case 3:
delayMicroseconds(10);
break;
case 4:
delayMicroseconds(23);
break;
case 5:
delayMicroseconds(60);
break;
case 6:
delayMicroseconds(123);
break;
case 7:
delayMicroseconds(248);
break;
case 8:
delayMicroseconds(623);
break;
case 9:
delayMicroseconds(1247);
break;
default:break;
}
}
}
void Measure()
{
V_max=Buffer[0];
V_min=Buffer[0];
for(i=0;i<192;i++)
{
if(Buffer[i]>V_max)
V_max=Buffer[i];
if(Buffer[i]<V_min)
V_min=Buffer[i];
}
V_mid=(V_max+V_min)/2;
Vpp=(V_max-V_min)*5/255;
for(i=0;i<97;i++)
{
if(Buffer[i]<V_mid&&Buffer[i+1]>=V_mid)
{
i1=i;
break;
}
}
for(i=i1+1;i<98+i1;i++)
{
if(Buffer[i]<V_mid&&Buffer[i+1]>=V_mid)
{
i2=i;
break;
}
}
t=i2-i1;
if(t>0)
Freq=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);
for(y=0;y<64;y+=8)
u8g.drawLine(47,y,49,y);
for(x=8;x<96;x+=8)
{
for(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(Key)
{
case 1:
u8g.drawStr(98,14,"0.02");
u8g.setPrintPos( 98, 62);
u8g.print(Freq*50);
break;
case 2:
u8g.drawStr(98,14,"0.05");
u8g.setPrintPos( 98, 62);
u8g.print(Freq*20);
break;
case 3:
u8g.drawStr(98,14," 0.1");
u8g.setPrintPos( 98, 62);
u8g.print(Freq*10);
break;
case 4:
u8g.drawStr(98,14," 0.2");
u8g.setPrintPos( 98, 62);
u8g.print(Freq*5);
break;
case 5:
u8g.drawStr(98,14," 0.5");
u8g.setPrintPos( 98, 62);
u8g.print(Freq*2);
break;
case 6:
u8g.drawStr(98,14," 1");
u8g.setPrintPos( 98, 62);
u8g.print(Freq);
break;
case 7:
u8g.drawStr(98,14," 2");
u8g.setPrintPos( 98, 62);
u8g.print(Freq/2);
break;
case 8:
u8g.drawStr(98,14," 5");
u8g.setPrintPos( 98, 62);
u8g.print(Freq/5);
break;
case 9:
u8g.drawStr(98,14," 10");
u8g.setPrintPos( 98, 62);
u8g.print(Freq/10);
break;
default:break;
}
}
void Key_scan()
{
if(digitalRead(Key_add)==LOW)
{
while(digitalRead(Key_add)==LOW);
Key++;
if(Key==10)
Key=9;
delay(10);
}
if(digitalRead(Key_sub)==LOW)
{
while(digitalRead(Key_sub)==LOW);
Key--;
if(Key==0)
Key=1;
delay(10);
}
if(digitalRead(Key_hold)==LOW)
{
while(digitalRead(Key_hold)==LOW);
hold=~hold;
delay(10);
}
}
منبع :
https://create.arduino.cc/projecthub/mircemk/diy-10hz-50khz-oscilloscope-on-128×64-lcd-display-52ecfe?ref=platform&ref_id=424_trending___&offset=87





