به نام خداوند جان آفرین، حکیم سخن در زبان آفرین.
شاید تا کنون در اجرای پروژههایتان به این فکر افتاده باشید که چگونه اطلاعات خروجی را به جای نمایش دیداری، بهصورت گفتاری و مثل یک ربات سخنگو به کاربر خود برسانید. در این قسمت از پروژه های آردوینو شما میآموزید که تنها با اضافه کردن یک کتابخانه گفتار و بدون استفاده از ماژولهای جانبی، قابلیت گفتار را به مدار خود اضافه کنید!
با این آموزش سیسوگ همراه باشید.
در مورد روشهای متداول تولید صدا در مدار، قبلاً در ابتدای مقاله “اجرای ملودی موسیقی به وسیله آردوینو و بازر (Buzzer)” سیسوگ بحث شده است. با استفاده از کتابخانهای که قرار است در این آموزش معرفی شود، شما میتوانید از طریق واحدهای تایمر/کانتر داخلی میکروکنترلر و ایجاد فرکانسهای PWM، حروف، کلمات، عبارات و اعداد انگلیسی از پیش تعریف شده را اجرا نمایید. اضافه کردن کلمات دیگر، همچنین تبدیل و تغییر آن برای زبان فارسی خیلی ارزش ندارد و برای این کار، بهتر است از مقاله نامبرده استفاده کنید. این کتابخانه با فریمورک آردوینو نوشته شده است. همانطور که پیش از این هم به آن اشاره شد، آردوینو صرفاً یک برد الکترونیکی نیست، بلکه یک فریمورک است که شما به وسیله آن قادر خواهید بود تا به جز بردهای آردوینو، برای تراشههای AVR و خیلی از بردهای الکترونیکی دیگر نیز کد بنویسید. اما با این حال، کدهای نوشته شده به زبان ++C هستند و شما میتوانید با دانش برنامه نویسی خود، به راحتی آن را برای زبان C نیز ترجمه کنید.
دانلود و نصب کتابخانه گفتار آردوینو
از طریق منوی
Sketch -> Include Libary -> Manage Libaries…
و یا با استفاده از کلید ترکیبی Ctrl+Shift+I قسمت مدیریت کتابخانه (لایبری)های آردوینو را باز کنید.
سپس در کادر جستجو، عبارت Talkie را وارد نمایید تا از طریق جستجوی اینترنتی، کتابخانه را پیدا کند. پس از یافتن تاکی، بر روی دکمه install
کلیک کنید تا فرآیند دانلود و نصب کتابخانه گفتار انجام شود.
آپلود کد بر روی آردوینو
حال یک اسکچ جدید باز کرده و کد زیر را در آن پیست کنید. در این برنامه آردوینو از طریق پایهی A0، مقدار ولتاژ ورودی (صفر تا پنج ولت) را اندازه گرفته و سپس مقدار آن را از طریق پایهی شماره 3 پخش مینماید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | // Talkie library // Copyright 2011 Peter Knight // This code is released under GPLv2 license. // GaryA 4/2018 Modified const variables to compile in Arduino 1.6 onwards // // Now for something a bit more challenging. // // Building sentences by program. // // The sayNumber() function can say any number under a million by // building the number from short phrases, // // Connect a sensor to Analog 0, and this program will read the sensor voltage. // /* Voice PWM output pins for different ATmegas: ATmega328 (Uno and Nano): non inverted at pin 3, inverted at pin 11. ATmega2560: non inverted at pin 6, inverted at pin 7. ATmega32U4 (Leonardo): non inverted at pin 10, inverted at pin 9. ATmega32U4 (CircuitPlaygound): only non inverted at pin 5. As default both inverted and not inverted outputs are enabled to increase volume if speaker is attached between them. Use Talkie Voice(true, false); if you only need not inverted pin or if you want to use SPI on ATmega328 which needs pin 11. The outputs can drive headphones directly, or add a simple audio amplifier to drive a loudspeaker. */ #include <Arduino.h> #include "Talkie.h" #include "Vocab_US_Large.h" #include "Vocab_Special.h" Talkie voice; /* Say any number between -999,999 and 999,999 */ void sayNumber(long n) { if (n < 0) { voice.say(sp2_MINUS); sayNumber(-n); } else if (n == 0) { voice.say(sp2_ZERO); } else { if (n >= 1000) { int thousands = n / 1000; sayNumber(thousands); voice.say(sp2_THOUSAND); n %= 1000; if ((n > 0) && (n < 100)) voice.say(sp2_AND); } if (n >= 100) { int hundreds = n / 100; sayNumber(hundreds); voice.say(sp2_HUNDRED); n %= 100; if (n > 0) voice.say(sp2_AND); } if (n > 19) { int tens = n / 10; switch (tens) { case 2: voice.say(sp2_TWENTY); break; case 3: voice.say(sp2_THIR_); voice.say(sp2_T); break; case 4: voice.say(sp2_FOUR); voice.say(sp2_T); break; case 5: voice.say(sp2_FIF_); voice.say(sp2_T); break; case 6: voice.say(sp2_SIX); voice.say(sp2_T); break; case 7: voice.say(sp2_SEVEN); voice.say(sp2_T); break; case 8: voice.say(sp2_EIGHT); voice.say(sp2_T); break; case 9: voice.say(sp2_NINE); voice.say(sp2_T); break; } n %= 10; } switch (n) { case 1: voice.say(sp2_ONE); break; case 2: voice.say(sp2_TWO); break; case 3: voice.say(sp2_THREE); break; case 4: voice.say(sp2_FOUR); break; case 5: voice.say(sp2_FIVE); break; case 6: voice.say(sp2_SIX); break; case 7: voice.say(sp2_SEVEN); break; case 8: voice.say(sp2_EIGHT); break; case 9: voice.say(sp2_NINE); break; case 10: voice.say(sp2_TEN); break; case 11: voice.say(sp2_ELEVEN); break; case 12: voice.say(sp2_TWELVE); break; case 13: voice.say(sp2_THIR_); voice.say(sp2__TEEN); break; case 14: voice.say(sp2_FOUR); voice.say(sp2__TEEN); break; case 15: voice.say(sp2_FIF_); voice.say(sp2__TEEN); break; case 16: voice.say(sp2_SIX); voice.say(sp2__TEEN); break; case 17: voice.say(sp2_SEVEN); voice.say(sp2__TEEN); break; case 18: voice.say(sp2_EIGHT); voice.say(sp2__TEEN); break; case 19: voice.say(sp2_NINE); voice.say(sp2__TEEN); break; } } } void setup() { // voice.doNotUseUseInvertedOutput(); #if defined(CORE_TEENSY) pinMode(5, OUTPUT); digitalWrite(5, HIGH); //Enable Amplified PROP shield #endif Serial.begin(9600); } void loop() { int mili_volt = analogRead(0) * 5.000 / 1.023; uint8_t volt = mili_volt / 1000; mili_volt -= 1000 * volt; Serial.println((String)volt + "." + mili_volt + "(V)"); if (volt != 0) { sayNumber(volt); voice.say(sp2_VOLTS); voice.say(sp3_AND); } sayNumber(mili_volt); voice.say(sp2_MILLI); voice.say(sp2_VOLTS); delay(2000); } |
در این برنامه ابتدا مقدار ولتاژ از پایهی A0 خوانده شده و سپس با استفاده از توابع کتابخانه گفتار، مقدار ولتاژ از طریق پایه شماره 3 آردوینو پخش میشود. همچنین مقدار ولتاژ از طریق پورت سریال هم قابل مشاهده است.
تابع sayNumber از کتابخانه گفتار، یک مقدار عددی را به عنوان ورودی دریافت کرده و آن را بهصورت گفتاری پخش مینماید.
تابع say نیز، در ورودی خود یک حرف، کلمه، عدد یا عبارت را دریافت و سپس آن را اجرا مینماید. البته این ورودی باید از قبل تعریف شده باشد.
سورس فایلهای کتابخانه گفتار درمسیر زیر قرار دارند:
https://github.com/ArminJo/Talkie/tree/master/src
اگر از میان فایلهای کتابخانه، فایلهایی که با پیشوند
Vocab_
هستند را باز کنید، میتوانید لیستی از کلمات از قبل تعریف شده را ببینید و با اضافه کردن فایل هدر (header) مورد نظر به برنامه خود، از آن کلمات استفاده کنید.
همچنین کتابخانه گفتار، مثالهای زیادی نیز برای اجرا دارد که میتوانید آنها را از منو زیر در آردوینو اجرا کنید:
File -> Examples -> Talkie
فیلتر و تقویت خروجی
از آنجایی که کتابخانه گفتار آردوینو، خروجی صدا را از طریق ایجاد سیگنال pwm و به فرم مربعی تولید میکند، ابتدا باید از یک فیلتر پایین گذر عبور داده شود تا تنها فرکانس صوت و بهصورت سینوسی باقی بماند. سپس این سیگنال را به مرحله تقویت میبریم. در مدار پیشنهادی زیر، ابتدا سیگنال از فیلتر RC عبور کرده و سپس به تقویت کننده با آپ امپ LM386 وارد میشود. سپس خروجی را میتوانید به یک بلندگو متصل کنید.
صدای ضبط شده از عملکرد مدار
امیدوارم این آموزش نیز برای شما مفید باشد.
سلام میشه تو محیط های شبیه سازی مثل(پروتوس) انجام داد ؟
درود بر شما.
لایبری آردوینو برای پروتئوس هست، فکر میکنم شدنی باشه.
مهندس میشه سخت افزارهای مورد نیازشو بنویسید من این پروژرو تو محیط شبیه سازی میخوام پیاده سازی کنم
سختافزار خاصی نیاز نداره، فقط یک آردوینو و قطعاتی که در مدار فیلتر و تقویت استفاده شده، همینها هست و اکثراً هم داخل نرم افزار پروتئوس وجود دارند. احتمال زیاد، حدس میزنم توی پروتئوس خیلی خوب اجرا بشه و حتی میتونید خروجی رو هم از اسپیکر کامپیوتر بشنوید، اما تست نکردم.
سلام.
ببخشید من سه چهار بار مدار تقویت کننده رو بستم ولی کار نمی کنه اما بدون تقویت کنده کار می کنه. یه سوال اینکه اون vcc برای کانکتور شماره 3 چه می خوره؟ اخه به هیج جا وصل نیست.
با تشکر
درود بر شما.
هر جا در مدار که برچسب VCC وجود دارد، بهم دیگر متصل هستند.
سلام.لطفا می شه بگین خازن های مدار باید چند ولت باشن؟
درود بر شما، ولتاژ خازن، حداکثر ولتاژی است که میتواند آن خازن تحمل کند. از آنجایی که حداکثر ولتاژ این مدار 5 ولت میباشد، فکر میکنم اکثر خازنهای موجود معمولاً تحمل بیشتر ازین مقدار را داشته باشند.
اگر دوست داشتید، این پروژه رو هم بسازید و نتیجه اش رو هم بگید.
ممنون.
https://sisoog.com/2019/11/11/%d8%a7%d8%ac%d8%b1%d8%a7%db%8c-%d9%85%d9%84%d9%88%d8%af%db%8c-%d9%85%d9%88%d8%b3%db%8c%d9%82%db%8c-%d8%a8%d9%87-%d9%88%d8%b3%db%8c%d9%84%d9%87-%d8%a2%d8%b1%d8%af%d9%88%db%8c%d9%86%d9%88-%d9%88-%d8%a8/
سلام.ببخشید چطور می شه کاری کرد که مثلا اگه یه سنسور جسمی رو تشخیص داد مثلا یه حرفی زده بشه؟ ممنون
درود بر شما!
خوب اگه برنامه نویسی بلد باشید که کاری نداره. سنسورتون رو مثلاً به یکی از پایههای آردوینو متصل میکنید، بعد توی برنامه اصلی چک میکنید هر موقع حرکتی اتفاق افتاد، توابع گفتار رو صدا میزنید! مثلاً سنسور PIR برای آردوینو هست که خروجی ولتاژ منطقی میده و میتونید متصل کنید به آردوینو.
سلام.ببخشید توی این مدار از بلند گو استفاده نمی شه؟ بعد اینکه این کانکتور به کجا وصل می شن؟ باتشکر
درود بر شما.
توی متن، اگر دقت کنید نوشته شده که:
“مقدار ولتاژ از طریق پایه شماره 3 آردوینو پخش میشود.”
یعنی اینکه آردوینو صدا رو روی این پایه تولید می کنه، اما شما بهتره این خروجی رو از یه فیلتر هم رد کنید و به یک تقویت کننده هم بدید که مدارش رسم شده. شماره 3 که VCC هست و برق مداره، باید به +5 ولت متصل بشه. شماره دو هم به پایه شماره 3 آردوینو و کانکتور شماره 1 هم به زمین.
فکر میکنم به کمک یک بازر و بدون نیاز به این مدار هم بتونید صدا رو بشنوید، اما تست نکردم. احتمالاً این مطلب بنده هم به دردتون بخوره:
https://sisoog.com/2019/11/11/%d8%a7%d8%ac%d8%b1%d8%a7%db%8c-%d9%85%d9%84%d9%88%d8%af%db%8c-%d9%85%d9%88%d8%b3%db%8c%d9%82%db%8c-%d8%a8%d9%87-%d9%88%d8%b3%db%8c%d9%84%d9%87-%d8%a2%d8%b1%d8%af%d9%88%db%8c%d9%86%d9%88-%d9%88-%d8%a8/
سلام.ببخشید اون jp توی شماتیک چی هستن؟ با تشکر
سلام دوست عزیز
کانکتور هستند برای وصل کردن اتصالات خارجی است
سلام.ببخشید توی شماتیمک،jp چی هست؟ با تشکر
این قسمت محل کانکتور هست، اگر روی برد برد میبندید، ازین قسمت باید برق مورد نیاز مدار فیلتر و تقویت کننده و همین طور ورودی صدا رو بهش بدید و طرف دیگه هم یه خروجی هست که باید به بلندگو متصل به شه.
توی اون یکی کامنت بیشتر براتون توضیح دادم.
بازم اگر سؤالی بود بپرسید.
سلام .اون ایف های اول برنامه که قبل از ووید ستاپ اومده بود برا چی بود؟؟
درود بر شما.
از اونجایی که داخل کتابخونه صدای تعدادی از اعداد انگلیسی پایهای بهصورت از پیش ضبط شده وجود داره، برنامه سعی میکنه تا بقیه اعداد را با کمک ترکیبی از اون ها به سازه. مثلاً برای اینکه بتونه عدد 1003 رو بگه، میاد یکبار هزار رو میگه، یک بار 3 رو و بقیه صداهایی که لازمه بینش گفته بشه رو هم پخش میکنه. چون عملاً نمیشه گفتار تمام اعداد رو داخل حافظه کم آردوینو ضبط کرد. برای همین، قبل از تابع setup، اومده یک تابعی به نام sayNumber تعریف کرده.
ورودی این تابع یه عدد بزرگه که به کمک اون ایف ها داخل تابع به اعداد ریزتر برای اجرا تبدیل میشن. داخل برنامه اصلی، وقتی که میخواهیم عددی رو دستگاه بخونه، این تابع رو صدا میزنیم.?
سلام نیاز به بلنگو دارد
سلام
برای فارسی گویی چطور باید عمل کنیم؟
ممنون
سلام.
کتابخانه معرفی شده، همانطور که در متن هم اشاره شد، صرفا برای حروف، کلمات، عبارات و اعداد انگلیسی از پیش تعریف شده مناسب هست و تبدیل و تغییر اون برای زبان فارسی خیلی ارزش نداره.
سلام
میتونید کامل بگید که برای استفاده از صدا های دیگه در برنامه باید چیکار کنم و کد رو کجا قرار بدم.
مثلا میخوام همین صدا رو در برنامه استفاده کنم:
extern const uint8_t sp4_OFF[] PROGMEM={0x69,0xFB}
شما هر کجا که میخواهید تابع پخش صدا رو صدا بزنید، میتونید این آرایه رو تعریف بکنید. اما بهتره در خطوط اولیه برنامه (قبل از setup آردوینو) باشه. اگه قصد دارید صدا های زیای رو تعریف کنید، یک فایل جدید بسازید و اون رو داخل برنامتون صدا بزنید. ولی توصیه میکنم از این لایبری فقط برای همان عبارات از پیش تعریف شده استفاده کنید، چون اضافه کردن صدا به این لایبری خیلی سخت هست. لینک زیر رو هم ببینید:
https://github.com/going-digital/Talkie/issues/4
به نظر من برای صدا های دیگه، از آرایه WAV استفاده کنید.
بنام خدا
سلام بر همگی
برنامه ها و کتابخانه هایی که برای نرم افزار آردینو میگذارید. برای vs code نیز اجرا کنید.
ممنون میشم.
درود بر شما. اگه آموزش بعدی روی آردوینو بود، حتما در محیط VSCODE اون رو اجرا میکنم.
خیلی عالی بود مرسی
واقعا خسته نباشید
درود بر شما. خوشحال هستم که مقاله برای شما مفید بوده.
بسیار عالی
واقعا مطالبتون جذاب و بروز هست
درود بر شما.
سپاس گزارم.
خیلی جالب بود ممنون
خواهش میکنم.
چه کارایی که ازین آردوینو بر نمیاد!
?