شاید تابحال با ابزار هایی با نام اسیلوسکوپ مواجه شدهاید که یکی از ابزار های کارآمد در دنیای الکترونیک و سخت افزار هستند، که در انواع مختلف و قابلیت های متفاوتی تولید میشوند. در این آموزش قصد داریم به کمک برد آردوینو و نمایشگر Oled 1306 یک اسیلوسکوپ ساده بسازیم تا شکل موج های مختلف را در آن نمایش دهیم. البته این اسیلوسکوپ ساخته ما قابلیت هایی که موارد صنعتی و شرکتی این دستکاه دارند را شامل نمیشود و تنها برای نمایش شکل موج ها در مدار های DC بکار میرود. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
اسیلوسکوپ با برد آردوینو
مجموعه برد های آردوینو از جمله برد های توسعه پرطرفدار بین مهندسین امبدد هستند که در مدل های مختلفی از جمله Micro , proMini , Nano , Uno و همچنین Mega قابل تهیه هستند، هسته مرکزی این برد های محبوب از سری AtMega328 می باشد. آردوینو پلتفرم سختافزاری و نرمافزاری متنباز است. همان طور که قبل تر اشاره کردیم، پلتفرم آردوینو شامل یک میکروکنترلر تکبردی متنباز است که قسمت سختافزار آردوینو را تشکیل میدهد. علاوه بر این، پلتفرم آردوینو یک نرمافزار آردوینو IDE که به منظور برنامهنویسی برای بردهای آردوینو طراحی شدهاست و یک بوت لودر نرمافزاری که بر روی میکروکنترلر بارگذاری میشود را در بر میگیرد.
ماژول نمایشگر Oled 1306
معمولا در پروژه های اینترنت اشیا و دیگر پروژه های امبدد از برای نمایش متن و مقادیر مختلف از نمایشگر های Oled استفاده می شود، این ماژول ها بدر انواع مختلق بسته به نوع درایور اندازه یافت می شوند که یکی از پرطرفدار ترین آن ها SSD1306 می باشد، این نوع از Oled ها معمولا در اندازه های ۰٫۹۶ و ۱٫۳ اینچ ساخته می شوند همچنین پروتکل ارتباطی Oled ها I2C می باشد.
اسیلوسکوپ Oscope
اسیلوسکوپ یا به زبان فارسی نوساننگاردستگاهی الکترونیکی است، برای مشاهده شکل موج سیگنالها که به موجب اختلاف ولتاژ های مختلف ایجاد شدهاند بکار میرود. در اسیلوسکوپ ها دامنه سیگنال در نموداری دوبعدی نمایش دادهمیشود که محور افقی، زمان و محور عمودی، مقدار ولتاژ است. از اسیلوسکوپ برای نمایش دقیق شکل موج استفاده میشود. علاوه بر دامنه، اندازهگیری دیگر پارامترهای سیگنال مانند عرض پالس، دوره تناوب و فاصله زمانی دو رویداد در سیگنال مانند وقوع ولتاژ دو پیک نیز بر روی نمایشگر اسیلوسکوپ ممکن است.
روش کار پروژه اسیلوسکوپ ساده
در این پروژه با استفاده از قطعه ساده یعنی برد آردوینو نانو و نمایشگر Oled با دریاور SSD1306 و ابعاد ۰٫۹۶ اینچ، اشکال موچ بدست آمده از سورس مدنظر را با کمک آنالوگ به دیجیتال آردوینو (پین A0) اندازهگیری و نمایش خواهیم داد، مقادیر بصورت گراف هایی وابسته به زمان و ولتاژ در نمودار نمایش داده میشوند. به این ترتیب میتوانیم شکل موج حاصل از ولتالژه ای مختلف را در نمایشگر مشاهده کنیم.
وسایل موردنیاز
نصب کتابخانه مورد نیاز
ابتدا در نرم افزار Arduino IDE اقدام به نصب کتابخانه مورد نیاز خواهیمکرد. مراحل زیر را دنبال کنید:
- این مسیر را دنبال کنید Sketch > Include Library > Manage Libraries
- کلمه Adafruit SSD1306 را جستجو کنید.
- کتابخانه را نصب کنید.
- سپس کلمه “GFX” را جستجو کنید و آن را نصب کنید.
اتصالات و راهاندازی
در این بخش اقدام به برقراری اتصالات بین نمایشگر Oled و برد آردوینو نانو خواهیم کرد. نمایشگر ما یعنی Oled 0.96 برای برقراری ارتباط با برد آردوینو از پروتکل I2C استفاده میکند. برای ایجاد این ارتباط ار پین های i2c برد آردوینو استفاده خواهیم کرد، یعنی پین های A4 و A5 که به ترتیب به SDA و SCL در نمایشگر ما متصل میشوند. اتصالات را با توجه به جدول و شماتیک زیر برقرار کنید.
-
شماتیک اتصالات پروژه اسیلوسکوپ ساده با آردوینو و نمایشگر Oled
در این بخش نوبت به کد های این پروژه میرسد،ابتدا چندبخش از این کد را مورد بررسی قرار خواهیم داد. در این کد برای راهانداز ینمایشگر از کتابخانه های Adafruit_SSD1306.h استفاده شد و در کنار این کتابخانه از Adafruit_GFX.h استفاده شده تا امکان نمایش گرافیک های مورد نیاز را داشته باشیم. همچنین از دو کتابخانه SPI , Wire در این کد در کنار دو کتابخانه قبل استفاده شده.
#include <SPI.h> // کتابخانه های مورد نیاز برای راه اندازی #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>
در این پروژه از پین A0 برای دریافت سیگنال از منبع، تحلیل در میکروکنترلر و در نهایت نمایش آن استفاده میشود. همچنین از یک پین برای کالیبره و یک پین نیز برای تولید PWM استفاده شده.
#define READ_PIN A0 // پین ورودی سیگنال #define PWM_PIN 11 //پین تولید PWM #define ADJ_PIN A1 //برای کالیبره
شما در این پروژه قادر هستید با توجه به Oled خود تنظیمات نمایشگر را تغییر دهید، تا روند نمایش مقادیر با توجه به ابعاد و درایور سخت افزار شما تنظیم شود.
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire); //تنظیمات وابسته به نمایشگر
در این بخش دو مورد حلقه For تعریف شده که برای نمایش خطوط عمودی و افقی محور ما هستند.
for (x = 10; x <= 127; x++) { display.drawLine(x , 63 - (data[x - 1]), x , 63 - (data[x]), WHITE); } // طراحی گراف و محور برای نمایش for (int y = 1; y < 10; y++) { display.drawFastHLine(7, y * (53) / 5 + 0, 5, WHITE); }
کد کامل پروژه اسیلوسکوپ ساده با آردوینو و نمایشگر Oled
#include <SPI.h> // کتابخانه های مورد نیاز برای راه اندازی #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define READ_PIN A0 // پین ورودی سیگنال #define PWM_PIN 11 //پین تولید PWM #define ADJ_PIN A1 //برای کالیبره #define OLED_RESET 4 Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire); //تنظیمات وابسته به نمایشگر byte data[128]; int x; int scnt, pos, ecnt; double y, pwmVolts; unsigned long etime, stime, ttime, xtime; void setup() { Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.display(); TCCR2B = TCCR2B & B11111000 | B00000100; //64 برای فرکانس PWM 490.20 هرتز (پیشفرض) pinMode(READ_PIN, INPUT); pinMode(ADJ_PIN, INPUT); pinMode(PWM_PIN, OUTPUT); pinMode(A3,OUTPUT); digitalWrite(A3,LOW); } void loop() { pwmVolts = analogRead(ADJ_PIN) / 4 ; analogWrite(PWM_PIN, pwmVolts); // پیدا کردن اولین زمان scnt = 0; ecnt = 0; etime = 0; stime = 0; while (scnt++ < 400) { pos = analogRead(READ_PIN); if (pos == 0) { while (ecnt++ < 400) { pos = analogRead(READ_PIN); if (pos != 0) { stime = micros(); break; } } break; } } // یافتن زمان افزایش بعدی و کسر محاسبه xtime = micros() - stime; scnt = 0; ecnt = 0; while (scnt++ < 400) { pos = analogRead(READ_PIN); if (pos == 0) { while (ecnt++ < 400) { pos = analogRead(READ_PIN); if (pos != 0) { etime = micros(); break; } } break; } } // محاسبه زمان بین دو سیگنال if (etime == 0 | stime == 0) { ttime = -1000000; } else { ttime = etime - stime - xtime; } for (x = 10; x <= 127; x++) { data[x] = (analogRead(READ_PIN) / 21.7659); } display.clearDisplay(); for (x = 10; x <= 127; x++) { display.drawLine(x , 63 - (data[x - 1]), x , 63 - (data[x]), WHITE); } // طراحی گراف و محور برای نمایش for (int y = 1; y < 10; y++) { display.drawFastHLine(7, y * (53) / 5 + 0, 5, WHITE); } display.setTextColor(WHITE, BLACK); display.setTextSize(1); display.setCursor(0, 55); display.println("0"); display.setCursor(0, 8); display.println("5"); display.drawFastHLine(10, 63, 128 - 10, WHITE); display.drawFastVLine(10, 10, 60, WHITE); }
جمع بندی
در این پروژه توانستیم یک اسیلوسکوپ ساده بسازیم تا بتوانیم سیگنال هایی را از منبع مورد نظر را نمایش دهیم. البته این پروژه کاربر های متفاوتی دارد یه این صورت که شما قادر خواهید بود مقادیر بدست امده از سنسور های مختلف را بصورت گراف با استفاده از این کد نمایش دهید و به پروزه خود یک ظاهر مناسب اضافه کنید.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام مهندس نمیشه قابلیت های بیشتری به این پروژه اضافه کنید؟؟
سلام، بله امکان این مورد وجود دارد، حتما سعی میکنم در آینده آموزشی در این مورد بنویسم.
سلام جناب
چه ماژول هایی میتوانیم ازشان خروجی برای پروژه بگیریم
پاسخ بدهید ممنون میشوم
سلام، متاسفانه متوجه منظور شما یا ارتباط آن با این آموزش نشدم لطفا واضح تر توضیح دهید.
سلام مهندس
کد ها رو به آردوینو انتقال دادم ولی خروجی ندارد،ودر صفحه نمایشگر هیچی نشان داده نمی شود
پیشنهاد میکنم از سخت افزار دیگری هم استفاده کنید، به این دلیل که کد ها تست شدهاند و به نظر مشکل از سخت افزار هست. البته میتوانید کد های نمونه برای نمایشگر خود را اجرا کنید تا از صحت کار اطمینان داشته باشید.
هرچی کامپابل میزنم ارور میده
قسمت TTCR2B=TTCR2B
سلام
آیا این کدی که اینجا قرار دادید، کد کامل پروژه است؟
این کد را اجرا کردید؟
برای بنده که اصلا اجرا نشد و حتی صفحه نمایشگر هم روشن نشد اصلا
با سلام، بله کد کامل پروژه است. تصاویر موجود در آموزش مربوط به همین کد است، اتصالات را بررسی کنید اگر ارتباط I2C به درستی برقرار نشود، نمایشگر کار نمیکند.
آیا اتصلات i2c برد آردینو نانو با تراشه R3 با اتصلات i2c برد آردینو نانو با تراشه ch340G فرق می کنه؟
خیر اتصالات متفاوت نیست، تنها تراشه پروگرامر موجود در این برد ها متفاوت است.
کد کار نمی کنه
بررسی کنید ببینید با کپی از کادر سایت چه مشکلی پیش میاره
با سلام
کادر سایت صحیح است، بفرمایید چه اروری دریافت میکنید؟
هیچ چیزی روی صفحه نشون نمیده
نمایشگر oled رو با سایر پروژه های توی سایت شما تست گرفتم
با سلام، در بخش Setup کد، قسمت آدرس i2c را نسبت به کد هایی که قبلا برای شما کار کردند تغییر دهید.
سلام محدوده فرکانس و ولتاژ قابل اندازه گیری چقدره؟
تمام موارد اندازه گیری نسبت محدودیت سخت افزار آردوینو است.
سلام مهندس
کد ها روی آردوینو نانو تست شد ،جواب نداد،کتابخانه ها کامل بارگیری شده،و فقط تو قسمت سریال باید مشکلی باشه ،چون ماژول ال ای با برنامه نمایش متن و اشکال ایرادی ندارد،لطف کنید راهنمایی کنید،ممنون
سلام، اگر همه موارد مطابق آموزش جلو رفته نباید مشکلی باشه و این عجیبه چون پروژه تست شده. کد ها رو تست میکنم و اگر مشکلی داشت و یا تغییری نیاز داشت کد هارو آپدیت میکنم.
سلام آیا این کد ها قابل تست با برنامه پروتئوس هستند؟ توی خود کامپایلر آردوینو گزینه ای برای سیو کردن کد ها داخل سیستم وجود داره؟ پسوند فایل کد های کامپایلر اردوینو چی هست؟ ممنون میشم به این سه تا سوال پاسخ بدید
در کل قابلیت اجرای کد ها در پروتئوس هست، اما برای این پروژه اطلاع ندارم برای نمایش مقادیر oled چه کاری باید انجام داد.
بله امکان ذخیره وجود دارد در منوی بالای برنامه یا منوی files امکان ذخیره است.
پسوند فایل ها .ino است.
آقا من هم زدم حتی مثل ها رو مزنم نمایشگر روشن می شه موقع بارگذاری کد ها خطا نمی گیره همه چیز مرتبه ولی هیچی نشون نمی ده من از مگا ۲۵۶۰ استفاده کردم
با سلام
این پروژه تست شده است، بایستی ارورهایی که دریافت میکنید را بررسی و نسبت به رفع آن اقدام کنید. در صورت تمایل ارورها را همینجا ارسال کنید.
مشکل اینجاست که ارور نمی گیره عرض کردم جناب مدیر کد بار گیری می شه کتاب خانه کامله ۱۰۰ بار زدم تصویر نمی ده
سلام بنده موفق شدم راهش بندازم اما از جای دیگه ای کد ها رو پیدا و بار گذاری کردم وقتی خوب دقت کردم دیدم در مقایسه با پروژه شما کدهای شما ناقصی زیادی دارد چرا که این نمایشگر در صورت اشکال در مختصات کد نویسی نمایشگر چیزی نمایش نمی دهد لطفا با دقت بررسی و رفع ایراد فرمایید
تشکر
این مورد امکان دارد از ورژن کتابخانه های استفاده شده در پروژه های مختلف باشد. در هرصورت تصاویری که در این آموزش میبینید نتیجه آپلود همین کد بودهاند و کد مشکلی ندارد.
دوستان کد یک مشکل داره
باید در آخر قسمت void loop بعد از جمله:
display.drawFastVLine(10, 10, 60, WHITE);
باید بنویسید:
;()display. display
با سلام
سپاس از همراهی شما
سلام برای ورودی داده ها به جا پین A0 میتونم از یه پین دیگه استفاده کنم
با سلام
در این پروژه از پایه های آنالوگ استفاده شده است. در صورت تمایل میتوانید به پایه های آنالوگ دیگر روی برد متصل کرده و کدها را براساس آن تغییر دهید.
سلام هیچ توضیحی در مورد نحوه کالیبره کردن داده نشده ، همچنین نتونستم علت استفاده از متغییرهای TCCR2B و ttime مشخص نیست ، چون بعد از مقدار دهی از آنها استفاده نشده است . ممنون میشم راهنمایی بفرمایید
با سلام
متغیر TCCR2B یک رجیستر است که در میکروکنترلرهای ATmega داخلی مانند ATmega328P که در برد Arduino Uno استفاده میشود، وظیفه تنظیم فرکانس تایمر/شمارنده ۲ را بر عهده دارد. این متغیر از سه بیت (Bit) پایین تر رجیستر TCCR2B استفاده میکند. در کد شما، این خط کد را داریم: TCCR2B = TCCR2B & B11111000 | B00000100;
این کد برای تنظیم فرکانس تایمر/شمارنده ۲ به حالت PWM با فرکانس ۴۹۰٫۲۰ هرتز استفاده میشود.
بیتهای B11111000 متعلق به بیتهای ۲ تا ۰ مربوط به TCCR2B هستند. این بیتها مشخص کننده تقسیمبندی فرکانس سیستم برای تولید فرکانس PWM هستند. با اینکه این کد نهایتاً بیتهای مورد نظر را تنظیم میکند، اما به دلیل استفاده از عملگر & و |، مطمئنیم که بیتهای دیگر این رجیستر حفظ میشوند. بیتهای B00000100 که به عنوان OR شدهاند، مربوط به تنظیم فرکانس PWM بر اساس پیشفرض هستند (divider = 64). این تنظیمات میتواند بر اساس نیازهای شما تغییر کند.
سلام روز بخیر ، برای من OLED روشن نمیشه اصلا لطفا راهنمایی کنید علتش چی میتونه باشه ؟
با سلام
تغذیه مدار را حتما بررسی کنید و ابتدا بایستی کد را آپلود کنید تا دیتا نمایش داده شود.