ATmega16 + DS18B20 + LED + Matlab / Simulink = AR

我想到了以某种方式使用DS18B20传感器是的,不仅要获取温度值(每个人都可以做),而且还要以某种方式将其可视化。有一个简单的想法。我们放了摄像头。我们将光线均匀地熄灭,然后熄灭。减去图片-仅保留闪光灯。在它上面,我们正在寻找传感器的位置,该传感器物理连接到太空中的LED。然后进行数学处理。好吧,所有这些都在simulinka中。在katom下,描述了如何接收精美图片。对于那些不想理解的人,我建议您在文章末尾查看实验。


电路图


电路非常简单。心脏是ATmega16。所有DS18B20传感器都挂在同一引脚上(在我的情况下,在PORTB端口的PB0上)。引脚本身通过一个4.7kΩ电阻上拉至电源电压。该方案是可扩展的。图片是可单击的。



所有LED均通过终端电阻连接到PORTA端口。灰色的多边形表示此LED已物理连接到DS18B20。复位引脚通过一个10kΩ电阻上拉至高电平,以避免由于干扰而意外复位。微控制器的时钟频率为16 MHz石英。尽可能接近结论。负载罐在内部使用。通过保险丝配置。分别输出ICP连接器(用于上传固件)和UART,用于“通信”。电容C1(电解质10μF)和C2(陶瓷100 nF)。尽可能靠近微控制器的电源引脚。用于避免负载转移期间的意外放电。

电路组装

什么是灰色多边形?

固件+工作算法


固件是用Atmel Studio 7 IDE 中的C语言编写的来源发布在GitHub上该代码已得到最大程度的记录。
该项目分为几个抽象级别:
  • 硬件 -最低级别,最大程度地绑定到硬件。使用微控制器的外围设备。
  • 中间件是硬件和驱动程序之间的中间地带。例如,执行1-Wire协议。
  • 驱动程序 -驱动程序级别。例如,使用DS18B20芯片。
  • 应用程序 -最高级别的抽象。例如,通过UART接收和发送温度。

快速浏览主要功能。首先是ROM地址表。物理连接到零位LED(挂在PORTA端口的PA0上)的传感器的地址必须位于零位等。要获得ROM,有一个sendROMToUART函数您只需要记住,传感器必须单独位于总线上,否则地址冲突。
主要的
int main(void)
{	
	const uint8_t ROM[][sizeof(ROM_T)] = /* ROM array */
	{
		{0x26, 0x00, 0x00, 0x04, 0x4B, 0x15, 0x89, 0x28}, // 0
		{0x71, 0x00, 0x00, 0x04, 0x4A, 0xC0, 0x65, 0x28}, // 1
		{0xA5, 0x00, 0x00, 0x04, 0x4A, 0xCB, 0xCE, 0x28}, // 2
		{0x41, 0x00, 0x00, 0x04, 0x4A, 0xAC, 0x65, 0x28}, // 3
		{0x22, 0x00, 0x00, 0x04, 0x4B, 0x06, 0x0D, 0x28}, // 4
		{0x86, 0x00, 0x00, 0x04, 0x4A, 0xF6, 0x46, 0x28}  // 5
	};
	
	uint8_t nDevices = sizeof(ROM) / sizeof(ROM_T); /* Number of DS18B20 devices */
	
	initUART(MYUBRR); /* Initialization of UART with appropriate baudrate */
	initTimer0(); /* Initialization of Timer/counter0 */
	initLED(nDevices); /* Initialization of LEDs */
	
	{ /* DS18B20s initialization */
		uint8_t nDevices = sizeof(ROM) / sizeof(ROM_T); /* Number of DS18B20 devices */
		ROM_T *pROM = (ROM_T *)&ROM; /* Pointer to ROM array */
		
		initDQ(); /* Initialization of DQ pin */
		
		while (nDevices--) /* For all DS18B20 */
			initDS18B20(pROM++, RESOLUTION_11BIT); /* Initialization of DS18B20 with appropriate resolution */
	}
	
	sei(); /* Global enable interrupts */
	
	while (1) /* Infinite loop */
	{
		sendTemperatureToUART((ROM_T *)&ROM, nDevices); /* Execute function routine */
	}
}

接下来是以适当的分辨率初始化外围设备和DS-ok本身。温度采样周期取决于它。对于11位,这是375毫秒。在无限循环中,程序不断从每个传感器读取温度并通过UART发送。

LED的工作基于中断。通过UART在偶数和奇数帧上连续2次出现LED ID。首先,LED亮起。计时器在一定时间(以我的情况为15 ms)后熄灭。第二次完全被忽略。定时器配置为CTC模式,因此每1 ms发生一次中断。
代号
volatile uint8_t ledID = 0; /* Current ledID value */
volatile uint8_t ledID_prev = 255;  /* Previous ledID value */
volatile uint8_t duration = FLASH_DURATION; /* Flash duration value */

ISR(USART_RXC_vect) /* UART interrupt handler */
{
	ledID = UDR; /* Assign ledID to receive via UART value */
	if (ledID != ledID_prev) /* If current ledID equal to previous value */
	{
		turnOnLED(ledID); /* Turn on the ledID LED */
		timer0Start(); /* Start Timer0 */
		ledID_prev = ledID; /* Previous ledID assign to current */
		duration = FLASH_DURATION; /* Update LED flash duration */
	}
}

ISR(TIMER0_COMP_vect) /* Timer0 compare interrupt handler */
{
	if (--duration == 0) /* Decrement Duration value each 1ms and if it reach to 0 */
	{
		timer0Stop(); /* Stop Timer0 */
		turnOffAllLED(); /* Turn off all LEDs */
		timer0Clear(); /* Clear Timer0 counter register */
	}
}

代码的时间敏感部分是1-Wire信号,包装在ATOMIC_BLOCK结构中。所有基本设置都在global.h中进行UART的运行速度为250,000,对于16 MHz石英而言,运行速度快且没有错误。DS18B20驱动程序具有此项目所需的最少功能。其余的-参见代码。会有问题-问,不要害羞。我还要提醒您有关保险丝的设置。他们需要通过外部石英来设置时钟功能,否则将通过内部发生器来设置(最大时钟频率为8 MHz,并且不稳定)。好,对CKOPT位编程,否则8 MHz以上的石英将不会启动。我有High Fuse = 0xD9Low Fuse = 0xFF

Simulink模型+操作算法


Matlab R2015b 版本Simulink的,除了内置库,主要用于计算机视觉系统工具箱图像AQUISITION工具箱整个模型和相关文件都上传到GitHub上以下是带有说明性示例的详细描述。所有图片都是可点击的。

WebCamTemp模块


黄色块表示COM端口块。分别是发射器,接收器和配置器。端口设置必须与微控制器的设置完全匹配(速度,奇偶校验,位数等)。接收器将温度分组为int16类型的[n 1]大小的一维数组,其中n是DS18B20的数量(我有6个)。此数组的每个元素进一步除以16。这来自第6页数据表。发送器将当前计数器值发送到Counter。它只是点亮特定的LED。滴答从0n期间2个样本。负责显示/保存视频流的块以蓝色分组。绿色-接收视频信息的块。实际上是网络摄像头本身。根据制造商的不同,有很多设置。图片以灰色调显示。好有趣 DIFF产生前一帧和当前帧之间的差。采样奇数仅突出显示已点亮的差异-未点亮的LED,反之亦然。采样均匀仅跳过LED熄灭的帧。

图差异
, — . ( ). , . 0.25.



图灰
, — , . , . .



帧频显示显示当前的FPS。所有处理都在LED块中我们将考虑如下。

LED模组


获得2D高斯的紫罗兰色分组块我们需要两个:干扰不透明度它们的sigma不同。它们的中心位于最大点(LED点亮的位置)。坐标位于“ 最大”块中与其持续生成这样的高斯函数(指数是一个非常耗时的数学运算),而是决定将其删除。为此,在m文件中,生成两个IntOp,其大小是中间居中位置的2倍,其中,必要的内容仅使用Crop干扰Crop不透明度块进行了裁剪

工作实例
— . — . — . — . 0.25.



内存块以绿色圈出。它们的目的是存储每个LED的坐标和高斯。我们将在下面更详细地考虑。To颜色用于构建温度分布和颜色图。也将在下面讨论。信号合成单元复化共混物中的两个图像IMAGE1图像2以下列方式:


插入文本”在图像上加上了格式化的文本(在这种情况下为温度)。它接受n个变量,并以[XY]格式坐标您可以选择字体及其大小。红色矩形内的块执行移动平均算法过渡变得不那么抽搐,这可以保留神经并取悦眼睛。

例子
, — 8- . ( ) .



内存条


内存干扰内存不透明度存储2D高斯集,内存点数 -每个LED的坐标。

内存干扰和内存不透明
. Address . . . Delay LEDs ( , ). . Enable . , ( Maximum Threshold LEDs). — . . [H W n], HxW — -, n — /.

记忆点
. . Permute Matrix , [Y X], [X Y].

上色模块


绿色- 不透明处理。总结三维输入数组。我们将其标准化为最大。乘以增益(从0到1)(1)。总的来说,我们有一个数组,其中高斯相互叠加,并且获得最大增益。用作混合图像因素。红色-接收温度色图。这里的数学略有不同,都是高斯。用公式(2)描述。粗略地说,任意点的温度是所有传感器的加权平均值。但是,每个传感器的影响均以百分比的形式与其中的高斯值成正比。所有的总和取为100%。


仍然需要考虑温度分布如何变成颜色图。蓝色圆圈将特定温度转换为介于0和1之间的值。在红色区域中,Prelookup计算索引,通过该索引搜索红色,绿色和蓝色的值。颜色数组包含64个值。中间体通过插值计算。在这些功能中,有两种模式:相对模式和绝对模式。在相对最冷和最热的地方,输入数组的最小值和最大值对应。绝对有一些常数。首先,更方便地查看温度分布曲线。另一方面,它的绝对变化。

m文件


它在模拟之前的开始时执行,将变量引入工作区。
代号
H = 480; % Height of image
W = 640; % Width of image
minT = 20; % Min temperature
maxT = 25; % Max temperature
sigmaInt = 40; % Sigma interference
sigmaOp = 80; % Sigma opacity
gain = 1.0; % Gain value
T = 0.3; % Threshold value
nAvr = 8; % number of means
% ------------------------------------------------------
[M,N] = meshgrid(-W:W, -H:H); % Meshgrid function

R = sqrt(M.^2 + N.^2); % Distance from the center

Int = normpdf(R, 0, sigmaInt); % 2D gaussian for interference
Op = normpdf(R, 0, sigmaOp); % 2D gaussian for opacity

Int = Int/max(max(Int)); % Normalization of interference gaussian
Op = Op/max(max(Op)); % Normalization of opacity gaussian

clear M N R sigmaInt sigmaOp % Delete unused variables from memory

load('MyColormaps','mycmap'); % Load colormap


它包含主要控制变量,其中:
  • H — .
  • W — .
  • minT — .
  • maxT — .
  • sigmaInt — Interference.
  • sigmaOp — Opacity.
  • gain — Factor.
  • T — .
  • nAvr — .

HW必须与WebCamera块中的电流匹配。minTmaxT在绝对温度模式下会影响颜色图。T设置为0到1。有时COM端口和网络摄像头不同步。差分图像的相位可以改变180°。并且应该有一个最大值-那里是一个最小值。并且系统可以选择与现实不符的任意坐标。为此,有一个阈值系统。nAvr是移动平均线中的平均线数。越大,过渡越平滑,但是相关性丢失(出现时移)。为了理解其余变量的影响,没有说明性的例子就无法弄清楚。

SigmaInt效应
. , , . — .



SigmaOp效应
.



增益效应
- . «» « » .



实验


以下是一些实验。

开窗


传感器被窗户分散在床上。稍后会打开和关闭窗口。相对(左)模式和绝对(右)模式之间差异的一个很好的例子。使用第一种方法,可以方便地考虑分布,第二种方法是如何分配冷量或如何恢复热量。



窗台


传感器位于窗台上。窗口打开-配置文件更改。最冷和最热的区域清晰可见。



上面比较暖吗?


他们说顶部比较温暖。此实验完全证实了这一点。在第10秒,窗口打开,在第30秒-关闭。



结论


这样的方案将不能替代成熟的热成像仪。但是他看不到空气的扩散。而且这种设计的价格是无与伦比的。您可以在其中使用其他颜色映射。您可以代替高斯使用其他功能。您甚至可以更改构造法则。或重写为OpenCV + QT以提高速度和便利性。但这就是我的构想-我已经实现了。只是在玩票

Source: https://habr.com/ru/post/zh-CN390985/


All Articles