Adafruit AMG8833 8x8热像仪传感器的制作

电子说

1.3w人已加入

描述

概述

添加热量到您的项目并使用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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分