这篇文章来源于DevicePlus.com英语网站的翻译稿。
我们利用此套件中的接近传感器完成了一个非常好玩的项目,具体内容请点击闪光万圣节面具项目。
ROHM Sensor Shield(ROHM传感器开发板)是一种兼容Arduino的扩展板,旨在帮助用户快速将各种传感器添加到自己的开发项目中。凭借其直观的布局和紧凑性,该开发板成为初学者和高级Arduino爱好者的绝佳原型制作工具。
Sensor Evaluation Kit(传感器评估套件)配备了ROHM传感器开发板和8种不同的ROHM传感器:加速度传感器、气压传感器、地磁传感器、环境光/接近传感器、颜色传感器、霍尔传感器、温度传感器和 紫外线传感器。
有关传感器开发板和每个传感器的详细文档,请参阅https://www.rohm.com/web/global/sensor-shield-support,该网页还为您提供了各个传感器所需的Arduino库的下载链接。评估套件包装中的用户手册对传感器开发板与传感器的配合使用进行了说明,该用户手册的电子版也可在该网站上找到。
在本文中,我们将概述一下传感器开发板的设置和首次使用情况,然后利用开发板和其他器件展示一个简单的物联网项目。
图1 ROHM传感器开发板(右上方)以及8种不同传感器/@CoreStaff
该开发板有两个功能特别突出。首先,开发板允许用户同时处理多个传感器。对于涉及两种独立传感形式的项目,用户可以一次性对系统进行整体原型设计,而不必分多个步骤进行。很方便,是吧?
图2 多个传感器同时插到传感器开发板上
(图中连接了温度传感器和接近传感器/环境光传感器)
其次,不同的传感器可以直接插入开发板。这使原型制作更加紧凑,并使大型项目更易于管理。由于Analog(模拟)、GPIO和I2C通信连接都是在开发板PCB内部实现的,因此无需连接多个跳线。
我们以I2C协议为例进行说明。一个独立的I2C传感器与Arduino通信至少需要四根单独的连线(SDA、SCL、电源和地)以及SDA和SCL线上的2个上拉电阻。而使用传感器开发板,用户仅需将等效的ROHM传感器插到开发板上的一个I2C接口即可。
传感器开发板的长边处有一排公插针。大多数针脚可以用来配置各种硬件中断。作为初学者,我们将仅关注板子边缘标有1.8V、3V和5V的前三行。这三个引脚表示所连接传感器的电压设置。某些传感器需要特定的工作电压,因此需要选择不同的电压设置。要选择相应电压,用户必须用跳线跨接相应电压电平的那对针脚。图3展示了用跳线选择3V电压的示例。
图3 用跳线选择3V电压
在开发板上两条Arduino连接排母之间,有八组不同的母排针接口(虚线框内)。这八组母排针用来连接不同的传感器。
需要注意的是,使用某个传感器时,必须将其插入与传感器通信方式相符的母排针中,这一点很重要。比如,温度传感器的输出是模拟值,因此,它只能连至标有模拟连接的两组接口中的任何一组。手册用鲜明的颜色描述了母排针接口与通信协议的对应关系,请参见下图。
蓝:Analog;红:数字GPIO;绿:I2C
测试温度传感器输出为模拟值的两个传感器是温度传感器和紫外线传感器。以温度传感器为例,要使用这个传感器,我们首先必须下载相应的名为BD1020HFV(温度传感器模块的名称)的Arduino库。
请打开库随附的示例程序。请在库include语句下方的程序顶部,将变量 tempout_pin 设置为值 A2。在void setup()中,BD1020对象(温度传感器对象)将使用该值进行初始化,表示系统会从模拟引脚2读取传感器的输出值。这意味着我们必须将温度传感器模块连至传感器开发板上的 Analog_2 排针连接器。
图4 温度传感器连至Analog 2连接器(板右下方)
将示例程序上传到Arduino并打开Serial Monitor(串行监视器)。此软件界面上应该会不断出现消息,显示所测量的当前温度。要测试传感器是否按预期工作,请将手指按到传感器的金属触点上。此时,监视器界面上的消息应该会显示温度已经升高!
图5 温度传感器金属触点的标记为“PAD1”
输出示例如下:“BD1020HFV Temp=23.59 [degrees Celsius], ADC=277”。
“ADC”表示传感器输出模拟值(电压)的整数转换。
测试加速度计接下来,我们来研究一下使用I2C协议通信的传感器。此类传感器包括加速度计、压力传感器、地磁传感器、环境光/接近传感器和颜色传感器。以加速度计为例,要使用这个传感器,我们首先必须下载名为KX022的相应Arduino库。
请打开这个库提供的示例程序。将加速度计模块插到传感器开发板的任意一个I2C接口上,并上传示例程序。您可能需要在程序的第一行(#include语句上方)输入“#define byte uint8_t”,因为Arduino编译器可能无法将“byte”识别为有效数据类型。
图6 加速度计模块连至开发板的I2C接口
打开Serial Monitor(串行监视器)。监视器应该不断显示消息,指示X、Y和Z轴的加速度。三个轴在加速度计上用小图表示。
图7 加速度计模块以及三个轴向
要测试加速度计,请在其中一个轴向上突然移动该模块。这时,该方向上的加速度分量会发生变化。
输出示例如下:
“KX022 (X) = -0.02 [g]
KX022 (Y) = -0.00 [g]
KX022 (Z) = 1.00 [g]”
最后,我们来看一下唯一一种通过GPIO连接通信的传感器,即霍尔传感器。霍尔传感器仅检测磁场的存在或不存在。因此,它的输出是数字信号:“low(低电平)”表示磁场存在;“high(高电平)”表示没有磁场。
在Arduino上,数字信号输入和输出(简称IO)的工作范围为5V电平,因此我们必须将跳线移至5V设置。
图8.选择5V电源
要使用这个传感器,我们首先必须下载名为BD7411的相应Arduino库。请打开库随附的示例程序。传感器开发板上标有GPIO的数字输出传感器(比如霍尔传感器)插槽只有一个。将示例程序上传到Arduino并打开Serial Monitor。如果存在磁场,那么串行监视器会显示“BD7411G Magnet field Detect!”(BD7411G检测到磁场)。
如果您想在自己的项目中使用该传感器开发板,只需下载并在程序包含所需的传感器库,然后用这些库中的不同方法与传感器进行通信即可。您可以参考每个库附带的示例程序以及该库的.cpp和.h源文件,以确切了解如何使用这些方法。
我用不同传感器及其库实现了多个简单项目:
1. 当霍尔传感器附近存在磁场时,点亮LED
图9 完成的霍尔传感器项目
元器件:
LED
220Ω 电阻(限制LED的电流)
跳线
面包板
ROHM 传感器开发板与霍尔传感器模块
Arduino Uno
装有Arduino IDE的电脑
连接电脑与Arduino Uno的USB电缆
在该项目中,每当霍尔传感器附近存在磁场时,LED灯亮起。
将传感器开发板安装到Arduino的母排针上
将霍尔传感器模块插到开发板的GPIO接口上
通过220Ω电阻将LED的负极引线连至传感器开发板的地
将LED的正极引线连到传感器屏蔽板上的数字引脚12上
将以下代码上传到Arduino:
#includeint led_pin = 12; int hallout_pin = 0; // use D0 pin BD7411 bd7411; void setup() { bd7411.init(hallout_pin); pinMode(led_pin, OUTPUT); } void loop() { int hallout; hallout = bd7411.readoutpin(); if (hallout == 0) { digitalWrite(led_pin, HIGH); } else { digitalWrite(led_pin, LOW); } delay(500); }
2. 利用Processing画出温度随时间变化的曲线
图10 装到传感器开发板的Analog_2接口上的温度传感器(右下方)
元器件:
ROHM 传感器开发板与温度传感器模块
Arduino Uno
装有Arduino和Processing(https://processing.org/download/)IDE的电脑
连接电脑与Arduino Uno的USB电缆
该项目通过Processing Sketch绘制一段时间内的温度曲线。
将传感器开发板安装到Arduino的母排针上
将温度传感器模块插到开发板的Analog_2接口上
在Processing中运行以下程序:
import processing.serial.*; Serial arduinoPort; // The serial port int currentX = 0; // horizontal position of the graph float data = 0; void setup () { size(1000, 300); arduinoPort = new Serial(this, Serial.list()[1], 9600); //"intercept" serial print messages arduinoPort.bufferUntil('\n'); background(0); } float oldData =0; void draw () { stroke(0, 255, 0); if (currentX++ >= width) //start at the left of the window with a blank screen when the screen has been filled { currentX=0; background(0); } if (Math.abs(data-oldData) < 30) //prevent the program from drawing noise spikes { line(currentX, height - oldData, currentX++, height - data); } else { stroke(0, 0, 0); line(currentX, height - oldData, currentX++, height - data); } oldData = data; } void serialEvent (Serial arduinoPort) { String serialInput = arduinoPort.readStringUntil('\n'); if (serialInput != null) { serialInput = trim(serialInput); data = int(serialInput); println(data); data = map(data, 0, 1023, 0, height); } }
将以下程序上传至Arduino:
#includeint tempout_pin = A2; BD1020 bd1020; void setup() { Serial.begin(9600); while (!Serial); bd1020.init(tempout_pin); } void loop() { float temp; bd1020.get_val(&temp); Serial.println(bd1020.temp_adc); delay(500); }