آموزش رزبری پایپروژه رزبری پای

ساخت دماسنج حرارت بدن با دوربین حرارتی رزبری پای

تصویربرداری حرارتی یکی از فناوری های پیشرفته در بینایی رایانه تلقی می شود که در پروژه های مختلفی کاربرد دارد. با بدتر شدن اوضاع ویروس کرونا در سال 2021 ، ابزارهای بیشتری برای شناسایی درجه حرارت بدون بدون نیاز به تماس مورد نیاز هستند. یک سنسور دمای حرارتی می تواند دمای بدن انسان را اندازه گیری کند ، همچنین می تواند در چندین حوزه برای کاربردهای مختلف مانند تشخیص های پزشکی (که می تواند بیماری های پوستی ، تومورها و حتی برخی از انواع سرطان ها را تشخیص دهد) ، تشخیص عیب (در مدارها)، کاربرد های دفاعی و … مورد استفاده قرار گیرد.

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

امروز ، سعی خواهیم کرد یک ماژول دوربین حرارتی ساده به نام AMG8833 را با رزبری پای راه اندازی کنیم. این سنسور چشم شبکه ای حرارتی محصول شرکت پاناسونیک است. همچنین می توانید این سنسور را یک دستگاه مانیتورینگ دما بنامید یعنی داده های گرفته شده را به چندین بلوک 8×8 = 64 تقسیم می کند. FOV (میدان دید) 60×60 است. تعداد بلوک ها معادل تعداد پیکسل های تصویر دوربین است (نقشه گرما) و به این، وضوحِ دوربین حرارتی می گویند. از این رو ، AMG8833 دارای رزولوشن 8×8 یا 64 پیکسل است. هر پیکسل مانند یک سنسور مادون قرمز جداگانه است و به صورت جداگانه اندازه گیری درجه حرارت را ارائه می دهد و این سنسور را بسیار بهتر از سنسور های PIR و pyrometric می کند که فقط یک مقدار دما را می توانند ارائه دهند.

اصول و مفاهیم مربوط به تصویربرداری حرارتی

اندازه گیری دما مبتنی بر IR بر اساس یک اصل ساده که توسط قانون استفان بولتزمن نشان داده شده کار می کند – اجسام داغ امواج مادون قرمز را تابش می کنند. ارتباط تابش ساطع شده از جسم با دمای بدن و موارد دیگر در قانون استفان بولتزمن در زیر آورده شده است:

برای یادگیری آردوینو (برنامه نویسی، ساخت ربات، ارتباط با اندروید) روی دوره آموزش آردوینو کلیک کنید.
برای یادگیری کامل الکترونیک روی دوره آموزش الکترونیک کلیک کنید.

جایی که:

  • P نیرویی است که توسط جسم ساطع کننده تابش ساطع می شود. (وات)
  • A سطح زمین از جسم ساطع کننده تابش است. (متر مربع)
  • s انتشار پذیری جسم ساطع کننده تابش است. (ثابت منحصر به فرد برای خواص جسم، بدون واحد)
  • σ که (W.m) است.
  • T دمای جسم ساطع کننده تابش است. (کلوین)

با استفاده از این رابطه ، می توان دمای سطح یک جسم غیر براق ، مانند پوست انسان یا یک ظرف آب گرم را محاسبه کرد. با این حال ، در شرایط عملی خطاهایی در فرآیند محاسبه رخ می دهد. پارامترهای دیگری که بر میزان قرائت حرارتی تأثیر می گذارند شامل دمای محیط ، رطوبت نسبی و شرایط نوری هستند (اگر منبع نور تابش گرمایی زیادی مانند لامپ ایجاد کند)

قابلیت انتشار بدن انسان تقریباً است (0.97) ، و برای یک بدن کاملا سیاه، این نسبت 1 است. سایر مقادیر انتشار پذیری مواد معمولی به راحتی از طریق اینترنت قابل دسترسی است. وجود ثابت تابش باعث می شود که اندازه گیری درجه حرارت مبتنی بر IR کمی دقیق تر باشد زیرا حتی در همان دما مواد مختلف مقدار متفاوتی اشعه مادون قرمز ساطع می کنند.

راه اندازی سنسور حرارتی AMG8833 با رزبری پای

همانطور که قبلا ذکر شد ، AMG8833 یک سنسور دوربین حرارتی 8×8 میلی متری با پروتکل I2C از شرکت پاناسونیک است که تنها سنسور دوربین حرارتی با وضوح بالاتر از 10K INR است. برای تهیه نقشه حرارتی میتوانید از راه های استفاده کنید.

روش های تهیه نقشه حرارتی

  1. تقسیم طیفی از مقادیر رنگ بین حداقل و حداکثر مقادیر دما گرفته شده توسط سنسور AMG8833: این کار یک نقشه رنگی پویا ایجاد می کند ، جایی که بسته به حداقل و حداکثر مقادیر حرارت موجود در صحنه شما ، ممکن است یک مقدار درجه حرارت خاص با رنگ های مختلف تعیین شود. به این معنی که تصویر حرارتی داده های واقعی دما را ارائه نمی دهد و بنابراین داده ها از بین می روند. با این حال ، این کار تقریباً در هر محیطی به طور مناسب کار میکند.
  2. تعیین حداقل و حداکثر دما: این مدل یک نقشه رنگی ساکن ایجاد خواهد کرد و از این رو می توانید رنگ های خود را در دمای لازم ترسیم کنید تا نسبت کنتراست را به حداکثر برسانید.اما بزرگترین عیب این روش این است که شما مجبورید برای هر محیط جدید آن را به صورت دستی کالیبره کنید.

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

مدار راه اندازی سنسور دما حرارتی مبتنی بر AMG8833

ما از RPi Zero ، ماژول AMG8833 و یک بازر 5 ولت استفاده خواهیم کرد. می توانید از آردوینو نیز استفاده کنید ، اما نمایش تصاویر با استفاده از آردوینو بسیار سخت و پیچیده است. برای تجسم تصاویر با استفاده از Processing IDE یا پایتون ، باید از یک سیستم دسک تاپ استفاده کنید. از آنجا که 64 مقدار برای حسگر وجود دارد ، بارگذاری داده ها بر روی سروری مانند Arduino IOT Cloud یا ThingSpeak نیز میسر نیست. از این رو ، من Raspberry Pi را برای پردازش تصاویرم با استفاده از پایتون انتخاب کردم.

مدار راه اندازی سنسور دما حرارتی مبتنی بر AMG8833

اتصالات کاملاً ساده هستند. صدای زنگ توسط GPIO از طریق پایه ترانزیستور (2N222 یا BC547) ایجاد می شود و سنسور AMG8833 به پایه های SCL و SDA  برد Raspberry Pi متصل می شود. شما می توانید از هر مدل برد رزبری پای که بخواهید استفاده کنید ، من از RPi Zero-W استفاده کرده ام.

قطعات مورد نیاز

در اینجا ، ما از Raspberry Pi Zero با سیستم عامل Raspbian استفاده می کنیم.

  • رزبری پای (هر نسخه از RPI کار خواهد کرد)
  • سنسور AMG8833
  • بازر 5 ولت
  • ترانزیستور BC547 یا 2N222
  • مقاومت 10k
  • نمایشگر HDMI
  • ماوس و صفحه کلید یا VNC (برای استفاده از RPI)
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

کد پایتون سنسور دمای حرارتی مبتنی بر AMG8833

در این کد هربار که حسگر تصویر جدیدی را ثبت کند، بازر فعال میشود. شما میتوانید روشن شدن بازر را با توجه به نیاز خود فعال یا غیرفعال کنید. کد کامل در انتهای صفحه قابل دریافت است. در اینجا قسمت های مهم کد را بررسی میکنیم.

همچنین اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید

بلوک 1: فراخوانی کتابخانه ها

import time,sys                   #ثبت زمان
sys.path.append('../')            #فراخوانی مستقیم کتابخانه سنسور
import amg8833_i2c                #کتابخانه سنسور
import numpy as np                #کتابخانه برای آرایه ای کردن تصویر
import matplotlib.pyplot as plt   #رسم نمودار دو بعدی حرارتی در تصویر
from scipy import interpolate     #برای الگوریتم های درون یابی استفاده می شود
import RPi.GPIO as GPIO           #برای کنترل پین هدر استفاده میشود

بلوک 2: پیکربندی سنسور و GPIO

GPIO.setmode(GPIO.BCM)         #استفاده از شماره پین های GPIO
GPIO.setwarnings(False)        #غیرفعال سازی هشدار ها
BUZZER= 23                     #اتصال بازر به پین 23
buzzState = False              #متغیر برای وضعیت بازر
GPIO.setup(BUZZER, GPIO.OUT)   #تعیین حالت پین بازر
t0 = time.time()               #ذخیره زمان فعلی در یک متغیر
sensor = []                    #متغیر برای شیئ سنسور

سنسور AMG8833 دارای 2 آدرس I2C است زیرا ممکن است گاهی آدرس پیش فرض 0x69 توسط دستگاه های I2C دیگر اشغال شود. برای استفاده از آدرس جایگزین باید دو پد پشت سنسور را به یکدیگر متصل کنید.

استفاده از آدرس جایگزین AMG8833

while (time.time()-t0)<1:                       # صبر برای راه اندازی سنسور
    try:
        sensor = amg8833_i2c.AMG8833(addr=0x69) # راه اندازی سنسور با آدرس پیشفرض
    except:
        sensor = amg8833_i2c.AMG8833(addr=0x68) # راه اندازی سنسور با آدرس جایگزین
    finally:
        pass
time.sleep(0.1)                                 # صبر برای پیکربندی سنسور
if sensor==[]:                                  # اگر دستگاهی یافت نشد، کد را متوقف کن
    print("No AMG8833 Found - Check Your Wiring")
    sys.exit();                                 # اگر سنسور مورد نظر یافت نشد کد را متوقف کن

بلوک 3: درون یابی

از آنجا که AMG8833 فقط 64 پیکسل دارد ، تصویری که تولید می کند یک تصویر با وضوح کم به صورت پیکسلی است که تقریبا مانند تصویر زیر است.

تصویر ایجاد شده توسط سنسور AMG8833

از این رو ، برای قابل درک تر ساختن تصویر ، از درون یابی استفاده خواهیم کرد. درون یابی روشی برای افزایش وضوح تصویر نقشه حرارتی است که با استفاده از الگوریتم های نرم افزاری برای تولید پیکسل از پیکسل های همسایه تولید می شود. الگوریتم های درون یابی زیادی مانند مکعب ، Lanczos و … وجود دارد. ما از یک الگوریتم ساده درون یابی مکعبی استفاده خواهیم کرد. همانطور که می دانیم 8×8 رزولوشن پیش فرض سنسور است. ما از تابع linspace از کتابخانه numpy برای تولید نمونه هایی با فاصله برابر از 0 تا 7 ذخیره شده در متغیرهای xx و yy استفاده می کنیم.

pix_res = (8,8)                                                                          # وضوح پیکسلی اولیه
xx,yy = (np.linspace(0,pix_res[0],pix_res[0]), np.linspace(0,pix_res[1],pix_res[1]))    
zz = np.zeros(pix_res)                                                                   # ایجاد آرایه          
pix_mult = 6                                                                             # ضرب کننده برای درون یابی
interp_res = (int(pix_mult*pix_res[0]),int(pix_mult*pix_res[1]))             #وضوح تصویر نهایی
grid_x,grid_y = (np.linspace(0,pix_res[0],interp_res[0]), np.linspace(0,pix_res[1],interp_res[1]))
def interp(z_var):                                            #استفاده از داده های سنسور برای ایجاد تصویر
    f = interpolate.interp2d(xx,yy,z_var,kind='cubic')         #check here for details
    return f(grid_x,grid_y)
grid_z = interp(zz) # تصویر درون یابی شده

بلوک 4: مقداردهی اولیه شکل

حال که آرایه درون یابی شده داریم ، بیایید آرایه را به یک نقشه گرمای قابل مشاهده تبدیل کنیم. همانطور که قبلاً بحث شد ، ما از یک cmap ثابت استفاده خواهیم کرد زیرا می خواهیم دست خود را تا حد ممکن واضح ببینیم ، به اندازه کافی برای تشخیص انگشتان. این کار فقط با استفاده از مرزهای دمایی ثابت و ثابت انجام می شود. دمای عمومی اتاق حدود 25 درجه سانتی گراد است و عقربه ها نیز در حدود 27-30 درجه سانتی گراد هستند. از این رو ، ما از دامنه 27-32 درجه سانتیگراد استفاده کرده ایم تا عقربه با محیط مقابل در تضاد باشد. ما همچنین این پس زمینه را ذخیره می کنیم ، زیرا کم و بیش به همان صورت باقی مانده است و برای صرفه جویی در وقت طراحی آن را در تصویر کپی می کنیم. به این عمل بلایت گفته می شود. ما از نقشه رنگین کمان به صورت غیر وارونه استفاده خواهیم کرد. می توانید آن را با هر نقشه رنگی از وب سایت matplotlib که قبلاً پیوند داده ام ، جایگزین کنید. به عنوان مثال ، برای استفاده از نقشه رنگی PiYG به صورت وارونه ، cmap = plt.cm.rainbow را cmap = plt.cm.PiYG_r جایگزین کنید. افزودن _r در انتها نقشه رنگ را معکوس می کند. به طور کلی ، از رنگ های سرد (سیاه ، آبی ، سبز) برای نشان دادن دمای سردتر استفاده می شود.

plt.rcParams.update({'font.size':16}) #اندازه فونت المان ها
fig_dims = (10,9) # اندازه شکل
fig,ax = plt.subplots(figsize=fig_dims) # ایجاد شکل
fig.canvas.set_window_title('AMG8833 Image Interpolation') #نام پنجره تصویر
im1 = ax.imshow(grid_z,vmin=27,vmax=32,cmap=plt.cm.rainbow) # رسم تصویر با توجه به دما
cbar = fig.colorbar(im1,fraction=0.0475,pad=0.03)# نمودار رنگی
cbar.set_label('Temperature [C]',labelpad=10) # برچسب نمودار رنگی
fig.canvas.draw() # رسم شکل
ax_bgnd = fig.canvas.copy_from_bbox(ax.bbox) # تصویر پس زمینه
fig.show()

بلوک 5: رسم شکل به صورت زنده

حالا که پیکربندی های لازم را انجام داده ایم به قسمت اصلی کد میرویم.

while True: #حلقه بی نهایت
    status,pixels = sensor.read_temp(64) # خواندن وضعیت پیکسل ها       
    if status: # اگر مشکلی بود حلقه را دوباره اجرا کن
        continue
    print(pixels) #چاپ مقادیر در ترمینال
    GPIO.output(BUZZER, 1) #فعال کردن بازر
    #print("Buzzer ON")
    time.sleep(1) #صبر کردن برای 1 ثانیه
    GPIO.output(BUZZER, 0) #غیرفعال کردن بازر
    T_thermistor = sensor.read_thermistor() # خواندن دما
    print("Thermistor Temperature: {0:2.2f}".format(T_thermistor)) #نمایش دما
    fig.canvas.restore_region(ax_bgnd) #بازیابی پس زمینه
    new_z = interp(np.reshape(pixels,pix_res)) # درون یابی آرایه ای
    im1.set_data(new_z) # بروزرسانی نمودار با دما های جدید
    ax.draw_artist(im1) #  رسم تصویر جدید 
    fig.canvas.blit(ax.bbox)
    fig.canvas.flush_events()

اندازه گیری دما بدون تماس با سنسور حرارتی و رزبری پای

اتصالات پروژه به طور کامل در زیر نشان داده شده است. اگر دمای اطراف شما در حدود 27 درجه سانتیگراد یا کمتر باشد ، تصویر خروجی در ابتدا آبی خواهد بود. بعد از قرار دادن دست روی سنسور ، باید دست خود را ببینید و به خوبی دست و انگشتان را از هم تشخیص دهید. اگر نمی توانید ، مقدار دمای حداکثر در عملکرد نمایش را تغییر دهید. می توانید به آرایه اصلی 64 پیکسل ضبط شده توسط ماژول AMG8833 که ما روی CLI چاپ کردیم مراجعه کنید.

اندازه گیری دما بدون تماس با سنسور حرارتی و رزبری پای

خروجی 1: تصویر حرارتی دست. با کنتراست مناسب ، حتی انگشتان دست نیز قابل مشاهده هستند که برای چنین رزولوشن پایینی ستودنی است.

خروجی 1

خروجی 2: داده های آرایه دمایی و دمای ترمیستور AMG8833 در ترمینال

خروجی 2

خروجی 3: تصویر حرارتی هسته RPI

خروجی 3

موارد موجود در فایل : سورس کامل

دانلود فایل های پروژه

برای مشاهده توضیحات روی دوره مورد نظر کلیک کنید.

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام آیرنکس را دنبال کنید.

تصویر از محمد رحیمی

محمد رحیمی

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *