雷竞技注册
项目

将PIC微控制器作为自定义传感器和I / O接口的I2C从设备进行编程

2016年3月03日通过Raymond Genovese.

没有I2C接口与该传感器?没问题。将PIC芯片作为自定义传感器和I / O接口的I2C从设备进行编程。在这里,我们在单个I2C接口上使用三个DHT22传感器。

没有I2C接口与该传感器?没问题。将PIC芯片作为自定义传感器和I / O接口的I2C从设备进行编程。在这里,我们在单个I2C接口上使用三个DHT22传感器。

内部集成电路(I2C)总线是一种常用的、方便的嵌入式控制器接口技术。这种流行的串行接口协议允许微控制器板(如Arduino UNO)使用两条通信线、时钟和数据(SCL和SDA)和两条电源线(Vcc和GND)与外部设备(如传感器)通信。每个I2C外围设备都是可寻址的,允许多个设备连接到同一个I2C连接,这是它流行的主要原因。

但是,当您要使用的外围设备不使用I2C通信协议时,您会做什么?一个解决方案是滚动自己的I2C接口。该项目呈现了相对容易且廉价的方式来做。

具体来说,我们将使用经济的PIC12F1840 IC作为从I2C设备,将接口到Arduino UNO以及大多数微控制器板使用一个单一的主/多个从,I2C方案。

该项目电路在面包板上。

面包板上的项目电路。

为了说明该技术具有一定的实用价值,PIC芯片将与三个DHT22(又名AM2302)湿度和温度传感器接口。最后的结果是一个简单的方法,使用一个I2C总线部署所有三个传感器。该技术可以扩展为包括其他自定义传感器应用程序以及自定义I/O扩展和这两者的组合。

硬件

该电路由PIC I2C接口和三个DHT传感器组成。PIC I2C接口包含12F1840 IC,一些支持组件,一个头/跳线(JP1)连接主板和三个额外的头/跳线连接三个传感器板。J1上Arduino UNO的四个连接是+5v、GND、SDA和SCL,这些都可以在Arduino板标头上找到。12F1840包括6个I/O引脚。其中两个引脚RA1和RA2组成了用于I2C通信的SDA和SCL线。我已经包括10K, I2C上拉电阻(R1和R2)在这些线路上,他们工作得很好,但你可能想要调整你的应用程序的值。

此外,如果系统上的I2C线路上已经有上拉电阻,则可能需要完全消除这些电阻。三个I/O引脚,RA0, RA4和RA5,分别连接到DHT22传感器#1,#2和#3上的数据线。剩余引脚(RA3)未使用,未连接。有了额外的扩展电路,这个引脚可以作为通用输入或使硬件复位(MCLR)。

图1. PIC I2C板的原理图。

图1. PIC I2C板的原理图。
部分 描述

PIC I2C单板部件列表。

U1. pic 12f1840 / p
C1 0.1超滤电容
R1, R2 10 k电阻
J1,DHT1-3 4针标题/跳线
电缆 3 X 4-pin

每个传感器安装在单独的板上,其意图将它们彼此一定距离放置并通过4针电缆连接到I2C板。由于DHT22上的4个引脚中只有3个可用,因此如果需要,您可以替换3个引脚电缆和连接器(制作适当的连接)。

DHT22或AM2302温湿度传感器。引脚:1-Vdd, 2-Data, 3 - n/c, 4-GND。

DHT22或AM2302湿度和温度传感器:引脚:1-VDD,2数据,3 N / C,4-GND。

传感器板也相对简单,仅包含DHT22传感器、数据线上的上拉电阻和横跨电力线的旁路电容。

图2。单个DHT22传感器原理图。3个传感器各需要一块单板。

图2。单个DHT22传感器原理图。3个传感器各需要一块单板。

传感器板部件清单
部分 描述
DHT22 DHT22传感器
C1 0.01 UF电容器
R1 4.7K电阻
J1. 4针标题/跳线

该项目,如所述,是为5v使用而设计的,但我也测试了3.3v,它工作良好,因为该电压在PIC IC和DHT22的工作范围内。

实现自定义I2C传感器

PIC 12F1840是Microchip增强的8位中档架构的示例。它是一个8针微控制器,包括大量外围设备功能。这些外围设备函数中的主要项目是主同步串口或MSSP。此功能允许我们实现I2C接口,使得芯片将用作从设备I2C设备。也许最好的是,在应用笔记(AN734C)中已经为我们完成了“重升降”的软件。该应用笔记中的代码构成了I2C引擎的基础。它是中断驱动的,允许芯片基本上起作用32字节存储器阵列,允许在主设备和从设备之间进行双向读取和写入。附加的程序包括来自应用程序笔记的代码,仅稍微修改为12F1840。

主I2C设备(在此示例中,Arduino UNO)将通过写入存储器阵列中的选择位置向从I2C设备发出命令。PIC作为从属I2C设备,将通过存储器阵列执行命令(即,读取DHT22传感器)并报告背部状态和传感器信息。然后,主设备读取存储器阵列以检索传感器读数。

记忆映射

我们将32字节的内存数组称为array[0]到array[31]。阵列[0]是主节点(Arduino)发出命令的位置,从节点(PIC)将报告主节点读取的状态。在这方面,PIC将返回表中描述的三个值中的一个。这些值将指示通电状态、有效命令的成功执行以及接收错误或未知命令。

ARRAY[0] STATUS - PIC设置的报告状态的值。
状态值
0 x00 启动值。另外,对软件PIC设置的值进行复位
0 x01 最后一个命令执行成功
0xF1. 请求错误的(未知的)命令

arduino将使用如下所述的四个可能的命令值中的一个写入阵列[0]。这些将指示PIC读取DHT传感器中的一个或重置。

ARRAY[0] COMMAND - Arduino设置的发出命令的值。
命令值
0 x02 读取DHT传感器#1
0 x03 读取DHT传感器#2
0 x04 读取DHT传感器#3
0x10 执行PIC的软件重置

当发出传感器读命令时,通过向Array[0]写入0x02、0x03或0x04, PIC返回成功执行状态,通过向Array[0]写入0x01,通过读取内存阵列Arduino可以获得传感器数据。

DHT22返回5个字节以指示湿度(相对湿度或RH)和温度(摄氏度),如下所示:RH积分,RH小数,温度积分,温度小数和校验和,这是所有四个字节的总和的值和255.这5个字节将在读取传感器命令之后用PIC写入不同的存储位置。阵列[16] - arraRay [31]位置是未使用的免费内存可用于自定义使用。

数组内存位置-由PIC设置的用于Arduino读取的值。
传感器数据信息图
数组[1]也参与[5] DHT传感器#1:RH积分,RH小数,温度积分,温度小数,校验和
数组[6]也参与[10] DHT传感器#1:RH积分,RH小数,温度积分,温度小数,校验和
阵列[11] - arraw [15] DHT传感器#1:RH积分,RH小数,温度积分,温度小数,校验和
阵列[16] - arraray [32] 使用

最后可用的命令是0x10,它将导致PIC 12F1840的软件复位。通常不需要使用此命令,但在意外情况下可能有用。

读取DHT22温湿度传感器

读取DHT22传感器并将其存储在存储器阵列中的工作也落到PIC芯片。DHT22的低价,可用性和相对可靠性使其成为无处不在的。然而,芯片使用的串行协议需要非常精确的定时。这些时序要求对于使用相对慢的I / O或系统(例如,芯片[SOC] IC)的系统可能是有问题的,其多个高优先级功能可以使所需的专用定时要求麻烦。在这方面,它对专用IC的作业“关闭了”作业来说是良好的感觉。

与传感器的通信是通过一个特定的“单线”串行协议,不应该与Dallas/Maxim半导体单线协议混淆——两者是完全不同的。涉及三个连接(Vcc、GND和Data)。数据引脚是所有操作发生的地方,仔细阅读数据表将提供详细信息。

简而言之,以下步骤描述了从PIC侧描述的相互作用,所需读取传感器,并且已经对所包括的MPASM程序进行了自由评论,以便在程序流程之后促进。

1.将数据线设置为输出,将其设置为低并等待18微秒。

2.将数据线高为30微秒。

3.设置数据线输入并监控其状态。DHT22应该将其设置为低80微秒,高80微秒。

4.步骤1-3是数据流的前导。接下来,DHT22将将数据线设置为低50微秒,这表示数据位的开始。

5.这就有点棘手了。在开始位时间之后,DHT22将使数据线升高约27微秒或70微秒。前者表示数据位为' 0 ',后者表示数据位为' 1 '。

6.后数据位(步骤5),DHT22将进入另一个50微秒起始位时期之后,另一个数据位(一个“0”或“1”中描述5以上)这对40位,重复序列构成的5字节的传感器数据(RH积分,RH小数,温度积分,小数,温度和校验和)。

您可以看到协议需要精确的定时,读取传感器的时间是可变的,因为它取决于读取中的' 0 '和' 1 '位的数量。一种策略是测量每个间隔,然后决定数据位是否适合' 0 '或' 1 '间隔。我选择了一种不同的策略,如下所述,它要求较低,但非常可靠。

图3。在串行流中区分' 0 '和' 1 '位的策略。

图3。在串行流中区分' 0 '和' 1 '位的策略。

在序言之后,我们等待开始位时间的结束,然后延迟约43微秒,然后读取数据线。如果数据线是低的,那么位是一个“0”,我们将在下一个开始位时间。在本例中,我们将该位记录为' 0 ',并等待起始位时间结束,然后读取下一位。如果数据线是高的,位是' 1 ',我们仍然在位时间。在本例中,我们将该位记录为' 1 ',然后等待下一个开始位时间开始,然后等待开始位时间结束,然后读取下一个位。

当PIC读取完所请求的DHT22传感器后,数据可以通过I2C接口读取。在这种情况下,Array[0]将被读取为0x01,表示最后一个命令成功完成。

获取传感器数据与Arduino UNO

通过I2C接口访问存储器位置以请求和读取传感器数据是通常的方式。为I2C功能编写Arduino程序的读者可以识别这些步骤,其中的草图已被注释,以方便程序流程。

首先,您需要声明,

# include < wire.h > < wire.h > < wire.h > < / wire.h > < / wire.h > < / wire.h >

使用I2C库。

接下来,您需要PIC的I2C地址。这在PIC MPASM代码中由程序行设置:

#define i2c_address 0x32;从地址

这个地址应该右移一位来形成Arduino将要使用的地址。熟悉I2C 7位寻址方案的人会认识到这一通常不方便的步骤。右移0x32得到0x19这就是Arduino使用的I2C地址。当然,您可以在MPASM代码中将这个地址设置为任何可用的I2C地址。

要启动启动,使用语句Wire.begin();// join bus as master -通常在setup()中。

读取传感器#2的命令的步骤如下所示(变量“地址”已设置为0x19):

Wire.beginTransmission(地址);Wire.write (0);//缓冲区索引指针Wire.write(3);//命令字节(3 =读取DHT22#2)Wire.endTransmission ();延迟(50);//等待它完成 -  50毫秒开始

最后一行的延迟等待传感器读数完成,可能比它需要的时间长,但最好是保守的。如果您的应用程序需要,您可以尝试减少延迟。

此时,来自DHT传感器#2的数据应该在阵列[6]-阵列[11]中。要检索数据,使用以下方法:

首先,读取数组[0]的状态字节

Wire.beginTransmission(地址);Wire.write (0);//缓冲区索引指针Wire.endTransmission ();电线。requestFrom(地址1);//更新状态字节dht [0] = wire.read();

检查状态字节(现在在DHT[0]中)是否等于0x01,表示命令成功完成。接下来,使用以下语句获取5字节的DHT数据(从Array[6]-Array[11]):

Wire.beginTransmission(地址);Wire.write (6);//缓存索引指针(指向DHT #2的数据)Wire.endTransmission ();wire.requestfrom(地址,5);

在我们将这些数据放入程序阵列DHT [6] = - DHT [10]后,我们将数据转换为RH和温度,最后,我们检查CRC是否好:

/ /湿度RHz2 = DHT [6];RHz2 * = 256;RHz2 + = DHT [7];RHZ2 / = 10;/ /温度TempCz2 = DHT [8] &0x7f;TempCz2 * = 256;TempCz2 + = DHT [9];tempcz2 / = 10;如果(DHT [8] &0x80){TempCz2 * = 1;}TempFz2= TempFz2 * 9 / 5 +32;//校验和if((DHT [6] + DHT [7] + DHT [8] + DHT [9]&255)!= DHT [10]){系列。print(" *** BAD CRC! ")* * *”);}其他{serial.print(“CRC很好”);}

其他两个DHT22传感器以相同的方式读取,使用适当的命令代码。

附带的Arduino示例草图每5秒只读取所有三个传感器,并在串行监视器上显示数据。

Arduino测试草图的屏幕输出。

Arduino测试草图的屏幕输出。

启动和运行

使用电路所需要的软件包括:12F1840 MPASM源代码,12F1840 HEX代码文件,Arduino测试草图。你将需要对PIC 12F1840芯片进行编程。如果你使用PIC芯片之前,这应该不代表一个困难的步骤。如果您不熟悉PIC芯片,那么这似乎是一个具有挑战性的任务。然而,有许多廉价的程序员,包括一些得到大量支持的DIY设计。MPASM汇编器可以从Microchip免费获得。

此外,通过使用一个更小的PIC芯片,如12F1840,任务不像看起来那么艰巨。您可以按原样组装包含的MPASM源代码进行编程,或者进行一些更改,比如I2C地址。或者,大多数程序员将允许您使用直接的HEX代码文件,以源代码所包括的芯片编程。

封闭的思想

该项目旨在为更大的嵌入式控制器项目提供有用的补充。具体而言,它非常适合于在多个区域监测湿度和温度的情况下。它还旨在作为利用自定义应用程序中的I2C总线的起点。虽然12F1840非常便宜且适用于该项目,但可以使用包含所需MSSP功能的较大的PIC芯片来实现扩展,但也包含更多GPIO。因此,在传感器接口和I / O扩展的基于基于I2C的组合中实现廉价的I2C组合是非常可行的。

自己试试这个项目吧!得到bom。

Rolyourowni2c.zip.

11日评论
  • 豪华林 2016年3月5日

    我最近加入了,并发现这些文章写得很好,信息量很大,偶尔还有点鼓舞人心。祝贺所有付出了时间和知识的作者,并对他们在评论中完全缺乏兴趣表示极大的不满。伙计们,这是好东西,让我们对那些想要做更多与555闪光灯LED的人有一点感激

    喜欢。 回复