آردوینو آموزش آردوینو نمایشگر OLED پروژه های آردوینو

پروژه ساخت اسیلوسکوپ ساده با نمایشگر Oled برد آردوینو

نوشته شده توسط CiferTech

شاید تابحال با ابزار هایی با نام اسیلوسکوپ مواجه شده‌اید که یکی از ابزار های کارآمد در دنیای الکترونیک و سخت افزار هستند، که در انواع مختلف و قابلیت های متفاوتی تولید می‌شوند. در این آموزش قصد داریم به کمک برد آردوینو و نمایشگر Oled 1306 یک اسیلوسکوپ ساده بسازیم تا شکل موج های مختلف را در آن نمایش دهیم. البته این اسیلوسکوپ ساخته ما قابلیت هایی که موارد صنعتی و شرکتی این دستکاه دارند را شامل نمی‌شود و تنها برای نمایش شکل موج ها در مدار های DC بکار می‌رود.  در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 

Build a simple oscilloscope with Arduino and Oled display - دیجی اسپارک

 


اسیلوسکوپ با برد آردوینو


مجموعه برد های آردوینو از جمله برد های توسعه پرطرفدار بین مهندسین امبدد هستند که در مدل های مختلفی از جمله Micro ,  proMini , Nano , Uno و همچنین Mega قابل تهیه هستند، هسته مرکزی این برد های محبوب از سری AtMega328 می باشد. آردوینو پلتفرم سخت‌افزاری و نرم‌افزاری متن‌باز است. همان طور که قبل تر اشاره کردیم، پلتفرم آردوینو شامل یک میکروکنترلر تک‌بردی متن‌باز است که قسمت سخت‌افزار آردوینو را تشکیل می‌دهد. علاوه بر این، پلتفرم آردوینو یک نرم‌افزار آردوینو IDE که به منظور برنامه‌نویسی برای بردهای آردوینو طراحی شده‌است و یک بوت لودر نرم‌افزاری که بر روی میکروکنترلر بارگذاری می‌شود را در بر می‌گیرد.

 simple oscilloscope with Arduino

 


ماژول نمایشگر Oled 1306


معمولا در پروژه های اینترنت اشیا و دیگر پروژه های امبدد از برای نمایش متن و مقادیر مختلف از نمایشگر های Oled استفاده می شود، این ماژول ها بدر انواع مختلق بسته به نوع درایور اندازه یافت می شوند که یکی از پرطرفدار ترین آن ها SSD1306 می باشد، این نوع از Oled ها معمولا در اندازه های ۰٫۹۶ و ۱٫۳ اینچ ساخته می شوند همچنین پروتکل ارتباطی Oled ها I2C می باشد.

 


اسیلوسکوپ Oscope


اسیلوسکوپ یا به زبان فارسی نوسان‌نگاردستگاهی الکترونیکی است، برای مشاهده شکل موج سیگنال‌ها که به موجب اختلاف ولتاژ های مختلف ایجاد شده‌اند بکار می‌رود. در اسیلوسکوپ ها دامنه سیگنال در نموداری دوبعدی نمایش داده‌می‌شود که محور افقی، زمان و محور عمودی، مقدار ولتاژ است. از اسیلوسکوپ برای نمایش دقیق شکل موج استفاده می‌شود. علاوه بر دامنه، اندازه‌گیری دیگر پارامترهای سیگنال مانند عرض پالس، دوره تناوب و فاصله زمانی دو رویداد در سیگنال مانند وقوع ولتاژ دو پیک نیز بر روی نمایشگر اسیلوسکوپ ممکن است.

 


روش کار پروژه اسیلوسکوپ ساده


در این پروژه با استفاده از قطعه ساده یعنی برد آردوینو نانو و نمایشگر Oled با دریاور SSD1306 و ابعاد ۰٫۹۶ اینچ، اشکال موچ بدست آمده از سورس مدنظر را با کمک آنالوگ به دیجیتال آردوینو (پین A0) اندازه‌گیری و نمایش خواهیم داد، مقادیر بصورت گراف هایی وابسته به زمان و ولتاژ در نمودار نمایش داده می‌شوند. به این ترتیب می‌توانیم شکل موج حاصل از ولتالژه ای مختلف را در نمایشگر مشاهده کنیم.

Build a simple oscilloscope with Arduino and Oled display

 


وسایل موردنیاز


برد آردوینو نانو Nano

نمایشگر Oled 0.96

Arduino and Oled display

 


نصب کتابخانه مورد نیاز


ابتدا در نرم افزار Arduino IDE اقدام به نصب کتابخانه مورد نیاز خواهیم‌کرد. مراحل زیر را دنبال کنید:

  1. این مسیر را دنبال کنید Sketch Include Library > Manage Libraries
  2. کلمه Adafruit SSD1306  را جستجو کنید.
  3. کتابخانه را نصب کنید.
  • سپس کلمه “GFX” را جستجو کنید و آن را نصب کنید.

 


اتصالات و راه‌اندازی


در این بخش اقدام به برقراری اتصالات بین نمایشگر Oled و برد آردوینو نانو خواهیم کرد. نمایشگر ما یعنی Oled 0.96 برای برقراری ارتباط با برد آردوینو از پروتکل I2C استفاده می‌کند. برای ایجاد این ارتباط ار پین های i2c برد آردوینو استفاده خواهیم کرد، یعنی پین های A4 و A5 که به ترتیب به SDA و SCL در نمایشگر ما متصل می‌شوند. اتصالات را با توجه به جدول و شماتیک زیر برقرار کنید.

اتصالات ماژول OLED به برد آردوینو - دیجی اسپارک

 

  • شماتیک اتصالات پروژه اسیلوسکوپ ساده با آردوینو و نمایشگر Oled

Build a simple oscilloscope with Arduino and Oled display

در این بخش نوبت به کد های این پروژه می‌رسد،ابتدا چندبخش از این کد را مورد بررسی قرار خواهیم داد. در این کد برای راه‌انداز ینمایشگر از کتابخانه های 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);

}

 


جمع بندی


در این پروژه توانستیم یک اسیلوسکوپ ساده بسازیم تا بتوانیم سیگنال هایی را از منبع مورد نظر را نمایش دهیم. البته این پروژه کاربر های متفاوتی دارد یه این صورت که شما قادر خواهید بود مقادیر بدست امده از سنسور های مختلف را بصورت گراف با استفاده از این کد نمایش دهید و به پروزه خود یک ظاهر مناسب اضافه کنید.

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

CiferTech

تبادل نظر و رفع عیب با ثبت دیدگاه

۳۲ دیدگاه

  • سلام جناب
    چه ماژول هایی میتوانیم ازشان خروجی برای پروژه بگیریم
    پاسخ بدهید ممنون میشوم

    • سلام مهندس
      کد ها رو به آردوینو انتقال دادم ولی خروجی ندارد،ودر صفحه نمایشگر هیچی نشان داده نمی شود

      • پیشنهاد میکنم از سخت افزار دیگری هم استفاده کنید، به این دلیل که کد ها تست شده‌اند و به نظر مشکل از سخت افزار هست. البته می‌توانید کد های نمونه برای نمایشگر خود را اجرا کنید تا از صحت کار اطمینان داشته باشید.

  • سلام
    آیا این کدی که اینجا قرار دادید، کد کامل پروژه است؟
    این کد را اجرا کردید؟
    برای بنده که اصلا اجرا نشد و حتی صفحه نمایشگر هم روشن نشد اصلا

    • با سلام، بله کد کامل پروژه است. تصاویر موجود در آموزش مربوط به همین کد است، اتصالات را بررسی کنید اگر ارتباط I2C به درستی برقرار نشود، نمایشگر کار نمیکند.

  • سلام مهندس
    کد ها روی آردوینو‌ نانو تست شد ،جواب نداد،کتابخانه ها کامل بارگیری شده،و فقط تو قسمت سریال باید مشکلی باشه ،چون ماژول ال ای با برنامه نمایش متن و اشکال ایرادی ندارد،لطف کنید راهنمایی کنید،ممنون

    • سلام، اگر همه موارد مطابق آموزش جلو رفته نباید مشکلی باشه و این عجیبه چون پروژه تست شده. کد ها رو تست میکنم و اگر مشکلی داشت و یا تغییری نیاز داشت کد هارو آپدیت میکنم.

  • سلام آیا این کد ها قابل تست با برنامه پروتئوس هستند؟ توی خود کامپایلر آردوینو گزینه ای برای سیو کردن کد ها داخل سیستم وجود داره؟ پسوند فایل کد های کامپایلر اردوینو چی هست؟ ممنون میشم به این سه تا سوال پاسخ بدید

    • در کل قابلیت اجرای کد ها در پروتئوس هست، اما برای این پروژه اطلاع ندارم برای نمایش مقادیر oled چه کاری باید انجام داد.
      بله امکان ذخیره وجود دارد در منوی بالای برنامه یا منوی files امکان ذخیره است.
      پسوند فایل ها .ino است.

  • آقا من هم زدم حتی مثل ها رو مزنم نمایشگر روشن می شه موقع بارگذاری کد ها خطا نمی گیره همه چیز مرتبه ولی هیچی نشون نمی ده من از مگا ۲۵۶۰ استفاده کردم

  • مشکل اینجاست که ارور نمی گیره عرض کردم جناب مدیر کد بار گیری می شه کتاب خانه کامله ۱۰۰ بار زدم تصویر نمی ده

  • سلام بنده موفق شدم راهش بندازم اما از جای دیگه ای کد ها رو پیدا و بار گذاری کردم وقتی خوب دقت کردم دیدم در مقایسه با پروژه شما کدهای شما ناقصی زیادی دارد چرا که این نمایشگر در صورت اشکال در مختصات کد نویسی نمایشگر چیزی نمایش نمی دهد لطفا با دقت بررسی و رفع ایراد فرمایید
    تشکر

    • این مورد امکان دارد از ورژن کتابخانه های استفاده شده در پروژه های مختلف باشد. در هرصورت تصاویری که در این آموزش میبینید نتیجه آپلود همین کد بوده‌اند و کد مشکلی ندارد.

  • دوستان کد یک مشکل داره
    باید در آخر قسمت void loop بعد از جمله:
    display.drawFastVLine(10, 10, 60, WHITE);
    باید بنویسید:
    ;()display. display

  • سلام هیچ توضیحی در مورد نحوه کالیبره کردن داده نشده ، همچنین نتونستم علت استفاده از متغییرهای TCCR2B و ttime مشخص نیست ، چون بعد از مقدار دهی از آنها استفاده نشده است . ممنون میشم راهنمایی بفرمایید

    • با سلام
      متغیر TCCR2B یک رجیستر است که در میکروکنترلرهای ATmega داخلی مانند ATmega328P که در برد Arduino Uno استفاده می‌شود، وظیفه تنظیم فرکانس تایمر/شمارنده ۲ را بر عهده دارد. این متغیر از سه بیت (Bit) پایین تر رجیستر TCCR2B استفاده می‌کند. در کد شما، این خط کد را داریم: TCCR2B = TCCR2B & B11111000 | B00000100;

      این کد برای تنظیم فرکانس تایمر/شمارنده ۲ به حالت PWM با فرکانس ۴۹۰٫۲۰ هرتز استفاده می‌شود.
      بیت‌های B11111000 متعلق به بیت‌های ۲ تا ۰ مربوط به TCCR2B هستند. این بیت‌ها مشخص کننده تقسیم‌بندی فرکانس سیستم برای تولید فرکانس PWM هستند. با اینکه این کد نهایتاً بیت‌های مورد نظر را تنظیم می‌کند، اما به دلیل استفاده از عملگر & و |، مطمئنیم که بیت‌های دیگر این رجیستر حفظ می‌شوند. بیت‌های B00000100 که به عنوان OR شده‌اند، مربوط به تنظیم فرکانس PWM بر اساس پیش‌فرض هستند (divider = 64). این تنظیمات می‌تواند بر اساس نیازهای شما تغییر کند.