概述
添加熱量到您的項目并使用Adafruit AMG8833 Grid-EYE Breakout進行視覺! Panasonic的這種傳感器是8x8的紅外熱傳感器陣列。當連接到您的微控制器(或樹莓派)時,它將通過I2C返回64個獨立紅外溫度讀數的數組。就像那些花哨的熱像儀一樣,但結構緊湊,簡單,易于集成。
此部分將準確測量溫度范圍為 0°C至80°C(32°F至176°F)的溫度+/- 2.5°C(4.5°F)。它可以在7米(23)英尺的距離內檢測到人。最大幀頻為10Hz,非常適合創建您自己的人體檢測器或微型熱像儀。我們具有在Arduino或兼容版本(傳感器通過I2C進行通信)或具有Python的Raspberry Pi上使用此突破的代碼。在Pi上,借助SciPy python庫的一些圖像處理幫助,我們能夠對8x8網格進行插值并獲得了一些非常不錯的結果!
AMG8833是松下的下一代8x8熱紅外傳感器,其性能比以前的AMG8831高。該傳感器僅支持I2C,并具有可配置的中斷引腳,當任何單個像素超過或低于您設置的閾值時,該引腳便會觸發。
為便于使用,我們將其拾取并放置在帶有3.3V穩壓器和電平轉換的分線板。因此,您可以將其與任何3V或5V微控制器或計算機一起使用。
甚至更好-我們在這里完成了所有艱苦的工作,提供了示例代碼和支持的軟件庫,使您可以僅用幾行代碼就可以開始運行!/p》
插腳
此攝像機有4個安裝孔和兩個標題條。僅底部帶連接到傳感器。頂部的突破僅是為了提高機械穩定性!
電源引腳:
Vin -這是電源引腳。由于傳感器使用3.3V電壓,因此我們包含了一個板載穩壓器,該穩壓器將承受3-5VDC的電壓并安全地將其向下轉換。要為電路板供電,請給它提供與微控制器邏輯電平相同的功率-例如對于像Arduino這樣的5V微型電池,請使用5V
3Vo -這是穩壓器的3.3V輸出,如果您愿意,可以從中獲得100mA電流
GND -電源和邏輯的公共接地
邏輯引腳:
SCL -這是I2C時鐘引腳,連接到您的微控制器I2C時鐘線。該引腳上有一個10K上拉電阻,并且已進行電平轉換,因此您可以使用3-5VDC。
SDA -這是I2C數據引腳,連接到您的微控制器I2C數據線。該引腳上有一個10K上拉電阻,并且已進行電平轉換,因此您可以使用3-5VDC。
INT -這是中斷輸出引腳。它是3V邏輯,您可以使用它來檢測傳感器視線路徑何時發生移動或改變。《/li》
板頂部的6個孔是為了穩定起見而未連接任何東西。如果您希望傳感器平穩地放在面包板或Perma-Proto上,請使用這些按鈕。
程序集
《表class =“ build-table”》
準備標題欄:
如有必要,將條切成一定長度。如果將其插入面包板,則焊接會更容易-長按針腳
添加分線板:
將分線板放在插針上,以便短插針穿過分線墊
還有焊料!
請務必焊接所有針腳以確保可靠的電接觸。
(有關焊接的技巧,請務必查看我們的出色焊接指南 )。
您完成了!目視檢查焊點,然后繼續進行下一步
Arduino接線和測試
您可以輕松地將此分線連接到任何微控制器,我們將使用Arduino。您可以使用任何其他類型的微控制器,只要它具有I2C時鐘和I2C數據線即可。
I2C接線
將 Vin 連接至電源,則3-5V即可。使用微控制器邏輯所基于的相同電壓。對于大多數Arduino,這是5V
將 GND 連接到公共電源/數據地
將 SCL 引腳連接到I2C在Arduino上的時鐘 SCL 引腳上。
在基于UNO和‘328的Arduino上,也稱為 A5 ,在Mega上也稱為 digital 21 ,在Leonardo/Micro上, 數字3
將 SDA 引腳連接到Arduino上的I2C數據 SDA 引腳。
在基于UNO&’328的Arduino上,也稱為 A4 ,在Mega上也稱為 digital 20 ,在Leonardo/Micro上, 數字2
默認情況下,I2C地址為0x69。如果將跳線焊接在標有“ 地址”的板子背面,則地址將更改為0x68。
下載Adafruit_AMG88xx庫
要開始讀取傳感器數據,您需要安裝Adafruit_AMG88xx庫。
啟動IDE并打開庫管理器。 :
鍵入 AMG88xx ,直到看到彈出的Adafruit庫。單擊安裝!
我們還提供了有關Arduino庫安裝的出色教程,網址為:
http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use
加載熱敏電阻測試
打開文件-》示例-》 Adafruit_AMG88xx-》 amg88xx_test ,并通過傳感器連接到您的Arduino。此示例僅連接到傳感器并讀取內部熱敏電阻以測試您的連接。
上傳到您的Arduino之后,以9600的波特率打開串行控制臺以查看內部熱敏電阻讀數。如果您獲得的讀數約為室溫(26度),那么一切都已連接好并且可以正常工作!
像素陣列輸出
好,我們知道傳感器正在工作,讓我們讀取實際的熱數據。加載文件-》示例-》 Adafruit_AMG88-》 pixels_test
上傳代碼,并以9600波特率打開串行控制臺。您應該每秒查看一次讀數數組的打印輸出。每個數字都是檢測到的溫度,以攝氏度為單位,并且是傳感器傳來的8x8網格順序。
如果將手或臉放在傳感器上方,數字應該會增加。如果您在感測器眼前舉起一些寒冷的東西,它們會減少
圖書館參考
要創建對象,請使用
下載:文件
復制代碼
Adafruit_AMG88xx amg; Adafruit_AMG88xx amg;
使用
下載:文件
復制代碼
status = amg.begin();
if (!status) {
Serial.println(“Could not find a valid AMG88xx sensor, check wiring!”);
while (1);
}
status = amg.begin();
if (!status) {
Serial.println(“Could not find a valid AMG88xx sensor, check wiring!”);
while (1);
}
以讀取像素,您需要一個數組才能將讀數放入其中。一旦擁有一個,就可以調用readPixels。通過使用預定義的AMG88xx_PIXEL_ARRAY_SIZE宏,確保您創建的數組足夠大。
下載:file
復制代碼
float pixels[AMG88xx_PIXEL_ARRAY_SIZE];
amg.readPixels(pixels); float pixels[AMG88xx_PIXEL_ARRAY_SIZE];
amg.readPixels(pixels);
Arduino熱像儀
要將您的Arduino變成酷的熱像儀,我們可以添加一個小顯示屏。
在此示例中,我們使用Adafruit 1.44英寸彩色TFT。更改一些代碼后,您可以使用其他尺寸的顯示器,但是彩色顯示器當然是最好的。
帶MicroSD卡突破口的Adafruit 1.44“彩色TFT LCD顯示屏
產品ID:2088
這個可愛的小顯示屏突破口是添加小尺寸顯示屏的最佳方法,色彩鮮艷明亮地顯示給任何項目。由于顯示器使用4線SPI進行通訊并且具有自己的。..
$ 14.95
IN STOCK
添加到購物車
將AMG8833分支保持連線,如上面“接線和測試”部分所述,并添加這樣的TFT
一切都連接好后,加載文件-》示例-》 Adafruit_AMG88xx-》 thermal_cam
點擊上傳,您應該擁有一個簡單的熱像儀!
James DV也已發送如果您想要更快的顯示更新速度,則可以進行優化的版本
Python和CircuitPython
將AMG8833傳感器與Python或CircuitPython以及Adafruit CircuitPython AMG88xx模塊一起使用很容易。該模塊使您可以輕松編寫從傳感器讀取熱成像數據的Python代碼。
由于我們的CircuitPython Adafruit_Blinka,您可以將此傳感器與任何CircuitPython微控制器板或具有GPIO和Python的計算機一起使用-for-Python兼容性庫。
CircuitPython微控制器接線
首先,將AMG8833與Arduino的前幾頁完全一樣地連接到板上。以下是使用I2C將Feather M0連接到傳感器的示例:
板3V 至傳感器VIN
板GND 》到傳感器GND
板SCL 到傳感器SCL
板SDA 到傳感器SDA
Python計算機接線
由于有數十種Linux計算機/主板,您可以使用我們將顯示Raspberry Pi的接線。對于其他平臺,請訪問Linux上的CircuitPython指南,以了解您的平臺是否受支持。
以下是與I2C相連的Raspberry Pi:
Pi 3V3 至傳感器VIN
Pi GND 到傳感器GND
Pi SCL 到傳感器SCL
Pi SDA 到傳感器SDA
AMG88xx庫的CircuitPython安裝 》
您需要在CircuitPython板上安裝Adafruit CircuitPython AMG88xx庫。
首先請確保您正在為板運行最新版本的Adafruit CircuitPython。
下一步,您將需要安裝必要的庫才能使用硬件-請認真按照以下步驟從Adafruit的CircuitPython庫捆綁包中查找和安裝這些庫。我們的CircuitPython入門指南上有一個很棒的頁面,說明如何安裝庫捆綁包。
對于諸如Trinket M0或Gemma M0的非表達板,您需要從捆綁包中手動安裝必要的庫:
adafruit_amg88xx.mpy
adafruit_bus_device
在繼續之前,請確保板的lib文件夾或根文件系統具有 adafruit_amg88xx.mpy,和 adafruit_bus_device 文件和文件夾 已復制。/p》
下一步連接到開發板的串行REPL,這樣您就可以在CircuitPython上出現》》》 提示。
AMG88xx庫的Python安裝
您需要安裝Adafruit_Blinka庫,該庫在Python中提供CircuitPython支持。這可能還需要在您的平臺上啟用I2C并驗證您正在運行Python3。由于每個平臺都略有不同,并且Linux經常更改,請訪問Linux上的CircuitPython指南以準備好您的計算機!
完成后,從命令行運行以下命令:
sudo pip3 install adafruit-circuitpython-amg88xx
如果您的默認Python是版本3,則可能需要改為運行“ pip”。只要確保您不嘗試在Python 2.x上使用CircuitPython,就不支持它!
CircuitPython和Python使用情況
為演示傳感器的使用情況,我們將對其進行初始化,并通過主板的Python REPL讀取熱成像數據。/p》
如果您使用的是I2C連接,請運行以下代碼以導入必要的模塊,并使用傳感器初始化I2C連接:
下載:文件
復制代碼
import time
import busio
import board
import adafruit_amg88xx
i2c = busio.I2C(board.SCL, board.SDA)
amg = adafruit_amg88xx.AMG88XX(i2c) import time
import busio
import board
import adafruit_amg88xx
i2c = busio.I2C(board.SCL, board.SDA)
amg = adafruit_amg88xx.AMG88XX(i2c)
現在您已經準備好使用以下任一屬性從傳感器讀取值:
溫度-傳感器溫度(以攝氏度為單位)。
pixels -傳感器上每個像素的溫度,以攝氏度為單位。溫度存儲在二維列表中,其中第一個索引是行,第二個索引是列。第一行位于最接近傳感器書寫的一側。
例如,每秒打印一次像素溫度,直到您停止它為止:
下載:文件
復制代碼
while True:
for row in amg.pixels:
print([‘{0:.1f}’.format(temp) for temp in row])
print(“”)
print(“ ”)
time.sleep(1) while True:
for row in amg.pixels:
print([‘{0:.1f}’.format(temp) for temp in row])
print(“”)
print(“ ”)
time.sleep(1)
完整示例代碼
下載:Project Zip 或 amg88xx_simpletest.py | 在Github上查看
復制代碼
import time
import busio
import board
import adafruit_amg88xx
i2c = busio.I2C(board.SCL, board.SDA)
amg = adafruit_amg88xx.AMG88XX(i2c)
while True:
for row in amg.pixels:
# Pad to 1 decimal place
print([‘{0:.1f}’.format(temp) for temp in row])
print(“”)
print(“ ”)
time.sleep(1)
import time
import busio
import board
import adafruit_amg88xx
i2c = busio.I2C(board.SCL, board.SDA)
amg = adafruit_amg88xx.AMG88XX(i2c)
while True:
for row in amg.pixels:
# Pad to 1 decimal place
print([‘{0:.1f}’.format(temp) for temp in row])
print(“”)
print(“ ”)
time.sleep(1)
Raspberry Pi熱成像儀
Raspberry Pi還具有i2c接口,甚至更好的具有處理能力以內插和過濾傳感器輸出。通過增加處理能力,您可以將8x8輸出“轉換”為看起來更高分辨率的顯示器。
我們使用的是PiTFT 2.8“和Pi Cobbler,但是代碼可以適應輸出到HDMI顯示器-我們正在使用pygame繪制到幀緩沖區。
您可以使用從Pi A +到Pi 3甚至是Pi Zero的任何Raspberry Pi計算機,但是我們碰巧有一個桌上的Pi 3已經設置好了,因此我們正在使用它。
Raspberry Pi 3-B型-具有1G RAM的ARMv8
產品ID:3055
您真的認為Raspberry Pi會變得越來越好嗎?在這一點上,我們聽起來像是一個破記錄,像我們一樣贊美新Pi的無數改進。..
$ 35.00
存貨
添加到購物車
PiTFT Plus組裝320x240 2.8英寸TFT +電阻式觸摸屏
產品ID:2298
這是不是Raspberry Pi最可愛的小顯示器嗎?它具有2.8英寸顯示屏,具有320x240 16位彩色像素和電阻式觸摸屏。該板使用高。..
$ 34.95
入庫
添加到購物車
已組裝的Pi T-Cobbler Plus-GPIO分支
產品ID:2028
這是Pi T-Cobbler Plus的組裝版本。與Raspberry Pi Model Zero,A +,B +,Pi 2,Pi 3兼容!(任何具有2x20連接器的Pi)
$ 7.95
現貨
添加到購物車
設置PiTFT
如果尚未設置,則要做的第一件事就是設置PiTFT。可以在本指南中找到。
安裝Python軟件
設置好所有的PiTFT,并且可以訪問Internet ss設置返回到此頁面并為AMG8833安裝Python軟件,以便您可以從傳感器讀取數據。
最后,同時安裝pygame和scipy。 Pygame允許我們使用python輕松繪制到屏幕上,我們將使用它來使顯示工作。 Scipy是一個強大的科學/數據處理庫,我們可以使用它神奇地將8x8 = 64像素陣列變成看起來更像32x32 = 1024像素陣列的對象。哇,數字信號處理不是很酷嗎?
下載:文件
復制代碼
sudo apt-get install -y python-scipy python-pygame
sudo pip3 install colour sudo apt-get install -y python-scipy python-pygame
sudo pip3 install colour
連接傳感器
在關閉Pi的情況下,我們可以將傳感器連接到Pi Cobbler,如下所示:
連接 Vin 連接到3V或5V電源(都可以)
將 GND 連接到補鞋匠的接地引腳上
連接 SDA 到補鞋匠上的 SDA
將 SCL 連到補鞋匠上的 SCL
》
您也可以使用直接電線,我們碰巧已經準備好了補鞋匠。記住,您可以將補鞋匠插入PiTFT的底部以訪問所有銷釘!
現在,您應該能夠通過要求Pi檢測它在I2C總線上可以看到的地址來驗證傳感器是否正確連接:
下載:文件
復制代碼
sudo i2cdetect -y 1 sudo i2cdetect -y 1
它應該顯示在默認地址( 0x69 )下。如果看不到0x69,請檢查接線,是否安裝了I2C支持等?
運行示例代碼
終于,終于可以運行示例代碼
下載:Project Zip 或 rpi_thermal_cam.py | 在Github上查看
復制代碼
“”“This example is for Raspberry Pi (Linux) only!
It will not work on microcontrollers running CircuitPython!”“”
import os
import math
import time
import busio
import board
import numpy as np
import pygame
from scipy.interpolate import griddata
from colour import Color
import adafruit_amg88xx
i2c_bus = busio.I2C(board.SCL, board.SDA)
#low range of the sensor (this will be blue on the screen)
MINTEMP = 26.
#high range of the sensor (this will be red on the screen)
MAXTEMP = 32.
#how many color values we can have
COLORDEPTH = 1024
os.putenv(‘SDL_FBDEV’, ‘/dev/fb1’)
pygame.init()
#initialize the sensor
sensor = adafruit_amg88xx.AMG88XX(i2c_bus)
# pylint: disable=invalid-slice-index
points = [(math.floor(ix / 8), (ix % 8)) for ix in range(0, 64)]
grid_x, grid_y = np.mgrid[0:7:32j, 0:7:32j]
# pylint: enable=invalid-slice-index
#sensor is an 8x8 grid so lets do a square
height = 240
width = 240
#the list of colors we can choose from
blue = Color(“indigo”)
colors = list(blue.range_to(Color(“red”), COLORDEPTH))
#create the array of colors
colors = [(int(c.red * 255), int(c.green * 255), int(c.blue * 255)) for c in colors]
displayPixelWidth = width / 30
displayPixelHeight = height / 30
lcd = pygame.display.set_mode((width, height))
lcd.fill((255, 0, 0))
pygame.display.update()
pygame.mouse.set_visible(False)
lcd.fill((0, 0, 0))
pygame.display.update()
#some utility functions
def constrain(val, min_val, max_val):
return min(max_val, max(min_val, val))
def map_value(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
#let the sensor initialize
time.sleep(.1)
while True:
#read the pixels
pixels = []
for row in sensor.pixels:
pixels = pixels + row
pixels = [map_value(p, MINTEMP, MAXTEMP, 0, COLORDEPTH - 1) for p in pixels]
#perform interpolation
bicubic = griddata(points, pixels, (grid_x, grid_y), method=‘cubic’)
#draw everything
for ix, row in enumerate(bicubic):
for jx, pixel in enumerate(row):
pygame.draw.rect(lcd, colors[constrain(int(pixel), 0, COLORDEPTH- 1)],
(displayPixelHeight * ix, displayPixelWidth * jx,
displayPixelHeight, displayPixelWidth))
pygame.display.update()
“”“This example is for Raspberry Pi (Linux) only!
It will not work on microcontrollers running CircuitPython!”“”
import os
import math
import time
import busio
import board
import numpy as np
import pygame
from scipy.interpolate import griddata
from colour import Color
import adafruit_amg88xx
i2c_bus = busio.I2C(board.SCL, board.SDA)
#low range of the sensor (this will be blue on the screen)
MINTEMP = 26.
#high range of the sensor (this will be red on the screen)
MAXTEMP = 32.
#how many color values we can have
COLORDEPTH = 1024
os.putenv(‘SDL_FBDEV’, ‘/dev/fb1’)
pygame.init()
#initialize the sensor
sensor = adafruit_amg88xx.AMG88XX(i2c_bus)
# pylint: disable=invalid-slice-index
points = [(math.floor(ix / 8), (ix % 8)) for ix in range(0, 64)]
grid_x, grid_y = np.mgrid[0:7:32j, 0:7:32j]
# pylint: enable=invalid-slice-index
#sensor is an 8x8 grid so lets do a square
height = 240
width = 240
#the list of colors we can choose from
blue = Color(“indigo”)
colors = list(blue.range_to(Color(“red”), COLORDEPTH))
#create the array of colors
colors = [(int(c.red * 255), int(c.green * 255), int(c.blue * 255)) for c in colors]
displayPixelWidth = width / 30
displayPixelHeight = height / 30
lcd = pygame.display.set_mode((width, height))
lcd.fill((255, 0, 0))
pygame.display.update()
pygame.mouse.set_visible(False)
lcd.fill((0, 0, 0))
pygame.display.update()
#some utility functions
def constrain(val, min_val, max_val):
return min(max_val, max(min_val, val))
def map_value(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
#let the sensor initialize
time.sleep(.1)
while True:
#read the pixels
pixels = []
for row in sensor.pixels:
pixels = pixels + row
pixels = [map_value(p, MINTEMP, MAXTEMP, 0, COLORDEPTH - 1) for p in pixels]
#perform interpolation
bicubic = griddata(points, pixels, (grid_x, grid_y), method=‘cubic’)
#draw everything
for ix, row in enumerate(bicubic):
for jx, pixel in enumerate(row):
pygame.draw.rect(lcd, colors[constrain(int(pixel), 0, COLORDEPTH- 1)],
(displayPixelHeight * ix, displayPixelWidth * jx,
displayPixelHeight, displayPixelWidth))
pygame.display.update()
如果您已正確安裝并正確連接了所有組件,您應該會看到一個不錯的熱像儀圖像。較冷的色調(藍色和紫色)是較涼的溫度,較暖的色調(黃色,紅色)是較暖的溫度。
如果您的圖像似乎在屏幕上被翻轉,請嘗試在AMG8833上更改突破的方向
如果您對細節感興趣,并且想了解更多有關我們如何使64像素看起來更多的信息,那就叫做雙三次插值(這個想法可以向OSHpark提示!)
下載
文檔
AMG8833數據表
AMG8833 Arduino驅動程序
Adafruit Fritzing庫中的Fritzing對象
AMG8833 CircuitPython驅動程序
AMG8833分支PCB文件(EAGLE格式)
示意圖
點擊放大
尺寸
英寸。點擊放大
責任編輯:wv
-
傳感器
+關注
關注
2552文章
51237瀏覽量
754762 -
熱像儀
+關注
關注
0文章
367瀏覽量
23918
發布評論請先 登錄
相關推薦
評論