دوربین های مادون قرمز گجت هایی هستند که توانای نمایش بصری گرمای محیط را دارند . از این دوربین ها جهت دیدن در تاریکی ، تشخیص و ردیابی حرکت موجودات زنده و بسیاری دیگر از کاربرد ها استفاده می شود . ساختار این دوربین ها تفاوت زیادی با دوربین های معمولی لنز CMOS ندارد و تنها اختلافی که دارند این است در دوربین های معمولی لنز آن ها حساس به نور های مرئی است و در دوربین های حرارتی لنز آن ها حساس به نور مادون قرمز می باشد .
اجسام به طور کلی نور مادون قرمز از خود ساطع می کنند که هرچه دمای یک جسم بیشتر باشد شدتمادون قرمز آن نیز بیشتر می شود .
در این پروژه ما قصد داریم از ماژول AMG8833 جهت ساخت دوربین حرارتی استفاده کنیم . همچنین جهت مانیتورینگ دیتا از برنامه متلب استفاده خواهیم کرد .
AMG8833 یک سنسور حرارتی غیر تماسی است که دارای یک آرایه از دیود های حساس به IR می باشد . لنز این سنسور به صورت آرایه ای 8 در 8 است که در مجموع دارای 64 پیکسل می باشد . این سنسور توانایی اندازه گیری دما های بین 0 تا 80 درجه را دارد . ما در آموزش از ماژول CJMCU-8833 که هدر برد AMG8833 است استفاده خواهیم کرد .
استفاده از ماژول در ساخت نمونه های اولیه و تست مدارات در مرحله اولیه بسیار مقرون به صرفه خواهد بود . ماژول ها می توانند هزینه زیاد نمونه اولیه را بیسار کاهش دهند . همپنین در ماژول AMG8833 مداراتی جهت تامین تغذیه و کاهش نویز در نظر گرفته شده است و نیز تمامی پین های سنسور به صورت پین هدر هایی در دسترس هستند که نصب آن را بر روی برد بورد امکان پذیر می کند .
شرح عملکرد پروژه :
در این مثال برد آردوینو از طریق رابط I2C با AMG8833 ارتباط برقرای کرده و مقدار اندازه گیر شده توسط هر پیکسل را می خواند . سپی آردوینو دیتا را از طریق پورت سریال به کامپیوتر می فرستد . در نرم افزار متلب دیتای دریافتی نمایش داnه خواهند شد .
کد های آردوینو :
#include <Wire.h> #include <SparkFun_GridEYE_Arduino_Library.h> GridEYE amg8833; void setup() { Wire.begin(); // for connecting with AMG8833 amg8833.begin(); // begin AMG8833 comm Serial.begin(115200); // larger baud rate for sending all 64 pixel values } void loop() { // Print the temperature of each pixel for(unsigned char i = 0; i < 64; i++){ Serial.print(amg8833.getPixelTemperature(i)); Serial.print(","); } // end print with return Serial.println(); // short delay between sends delay(50); }
ابتدا ماژول را همانند شکل زیر به آردوینو متصل کرده و سپس کد های فوق را بر روی برد خود آپلود کنید . در نظر داشته باشد کهکتابخانه های Amg8833 را ابتدا دانلود و آن را نصب کنید .
برای تست عملکرد کد های بالا پس از پروگرام کردن برد وارد قسمت Serial ploter آردوینو IDE شوید . در آن جا باید مقدار 64 پیکسل ماژول نمودار شود .
کد های متلب :
کد ای زیر را در یک اسکریپت کپی کرده و پس از ذخیره آن را اجرا کنید ( پورت وارد شده را بر روی پورتی که آردوینو به آن متصل است تغییر دهید ) :
instrreset % reset all serial ports clear all close all clc s = serial('COM6'); % change this to desired Arduino board port set(s,'BaudRate',115200); % baud rate for communication fopen(s); % open the comm between Arduino and MATLAB % figure and axes parameters f1 = figure(); screen = get(0,'screensize'); fig_span = 0.75; % figure size 90% of screen set(gcf,'Position',[((1.0-fig_span)/2.0)*screen(3),((1.0-fig_span)/2.0)*screen(4),... (fig_span*screen(3))-((1.0-fig_span)/2.0)*screen(3),(fig_span*screen(4))-((1.0-fig_span)/2.0)*screen(3)],... 'color',[252.0,252.0,252.0]/256.0) loop_break = true; % dummy variable to exit loop when BREAK is pressed dialogBox = uicontrol('Style', 'PushButton', 'String', 'Break Loop','Callback', 'loop_break = false;'); % plot zeros so we can just update it later [x_locs,y_locs] = meshgrid(1:8); [x_interp,y_interp] = meshgrid(1:0.07:8-.07); % interpolate 8x8 to 100x100 % Sensor noise measurement % for this: place a large object with uniform temperature in % front of sensor (book, wall, table) - this is a psuedo calibration out = fscanf(s); % read data data_parse = split(out,','); % split by comma data_array = zeros(64,1); for ii = 1:64 data_array(ii) = str2double(data_parse(ii)); % convert to double end noise = reshape(data_array,[8,8]); mean_noise = mean(mean(noise)); % calculate mean noise noise = noise-mean_noise; % subtract mean noise from each pixel's noise plot_bounds = [mean_noise-2 26]; % plot bounds - If colder or hotter are expected - this may be changed while loop_break out = fscanf(s); data_parse = split(out,','); data_array = zeros(64,1); for ii = 1:64 data_array(ii) = str2double(data_parse(ii)); end data_array = reshape(data_array,[8,8])-noise; cla() % interpolate and plot onto image data_interp = interp2(x_locs,y_locs,data_array,x_interp,y_interp,'cubic'); imagesc(data_interp,plot_bounds) c1 = colorbar; % colorbar for temperature reading ylabel(c1,'Temperature [C]','FontSize',16) pause(0.05) % briefly pause to allow graphics to catch-up end
پس از اجرای اسکریپت فوق باید تصویری همانند شکل زیر نشان داده شود :