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

ساخت پیانو لمسی خازنی با آردوینو (همراه با قابلیت ضبط و پخش)

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

سنسور لمسی خازنی چگونه کار می کند؟

ما می دانیم که برای تشکیل یک خازن با مقداری ظرفیت ، به دو صفحه رسانای موازی نیاز داریم که توسط یک ماده دی الکتریک از هم جدا شده اند. اما چگونه می توانیم تشخیص دهیم که آیا ظرفیت تنها با لمس صفحه رسانا با انگشتان دست تغییر کرده است؟ پاسخ ما بر اساس درک اساسی ما از خازن است. همانطور که می دانیم ، تغییر سطح صفحه رسانا یا فاصله بین دو صفحه رسانای موازی می تواند مقدار ظرفیت را تغییر دهد. بین صفحه رسانا و انگشت ، ما هوا را به عنوان یک محیط دی الکتریک داریم. ما می دانیم که فرمول اصلی خازن خازن صفحه موازی C = ϵA/d است.

جایی که “A” نشان دهنده مساحت صفحات رسانا است ، “d” نشان دهنده فاصله بین دو صفحه رسانا و “ϵ” نشان دهنده ضریب دی الکتریک است. در نتیجه ، افزایش مساحت و کاهش فاصله بین دو صفحه رسانای موازی ، مقدار ظرفیت را افزایش می دهد. در مورد ما ، لمس صفحه رسانا فاصله را کاهش می دهد در حالی که مقدار خازن را افزایش می دهد. آیا می توانیم این این تغییر ظرفیت را با اتصال یک ماده رسانا به یک مقاومت و پین GPIO میکروکنترلر تشخیص دهیم؟ پاسخ این است که ما نمی توانیم. بله ، اتصال منبع ولتاژ به آن باعث تغییر کوچکی در ولتاژ آنالوگ می شود ، اما این راه حل چندان قابل اطمینانی نیست.

چگونه می  توان تغییر ظرفیت در سنسور لمسی خازنی را تشخیص داد؟

بنابراین ، چگونه می توانیم تشخیص دهیم که آیا مقدار ظرفیت تغییر کرده است؟ بیایید نگاهی به بلوک دیاگرام زیر بیندازیم. این را یک مدار اصلی شامل یک میکروکنترلر (در این مورد ، یک آردوینو نانو) ، یک مقاومت 1 مگا اهم و یک صفحه رسانا در نظر بگیرید. دو خط دیجیتالی آردوینو نانو با یک مقاومت 1 مگا اهم به یک حلقه مقاومت متصل می شوند. این مقاومت همچنین در یک نقطه به صفحه رسانا متصل می شود. اگرچه این صفحه به عنوان یک نقطه واحد از خازن عمل می کند ، اما همچنان می تواند خازنی را معرفی کند که با لمس آن تغییر می کند. با این حال ، این را نمی توان به سادگی با تشخیص تغییر ولتاژ تشخیص داد. تغییر خازن در این خط به آسانی به عنوان حس کردن ضامن روشن یا خاموش بودن مقدار روی پین GPIO نیست.

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

اینجاست که کتابخانه های آردوینو مفید هستند. از پل باگدر و پل استفرگن ، نویسندگان کتابخانه “CapacitiveSensor” بسیار سپاسگزارم. هنگامی که آن صفحه رسانا را لمس می کنیم ، می توانیم تغییر ظرفیت را با استفاده از این کتابخانه تشخیص دهیم. یکی از پین های دیجیتال به عنوان پین ارسال (به عنوان OUTPUT) ، و دیگری به عنوان پین دریافت (به عنوان INPUT) در این کتابخانه استفاده می شود. مدت زمانی که پین ​​ارسال HIGH میشود و هنگامی که پین ​​دریافت کننده HIGH میشود تنها راه تشخیص تغییر در ظرفیت است. هنگامی که پین ​​ارسال را روی HIGH (یا 5 ولت) تنظیم می کنید ، جفت مقاومت-خازن بین زمانی که پایه ارسال HIGH می شود و هنگامی که پین ​​دریافت کننده مقدار HIGH پین ارسال را می خواند تأخیر ایجاد می کند. کتابخانه CapacitiveSensor عملکردی را ارائه می دهد که پین ​​ارسال را روی HIGH تنظیم می کند ، سپس منتظر می ماند و زمانی که پین ​​دریافت کننده به عنوان HIGH خوانده شود را حساب میکند. این تابع مقدار زمانی را برمی گرداند که می تواند برای تشخیص تغییرات ظرفیت مورد استفاده قرار گیرد. وقتی مقدار زمان افزایش یا کاهش می یابد ، نشان می دهد که مقدار ظرفیت تغییر کرده است. رسیدن پین دریافت در زمانی که ظرفیت بیشتر است بیشتر طول می کشد و در زمانی که ظرفیت کمتری وجود دارد ، زمان کمتری طول می کشد. در نتیجه ، ما می توانیم وضعیت عادی را تعیین کنیم و سپس با هر بار ارسال ، تغییرات را بررسی کنیم.

مدار برای پیانو لمسی با استفاده از آردوینو نانو

هشت مقاومت 1 مگا اهم در نمودار مدار زیر به پین ​​دیجیتال شماره 2 آردوینو نانو متصل شده است. پایه های دیجیتالی 3 تا 10 به نقاط اتصال دیگر هر مقاومت متصل شدند. در نمودار زیر ، یک سوئیچ اسلاید با عنوان “RECODINGSWITCH” داریم. پین دیجیتال 12 آردوینو نانو به پین ​​”EN” سوئیچ اسلاید متصل است. پین “Vs” سوئیچ اسلاید به پین ​​”5V” آردوینو نانو متصل است. پین “GND” سوئیچ کشویی به “Ground Pin” آردوینو نانو متصل است. پین مثبت BUZZER به پین ​​”A4″ آردوینو نانو متصل است. و منفی BUZZER به پین ​​Ground آردوینو نانو متصل می شود.

مدار برای پیانو لمسی با استفاده از آردوینو نانو

ما هشت خازن 10uF را به هر یک از مقاومت ها وصل کرده ایم. و پین منفی هر خازن به پایه زمین آردوینو نانو متصل می شود. سپس یک بخش Power داریم که 6.6 ولت مناسب را برای پین “Vin” آردوینو فراهم می کند. سلول باتری 18650 به ماژول شارژر باتری 18650 متصل است و خروجی ماژول شارژر به تقویت کننده ولتاژ DC به DC متصل می شود. پین خروجی مثبت تقویت کننده ولتاژ (BOUT+) به پین ​​”Vin” آردوینو نانو و پین خروجی منفی تقویت کننده ولتاژ (BOUT-) به پین ​​GND آردوینو نانو متصل است.

قطعات مورد نیاز

اجزای زیر برای ساخت پیانو PCB با استفاده از آردوینو نانو مورد نیاز است.

  • آردوینو نانو
  • مقاومت 1 مگا اهم – 8 عدد
  • بازر
  • باتری 18650
  • نگهدارنده باتری 18650
  • ماژول شارژ باتری 18650
  • تقویت کننده ولتاژ DC به DC
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

PCB مدار پیانو لمسی خازنی

PCB مدار پیانو لمسی خازنی با آردوینو

فایل PCB مدار این پروژه در فایل دانلودی انتهای صفحه قرار داده شده است.

برنامه نویسی پیانو لمسی خازنی با آردوینو

استفاده از کتابخانه “CapacitiveSensor” بسیار آسان است. قبل از توضیح برنامه نویسی شما باید ابتدا کتابخانه را نصب کنید. فایل کتابخانه در فایل دانلودی انتهای صفحه قرار داده شده است. همچنین میتوانید آموزش نصب کتابخانه در آردوینو را مشاهده کنید.

#include <CapacitiveSensor.h>
#include "piano_tones.h"
#define common_pin 2 // The common ‘send’ pin for all keys
#define buzzer A4 // The output pin for the piezo buzzer
#define recordbtn 12 // The recording button
#define CPin(pin) CapacitiveSensor(common_pin, pin)

در شروع کد ما فایلهای “CapacitiveSensor.h” و “piano_tones.h” را فراخوانی کردیم. سپس من سه ماکرو برای پین GPIO مربوطه تعریف کرده ام.

int notes[]={NOTE_C7,NOTE_D7,NOTE_E7,NOTE_F7,NOTE_G7,NOTE_A7,NOTE_B7,NOTE_C8};
// Sound on startup
int soundOnStartUp[] = {
  NOTE_E7, NOTE_E7, 0, NOTE_E7,
  0, NOTE_C7, NOTE_E7, 0,
  NOTE_G7, 0, 0,  0,
  NOTE_G6, 0, 0, 0 };
CapacitiveSensor keys[] = {CPin(3), CPin(4), CPin(5), CPin(6), CPin(7), CPin(8), CPin(9), CPin(10)};

پس از فراخوانی کتابخانه ها و تعریف ماکروهای خاص ، باید 3 آرایه همانطور که در بالا ذکر شده ایجاد کنیم.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید
void recordButtons(){
  // Set the sensitivity of the sensors.
  long touch1 =  keys[0].capacitiveSensor(sensitivity);
  long touch2 =  keys[1].capacitiveSensor(sensitivity);
  long touch3 =  keys[2].capacitiveSensor(sensitivity);
  long touch4 =  keys[3].capacitiveSensor(sensitivity);
  long touch5 =  keys[4].capacitiveSensor(sensitivity);
  long touch6 =  keys[5].capacitiveSensor(sensitivity);
  long touch7 =  keys[6].capacitiveSensor(sensitivity);
  long touch8 =  keys[7].capacitiveSensor(sensitivity);
   pev_button = button;
   // When we touched the sensor, the the button will record the corresponding numbers.
  if (touch1 > sensitivity)
    button = 1;
  if (touch2 > sensitivity)
    button = 2;
  if (touch3 > sensitivity)
    button = 3;
  if (touch4 > sensitivity)
    button = 4;
  if (touch5 > sensitivity)
    button = 5;
  if (touch6 > sensitivity)
    button = 6;
  if (touch7 > sensitivity)
    button = 7;
  if (touch8 > sensitivity)
    button = 8;
  // When we didn't touch it, no tone is produced.
  if (touch1<=sensitivity  &  touch2<=sensitivity  &  touch3<=sensitivity & touch4<=sensitivity  &  touch5<=sensitivity  &  touch6<=sensitivity &  touch7<=sensitivity &  touch8<=sensitivity)
    button = 0;
  /****Rcord the pressed buttons in a array***/
  if (button != pev_button && pev_button != 0)
  {
    recorded_button[button_index] = pev_button;
    button_index++;
    recorded_button[button_index] = 0;
    button_index++;
  }
/**End of Recording program**/
  }

ما مقدار ظرفیت هر کلید را با استفاده از تابع “keys[0].capacitiveSensor(sensitivity)” می خوانیم و آن را با برخی مقادیر مشخص مقایسه می کنیم تا مشخص شود کدام کلید در تابع recordButtons() بالا فشار داده شده است. همچنین ترتیب فشردن دکمه ها در این عملکرد را پیگیری می کنیم. مقادیر ثبت شده در آرایه button[] ثبت شده ذخیره می شوند. ما ابتدا نگاه می کنیم تا ببینیم آیا کلید جدیدی فشار داده شده است یا خیر و در این صورت ، دوباره بررسی می کنیم که دکمه 0 نیست.

void playTone(){
   /****Rcord the time delay between each button press in a array***/
  if (button != pev_button)
  {
    note_time = (millis() - start_time) / 10;
    if(note_time!=0){
    recorded_time[time_index] = note_time;
    time_index++;
    start_time = millis();
      }
Serial.println(time_index);
  }
  /**End of Recording program**/
  if (button == 0)
  {
    noTone(buzzer);
  }
  if (button == 1)
  {
    tone(buzzer, notes[0]);
  }
  if (button == 2)
  {
    tone(buzzer, notes[1]);
  }
  if (button == 3)
  {
    tone(buzzer, notes[2]);
  }
  if (button == 4)
  {
    tone(buzzer, notes[3]);
  }
  if (button == 5)
  {
    tone(buzzer, notes[4]);
  }
  if (button == 6)
  {
    tone(buzzer, notes[5]);
  }
  if (button == 7)
  {
    tone(buzzer, notes[6]);
  }
  if (button == 8)
  {
    tone(buzzer, notes[7]);
  }
  }

با استفاده از شرایط مختلف ، تن مناسب را برای ضربه کلید در داخل تابع playTone() پخش می کنیم. کل کد عملکرد در بالا نمایش داده می شود. ما همچنین از آرایه ای با نام recorded time[] برای حفظ مدت زمان فشار دادن دکمه استفاده خواهیم کرد. این روش مشابه ضبط توالی های دکمه است زیرا از تابع millis() برای محاسبه مدت زمان فشار دادن هر دکمه استفاده می کنیم و سپس مقدار را بر 10 تقسیم می کنیم تا اندازه متغیر کاهش یابد. ما در همان مدت برای دکمه 0 هیچ صدایی پخش نمی کنیم ، که نشان می دهد کاربر چیزی را فشار نمی دهد.

void setup(){
  Serial.begin(9600);
// Turn off autocalibrate on all channels:
for(int i=0; i<8; ++i) {
keys[i].set_CS_AutocaL_Millis(0xFFFFFFFF);
}
// Set the buzzer as an output:
pinMode(buzzer, OUTPUT);
pinMode(recordbtn, INPUT);
noTone(buzzer);
delay(10);
  int sizeed = sizeof(soundOnStartUp) / sizeof(int);
    for (int thisNote = sizeed; thisNote > 0 ; thisNote--) {
       tone(buzzer, soundOnStartUp[thisNote]);
       delay(100);
    }
noTone(buzzer);
delay(10);
}

در تابع setup () دو حلقه for وجود دارد. در حلقه اول ، من کلیدها را با استفاده از “keys [i] .set_CS_AutocaL_Millis (0xFFFFFFFF)” تنظیم کرده ام. و حلقه دوم برای پخش نت های soundOnStartUp [] با استفاده از tone(buzzer, soundOnStartUp[thisNote]); استفاده می شود.

void loop() {
  Serial.println(digitalRead(recordbtn));
  while (digitalRead(recordbtn) == 1) //If the toggle switch is set in recording mode
  {
    recordButtons();
    playTone();
  }
  while (digitalRead(recordbtn) == 0) //If the toggle switch is set in Playing mode
  {
  for (int i = 0; i < sizeof(recorded_button) / 2; i++)
  {
    delay((recorded_time[i]) * 10); //Wait for before paying next tune
    if (recorded_button[i] == 0)
      noTone(buzzer); //user didnt touch any button
    else
      tone(buzzer, notes[(recorded_button[i] - 1)]); //play the sound corresponding to the button touched by the user
  }
  }
}

سپس ، برای پخش آهنگ ضبط شده ، کاربر باید پس از ضبط ، Slide Switch را به سمت دیگری سوق دهد. وقتی این کار انجام شد ، برنامه از حلقه while قبلی خارج می شود و در حلقه while دوم وارد می شود ، جایی که ما نت ها را به ترتیب ضربه زدن کلیدها به طول ضبط شده قبلی پخش می کنیم.

موارد موجود در فایل : سورس کامل، کتابخانه، فایل PCB

5 (2 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

4 نظر

  1. سلام چجور در آردوینو بجای برد بورد از pcb استفاده کنیم؟

    1. سلام عزیز، منظورتون رو متوجه نشدم

  2. سلام مهندس عزیز
    بسیار از مطالب شما لذت بردم
    من یه پروژه بی نظیر برای شرکت در جشنواره خارزمی میخوام ممنون میشم راهنمایی کنید
    پایه هشتم و نهم

    1. سلام عزیز، خوشحالم که براتون مفید واقع شده
      قسمت پروژه های آردوینو رو بررسی کنید پروژه های متنوعی هست.
      همچنین از دوره آموزش آردوینو هم میتونید استفاده کنید

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *