کار با ماژول تمام عیار mc60 – قسمت پنجم – ساخت MP3 Player

کار با ماژول تمام عیار mc60 – قسمت پنجم – ساخت MP3 Player

کار با ماژول تمام عیار mc60 – قسمت پنجم – ساخت MP3 Player
کار با ماژول تمام عیار mc60 – قسمت پنجم – ساخت MP3 Player

در قسمت قبل از آموزشمون، ساخت یک ردیاب کامل رو با ماژول MC60 و هدربرد جدیدی که معرفی کرده بودیم پیش بردیم. حالا توی این قسمت میخوایم که بیشتر با بخش کارت حافظه و صدای ماژول کار بکنیم و یک MC60 MP3 player بسازیم.

ما یک MP3 Player می‌سازیم که آهنگ‌ها را از کارت حافظه خوانده و به ترتیب پخش می‌کند. همچنین چند کلید برای کنترل پخش قرار میدیم که بشه با اونها آهنگ قبلی و بعدی رو پخش کرد و صدا رو کم و زیاد کرد و پخش رو متوقف کرد و شروع کرد. برای اتصال کلیدها به ماژول هم از ADC کمک گرفتیم تا با یک پین بتونیم چندها کلید رو تشخیص بدیم.

در زیر نحوه اتصال کلیدها به پین ADC رو می‌بینید.

 

اول از همه با یک تقسیم مقاومتی ولتاژ 5 ولت رو به 2.8 تبدیل کردیم (چون ولتاژ IO های ماژول 2.8V هست) و بعد هم هر کدوم از کلیدها یک ولتاژ متفاوت رو ایجاد میکنه که توی کد مقدار اونها رو وارد کردم.

این هم تصویر مداری که خودم وصل کردم:

 

MC60 MP3 player

 

حالا بریم سراغ کد MC60 MP3 player

و این هم فایل custom_task_cfg.h :

قسمت شروع کد اینجا در خط 59 تا 69 هست

 

بعد از آماده بودن توابع RIL، اول از همه بخش ADC رو با فراخوانی تابع زیر راه اندازی می‌کنیم:

با تابع Ql_ADC_Register پین ADC رو مشخص کرده و در پارامتر دوم یک تابع رو برای اون مشخص می‌کنیم که هر بار که مقدار ADC رو خوند این تابع فراخوانی بشه و کدهای توش اجرا بشن، (لازم نیست که مثل میکروکنترلر ها توی loop هر بار مقدار ADC رو بخونیم، چون اینجا ما یک سیستم عامل داریم!) بعد هم با تابع Ql_ADC_Init توی پارامتر دوم تعداد نمونه برداری‌ها (خودش چند نمونه برداری میکنه و میانگین رو به ما می‌ده) و توی پارامتر سوم اینکه هر چند میلی ثانیه باید اجرا بشه رو براش مشخص می‌کنیم، در آخر هم که میگیم شروع کن.

توی این سه خط هم اول از همه مشخص می‌کنیم که می خوایم صدا از طریق هدفون وصل باشه (RIL_AUD_SetChannel)، بعد هم میزان صدا رو تعیین کرده (که پارامتر اول شماره کانال هست و پارامتر دوم میزان صدا) و بعد از اون هم توی پارامتر اول RIL_AUD_RegisterPlayCB آدرس یه تابع دیگه رو میدیم که هر موقع پخش تموم شد یا متوقف شد این تابع اجرا بشه.

 

حالا میریم سراغ تابع listSong که یکم پیچیدس:

برای پخش آهنگ ها توسط MC60 MP3 player لازمه که لیست اونها رو به همراه آدرس داشته باشیم. این تابع هم کارش همین هست. تو خط 178 با تابع  Ql_FS_FindFirst اول یک دایرکتوری رو مشخص می کنیم و بعد از پیدا کردن اولین فایل باید با تابع Ql_FS_FindNext فایل بعدی رو پیدا کنیم ، این کار تا زمانیکه فایل وجود داشته باشه انجام میشه و به همین خاطر توی یک while اجرا میشه. من توی خط 183 گفتم که اگر یک دایرکتوری دیگه پیدا کردی دوباره داخل اون رو هم سرچ کن و به این ترتیب این کد تا دوتا دایرکتوری داخل هم پیش میره که اگه میخواید بیشتر بشه میتونید تغییرش بدید🙂. بعد از اون هم توی خط 201 و 215 گفتم که هر فایلی که پیدا کردی رو آدرسش رو بریز داخل متغیر listSongs .

 

در آخر هم توسط تابع playSong اولین آهنگ رو پخش میکنیم. در خط 146 چک کردیم که به درستی آهنگ پخش شده یا نه ، چون ممکن است فایلی با فرمت نا مربوط انتخاب شود و نشه اون رو پخش کرد ، برای همین میره سراغ فایل بعدی.

 

همچنین توی تابع Callback_AudPlay خط 157 گفتیم که هر موقع پخش یک فایل به اتمام رسید ، سراغ فایل بعدی بره:

 

داخل تابع Callback_OnADCSampling هم که هر 10ms فراخوانی میشه مقادیر ADC رو بررسی کردیم و با یک تلرانس 10mV از هر طرف برای هر کلید، فشرده شدن کلیدها رو بررسی کردیم و برای هر کدوم از اونها عملکردی رو مشخص کردیم:

 

 

یک نکته:

یکی دیگر از امکانات ماژول این هست که 120KB حافظه داخلی داره که میتونید از اون برای نگهداری فایل استفاده کنید، بزارید تا یکی از کاربردهای این قابلیت رو بگم، مثلاً شما یک دستگاه با این ماژول ساختید که دسترسی مستقیم به اون ندارید، برای بررسی وضعیت دستگاه میتونید از پیامک استفاده کنید که وضعیت خودش رو به صورت متنی ارسال کنه، اما در مواقعی برقراری تماس گزینه خیلی بهتری هست، مثلاً زمانی که یک وضعیت اضطراری پیش اومده، توی این شرایط میتونید یک پیام ضبط شده رو داخل ماژول ذخیره کنید و بگید که به شماره‌ای تماس بگیره و این پیغام رو براش پخش کنه.

 

 

 

 

 

حمایت از Mahdi.h  

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

Mahdi.h  
Mahdi.h  

علاقه مند به سیستم های امبدد

دیدگاه ها

6 دیدگاه

  • زهرا شکوهی نکو
    زهرا شکوهی نکو
    ۳۱ خرداد ۱۴۰۱

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

    • Mahdi.h  
      Mahdi.h  
      ۳۱ خرداد ۱۴۰۱

      سلام
      احتمال زیاد مشکل از نرم افزار نیست.
      از چه بردی استفاده میکنید؟(طراحی بخش صدا به چه صورت هست؟)
      بهتره که بخش audio بر اساس این داکیومنت طراحی بشه
      https://sisoog.com/wp-content/uploads/2020/01/Quectel_MC60_Reference_Design_Rev.B_20160801.pdf
      کیفیت خازن های مورد استفاده هم خیلی مهمه.

      • زهرا شکوهی نکو
        زهرا شکوهی نکو
        ۳۱ خرداد ۱۴۰۱

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

        • Mahdi.h  
          Mahdi.h  
          ۱ تیر ۱۴۰۱

          خب مشخصا این ماژول برای کاربرد ضبط صدا نیست و در کنار کار های دیگه این کار رو هم میکنه (که بیشتر استفادش با هندزفری هست) ، شما برای صدای با کیفیت تر میتونید از چیپ هایی دارای پروتکل PCM استفاده کنید و به mc60 وصلشون کنید که خود این چیپ ها کارهای کم کردن نویز و غیره رو انجام بدند (مثل ALC5616 و NAU88C10GY )

  • Omid Azadeh
    Omid Azadeh
    ۱۹ آذر ۱۴۰۰

    سلام … یه سوال … این ماژول بصورت سخت افزاری فایل mp3 رو میتونه دیکد کنه با نرم افزاری ….

    • Zeus ‌
      Zeus
      ۲۰ آذر ۱۴۰۰

      احتمالا به شکل نرم افزاری یا شاید هم سخت افزاری
      ولی فرقی نمیکنه در نهایت شما صدای صوت رو خواهید داشت بدون مشکل خاصی

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

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

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 9 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

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

Zeus ‌ Zeus ‌
  • 1 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 2 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک