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

آموزش راه اندازی برد آردوینو NANO 33 بخش چهارم: میکروفن MP34DT05-A

getting-started-with-arduino-nano33-sense-ble-part-four-mp34dt05-a-digispark
نوشته شده توسط پریسا پوربلورچیان

از دیگر سنسورهای امبدد داخلی قرار گرفته شده بر روی برد آردوینو Arduino nano 33 sense ble سنسور میکروفن است. این سنسور شدت صدای محیط را دریافت می‌کند. در این آموزش به معرفی سنسور و کدنویسی میکروفن MP34DT05-A بر روی برد آردوینو نانو ۳۳ خواهیم پرداخت. در ادامه با مرجع تخصصی آردوینو نانو به زبان فارسی، دیجی اسپارک همراه باشید.

 


سنسور میکروفن MP34DT05-A


سنسور MEMS AUDIO یک سنسور گیرنده فرستنده همه جانبه صوتی است که با کد تجاری MP34DT05 معرفی شده است. یک سنسور دیجیتال فوق فشرده، کم مصرف . همه جهته که از یک عنصر حسگر خازنی تشکیل شده است. پروتکل ارتباطی این سنسور با میکروکنترلر به صورت I2C است. المنت حسگر قادر به تشخیص امواج صوتی است و از آی سی CMOS برای ساخت و طراحی آن استفاده شده است. MP34DT05-A یک میکروفون دیجیتال کم اعوجاج با سیگنال به نویز ۶۴ دسی بل است. این سنسور از ۵ پایه VDD, LR, CLK, DOUT, GND تشکیل شده است. از این سنسور در ساخت ترمینال های صوتی موبایل، ساخت کامپیوترها،مدیا پلیرهای پرتابل، تشخیص صحبت کردن، بازی و ساخت بازی های مجازی به عنوان ورودی و دیگر دیوایس ها استفاده می‌شود.

• Single supply voltage
• Low power consumption
• AOP = 122.5 display
• ۶۴ dB signal-to-noise ratio
• Omnidirectional sensitivity
• –۲۶ dBFAST ±۳ dB sensitivity
• PDM output
• HCLGA package

 

میکروفن ها صدای فیزیکی را به صدای دیجیتال تبدیل می‌کنند به همین دلیل در ساخت بسیاری از دیوایس ها این سنسور یعنی MP34TD05 کاربرد ویژه ای برای تبدیل و دریافت صدای دیجیتال استفاده می‌شود. سنسور میکروفن با تراشه MP34TD05 از ماهیت PDM مخفف Pulse-Density Modulation بهره برده که برای نمایش سیگنال آنالوگ به سیگنال باینری از آن استفاده می‌شود.

  • Signal-to-noise ratio: 64dB
  • Sensitivity: -26dBFS ±۳dB
  • Temperature range: -40 to 85°C

 


نصب کتابخانه PDM برای فعال سازی میکروفن


در قدم اول با توجه به اینکه سنسور میکروفن MP34DT05-A از ماهیت PDM استفاده می‌کند، بایستی کتابخانه PDM را به لیست کتابخانه های نرم افزار آردوینو اضافه کنیم. برای اینکار از منو نرم افزار آردوینو عبارت PDM را فیلتر کنید.

نصب کتابخانه PDM برای استفاده از میکروفن MP34DT05-A آردوینو - دیجی اسپارک

 

کتابخانه Adafruit Zero PDM Library را نصب کنید. با نمایش پیغام INSTALLED کتابخانه نصب و آماده به کار است.

 


راه اندازی سنسور میکروفن MP34DT05-A


برای راه اندازی سنسور میکروفن MP34DT05-A در برد آردوینو نانو ۳۳ sense از کتابخانه PDM استفاده می‌کنیم. کد را کپی و به نرم افزار آردوینو انتقال دهید.

#include <PDM.h>

//ساخت بافر برای سمپل ۱۶ بیتی 
short sampleBuffer[256];

// number of samples read
volatile int samplesRead;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  // تنظیم دیتای دریافتی
  PDM.onReceive(onPDMdata);

  // optionally set the gain, defaults to 20
  // PDM.setGain(30);

  // initialize PDM with:
  // - one channel (mono mode)
  // - a 16 kHz sample rate
  if (!PDM.begin(1, 16000)) {
    Serial.println("Failed to start PDM!"); //فعال سازی PDM
    while (1);
  }
}

void loop() {
  // منتظر میمانیم تا سمپل خوانده شود
  if (samplesRead) {

    // نمایش سمپل ها در سریال مانیتور 
    for (int i = 0; i < samplesRead; i++) {
      Serial.println(sampleBuffer[i]);
      // اگه شدت صدای دریافتی از ۵۰۰ بیتشر شد
      if (sampleBuffer[i]>=500){
        digitalWrite(LEDR,LOW);
        digitalWrite(LEDG,HIGH);
        digitalWrite(LEDB,HIGH);
      }
      //اگر شدت صدای دریافتی بین ۲۵۰ تا ۵۰۰ بود
      if (sampleBuffer[i]>=250 && sampleBuffer[i] < 500){
        digitalWrite(LEDB,LOW);
        digitalWrite(LEDR,HIGH);
        digitalWrite(LEDG,HIGH);
      }
      //اگر شدت صدای دریافتی از ۰ بیشتر و از ۲۵۰ کمتر بود
      if (sampleBuffer[i]>=0 && sampleBuffer[i] < 250){
        digitalWrite(LEDG,LOW);
        digitalWrite(LEDR,HIGH);
        digitalWrite(LEDB,HIGH);
      }
    }

    // clear the read count
    samplesRead = 0;
  }
}

void onPDMdata() {
  // query the number of bytes available
  int bytesAvailable = PDM.available();

  // read into the sample buffer
  PDM.read(sampleBuffer, bytesAvailable);

  // ۱۶-bit, 2 bytes per sample
  samplesRead = bytesAvailable / 2;
}

 

در ابتدا دو متغیر در اول برنامه معرفی می‌کنیم. یکی از متغیرها SHORT و دیگری volatile int است. از متغیر SHORT برای ذخیره داده ی ۱۶ بیتی استفاده می‌کنیم که در این برنامه با کد زیر نوشته شده است.

short sampleBuffer[256];

متغیر دیگر VOLATILE است که با افزودن این متغیر برای کامپایلر مشخص می‌شود که این متغیر از THREAD های دیگر هم فرمان گرفته و ممکن است مقدار آن در طول برنامه هر لحظه تغییر کند. پس نیازی به بهینه شدن وجود ندارد و به جای ذخیره سازی در رجیستر در حافظه مقدار آن ذخیره می‌شود. پس کلمه کلیدی VOLATILE در ابتدای تعریف متغیر استفاده می‌شود تا کامپایلر عملیات بهینه سازی را روی آن انجام ندهد و در هر بار فراخوانی اسم متغیر در طول برنامه مقدار آن را از حافظه بخواند.

volatile int samplesRead;

 

سپس از فانکشن PDM.conReceive() برای تنظیم دیتای دریافتی استفاده می‌شود. در ابتدا توسط PDM.begin() دیتا از یک کانال خوانده شده و با سمپل ریت ۱۶KHZ خوانده می‌شوند. 

void setup() {
  Serial.begin(9600);
  while (!Serial);

  // configure the data receive callback
  PDM.onReceive(onPDMdata);

  // optionally set the gain, defaults to 20
  // PDM.setGain(30);

  // initialize PDM with:
  // - one channel (mono mode)
  // - a 16 kHz sample rate
  if (!PDM.begin(1, 16000)) {
    Serial.println("Failed to start PDM!");
    while (1);
  }
}

 

در نهایت پس از خواندن سمپل ریت برای مشاهده خروجی از همان ال ای دی RGB داخلی قرار گرفته شده بر روی برد استفاده شده است. در صورتیکه شدت صدای دریافتی بین بازه های مختلفی باشد، ترکیب رنگ ها به دلخواه برای ال ای دی تغییر خواهد کرد.

for (int i = 0; i < samplesRead; i++) {
      Serial.println(sampleBuffer[i]);
      // اگه شدت صدای دریافتی از ۵۰۰ بیتشر شد
      if (sampleBuffer[i]>=500){
        digitalWrite(LEDR,LOW);
        digitalWrite(LEDG,HIGH);
        digitalWrite(LEDB,HIGH);
      }
      //اگر شدت صدای دریافتی بین ۲۵۰ تا ۵۰۰ بود
      if (sampleBuffer[i]>=250 && sampleBuffer[i] < 500){
        digitalWrite(LEDB,LOW);
        digitalWrite(LEDR,HIGH);
        digitalWrite(LEDG,HIGH);
      }
      //اگر شدت صدای دریافتی از ۰ بیشتر و از ۲۵۰ کمتر بود
      if (sampleBuffer[i]>=0 && sampleBuffer[i] < 250){
        digitalWrite(LEDG,LOW);
        digitalWrite(LEDR,HIGH);
        digitalWrite(LEDB,HIGH);
      }
    }

    // clear the read count
    samplesRead = 0;
  }

 

به همین ترتیب به دلخواه میتوانید تغییراتی در خروجی LED RGB لحاظ کنید. برای دیتای صوت از سمپل بافر استفاده می‌کنیم. اگر SAMPLE BUFFER بین بازه های دریافتی از میکروفن تغییر کند، رنگ ها بر اساس RED, GREEN , BLUE به ترتیب HIGH , LOW می‌شوند. تا این مرحله کد نوشته شده است و کافیست برنامه را آپلود و اجرا کنید. بر روی UPLOAD کلیک کنید. سپس سریال مانیتور را باز کنید.

کدنویسی آردوینو برای راه اندازی میکروفن MP34DT05-A - دیجی اسپارک

 

وضعیت سریال پلاتر در آردوینو IDE2 به صورت زیر است.

سریال پلاتر آردوینو میکروفن MP34DT05-A - دیجی اسپارک

 

برد آردوینو نانو 33 Sense ble و میکروفن MP34DT05-A - دیجی اسپارک

 


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


سنسور میکروفن سومین سنسوری بود که در سری آموزش های نانو ۳۳ با آن آشنا شدیم و همزمان از دو سنسور امبدد برد برای راه اندازی و بررسی آن استفاده کردیم. سنسور میکروفن صوت را تشخیص داده و صدای فیزیکی را به دیجیتال و دیتای قابل فهم برای میکروکنترلر تبدیل می‌کند. برای تست برنامه از یک اسپیکر کمک بگیرید و یک موزیک پخش کنید. اگر محیط ساکت باشد، رنگ LED RGB با توجه به محدوده هایی که در کد برنامه تعریف کردیم به رنگ سبز خواهد بود. با پخش صدای کم LED RGB رنگ آن تغییر می‌کند و در نیتجه اگر شدت صدای دریافتی بسیار زیاد باشد، تغییر رنگ و سرعت تغییر رنگ را شاهد خواهیم بود.

 


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


برد آردوینو Arduino Nano 33 Sense BLE

 

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

 

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

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

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

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

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

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

۱۰ دیدگاه