آردوینو آردوینو Arduino Uno آموزش آردوینو

آموزش تولید فرکانس با بیزر Buzzer و میکروسوییچ و برد آردوینو Arduino

نوشته شده توسط پریسا پوربلورچیان

بیزر پیزو برای تولید صدا ساخته شده است و قابلیت پخش صدایی شبیه به بوق و موزیک دارد. بیزر به صورت معمولی دارای دو پایه است. پایه مثبت و منفی که به gnd و پایه دیجیتال بردهای میکروکنترلر متصل می‌شود. عملکرد بیزر توسط تولید فرکانس در یک موج مربعی است به این صورت که با تغییر فرکانس بر روی پین مثبت صداهای مختلفی میتوان ایجاد کرد. در ادامه به معرفی کاملتری از بیزر و ساخت موزیک با بیزر و کلید می‌پردازیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی دیجی اسپارک همراه باشید.

 


بیزر چیست و چگونه کار می‌کند


بیزر با تولید فرکانس صداهای مختلفی تولید کرده و با اتصال به ۵ ولت در یک موج PWM صدا را پخش می‌کند. در حال حاضر دو مدل پیزو پسیو و اکتیو وجود دارد. بیزر در واقع یک ماژول سیگنال صوتی الکترومغناطیسی است. بیزر Buzzer توسط یک مدار الکتریکی و یا یک سیگنال صوتی نوسان و هدایت می‌شود. ولتاژ کاری ماژول بیزر ۵ ولت DC است. در این آموزش من از بیزر پسیو یا passive buzzer استفاده خواهم کرد. ماژول بیزر دارای دو نوع اکتیو و پسیو می‌باشد. در نوع پسیو برای راه اندازی ماژول نیاز به تعریف فرکانس کاری برای عملکرد ماژول بیزر خواهد داشت. ماژول بیزر اکتیو برای راه اندازی تنها نیاز به ولتاژ DC دارد و به راحتی قابل اجرا است. دیگر نیازی به تعریف فرکانس کاری برای عملکرد آن نخواهیم داشت. به عبارتی با شوک الکتریکی ماژول اکتیو فعال خواهد شد.

 


تولید فرکانس بیزر


 برای راه اندازی بیزر نیاز به تعریف فرکانس Frequency داریم. فرکانس در موج مربعی PWM تولید شده و با وارد کردن اعداد فرکانس در کدنویسی میتوانید شدت صدای دریافتی را تست و تغییر دهید. به همین صورت در کد برنامه آردوینو Arduino به دلخواه می‌توانید از لیست فرکانس های زیر استفاده کنید و در خروجی تن های متفاوتی را دریافت کنید.

  1. ۲۶۱
  2. ۲۷۷
  3. ۲۹۳
  4. ۳۱۱
  5. ۳۲۹
  6. ۳۴۹
  7. ۳۶۹
  8. ۳۹۲
  9. ۴۱۵۲۶
  10. ۴۴۰
  11. ۴۶۶
  12. ۴۹۳
  13. ۵۲۳
  14. ۵۵۴

 


ساخت پیانو با بیزر و آردوینو


در این آموزش با تولید فرکانس های مختلف از بیزر و توسط کلید یک پیانو طراحی می‌کنیم. به این صورت که با فشردن هر کلید یک فرکانس منحصر به فرد برای بیزر تولید شده و پخش خواهد شد. در این آموزش ۴ کلید تعریف شده است و به ترتیب ۴ فرکانس مختلف برای هر کلید تعریف شده است. با فشردن کلید ۱ بیزر فرکانسی با عدد ۲۶۲ تولید، با فشردن کلید ۲ فرکانس ۲۹۴ ، با فشردن کلید ۳ فرکانس ۳۳۰ و در نهایت با فشردن کلید چهارم فرکانس ۳۴۹ توسط بیزر تولید و پخش می‌شود. به همین ترتیب میتوانید تعداد کلیدها را افزایش داده و پروژه را تعمیم دهید.

 


روش استفاده از کلید Button در آردوینو


کلید یکی از تجهیزات مهم و کاربردی در پروژه های الکترونیک است و میتواند به عنوان ورودی عمل خاصی را انجام دهد. برای تازه کاران در ابتدا ممکن است کار با کلید با وجود سادگی بسیار پیچیده باشد. به عنوان مثال با یک بار فشردن کلید ممکن است آردوینو چند بار آن را دریافت کند و در خروجی مدام ۰ و ۱ ارسال کند که عملا ایجاد خطا در برنامه نویسی و عملکرد پروژه می‌کند که برای رفع مشکل بایستی از قابلیت دیبانسینگ در آردوینو استفاده کرد. با اتصال مستقیم بیزر به پایه های آردوینو ممکن است نتیجه ای که در خروجی مشاهده می‌کنید با وضعیت کلید درآن لحظه تفاوت داشته باشد که برای اینکار از یک مقاومت برای Pullup و Pulldown بیزر استفاده می‌شود. روش استفاده از کلید بسیار آسان است. در صورتیکه از کلید دو پایه استفاده می‌کنید یک پایه به صورت دلخواه به پایه دیجیتال آردوینو و پایه دیگر با یک مقاومت بین ۱ تا ۱۰ کیلو Pullup , pulldown به زمین GND و یا VCC متصل می‌شود. در صورتیکه از کلید های چهار پایه استفاده می‌کنید، فقط دو پایه متقارن استفاده می‌شود.

در این تصویر پایه های کلید ۴ پایه مشخص شده است. پایه های ۱ و ۳ به هم متصل و پایه های ۲ و ۴ به هم متصل است:

شماتیک میکروسوئیچ جهت اتصال به آردوینو - دیجی اسپارک

 

 جهت اتصال کلید Pushbutton به برد آردوینو Arduino از دیاگرام زیر استفاده کنید.

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

در کدنویسی به دلخواه از پایه های ۲ تا ۱۳ برد آردوینو UNO و پایه های ۲ تا ۵۴ در برد آردوینو Arduino Mega2560 میتوانید استفاده کنید. رنج مقاومت از ۱ تا ۱۰ کیلو قابل تغییر است و مشکلی در مدار ایجاد نمی‌کند.

 


برد آردوینو Arduino


برد آردوینو میکروکنترلری با قابلیت دسترسی به پورت های دیجیتال و آنالوگ و پروتکل‌های I2C و SPI است. در این آموزش از آردوینو Arduino مدل UNO استفاده شده است. برد آردوینو Arduino دارای تراشه Atmega328P است و با در اختیار داشتن پایه‌های کنترلی آنالوگ و دیجیتال I/O میتوان با سنسورهای مختلف ارتباط برقرار کرد. با در نظر گرفتن پروتکل ارتباطی، آن‌ها را راه اندازی و کدنویسی کرد. محیط برنامه نویسی IDE Arduino است که نباز به دانش برنامه نویسی C++ خواهد داشت.

 


اتصالات بیزر به آردوینو


در این آموزش از ۴ کلید Pushbutton و یک بیزر استفاده شده است:

  • کلید اول رل به پایه شماره ۳ دیجیتال آردوینو اتصال دهید.
  • کلید دوم را پایه شماره ۴ دیجیتال آردوینو اتصال دهید.
  • کلید سوم را به پایه شماره ۵ دیجیتال آردوینو اتصال دهید.
  • کلید چهارم را به پایه شماره ۶ دیجیتال آردوینو اتصال دهید.
  • پایه کوتاه بیزر را به پایه زمین GND آردوینو اتصال دهید.
  • پایه بلند بیزر را به پایه ۱۱ دیجیتال برد آردوینو اتصال دهید.

اتصال بیزر Buzzer به آردوینو - دیجی اسپارک


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


جهت شروع برنامه نویسی در صورتی که روش کار با آردوینو و طربق نصب نرم افزار آردوینو Arduino را نمی‌دانید آموزش زیر را مطالعه کرده و سپس کد را به نرم افزار آردوینو انتقال دهید.

آموزش کار با برد آردوینو و نصب نرم افزار آردوینو Arduino

int val=0;
int buzzer = 11;
unsigned long on_time=0;
unsigned long off_time=0;
unsigned long button_ontime[20];
unsigned long button_offtime[20];
int button_seq[20];
int button1=3;
int button2=4;
int button3=5;
int button4=6;




int frequency[] = {262, 294, 330, 349};

int buttonPin = 2;
int previousState = HIGH;
unsigned int previousPress;
volatile int buttonFlag;
int buttonDebounce = 20;


int path=1;
int i=0;
int led=13;
void playback (void);

void setup() 
{
Serial.begin(9600);
pinMode(buzzer,OUTPUT);
pinMode(led,OUTPUT);

///////////////
pinMode(button1,INPUT_PULLUP);
pinMode(button2,INPUT_PULLUP);
pinMode(button3,INPUT_PULLUP);
pinMode(button4,INPUT_PULLUP);




pinMode(buttonPin,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), button_ISR, CHANGE);
analogWrite(buzzer,0);
digitalWrite(led,LOW);
}

void loop() 
{
if(path==0)
{
  Serial.println("playback");
  playback();
}
if((millis() - previousPress) > buttonDebounce && buttonFlag)
  {
    previousPress = millis();
    if(digitalRead(buttonPin) == LOW && previousState == HIGH)
    {
      path =! path;
      previousState = LOW;
    }
    
    else if(digitalRead(buttonPin) == HIGH && previousState == LOW)
    {
      previousState = HIGH;
    }
    buttonFlag = 0;
  }

if(digitalRead(button1)==LOW)
{ 
  analogWrite(buzzer,frequency[0]);
 
  on_time=millis();
  if(i>0)
  {
    button_offtime[i-1]=on_time-off_time;
  }
  while(digitalRead(button1)==LOW);
  if(path==1)
  {
    off_time=millis();
    button_ontime[i]=(off_time-on_time);
    button_seq[i]=0;
    i++;
    Serial.println("button 1 stored");
  }
}

else if(digitalRead(button2)==LOW)
{
analogWrite(buzzer,frequency[1]);
on_time=millis();
if(i!=0)
button_offtime[i-1]=on_time-off_time;
while(digitalRead(button2)==LOW);
if(path==1)
  {
    off_time=millis();
    button_ontime[i]=(off_time-on_time);
    button_seq[i]=1;
     i++;
     Serial.println("button 2 ");
  }
}

else if(digitalRead(button3)==LOW)
{
analogWrite(buzzer,frequency[2]);
on_time=millis();
if(i!=0)
button_offtime[i-1]=on_time-off_time;
while(digitalRead(button3)==LOW);
if(path==1)
  {
    off_time=millis();
    button_ontime[i]=(off_time-on_time);
    button_seq[i]=2;
     i++;
     Serial.println("button 3 ");
  }
}

else if(digitalRead(button4)==LOW)
{
analogWrite(buzzer,frequency[3]);
on_time=millis();
if(i!=0)
button_offtime[i-1]=on_time-off_time;
while(digitalRead(button4)==LOW);
if(path==1)
  {
    off_time=millis();
    button_ontime[i]=(off_time-on_time);
    button_seq[i]=3;
     i++;
     Serial.println("button 4 ");
  }
}



analogWrite(buzzer,0);
}




void playback (void)
{
 digitalWrite(led,LOW);
 for(int j=0;j<i;j++)
 {
  analogWrite(buzzer,frequency[button_seq[j]]);
  delay(button_ontime[j]);
  analogWrite(buzzer,0);
  delay(button_offtime[j]);
 }
 i=0;
 off_time=0;
 on_time=0;
 path=1;
 digitalWrite(led,HIGH);
}




void button_ISR()
{
  buttonFlag = 1;
  
}

کد را در ابتدا Verify و سپس Upload کنید.

 


تحلیل کد آردوینو


در مرحله اول بایستی به تعداد کلید و بیزر ها ورودی و خروجی ها را در برنامه تعریف کنیم.

int val=0;
int buzzer = 11;
unsigned long on_time=0;
unsigned long off_time=0;
unsigned long button_ontime[20];
unsigned long button_offtime[20];
int button_seq[20];
int button1=3;
int button2=4;
int button3=5;
int button4=6;


int buttonPin = 2;
int previousState = HIGH;
unsigned int previousPress;
volatile int buttonFlag;
int buttonDebounce = 20;


int path=1;
int i=0;
int led=13;

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

void playback (void)
{
 digitalWrite(led,LOW);
 for(int j=0;j<i;j++)
 {
  analogWrite(buzzer,frequency[button_seq[j]]);
  delay(button_ontime[j]);
  analogWrite(buzzer,0);
  delay(button_offtime[j]);
 }
 i=0;
 off_time=0;
 on_time=0;
 path=1;
 digitalWrite(led,HIGH);
}

 

 


جمع بندی لیدی پای


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

 


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


آردوینو UNO

بیزر Buzzer

کلید Pushbutton

مقاومت ۴٫۷ کیلو

 

 

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

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های دیجی_اسپارک   دانشجوکیت    digispark    daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

 

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

پریسا پوربلورچیان

تولید کننده محتوا / کارشناس IOT

زندگی یعنی پژوهش و فهمیدن چیزی جدید

تلاشم بر این است تجربیاتم در زمینه IOT‌ را به بهترین شکل با شما در میان بگذارم.

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

۵ دیدگاه

  • سلام و خسته نباشید
    آیا این آموزش با آردوینو mega قابل اجرا است و چه تغییراتی در کدها باید بدهم لطفا سریع جواب دهید

    • با سلام
      بله تفاوتی در نوع برد مورد استفاده ندارد و کافیست از منو Arduino / Tools/ Board نوع برد را آردوینو Arduinomega2560 انتخاب کنید.

  • سلام یک سوال چرا وقتی کلید در برنامه تعریف میکنیم و فقط یک بار میفشاریم چندین بار حساب می‌شود.

    • با سلام
      در متن آموزش به این مورد اشاره شده است.
      برای تازه کاران در ابتدا ممکن است کار با کلید با وجود سادگی بسیار پیچیده باشد. به عنوان مثال با یک بار فشردن کلید ممکن است آردوینو چند بار آن را دریافت کند و در خروجی مدام ۰ و ۱ ارسال کند که عملا ایجاد خطا در برنامه نویسی و عملکرد پروژه می‌کند که برای رفع مشکل بایستی از قابلیت دیبانسینگ در آردوینو استفاده کرد.

  • باسلام میخواستم بدونم باچه فرکانسی میشه صدای تیری که از تفنگ خارج میشه رو تولید وشبیه سازی کرد ؟ ممنون میشم اگه جواب بدید.

    • با سلام
      این مورد تست نشده است. از تابع زیر استفاده کنید.
      void playTone(long duration, int freq) { // تعیین زمان و فرکانس ماژول بیزر : زمان بر اساس میلی ثانیه و فرکانس بر اساس هرتز می باشد.

      duration *= 1000; // انتخاب زمان
      int period = (1.0 / freq) * 1000000; // تعیین فرکانس
      long elapsed_time = 0;
      while (elapsed_time < duration) { // اگر زمان سپری شده کوچک تر از مدت تعریف شده در کد باشد digitalWrite(pinSpeaker,HIGH); // بیزر فعال خواهد شد delayMicroseconds(period / 2); // تاخیر digitalWrite(pinSpeaker, LOW); // بیزر غیر فعال خواهد شد delayMicroseconds(period / 2); elapsed_time += (period); // تعریف زمان سپری شده } }