راه اندازی ADC در آردوینو مانند آنچه در نوشته های «راه اندازی ADC در AVR» و «راه اندازی ADC در STM32» داشتیم، است. تفاوت راه اندازی ADC آردوینو با راه اندازی ADC میکروکنترلرهای AVR یا میکروکنترلرهای دیگر، راحتی کار با آردوینو است. در پلتفرم آردوینو، با اجرای تنها یک تابع، تبدیل ADC آغاز و نتیجه در خروجی تابع قرار می گیرد. مانند مباحث نوشته های مذکور، مباحث این نوشته هم عبارتند از:
- راه اندازی مبدل آنالوگ به دیجیتال آردوینو؛
- اندازه گیری ولتاژ با آردوینو؛
- راه اندازی سنسور دما با آردوینو؛
- راه اندازی فتوسل با آردوینو؛
- راه اندازی LCD گرافیکی KS0108 با آردوینو.
در اینجا برای راه اندازی KS0108، از کتابخانۀ U8g2 استفاده کرده ایم. راه اندازی ADC آردوینو، در یک شکلِ ساده است. یعنی مد تحریک Single است، رزولوشن و فرکانس نمونه برداری ثابت هستند و از وقفۀ ADC استفاده نمی شود. در بردهای آردوینو مبتنی بر میکروکنترلرهای 8 بیتی AVR، رزولوشن 10 بیتی و فرکانس نمونه برداری حدود 9.6 کیلوهرتز است. در برخی بردهای آردوینو دیگر می توان رزولوشن را تغییر داد. ما در این نوشته از برد Arduino UNO استفاده می کنیم. تنها کاری که نیاز است انجام دهیم، اجرای تابع خواندن کانال ورودی است. خروجی تابع نیز مقدار دیجیتال تبدیل شده است. خواهیم دید که از خروجی این تابع، در توابعی دیگر، به ولتاژ، دما و شدت نور می رسیم. و آنها را در LCD گرافیکی KS0108 نمایش می دهیم. کدهای پروژۀ این نوشته را در Arduino IDE نوشته و پروژه را در نرم افزار پروتئوس شبیه سازی کرده ایم. فایل های Arduino IDE و پروتئوس و همچنین کتابخانۀ U8g2 در پیوست قرار دارند.
نکته: KS0108 را می توان با میکروکنترلرهای STM32 در پلتفرم آردوینو و با استفاده از کتابخانۀ U8g2 راه اندازی کرد. به نوشتۀ «راه اندازی STM32 با آردینو» مراجعه نمایید.
ویدئوی 1 – راه اندازی ADC در آردوینو، پایه های ADC در آردوینو
اتصالات لازم برای راه اندازی ADC و LCD گرافیکی KS0108
در پروژۀ این نوشته، خروجی پتانسیومتر را به پایۀ A0 آردوینو متصل کرده ایم. خروجی سنسور دمای TMP36 و خروجی مدار فتوسل را هم به ترتیب به A1 و A2 وصل کرده ایم. ولتاژ تغذیه برای پتانسیومتر، سنسور دما و فتوسل، 5 ولت است. بنابراین ولتاژ خروجی پتانسیومتر می تواند بین صفر تا 5 ولت باشد. خروجی مدار فتوسل و سنسور دما هم در همین محدوده است. با تعیین ولتاژ مرجع 5 ولت برای ADC، می توانیم ولتاژ خروجی پتانسیومتر، سنسور دما و مدار فتوسل را بخوانیم. در نوشته هایی که در مقدمه به آنها اشاره کردیم، خروجی سنسور دمای LM35 را اندازه گرفته ایم. در اینجا از سنسور TMP36 استفاده کرده ایم. راه اندازی LM35 با آردوینو تفاوت زیادی با راه اندازی سنسور TMP36 ندارد.
تصویر 1 – اتصال فتوسل، سنسور دما و پتانسیومتر به Arduino UNO
برای نمایش نتیجۀ راه اندازی ADC در آردوینو در این نوشته از LCD گرافیکی KS0108 استفاده می کنیم. نحوۀ اتصال KS0108 به آردوینو به صورت زیر است. دقت داشته باشید که پایۀ DI نام های دیگری هم دارد. RS و DC نام های دیگر پایۀ DI هستند. در برخی LCDهای KS0108 ممکن است نام پایۀ CS0 و CS1، به ترتیب CS1 و CS2 باشد. همچنین برخی از این LCDها پایۀ CS2 هم دارند. در LCD گرافیکی که ما استفاده کرده ایم، پایه های CS1 و CS2 وجود دارند که در کد باید CS0 و CS1 فرض شوند. پایۀ RW نیز نمایشگر زمین شده است. توجه کنید که در عمل دو پایۀ دیگر در LCD وجود دارد که مربوط به LED پس زمینه هستند. در LCD مورد استفادۀ ما، این پایه ها، پایه های 19 و 20 هستند. که آنها را به ترتیب به 5 ولت و زمین متصل می کنیم.
تصویر 2 – اتصالات لازم برای راه اندازی KS0108 با آردوینو
نمونه کد راه اندازی ADC در آردوینو
ابتدا پایه هایی که به خروجی پتانسیومتر، سنسور دمای TMP36 و فتوسل متصل است، دیفاین کرده ایم. ولتاژ مرجع پیش فرض برابر ولتاژ پایۀ AVCC میکروکنترلر روی برد آردوینو یعنی 5 ولت است. روزولوشن ADC برابر 10 بیت است. 210 – 1 که در فرمول ولتاژ استفاده می کنیم، برابر 1023 است. آنها را دیفان کرده ایم. سپس کتابخانۀ U8g2 را به پروژه اضافه کرده ایم. در کتابخانۀ U8g2 برای LCD گرافیکی KS0108 کلاس هایی وجود دارد. که ما از کلاس U8G2_KS0108_128X64_F شیء my_glcd را ایجاد کرده ایم. پارامتر ورودی اول، تعیین کنندۀ Rotation یا چرخش است. که می خواهیم جهت نمایش، افقی رو به پایین باشد. بنابراین آن را برابر U8G2_R0 قرار داده ایم. U8G2_R0 تا U8G2_R3 در کتابخانۀ U8G2 دیفاین شده اند. پارامترهای ورودی دوم تا نهم، شمارۀ پایه های D0 تا D7 نمایشگر هستند. پارامتر ورودی دهم تا سیزدهم نیز پایه های دیگر LCD هستند. دو پارامتر ورودی آخر هم به ترتیب پایه های CS2 و Reset نمایشگر هستند. LCD مورد استفادۀ ما پایۀ CS2 ندارد و پایۀ Reset هم به آردوینو متصل نمی کنیم. بنابراین مقدار آنها را برابر U8X8_PIN_NONE که یک عبارت دیفاین شده در کتابخانۀ U8g2 است، قرار داده ایم.
#define rs_pin 2 // or di_pin or dc_pin (dc = data / command)
#define cs0_pin 0 // or cs1_pin (On my GLCD, the cs1 pin is the same as cs0.)
#define cs1_pin 1 // or cs2_pin (On my GLCD, the cs2 pin is the same as cs1.)
//#define cs2_pin ... // or U8X8_PIN_NONE (There is no CS2 pin on my GLCD.)
#include <U8g2lib.h>
U8G2_KS0108_128X64_F my_glcd(U8G2_R0, // Rotation
d0_pin,
d1_pin,
d2_pin,
d3_pin,
d4_pin,
d5_pin,
d6_pin,
d7_pin,
en_pin,
rs_pin,
cs0_pin,
cs1_pin,
U8X8_PIN_NONE, // CS2_pin
U8X8_PIN_NONE); // Reset_pin
در ادامه توابع محاسبۀ ولتاژ پتانسیومتر، دمای اندازه گیری شده توسط TMP36 و شدت نور بر حسب درصد، آورده ایم. مقدار ولتاژ ورودی برابر است با:
(digital_rsult * Vref) / 1023
که آن را در تابع ولتاژ آورده ایم. فرمول محاسبۀ دما از سنسور TMP36 هم به این صورت است:
(Volatge - 0.5)*100
که Voltage را با تابع ولتاژ محاسبه کرده ایم و در فرمول دما در تابع دما قرار داده ایم. تابع شدت نور نیز نتیجۀ تبدیل خروجی مدار فتوسل را که از صفر تا 1023 است، با تابع map، به مقداری بین صفر تا 100 تبدیل می کند.
float voltage(unsigned int voltage_d)
{
return (((float)voltage_d * vref)/resolution);
}
float temperature(unsigned int temp_d)
{
float temp = voltage(temp_d);
temp -= 0.5; // 0.5 is offset of TMP36
temp *= 100; // from TMP36 datasheet
return temp;
}
unsigned int light(unsigned int light_d)
{
unsigned int light_percent = 0;
light_percent = map(light_d, 0, 1023, 0, 100);
return light_percent;
}
تصویر 3 – نتیجۀ راه اندازی ADC در آردوینو در نرم افزار پروتئوس
راه اندازی KS0108، پتانسیومتر، TMP36 و فتوسل با آردوینو
در تابع setup ابتدا تابع begin را فراخوانی کرده ایم. سپس با تابع analogReference، ولتاژ مرجع ADC را روی حالت پیش فرض (ولتاژ AVCC) قرار داده ایم. بعد با تابع clear نمایشگر را پاک و یک فونت را برای نمایش تعیین کرده ایم. بعد از آن، رشتۀ UBOARD.ir را به تابع drawStr ارسال کرده ایم. در سطرهای بعد فونت را تغییر و رشته های دیگر را در تابع drawStr قرار داده ایم. ورودی اول و دوم drawStr ستون و سطری از LCD است که رشته در آن نمایش داده می شود. سپس با اجرای تابع sendBuffer، رشته هایی را که در تابع drawStr قرار داده ایم، در LCD نمایش داده ایم. در نهایت یک تأخیر 2.5 ثانیه ای ایجاد کرده ایم.
void setup(void) {
my_glcd.begin();
analogReference(DEFAULT);
my_glcd.clear();
my_glcd.setFont(u8g2_font_ncenB14_tr);
my_glcd.drawStr(8, 15, "UBOARD.ir");
my_glcd.setFont(u8g2_font_ncenR10_tr);
my_glcd.drawStr(0, 32, "This project is a");
my_glcd.drawStr(0, 48, "simple example");
my_glcd.drawStr(0, 63, "of ADC.");
my_glcd.sendBuffer();
delay(2500);
}
تصویر 4 – راه اندازی KS0108 با آردوینو با کتابخانه U8g2
در ادامه در تابع loop با تابع analogRead ولتاژ ورودی ها را به مقادیر دیجیتال تبدیل کرده ایم. این مقادیر را در channel_x_value قرار داده ایم. سپس LCD را پاک کرده ایم. بعد از آن مقدار channel_1_value و channel_2_value را به ترتیب در توابع voltage و temperature قرار داده ایم. خروجی این توابع را که از نوع float است، به تابع dtostrf ارسال کرده ایم. تابع dtostrf، مقادیر float را به رشته تبدیل می کند. ورودی اول آن، مقدار float مورد نظر است. ورودی دوم، سایز رشته، ورودی سوم، تعداد ارقام اعشار و ورودی چهارم نیز یک رشته است. سپس با تابع sprint رشتۀ str_float را در رشتۀ glcd_str قرار داده ایم. بعد تابع drawStr را اجرا کرده ایم. سپس channel_2_value را در تابع light و خروجی light را با spintf در glcd_str قرار داده ایم. تابع drawStr و sendBuffer را فراخوانی کرده و در نهایت یک تأخیر 500 میلی ثانیه ای به وجود آورده ایم. نتیجۀ راه اندازی ADC در آردوینو در این چند سطر کد، در تصویر زیر آمده است.
void loop(void) {
unsigned int channel_0_value, channel_1_value, channel_2_value;
char glcd_str[25], str_float[10];
channel_0_value = analogRead(potentiometer_output_pin);
channel_1_value = analogRead(tmp36_output_pin);
channel_2_value = analogRead(photocell_output_pin);
my_glcd.clear();
dtostrf(voltage(channel_0_value), 4, 2, str_float);
sprintf(glcd_str, "V = %s", str_float);
my_glcd.setFont(u8g2_font_ncenR10_tr);
my_glcd.drawStr(3, 15, glcd_str);
dtostrf(temperature(channel_1_value), 4, 2, str_float);
sprintf(glcd_str, "T = %s", str_float);
my_glcd.setFont(u8g2_font_ncenR10_tr);
my_glcd.drawStr(3, 35, glcd_str);
sprintf(glcd_str, "L = %d", light(channel_2_value));
my_glcd.setFont(u8g2_font_ncenR10_tr);
my_glcd.drawStr(3, 55, glcd_str);
my_glcd.sendBuffer();
delay(500);
}
تصویر 5 – نتیجۀ عملی راه اندازی ADC در آردوینو و نمایش در LCD گرافیکی KS0108
نتایج راه اندازی ADC در آردوینو
- برنامه نویسی ADC در آردوینو، نسبت به برنامه نویسی آن با میکروکنترلرهای AVR و میکروکنترلرهای دیگر، ساده تر است. مقدار آنالوگ روی پایۀ ورودی، با اجرای تنها یک تابع، به دیجیتال تبدیل می شود.
- در ADC آردوینو پیچیدگی ها و جزئیات وجود ندارد و بیشتر تنظیمات ADC غیر قابل تغییرند. مثلاً رزولوشن 10 بیتی و مد تحریک Single است. اما در راه اندازی ADC در میکروکنترلرها می توان تنظیمات متعددی داشت. مثلاً در ADC در AVR می توان رزولوشن را 8 بیتی یا 10 بیتی تنظیم کرد.
- راه اندازی TMP36 با آردوینو تقریباً مشابه راه اندازی LM35است. فرمول های محاسبۀ دما در راه اندازی این دو سنسور متفاوت است.
- برای خواندن ولتاژ با آردوینو یا میکروکنترلرها باید دقت داشت که محدودۀ ولتاژی را که می توان با ADC اندازه گرفت، صفر تا ولتاژ مرجع ADC است.
- همۀ LCDهای گرافیکی KS0108، ترتیب و نوع پایه های یکسانی ندارند. از این لحاظ ممکن است انواع متفاوتی وجود داشته باشد.
- ولتاژ روی کانال ورودی ADC از این فرمول به دست می آید: (digital_result * Vref)/(2Resolution – 1)
- تابع map مقدار یک عدد را که در یک محدوده است، به یک عدد متناسب با محدوده ای دیگر تبدیل می کند.
- تابع analogReference برای تعیین ولتاژ مرجع ADC است. که برای برد Arduino UNO می تواند در حالت DEFAULT (ولتاژ پایۀ AVCC) یا EXTERNAL (ولتاژ خارجی روی پایۀ AREF) یا INTERNAL (ولتاژ مرجع 1.1 ولت داخلی) باشد.
- برای راه اندازی مبدل آنالوگ به دیجیتال در آردوینو کافی است تابع analogRead اجرا شود.
- برای تبدیل مقادیر float به رشته در آردوینو نمی توان مستقیماً از تابع sprintf استفاده کرد. در آردوینو تابع dtostrf استفاده می شود.
فیلم های آموزشی یوبرد که مرتبط با این نوشته هستند:
0 دیدگاه