در این آموزش ابتدا نحوه ی راهاندازی سنسور DS18B20 و نمایشگر OLED را بررسی میکنیم. سپس میخواهیم بدون استفاده از خودِ برد آردوینو و تنها با تکیه بر پلتفرم آن یک محصول را تغییر کاربری دهیم و آن را به ابزاری برای تست و توسعه تبدیل کنیم.
اخیراً در شرکتی که مشغول به کار هستم، برای بردهایی که در آن از سنسور دمای DS18B20 جهت پایش محیطی استفاده میشود، مشکلاتی ایجاد شده. به دلیل ارسال اطلاعات به سرور ، عیبیابی این مشکلات در محل ساده نبود؛ چرا که ممکن بود ایراد از خودِ برد، سنسور، سوکت یا سیمهای ارتباطی ــ یا حتی ترکیبی از آنها ــ باشد.
به همین علت تصمیم گرفته شد تستری برای سنسور DS18B20 در سریع ترین زمان و با کمترین هزینه ممکن ساخته شود. اینجاست که آردوینو خودنمایی میکند؛ زمانی که نمیخواهید “چرخ را از اول اختراع کنید”.
همانطور که در یادداشت “آردوینو خوب، بد، زشت“ اشاره شد، این ابزار در جامعهی الکترونیک با دو نگاه متفاوت دیده میشود: گاهی خوب و کاربردی ، و گاهی محدود و آماتوری. اما آردوینو با وجود صدها کتابخانه، مثالهای آماده و جامعهای گسترده همواره ابزاری برای نمونه سازی و پیشبرد سریع یک ایده یا پروژه در بین همگان شناخته میشود.
این نیاز بهانه ای شد برای یادداشت پیش رو ، که در قالب یک مثال کاربردی به بررسی یکی از روشهای استفاده از پلتفرم آردوینو در کالبد های مختلف بپردازیم.
این آموزش نیاز به دانش مقدماتی در زمینهی الکترونیک، برنامهنویسی و آردوینو دارد. اگر با این مفاهیم آشنایی ندارید، پیشنهاد میشود ابتدا منابع مقدماتی را مطالعه کنید.
یک حسگر دیجیتال دماست که به دلیل دقت خوب، سیمکشی ساده و خروجی دیجیتال بسیار پرکاربرد است. این سنسور با پروتکل 1-Wire کار میکند، بنابراین تنها یک خط داده برای ارتباط نیاز دارد. هر سنسور یک شناسه یکتای ۶۴ بیتی دارد که امکان اتصال چندین سنسور روی یک باس مشترک را فراهم میکند. همین ویژگیها باعث میشود استفاده از آن نسبت به سنسورهای آنالوگ سادهتر و قابلاعتمادتر باشد. مخصوصا زمانی که طول اتصالات زیاد است.
برخلاف نمایشگرهای LCD سنتی، نمایشگرهای OLED به نور پس زمینه نیاز ندارند زیرا پیکسلهای OLED نور خود را تولید میکنند. این امر به OLEDها کنتراست بالا، زاویه دید عالی و رنگهای مشکی واقعاً عمیق میدهد. از آنجایی که به نور پس زمینه نیاز ندارند، نمایشگرهای OLED از انرژی کمتری – به طور متوسط حدود 20 میلیآمپر – استفاده میکنند که آنها را برای پروژههای باتریدار ایدهآل میکند. این نمایشگرها در بازار ایران در ابعاد مختلف و در پروتکلهای SPI و I2C موجود است. ما از ماژول ”OLED 0.96 با درایور SSD1306 با پروتکل I2C استفاده میکنیم اما شما می توانید از نمونهای که با SPI کار می کند استفاده کنید
نمایشگرهای OLED با ولتاژهای بین ۳.۳ ولت تا ۵ ولت کار میکنند. این یعنی میتوانید به راحتی و بدون هیچ مشکلی نمایشگر OLED خود را به یک میکروکنترلر ۳.۳ ولت یا ۵ ولت (مانند آردوینو) متصل کنید.
برای راه اندازی سنسور DS18B20 از کتابخانههای OneWire و DallasTemperature استفاده کردیم. و برای راه اندازی OLED از کتابخانه ی u8glib استفاده شد. چرا که توانایی راهاندازی طیف وسیعی از نمایشگرها را دارد. و به راحتی می توان با تغییرات اندکی در کد، نمایشگر را تعویض کرد. برای استفاده از دیگر نمایشگرهای پشتیبانی شده این فایل را دانلود و به اول کدتان اضافه کنید. سپس خط مربوط به آن را از حالت کامنت خارج کنید.
برای آشنایی بیشتر با این کتابخانهی جذاب (u8glib) می توانید از صفحهی گیتهاب آن بازدید کنید. در این صفحه درایورها و فونتهای پشتیبانی شده و اطلاعات مفید فراوانی وجود دارد.
نحوه متصل کردن قطعات روی بردبورد
این کد برای تست موارد اشاره شده در مقدمه، سه پارامتر زیر را در سه سطر نمایش می دهد:
(افت این ولتاژ نشاندهنده اتصالکوتاه در سنسور یا اتصالات آن است. برای این ولتاژ تقسیم مقاومتی در نظر گرفته نشده زیرا در محدوده اندازهگیری ADC است. اما قابلیت استفاده از تقسیم مقاومتی در کد درنظر گرفته شده.)
در کد زیر امکان راهاندازی هر دو پروتکل SPI و I2C برای OLED درنظر گرفته شده. فقط کافیست که پروتکلی که نمایشگر شما از آن استفاده میکند را از کامنت خارج و دیگری را کامنت کنید. دقت کنید که از SPI نرم افزاری استفاده شده و پینهای آن را میتوان تغییر داد.
1 2 3 4 5 6 | #include <Encoder.h> // لوپ ترسیم u8g.firstPage(); // مواردی که باید رسم شود do { } while(u8g.nextPage()); |
در تابع ترسیم یعنی drawScreen ، ابتدا فونت مورد نظر را با دستور ()u8g.setFont انتخاب میکنیم. سپس دادههای عددی را با تابع dtostrf به رشته تبدیل میکنیم تا بتوان آنها را چاپ کرد.
در داخل لوپ ترسیم با تابع drawStr(x, y, text) موقعیت هر عنصر را با مختصات پیکسلی (x, y) تعیین میکنیم. در این مورد مقدار سعی و خطا برای یافتن مختصات مناسب لازم است.
طبق توضیحات ارائه شده با کامپایل کدی که در ادامه آمده ، نتیجهی زیر نمایش داده میشود:
نمایشگر OLED در حالت های مختلف
نکته: توابع متعددی برای رسم اشکال در U8glib وجود دارد؛ از جمله: دایره و بیضی (پر و خالی)، مستطیل و کادر (با یا بدون گوشه گرد)، خطوط افقی، عمودی و مورب، نقطه، مثلث، تصاویر بیتی، و چاپ متن با جهتهای مختلف که میتوانید با مراجعه به این لینک در گیتهاب نحوهی استفاده از آنها را به شرح تصویر ببینید.
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 | #include "U8glib.h" #include <OneWire.h> #include <DallasTemperature.h> #include "Wire.h" //i2c // =================== OLED =================== // Soft SPI //U8GLIB_SSD1306_128X64 u8g(13, 12, 10, 11, 9); // SCK=13, MOSI=12, CS=10, A0(CD)=11, RST=9 //i2c U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK); // =================== DS18B20 =================== #define ONE_WIRE_BUS 5 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature DS18B20(&oneWire); // ============= مقادیر تقسیم مقاومتی ================ const float R1 = 10000; // 10k const float R2 = 1000; // 1k const float R3 = 0.0; // const float R4 = 1.0; // // =================== ورودیها =================== #define PIN_V_IN A1 #define PIN_V_S A0 // =================== متغیرهای رشتهای =================== char str_temp[20]; char str_V_IN[9]; char str_V_S[9]; // =================== توابع =================== float readVoltage_IN(int analogValue) { float Vout = (analogValue * 5.0) / 1024.0; return Vout / (R2 / (R1 + R2)); } float readVoltage_S(int analogValue) { float Vout = (analogValue * 5.0) / 1024.0; float Vin = Vout / (R4 / (R3 + R4)); return Vin ; } void drawScreen(float T, float V_in, float V_S) { u8g.setFont(u8g_font_ncenR12); // font //other font:u8g_font_gdr12 ,u8g_font_gdb12 , u8g_font_helvR12 , u8g_font_helvB12 , u8g_font_ncenR12 , u8g_font_ncenB12 // تبدیل اعداد به رشته dtostrf(T , 4, 1, str_temp); dtostrf(V_in, 4, 2, str_V_IN); dtostrf(V_S , 4, 2, str_V_S); // لوپ ترسیم u8g.firstPage(); do { // سطر اول :دما if(V_S <= 0.5) { u8g.drawStr(1, 12, "Temp "); u8g.drawStr(55, 12, "Short"); } else if(T != DEVICE_DISCONNECTED_C) { u8g.drawStr(1, 12, "Temp: "); u8g.drawStr(55, 12, str_temp); u8g.setPrintPos(102, 12); u8g.write(0xBA); // 0xDF or 0xBA for "°" u8g.drawStr(110, 12, "C"); } else if(T == DEVICE_DISCONNECTED_C) { u8g.drawStr(1, 12, "Temp: "); u8g.drawStr(55, 12, "disconnect"); } // سطر دوم : ولتاژ ورودی u8g.drawStr(1, 30, "V_in: "); u8g.drawStr(55, 30, str_V_IN); u8g.drawStr(110, 30, "V"); // سطر سوم : ولتاژ تغذیه سنسور u8g.drawStr(1, 48, "V_sen: "); u8g.drawStr(55, 48, str_V_S); u8g.drawStr(110, 48, "V"); } while(u8g.nextPage()); } // =================== setup =================== void setup() { Serial.begin(9600); DS18B20.begin(); } // =================== loop =================== void loop() { // خواندن ولتاژ ورودی float V_in = readVoltage_IN(analogRead(PIN_V_IN)); // خواندن ولتاژ سنسور float V_S = readVoltage_S(analogRead(PIN_V_S)); // خواندن دما DS18B20.requestTemperatures(); float T = DS18B20.getTempCByIndex(0); // نمایش روی OLED drawScreen(T, V_in, V_S); delay(250); } |
بخش دوم: پلتفرم آردوینو در کالبد دیگر | هم کالبد
همان طور که در مقدمه اشاره شد. قرار شد برای سنسور DS18B20 در سریعترین زمان و با کمترین هزینه ممکن تستری ساخته شود. در بخش اول ساخت یک نمونه با برد Arduino بررسی شد ولی برای یکپارچگی و سریعتر شدن مراحل ساخت و رهایی از سیم کشی و لحیم کاریهای کثیف، تصمیم گرفتم از یک برد خراب همان دستگاههای پایش که میکروکنترلر ATmega8 داشت برای ساخت این تستر استفاده کنم. همچنین بهانه ای برای نوشتن این یادداشت یعنی چگونگی استفاده از پلتفرم آردوینو بدون برد آن داشته باشم.
البته به دلیل استفاده از OLED این میکرو حافظه ی لازم برای برنامه ما را نخواهد داشت پس آن را با یک میکرو ATmega328P که پین های سازگاری با ATmega8 دارد تعویض میکنم.
نکته: سادهترین روش استفاده از پلتفرم آردوینو این است که بوتلودر آردوینو را روی میکروکنترلرهایی پروگرام کنیم که مشابه میکروکنترلرهای بهکاررفته در بردهای آردوینو هستند. در این حالت باید دقت کنید که کریستال هم مشابه کریستال بهکاررفته در بردهای آردوینو باشد (برای ATmega معمولاً ۱۶ مگاهرتز) چرا که بوتلودر با همین فرکانس اسیلاتور کار میکند و برای فرکانسهای دیگر سازگار نیست. همچنین قطعات لازم برای پایدار کردن پایهی ریست نیز لازم است.
در این مرحله به یک ابزار دیگر یعنی پروگرامر AVR هم نیاز داریم. ما از پروگرامر اپنسورس USBasp استفاده میکنیم که بهخوبی با پلتفرم آردوینو همگام است. به جای پروگرامر مجزا، میتوانید از یک برد آردوینو (مثل UNO) که در حالت ISP Programmer برنامه ریزی شده هم استفاده کنید و به کمک آن میکروکنترلر خود را پروگرام نمایید.
پروگرامر AVR با رابط USBasp برای برنامهریزی درونمداری ISP
سازنده برد پایش دما پینهای پروگرام ISP را از میکرو خارج کرده و در برد به راحتی در دسترس است خوشبختانه از کریستال هم در برد استفاده شده. به هر حال تنها کافیست نام پینهای ISP را پیدا کنیم که به سادگی و با مقایسه برد با pinout میکرو به دست میآید. در تصویر زیر عکس قسمتی از برد پایش را می بینید که نام پینهای مورد نیاز به آن اضافه شده.
بعد از پیدا کردن ترکیب پایههای ISP میتوان به سادگی میکروکنترلر روی برد را پروگرام کرد. من حتی آنها را لحیم نمیکنم فقط پینهدرها در پدهای برد زاویه دار تحت فشار نگه میدارم تا متصل باقی بماند (شما لحیم کنید).
در مرحله بعدی در Arduino IDE در منو Tools ابتدا بردی را انتخاب کنید که از میکروکنترلر مشابه شما استفاده کند من Arduino nano را انتخاب کردم سپس طبق عکس 1 بوتلودر آردوینو را روی میکرو بریزید با این کار فقط بوتلودر و فیوزبیتها پروگرام میشود. حال طبق عکس 2 میتوانید میکروکنترلر را با پروگرامری که انتخاب کردید، برنامهریزی کنید.
نحوهی ریختن بوتلودر با پروگرامر در آردوینو
ریختن برنامه با پروگرامر در آردوینو
همین مراحل را میتوانید برای همه میکروکنترلرهای AVR AT_MEGA که در آردوینو به کار رفته به کار ببرید. در قسمت های بعدی روش استفاده از طیف گسترده تری از میکروکنترلرها بدون لزوم استفاده از کریستال را با هم مرور خواهیم کرد.
دیدیم با استفاده از پلتفرم آردوینو و یک نمونه از برد پایش برای تغییر کاربری به تستر مورد نیاز ، دغدغه زیادی برطرف شد. تغذیه، سوکتها، لحیم کاری، سیم کشی همچنین قاب از این موارد بودند تنها اتصال نمایشگر نیاز بود که خوشبختانه پایههای I2C در دسترس بودند و به راحتی لحیم شدند.
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.