آموزش آردوینو – فصل چهارم

//آموزش آردوینو – فصل چهارم

آموزش آردوینو – فصل چهارم

هر فصل از ۱۴ فصل آموزش آردوینوتقدیم میشه به یکی از امامان معصوم .این فصل تقدیم میشه به :

امام حسن مجتبی (ع)

چطور با آردوینو صدا تولید کنیم؟

صوت با آردوینو؟ واقعا ممکنه؟

بله.

یکی از چیزهای جالب و پرکاربردی که وجود داره, هشدار توسط ایجاد صوت هست. مثل چی؟

مثل بوق زدن تو خیابون! با ماشین بوق میزنیم و نفر دیگه رو آگاه میکنیم.یا وقتی از گیت خروج فروشگاه رد بشی و تگ فروشگاه از لباس کنده نشده باشه دستگاه خروجی صدای بوق میده.یاوقتی دکمه پاور کیس رو میزدی یه صدای بوق میشنیدی و ویندوز میومد بالا! یا ساعتهایی که تنظیم میکردیم سر یه ساعت خواستی زنگ بزنه! مثلا صبح برای نماز صبح یا مدرسه رفتن و …

خلاصه که این بوق در زندگی ما خیلی تاثیر گزاره و البته هزینه خیلی زیادی هم نداره.(غیر از بوقهای حرفه ای)

احتمالا میدونین یکی از چیزهایی که تولید بوق میکنه “بازر یا buzzer ” هست. ولتاژی بهش اعمال میکنیم و اون بوق میزنه به همین راحتی!

به عبارت دیگه:” بازرسیگنال الکتریکی رو به سیگنال صوتی تبدیل میکنه”

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

بازر به شکل زیر هست:

اما برای شروع یه بازر تهیه کنین و مثبت اونو(پایه بانده) به یکی از پایه های دیجیتال مثلا پایه ۲ متصل کنین و اون یکی پایه رو هم به پتانسیومتر و اونور پتانسیومتر هم به زمین و  بعد مثل led اونو خاموش روشن کنین:

خب اگه درست عمل کرده باشین از بازر یه صدایی شبیه اتاق عمل میشنوین! تو فیلما احتمالا دیدین که ضربان قلب بیمار رو مثل بوق پخش میکنند . یه پتانسیومتر هم گذاشتیم که صداشو کم و زیاد کنیم. میتونین شما نزارین خیلی لازم نیست.

آردوینو برای بازر هم دستور داره که به دوصورت زیر هست:

(tone(pin, frequency

(tone(pin, frequency,duration

pin همون پایه ای که به بازر متصل هست

Frequency همون فرکانس مورد نظر ماست

Duration هم برابر زمانی هست که میخایم از بازر صدا در بیاد.

خب بریم یه کار عملی کنیم و ببینیم این چیزاییکه گفتیم چجوری کار می کنند:

برای شروع شماره پین ۳ رو بعنوان خروجی در نظر میگیریم و فرکانس رو از صفر زیاد میکنیم تا ۱۰۰۰

کدهای بالا رو در نرم افزار وارد کنید و نتیجه رو ببینینکه وقتی فرکانس تغییر میکنه صدای خروجی چه تغییری میکنه.

میدونی برا چی خوبه؟

اگر در سنسور فاصله سنج کدهای بالا رو بنویسیم جالب میشه! یعنی وقتی به یه مانعی نزدیک می شیم فرکانس بره بالا و متوجه بشیم.

درکد بعدی (tone(pin, frequency, duration هم فرقش اینه که اینجا مدت زمان میدیم.مثلا میگیم فقط ۱ ثانیه بوق بزن:

(tone(pin, frequency, 1000

 که اینجا ۱۰۰۰ میلی ثانیه همون ۱ ثانیه میشه. حالا کاربردش کجاست؟

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

الان وقتش رسیده که تمرین فصل قبل رو با هم انجام بدیم.تمرین فصل قبل چی بود ؟

گفته بودیم با یک فتوسل (سنسور حساس به نور) و یک LED مداری بسازید که بمحض نزدیک کردن دست به فتوسل و تاریک شدن سنسور, LED روشن بشه و زمانیکه دست رو از فتوسل دور میکنین LED خاموش بشه.

بد نیست که حالا یاد گرفتیم بازر چجوری کار میکنه به جای LED از بازر استفاده کنیم. یعنی بمحض نزدیک کردن دست به فتوسل و تاریک شدن سنسور ,صدای بازر رو بصورت ممتد بشنویم و زمانیکه دست رو از فتوسل دور میکنین صدای بازر قطع بشه!

برای شروع ابتدا مدار زیر رو می بندیم :

و سپس کد های زیر رو در آردوینو وارد می کنیم:

تحلیل کدها:

در کد بالا پایه ۳ رو بعنوان خروجی تعریف کردیم و متصل کردیم به بازر. بهتره یه مقاومت ۱۰۰ اهم هم با بازر سری کنین.

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

در این قسمت کاری که باید بکنیم اینه که از ورودی سنسور فتوسل بخونیم بنابراین یه ظرفی (متغیری) در نظر میگیریم از جنس متغیر صحیح (مثل ۱و۲و۳و۴و..) به اسم sensorValue و مقداری که از پایه آنالوگ(A0) میخونیم رو داخل اون میریزیم.

میتونستین اینکارم نکنین و مستقیم هرجا sensorValue وجود داشت به جاش (analogRead(A0 بذارین.

حالا میخایم ببینیم که این مقداری که ما از سنسور فتوسل دریافت کردیم چقدر هست و بر اساس اون تصمیم گیری بکنیم برای همین از if  استفاده کردیم.

میگیم که اگر مقداری که ما از سنسور فتوسل دریافت کردیم از ۶۵۰ بیشتر باشه: (if(sensorValue>650

مقدار پایه ۳ رو برابر HIGH ( همون ۵ ولت) قرار بده .یعنی بیا led یا بازر رو روشن کن. (digitalWrite(3,HIGH

 اگربیشتر از ۶۵۰ نبود (else)  بیا led یا بازر رو خاموش نگه دار (digitalWrite(3,LOW

در آخر هم مقداری که دریافت کردی از سنسور فتوسل رو به ما در پورت سریال نشون بده.  (Serial.println(sensorValue

و حدود ۳۰۰ میلی ثانیه هم تاخیر میندازیم که مقدارش رو در پورت سریال ببینیم.  (delay(300

 حالا چرا۶۵۰ ؟

این مقدار بستگی به خودتون داره و هر چقدر که دوست دارین میتونین این عدد رو عوض کنین.

مثلا یکی میخاد وقتی یه مقداری هوا تاریک شد یا بعبارتی نور فتوسل کم شد بازر به صدا در بیاد و یکی میخاد هر موقع کاملا تاریک شد بازر به صدا در بیاد .برای اینکه مقدار مناسبتون رو در بیارین میتونین برنامه رو روی آردوینو بریزین و بعد پورت سریال رو باز کنین و بعد نور سنسور فتوسل رو کم کنین (مثلا دستتون رو بگیرین جلوش)و ببینین چه عددی نشون میده و بر اساس اون بیاین و عدد ۶۵۰ رو اگر نمیخاین تغییر بدین.

در حالت اول مقدار مقاومت فتوسل کم هست (در این مدل که من استفاده کردم در حدود ۴ کیلو اهم) وقتی نور کم میشه مقدار مقاومت تا ۴۳ کیلو اهم بالا میره. چون فتوسل مقاومت بیشتری پیدا میکنه ولتاژ بیشتری روی اون افت میکنه و در نتیجه مقدار ولتاژ بیشتری توسط پایه A0 دریافت میشه و بنابراین عدد بیشتری از ۶۵۰ دریافت میشه در نتیجه صدای بازر بلند میشه.

حدیث از امام حسن (ع) :      

علم‌ و دانش‌ خود را به‌ مردم‌ یاد بده‌ و علم‌ دیگران‌ را یاد بگیر تا بدین‌ وسیله‌ هم‌ علم‌ خود را محكم‌ و استوار كنى‌ و هم‌ آنچه‌ نمى‌دانى‌ بیاموزى‌.

(بحار الانوار ، ج‌ ۷۸ ، ص‌ ۱۱۱)

پورت سریال قسمت دوم

این قسمت خیلی مهمه بنابراین خیلی دقت کنین!

در قسمت اول پورت سریال رو یه مقداری توضیح دادیم و گفتیم که چجوری کار میکنه و بعد از اون گفتیم که اگر بخایم که یک ارتباط سریال بسازیم در آردوینو باید اینکاررو چجوری انجام بدیم.

حالا وقتشه که یه مقداری جزیی تر وارد این مبحث بشیم و راجع به خوندن اطلاعات از نوع صحیح(int) واعشاری (float) و رشته (string) یه توضیحی بدیم.

اولین کاری که بخوایم برای ایجاد پورت سریال در آردوینو انجام بدیم اینه که سرعتش رو تنظیم کنیم. و این بستگی به این داره که چیکار میخایم بکنیم. مثلا آردوینو رو متصل کردین به یک سنسور خاص یا یه دستگاه که پورت سریال داره و میخاین از طریق پورت سریال باهاش ارتباط برقرار کنین. خب اول از همه باید ببینین که اون دستگاه یا سنسور خاص باچه سرعتی کار می کنه و بعد آردوینو رو دقیقا در همان سرعت تنظیم کنین تا ارتباط برقرار بشه.

سوال اگه سرعت ارتباط سریال یکی نباشه میشه ارتباط برقرار کرد؟

نه نمیشه! باید سرعت ارتباط سریال در هر دو دستگاه یکی باشه.

خب چجوری در آردوینو بهش بگیم که باید مثلا با سرعت ۹۶۰۰ ارتباط سریال برقرار کنی؟ با دستور زیر:

(Serial.begin(9600

داخل  پرانتز به جای ۹۶۰۰ میتونین هر سرعت دیگه ای که میخاین رو بنویسین.

قراردادن خروجی در پورت سریال (نوشتن روی پورت سریال)

اگه بخایم یه اطلاعاتی رو روی پورت سریال قرار بدیم مثلا یه چیزی مثل hello رو بخام روی پورت سریال قرار بدیم چجوری میشه؟

(“Serial.print (“hello

اگه بخایم یه اطلاعاتی رو روی پورت سریال قرار بدیم اما وقتی بخایم اطلاعات بعدی روی خط بعد قرار بگیره چجوری میشه؟

(“Serial.println(“hello

بعضی موقعا میخایم که آخر اطلاعاتی که میفرستیم روی خط بعد قرار نگیره!

یعنی چی؟

مثلا اینجا hello رو فرستادی آخرشم گفتی برو خط بعد .

خب!

یبار دیگه وقتی دستور بالا اجرا بشه , چون رفته خط بعد از همونجا اجرا میشه. ولی بعضی وقتها بستگس به شرایط میخای که اول بره خط بعد , بعدش hello رو بفرسته!  برای اینکار از دستور Serial.print (“hello”) استفاده میکنی فقط اول دستور  \n رو میزاری که بمعنی خط جدید یا new line هست.پس دستورش میشه:

(“Serial.println(“\nhello

نکته:

۱- اگر بخایم که یه پیامی رو در خروجی بفرستیم باید از   ”   “استفاده کنیم مثل همین دستور قبل :  (“hello”)

اما اگه خواستیم یه متغیری یا یه مقداری مثل مقدار پین آنالوگ A0 رو در خروجی قرار بدیم بایستی بدون علامت ”   ” باشه مثل دستور :

((Serial.println(analogRead(A0

۲- بعضی موقعها هم پیش میاد که بخایم tab (مثل کلید tab)  رو بفرستیم در خروجی پورت سریال در این موقع باید از \t  استفاده کنیم:( در پورت سریال اگه ببینین یه مقداری جابجا میشه خروجی سمت راست)

(“Serial.println(“\thello

گرفتن ورودی در پورت سریال (خواندن از پورت سریال)

اگه بخایم اطلاعاتی که روی پورت سریال اومده(از یه دستگاه دیگه) بخونیم باید از چه دستوری استفاده کنیم؟

برای خوندن از پورت سریال از دستور :    ( )Serial.read     

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

خب چیکار میکنن؟

شما مهمون میخاد بیاد خونتون چند دقیقه یبار میری جلوی در نگاه میکنی ببینی مهمون اومده یا نه؟!!

معلومه نه! منتظر میشم تا زنگ در خونه رو بزنه بعد برم در رو باز کنم.

تو آردوینو هم همینجوری که گفتی هست. برنامه رو جوری باید بنویسیم اول برنامه منتظر بمونه که یه دیتا (اطلاعاتی) در ورودی پورت سریال بیاد بمحض اینکه اطلاعاتی قرار گرفت اونو بخونه.

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

دستور  ۰مقدار کاراکترهایی که دریافت شده رو نشون میده. حالا اگه یه دستور بنویسیم که هر موقع تعداد کاراکترهایی که دریافت کرده بیشتر از صفر باشه , یعنی اینکه یه اطلاعاتی دریافت کرده (مثل اینکه یکی زنگ خونه رو فشار داده)

بعد اطلاعاتی رو که اومده با( )Serial.read میتونیم بخونیم. مثال:

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

مقداری که بر روی پورت سریال قرار میگیره رو باSerial.read میخونیم سپس با Serial.println اون مقدار رو نمایش میدیم.

برنامه بالا رو روی آردوینو پروگرام کنین و بعد پورت سریال رو باز کنین و در قسمت بالا یه چیزی مثل salam بنویسین و بعد گزینه send رو بزنین:

بعد از اینکهsalam رو تایپ کردی و دکمه send رو زدی باید الان همون salam رو درقسمت پایین ببینیم. اما یه چیزه دیگه ای نشون میده و بی ربط مثل این :

یه سری عدد مثل ۱۱۵  ۹۷  ۱۰۸  ۹۷  ۱۰۹ رو نشون میده! احتمال داره اشتباه کرده باشه یبار دیگه از اول آردوینو رو پروگرام میکنم و بعد salam رو تایپ میکنم. اما باز هم همین عددها میاد .چرا؟

آهان! ببین آردوینو نمیفهمه که شما زدی salam .پس چی میفهمه؟

وقتی  در قسمت پورت سریال  salam رو تایپ میکنی در حقیقت معادل کاراکتری اون رو میفرستی سمت آردوینو!

متوجه نشدم!

ببین یه جدولی هست که توی اون معادل حروف, علامتها, اعداد به فرمتهای دیگه هست. اون جدول رو میتونی ببینی:

اگه برای بار اولتونه که این جدول رو می بینین اصلا نیاز نیست وحشت کنین! فقط کافیه معادل کاراکتر ها رو از روی جدول بدونی چی میشه. اگه خیلی علاقه داری میتونی ascii table  رو تو اینترنت سرچ کنی و راجع بهش بخونی که چیه و …

حالا کاری که میخایم بکنیم اینه که چجوری اطلاعاتی که نیاز داریم رو از رو جدول بدست بیاریم. یه تیکه از جدول رو که حروف salam روش قرار داره میاریم و روی اون کار میکنیم:

اگه دقت کنی میبینی که روی سطر اول Char نوشته شده که معادل همون کاراکتر هست و در قسمت پایین میای و a رو پیدا میکنی.بعد معادل همون a رو در همون سطر پیدا میکنی که میشه ۹۷.

 وقتی که تو کاراکتر a رو میفرستی سمت آردوینو , آردوینو a رو نمیفهمه و در عوض معادلش رو میفهمه که میشه ۹۷.

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

یعنی:   s=۱۱۵, a=۹۷, l=۱۰۸, a=۹۷ ,m=۱۰۹  که در پایین میتونی با مقداری که آردوینو نشون میداد مقایسه کنی:

اما یه سوال مهم!

چی؟

خب فهمیدیم که آردوینو معادل Dec رو میفهمه. ولی مگه ما وقتی کلمه salam رو تایپ میکنیم و بعدsend رو میزنیم  همه کاراکتر ها رو در یک لحظه برای آردوینو میفرستیم پس چرا پشت سر هم معادل اونا رو نشون نمیده ؟

مثلا اینجوری : ۱۱۵ ۹۷ ۱۰۸ ۹۷ ۱۰۹

به نکته خیلی خوبی اشاره کردی و اونم اینه که آردوینو مقادیر رو کاراکتر به کاراکتر میخونه نه پشت سر هم ! دلیل اینکه از دستور println  استفاده کردم به جای دستور println همین بود که شما متوجه بشی :

 بله درسته که شما تمام کاراکتر ها رو مینویسی و بعد همه شو send میکنی به سمت آردوینو ولی اون دونه دونه اونا رو دریافت میکنه و بخاطر همین به شما بصورت دونه دونه نشون میده.

اگه بخام برات مثال بزنم اینجوری میشه که :وقتی یه مغازه دار یه باری سفارش میده مثلا چند تا کارتن بیسکوییت , شرکت تولید کننده بیسکوییت یه وانت پر از کارتنهای بیسکوییت یه دفعه براش میفرسته ولی وقتی بار رسید به مغازه باید دونه دونه از وانت کارتنها رو بیارن تو مغازه تا دونه آخر. حالا ما مثل اون کارخونه بیسکوییت هستیم که یدفعه همه کاراکتر ها رو میفرستیم سمت آردوینو و آردوینو هم شبیه مغازه داره هست که کاراکتر به کاراکتر اونا رو دریافت میکنه.

خب تا اینجا فهمیدیم که چجوری پورت سریال آردوینو کار میکنه! اما راههای ساده تری هم هست که میتونیم ازاون بهره بگیریم که در ادامه اونها رو توضیح میدیم.

خواندن int  (صحیح)

اگه بخایم عدد صحیح مثل ۱و۲و۳و۴و… رو از ورودی بخونیم یه متغیر از جنس صحیح انتخاب میکنیم و بعد از دستور :

( )Serial.parseInt

استفاده میکنیم. پس این دستور برای خواندن اطلاعات از جنس صحیح هست. مثال:

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

یه سوال؟

بفرمایین.

اگه من عدد اعشاری یا حروف تایپ کنم چی نشون میده؟

میتونی خودت امتحان کنی ببینی چی نشون میده!!

جالبه!! وقتی یعه عدد اعشاری مثل ۶۷.۳۴۵ رو در پورت سریال میفرستیم چیزی که نشون میده اینه : ۶۷

چرا؟ برای اینکه عددی که ما فرستادیم از نوع اعشار بوده و در برنامه تعریف کردیم که عدد صحیح رو نشون بده بنابراین قسمت صحیح عدد رو نشون میده و بقیه اشم نشون نمیده.

راجع به حروف چی؟ مثلا salam رو میفرستم با پورت سریال به اردوینو چی نشون میده؟

صفر رو نشون میده!

پس نتیجه اینکه وقتی متغیر ما صحیح بود باید از دستور ( )Serial.parseInt استفاده کنیم.

.

خواندن float  (اعشاری)

اگه بخایم عدد صحیح مثل ۱.۲  و ۶۲.۳۲ و … رو از ورودی بخونیم یه متغیر از جنس اعشاری انتخاب میکنیم و بعد از دستور :

( )Serial. parseFloat  استفاده میکنیم. پس این دستور برای خواندن اطلاعات از جنس صحیح هست. مثال:

برنامه بالا رو روی آردوینو پروگرام کنین و بعد پورت سریال رو باز کنین و اعداد اعشاری بفرستین و بعد میبینین که همون اعداد رو بهتون نشون میده.مثل قبلی اگه عدد صحیح بفرستم چی میشه؟ همون عدد قبلی با وجود دورقم اعشار نشون میده. اگه عدد صحیح بفرستم چی؟ مثل دفعه قبلی همون عدد صفر با دو رقم اعشار نشون میده.

نکته مهم:

وقتی داشتیم تست میکردیم متوجه شدیم که عدد اعشار رو فقط تا دو رقم نشون میده!

وقتی عدداعشاری وارد شده بیشتر از دو رقم باشه , عددی که نشون میده فقط تا دو رقم اعشار بصورت گرد شده به سمت پایین یا بالاست. مثلا عدد ۰.۱۲۳ رو وارد میکنیم تا دو رقم اعشار که نشون میده ولی میاد به رقم سوم اعشار که اینجا ۳ هست نگاه میکنه اگه رقم سوم اعشار بیشتر از ۵ باشه به رقم سمت چپ یه واحد اضافه میکنه. ولی اگر کمتر از  ۵و خود ۵ باشه به رقم سمت چپ چیزی اضافه نمیکنه .مثال

عدد ۰.۱۲۲ چون رقم سوم اعشارش که میشه ۲ کمتر از ۵ هست نتیجه میشه: ۰.۱۲

عدد ۰.۱۲۷ چون رقم سوم اعشارش که میشه ۷ بیشر از ۵ هست نتیجه میشه: ۰.۱۳

مطلب بالا رو اگه متوجه نشدین چند بار بخونین تا موضوع کاملا براتون قابل درک باشه.

خواندن string  (رشته)

اگه بخایم یک رشته رو از ورودی بخونیم یه متغیر از جنس string انتخاب میکنیم و بعد از دستور :

( )Serial.readString استفاده میکنیم. پس این دستور برای خواندن اطلاعات از جنس string هست. مثال:

برنامه بالا رو روی آردوینو پروگرام کنین و بعد پورت سریال رو باز کنین و چند تا حرف بفرستین و بعد میبینین که همون حروف رو بهتون نشون میده.مثل قبلی اگه عدد صحیح بفرستم چی میشه؟ اگه عدد صحیح بفرستم چی؟

اما قسمت جالبناکش اینه که عدد صحیح و عدد اعشاری رو اگه بفرستین باز همونارو نشون میده! حتی عدد اعشاری رو هم تا دو رقم نشون نمیده بلکه کل عدد رو نشون میده!

چرا؟

بعنوان تمرین خودتون سرچ کنین و درقسمت نظرات بنویسین.

این ارتباط سریال خیلی خیلی مهمه!!!  هم در میکرو کنترلر و هم تو مبحث برنامه نویسی موبایل (اگه عمری بود بگیم انشاا…) وقتی که میخاین از طریق اپلیکیشن موبایل با آردوینو ارتباط برقرار کنین بهتره این مباحث رو بلد باشین تا دچار سردرگمی نشین.

تمرین:

۱- برنامه ای بنویسین که وقتی حرف A را  از کامپیوتر توسط پورت سریال به آردوینو میفرستین , led متصل به آردوینو روشن شود و وقتی حرفa  را به آردوینو میفرستین led متصل به آردوینو خاموش شود.

حدیث از امام حسن (ع) :      

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

(شرح‌ نهج‌ البلاغه‌ ابن‌ ابى‌ الحدید ، ج‌ ۱۸ ، ص‌ ۱۰۸)

توسط | ۱۳۹۷/۸/۲۱ ۲۲:۲۵:۰۱ آبان ۱۹ام, ۱۳۹۷|آموزش آردوینو|۲ دیدگاه

۲ ديدگاه

  1. كلامي آبان ۲۶, ۱۳۹۷ در ۵:۳۶ ق٫ظ - پاسخ دادن

    با سلام و خسته نباشيد خيلي مطالب خوب و عالي مي باشد. با تشكر

  2. امیر دی ۲۱, ۱۳۹۷ در ۷:۴۱ ب٫ظ - پاسخ دادن

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

ثبت ديدگاه