هدف از این آموزش طراحی و ساخت یک فرستنده [1] FM با قابلیت ارسال سیگنالهای صوتی در فرکانسهای دلخواه FM با استفاده از ماژولهای Adafruit SI4713 و DigiSpark (مبتنی بر میکروکنترلر ATTiny 85) میباشد.
معرفی اجزا
این ماژول، یک فرستنده صوتی FM استریو با قابلیت ارسال دادههای RDS / RBDS مبتنی بر تراشه [3] SI4713 بوده که میتواند به راحتی صوت را تا حدود 10 متر انتقال دهد. همچنین با استفاده از قابلیت RDS/RBDS میتوان هر متن دلخواهی را بر روی رادیوهایی که از این ویژگی پشتیبانی میکنند (تقریبا اکثر رادیوهای ماشین) نمایش داد.
ورودی های صدا
LIN :
ورودی چپ سیگنال صوتی میباشد. این ورودی به جک هدفون تعبیه شده روی ماژول نیز متصل است. در صورت نیاز به اتصال مستقیم و بدون کابل AUX، میتوانید از این ورودی استفاده نمایید.
RIN : دقیقا مانند LIN با این تفاوت که برای ورودی سمت راست میباشد.
پایههای مربوط به تغذیه ماژول
VIN :
پایانه مثبت ولتاژ ورودی ماژول میباشد که میتوان آن را از 3 تا 5 ولت به صورت DC تغذیه نمود. در حالت ایده آل باید از همان ولتاژ مورد استفاده برای سطح منطقی بالا (1) استفاده شود. به طور مثال برای تراشه آردوینو، ولتاژ مورد استفاده معمولاً 5 ولت است.
GND :
پایه زمین یا ولتاژ سطح پایین مدار میباشد.
3Vo :
ولتاژ خروجی 3.3 ولت با حداکثر جریان 100 میلی آمپر است.
پایههای رابط
ماژول فرستنده FM به کار رفته در این آموزش، برخلاف تراشههای آنالوگ که با یک پتانسیومتر تنظیم میگردند، جهت ارسال امواج FM به یک میکروکنترلر نیاز دارد. در نتیجه برای راهاندازی این ماژول نیاز به کدنویسی وجود دارد ولی خروجی آن نسبت به مدارهای آنالوگ از دقت بیشتری برخوردار میباشد. جهت ارتباط با میکروکنترلر از پروتکل I2C استفاده میگردد، اما در عین حال پروتکل SPI نیز پشتیبانی میشود.
RST – پایه ریست است. قبل از برقراری ارتباط با تراشه، باید این پین تغییر وضعیت داده شود. در منطق 0، تراشه ریست می شود.
[4] CS – پایه انتخاب تراشه است که در حالت SPI استفاده می شود. همچنین آدرس I2C را تعیین میکند. در حالت بالا (که وضعیت پیش فرض است) آدرس I2C برابر با 0X63 است و در حالت پایین، آدرس I2C برابر با 0X11 است.
SCL – پایه کلاک I2C است که به پایه SCL میکروکنترلر متصل میشود.
SDA – پایه داده I2C است که به پایه SDA میکروکنترلر متصل میشود.
توجه : تمام پایههای ورودی 5 ولت بوده و با منطق 3-5 ولت قابل استفاده اند.
پینهای اضافی GPIO
دو پایه “GPIO” اضافی جهت کنترل LED های روی ماژول وجود دارد. مقدار اولیه این پایهها تراشه را برای حالت آنالوگ تنظیم می کند، بنابراین در هنگام تنظیم مجدد (Reset)، نباید در سطح GND یا VCC قرار داده شوند. همچنین این پایهها فقط دارای خروجی 3 ولت هستند!
GP1 – پین GPIO شماره 1 است
GP2 – پین GPIO شماره 2 است
GPIO #3 برای کلاک 32 کیلوهرتز تعبیه شده در ماژول استفاده می شود.
DigiSpark یک برد توسعه مبتنی بر میکروکنترلر ATTiny 85 مشابه آردوینو بوده، با این تفاوت که ارزانتر، کوچکتر و با قدرت پردازشی کمتر میباشد. این برد دارای مجموعه متنوعی از شیلدها جهت افزودن به قابلیتهای آن بوده و میتوان آن را با استفاده از Arduino IDE برنامه نویسی نمود. DigiSpark جهت آموزش الکترونیک و سیستمهای نهفته و همچنین در مواردی که Arduino از لحاظ اندازه و هزینه به صرفه نیست بسیار کاربردی میباشد.
این برد دارای 6 عدد پایه I/O، یک حافظه فلش 8K بوده و از پروتکلهای I2C و [6] SPI پشتیبانی میکند. همچنین PWM روی 3 پایه و ADC در 4 پایه وجود دارد.
DigiSpark از همه ویژگیهای موجود در Arduino IDE به استثنای مانیتور سریال و قابلیت bootloader پشتیبانی میکند. ولی بسیاری از کتابخانههای موجود، با DigiSpark سازگار نیستند. به عنوان مثال جهت استفاده از پروتکل I2C، باید کتابخانهای با نام TinyWireM به محیط IDE اضافه گردد.
پایههای خروجی
از تمام پایهها میتوان به عنوان ورودی/خروجی استفاده نمود.
پایه 0 ← I2C SDA ، PWM (متصل به LED در مدل B)
پایه 1 ← PWM (متصل به LED در مدل A)
پایه 2 ← I2C SCK ، ورودی آنالوگ
پایه 3 ← ورودی آنالوگ (همچنین در هنگام استفاده از USB ، برای USB+ استفاده میشود)
پایه 4 ← [7] PWM ، ورودی آنالوگ (همچنین در هنگام استفاده از USB ، برای USB – استفاده میشود)
پایه 5 ← ورودی آنالوگ
پیاده سازی
پروتکل I2C یک پروتکل سریال برای ایجاد ارتباط دو به دو با سیم بین دستگاههای کم سرعت مانند میکروکنترلرها، EEPROM ها، مبدل های A/D و D/A، رابط های I/O و سایر دستگاههای جانبی مشابه در سیستمهای نهفته میباشد.
در حالت عادی هر دو خط (SCL و SDA) در حالت یک منطقی هستند. ارسال داده توسط دستگاه Master آغاز می شود. وضعیت شروع (S) و به دنبال آن آدرس دستگاه Slave (در بخش B1 در شکل بالا) توسط Master تولید و ارسال میگردد. در صورتی که بیت 0 از بایت آدرس در حالت 0 تنظیم شود، Master در Slave مینویسد (B2). در غیر این صورت، بایت بعدی از Slave خوانده میشود. پس از خواندن یا نوشتن تمام بایت ها، Master وضعیت توقف (P) را تولید و ارسال میکند. در نتیجه پیام پایان یافتن ارتباط به تمام دستگاههای متصل به باس ارسال گردیده و باس برای شروع ارتباطی دیگر آماده میگردد.
بیشتر دستگاههای مبتنی بر I2C حالت شروع مجدد را پشتیبانی میکنند. در این حالت قبل از پایان یافتن یک تراکنش توسط وضعیت توقف، Master میتواند با ارسال وضعیت شروع و سپس بایت آدرس، حالت را از نوشتن به خواندن یا بالعکس تغییر دهد.
این کتابخانه امکان برقراری ارتباط به وسیله پروتکلهای I2C / TWI را فراهم میکند. محل پیشفرض این کتابخانه در مسیر نصب Arduino IDE بوده که معمولاً با آدرس زیر قابل دسترسی است:
“C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire”
میکروکنترلر ATTiny85 یک تراشه با تعداد 8 پایه بوده که دارای حداکثر 6 پورت I / O است. در نتیجه استفاده از یک باس I2C تعداد اتصالات را به نحو چشمگیری افزایش داده و باعث افزایش کارایی این میکروکنترلر میگردد.
متاسفانه پروتکل I2C (یا SPI) در ATTiny85 به صورت سختافزاری پیادهسازی نشده است، و در عوض برای پیادهسازی این پروتکلها باید از رابط [11]USI استفاده نمود.
برای استفاده از پروتکل I2C بر روی این میکروکنترلر کتابخانههای متعددی نوشته شده است. سه کتابخانه رایج که بیشتر مورد استفاده قرار گرفتهاند از طریق لینکهای زیر قابل دسترسی میباشند:
-
- کتابخانه [Master[12
- کتابخانه Slave
- کتابخانه مجتمع (تشکیل شده از Master و Slave مشابه با کتابخانه موجود در Arduino IDE)
کتابخانه DigiSpark wire
در واقع همان کتابخانه TinyWireM است و نام کلاس اصلی به جای Twowire به USI_TWI تغییر یافته است. این کتابخانه به همراه پکیج DigiStump توسط قابلیت Board Package Manager در Arduino IDE نصب میگردد. مسیر قرارگیری این کتابخانه در Arduino IDE عبارت است از:
“C:\Users\[YOUR USER NAME]\AppData\Local\Arduino15\packages\digistump\hardware\avr\1.6.7\libraries\Wire”
دستورالعمل نصب DigiStump در [Arduino IDE [13
ابتدا نسخه مناسب نرم افزار آردوینو را از طریق وبسایت Arduino.cc بارگیری نمایید:
https://www.arduino.cc/fa/Main/Software
اگر از Arduino 1.6.6 یا بالاتر و ویندوز استفاده میکنید لازم است درایورها را به صورت دستی نصب نمایید.
“Install Drivers” (در سیستم های 32 بیتی) یا “DPInst64” (در سیستم های 64 بیتی) را بارگیری و از حالت فشرده خارج کرده و اجرا کنید. فایل های درایور از طریق لینک زیر قابل دسترسی میباشند:
https://github.com/digistump/DigistumpArduino/releases/download/1.6.7/Digistump.Drivers.zip.
پس از نصب و اجرای Arduino IDE به منوی “File” رفته و “Preferences” را انتخاب کنید.
در کادر “Additional Boards Manager URLs” لینک زیر را وارد نمایید:
http://digistump.com/package_digistump_index.json
سپس روی تأیید کلیک کنید.
توجه: اگر از قبل [14] URL های دیگری در آن کادر وارد کردهاید، روی دکمه سمت راست کادر کلیک کرده و این URL را در یک خط جدید وارد کنید.
-
- به منوی “Tools” و سپس زیرمنوی “Board” بروید – “Boards Managers ” را انتخاب کنید و سپس از منوی کشویی Type، گزینه “Contributed” را انتخاب کنید
- سپس بسته “Digistump AVR Boards” را انتخاب کرده و بر روی دکمه “Install” کلیک کنید.
پیشرفت بارگیری در نوار پایین پنجره “Boards Manager” قابل مشاهده بوده و زمانی که کامل شود عنوان “Installed” در کنار آن مورد در لیست نشان داده میشود.
کاربران ویندوز: پس از اتمام نصب یک پنجره پاپ-آپ برای نصب درایور مورد نیاز ظاهر میگردد، که باید بر روی “Next” در این پنجره کلیک کنید تا درایور Digistump Boards نصب شود (در صورتی که قبلا بر روی سیستم شما نصب شده است این فرایند به آپدیت شدن درایور کمک میکند)
پس از اتمام نصب، پنجره “Boards Manager” را ببندید و از منو Tools → Boards، گزینه ” Digispark (Default – 16.5mhz)” را انتخاب کنید.
-
- Vin را به منبع تغذیه متصل و در مقدار 3-5 ولت تنظیم کنید
- GND را به پایه مشترک زمین/داده متصل کنید
- پایه SCL را به پایه کلاک SCL (پایه D2 بر روی DigiSpark) وصل کنید
- پایه SDA را به پایه داده SDA (پایه D0 بر روی Digispark) وصل کنید
- پایه RST را به پایه D5 بر روی DigiSpark وصل کنید
آدرس پیش فرض I2C دارای مقدار 0X63 میباشد-می توان با اتصال پایه CS به زمین، آن را به مقدار 0X11 تغییر داد.
دانلود Adafruit_Si4713
برای شروع کار با ماژول Si4713، ابتدا باید کتابخانه Adafruit_Si4713 از قسمت مدیریت کتابخانه آردوینو بارگیری شود. از منو Sketch->Include Library->Manage Libraries کتابخانه Adafruit Si4713 را جستجو کرده و آن را نصب کنید.
بارگیری نسخه ی Demo
نسخه دمو از مسیر File->Examples->Adafruit_Si4713->Adaradio قابل دسترس میباشد.
در کد مربوط به Demo، فرکانس 102.3 مگاهرتز برای انتقال صوت استفاده شده است. در صورت نیاز به تغییر این باند فرکانسی میتوانید خط زیر در کد را ویرایش نمایید:
#define FMSTATION 10230 // 10230 == 102.30 MHz
این عدد در مقیاس 10 کیلوهرتز است، بنابراین برای مثال 88.1MHz به صورت 8810 نوشته میشود.
تغییرات مورد نیاز جهت پیادهسازی بر روی DigiSpark
کتابخانه و مثالهای مربوط به برد Adafruit، برای استفاده از پروتکل I2C، مستقیماً به کلاس TwoWire، که به طور معمول در هدر فایل wire.h (پروتکل I2C پیشفرض) تعریف شده است مراجعه میکنند. اما در بردهای DigiStump نام کلاس مربوط به این پروتکل USI_TWI میباشد. در نتیجه احتمالاً ساده ترین راه برای اصلاح این موضوع، ویرایش فایل wire.h (پروتکل I2C مربوط به برد DigiStump) تعریف شده در برد DigiStump میباشد که معمولا از مسیر زیر قابل دسترس است :
“C:\Users\[YOUR USER NAME]\AppData\Local\Arduino15\packages\digistump\hardware\avr\1.6.7\libraries\Wire”).
عبارت زیر را در انتهای فایل اضافه نمایید :
;extern USI_TWI Wire
define TwoWire USI_TWI#
endif#
با این تغییر، هر ارجاع به کلاس Twowire به کلاس USI_TWI انتقال داده میشود.
مانیتور سریال
با توجه به ابعاد کوچک و قیمت پایین DigiSpark، برای کار با این برد با محدودیتهایی مواجه هستیم. یکی از ویژگیهایی که در بردهای پرکاربرد نظیر Arduino بسیار استفاده میشود ابزار مانیتور حالت درونی برد با استفاده از پورت سریال میباشد که در Arduino IDE از طریق آیکون “serial Monitor” قابل دسترس میباشد. متاسفانه این ویژگی در بردهای DigiSpark وجود ندارد.
DigiKeyboard
از این تابع به عنوان جایگزین تابع ()serial.print در آردوینو استفاده میشود. برای استفاده از آن، باید کتابخانه کیبورد به کد اضافه شود. سپس در کد هرجا از ()serial.print استفاده میشود با ()DigiKeyboard.printجایگزین گردد.
بارگیری کد بر روی DigiSpark
DigiSpark در مقایسه با برخی از محصولات سازگار با آردوینو، با روش متفاوتی برنامهنویسی میشود . برای کار با این برد ابتدا از منوی Tools گزینه Board → Digispark (پیش فرض – 16.5 مگاهرتز) را انتخاب کنید. نیازی به اتصال DigiSpark به کامپیوتر قبل از فشردن گزینه آپلود کد نیست. یک برنامه ویرایشگر متن (مانند Notepad) را باز کرده و سپس در محیط Arduino IDE دکمه بارگذاری را بزنید. در باکس وضعیت پایین اکنون از شما خواسته میشود تا Digispark خود را وصل نمایید – در این مرحله باید Digispark را به کامپیوتر متصل کنید. سپس مکان نما را بلافاصله به داخل پنجره Notepad برده و کلیک کنید.
بعد از بارگذاری کد بر روی برد، اجرای آن آغاز میگردد. اگر برد را از کامپیوتر جدا کرده و دوباره به آن یا منبع تغذیه دیگری متصل کنید، برنامه با 5 ثانیه تاخیر اجرا میشود. در این 5 ثانیه بررسی میشود که آیا برد در حال بارگذاری برنامه میباشد یا خیر.
بعد از بارگذاری کد دمو، تا زمانی که در Notepad پیام RDS on چاپ میشود به معنی درست کار کردن برد میباشد. همچنین بعد از اتصال جک 3.5 میلیمتری به ورودی صدای ماژول ارسال FM، مطمئن شوید که میزان ولوم دریافتی همیشه بین 0 تا 10- دسیبل باشد.
کتابخانه Si4713
کنترل فرستنده رادیویی
تنظیمات اولیه تراشه Si4713
()begin
این تابع جهت تنظیم کردن تراشه برای شروع به کار آن میباشد. اگر این تنظیمات اولیه به درستی انجام شود مقدار True و در غیر این صورت مقدار False برگشت داده میشود (در این حالت در اغلب موارد اشکال از اتصالات سیمها میباشد).
(setTXpower(txpwr
این تابع فرستنده رادیویی را روشن میکند. Txpwr واحد قدرت انتقال بوده که با dBμV اندازهگیری میگردد و محدوده قابل تنظیم برای آن 88-115 dBμV و در حالت خاموشی برابر با صفر است.
(tuneFM(freq
فرکانس خروجی را در بازه 10 کیلوهرتزی تنظیم میکند. بنابراین به عنوان مثال برای تنظیم در فرکانس 101.9، باید مقدار فرکانس در 10190 تنظیم شود.
()readTuneStatus
با استفاده از این تابع میتوان وضعیت ماژول را بررسی نمود. مقادیر currFreq ،currdBuV و currAntCap با استفاده از این تابع قابل بررسی میباشند. دو مورد اول توان خروجی و فرکانس و متغیر سوم خازن تیونینگ آنتن با هدف دستیابی به بهترین خروجی است. مقدار متغیر سوم با توجه به اندازه و فرکانس آنتن متفاوت خواهد بود.
RPS (سنجش قدرت رادیویی)
این اندازهگیری توسط دو تابع زیر انجام میشود:
(readTuneMeasure (freq
با استفاده از این تابع فرکانس در مقیاس 10 کیلوهرتز اندازهگیری میشود.
()readTuneStatus
مقدار نویز را در متغیر CurrNoiseLevel ذخیره میکند. این تابع تا زمانی که اندازهگیری توسط تراشه انجام شود در حالت انتظار باقی میماند.
[16]RDS/RBDS (انتشار اطلاعات رادیویی)
با استفاده از ماژول Si4713 میتوان اطلاعات RDS را به راحتی ارسال نمود.
()beginRDS
این تابع تنظیمات اولیه مربوط به سیستم RDS را بر روی تراشه انجام میدهد.
(“setRDSstation (“AdaRadio
نام ایستگاه رادیویی توسط این تابع انجام میشود که حداکثر 8 کاراکتر میباشد.
(“!setRDSbuffer(“Adafruit g0th Radio
پیام اصلی که معمولاً حاوی نام فایل صوتی است توسط این تابع به گیرنده رادیویی ارسال میگردد. شما میتوانید تا 32 کاراکتر توسط این تابع ارسال نمایید. همچنین برای ارسال پیامهای متوالی، بعد از ارسال هر پیام چند ثانیه صبر نمایید تا گیرنده تمام پیام مورد نظر را دریافت نماید و سپس به ارسال پیام بعدی بپردازید.
کنترل [17]GPIO
دو پایه GPIO1 و GPIO2 جهت LED های چشمک زن نشان دهنده وضعیت به کار میروند. همچنین GPIO3 جهت نوسان ساز استفاده میشود. برای تنظیم این پایهها به عنوان خروجی، از تابع زیر استفاده میشود:
(setGPIOctrl(bitmask
در bitmask برای هر پین یک بیت در نظر گرفته شده است. به عنوان مثال برای تنظیم GPIO2 به عنوان خروجی، دستور
((setGPIOctrl((1<<2
را اجرا کرده و برای تنظیم هر دو خروجی، از دستور
((setGPIOctrl((1<<2) || (1<<1
استفاده کنید.
در نهایت می توانید خروجی را با دستور زیر تنظیم کنید:
(setGPIO(bitmask
مانند کار با bitmask، برای روشن کردن هر دو پین GPIO1 و GPIO2 ، از دستور
((setGPIOctrl((1<<2) || (1<<1
و برای غیرفعال کردن هر یک از آنها از دستور زیر استفاده میشود:
(setGPIOctrl(1<<2
پانویسها و منابع
[1] Frequency modulation
[2] https://learn.adafruit.com/adafruit-si4713-fm-radio-transmitter-with-rds-rdbs-support
[3] https://www.silabs.com/documents/public/data-sheets/Si4712-13-B30.pdf
[4] Chip select
[5] http://digistump.com/products/1
[6] Serial Peripheral Interface
[7] Pulse Width Modulation
[8]https://i2c.info/#:~:text=I2C%20is%20a%20serial%20protocol,almost%20all%20major%20IC%20manufacturers.
[9] https://www.arduino.cc/en/reference/wire
[10] https://playground.arduino.cc/Code/USIi2c/
[11] Universal Serial Interface
[12] قابل دسترسی از آدرس : “C:\Users\[YOUR USER NAME]\Documents\Arduino\libraries\TinyWireM”
[13] http://digistump.com/wiki/digispark/tutorials/connecting
[14] Uniform Resource Locator
[15] https://learn.adafruit.com/adafruit-si4713-fm-radio-transmitter-with-rds-rdbs-support/test-and-usage
[16] Radio Broadcast Data System
[17] General Purpuse Input Output