亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

“这是给鸟类的!”

组件和用品

Arduino 101
× 1
英特尔爱迪生
× 1
罗技 c270 高清网络摄像头
× 1
Pololu Carrier with Sharp GP2Y0D815Z0F 数字距离传感器 15cm
× 2
Adafruit 方形力敏电阻 (FSR) - Interlink 406
× 1
Adafruit Si7021 温度和湿度传感器分线板
× 1
Seeed Grove Start Kit Plus,英特尔物联网版
× 1
电容 47 µF
× 2
电阻 1k ohm
× 1
Adafruit 接线端子 - 2 针 3.5 毫米 - 每包 5 个!
× 1
Adafruit 紧凑型开关电源 - 可选输出 3-12VDC
× 1
Adafruit Perma-Proto 四分之一大小的面包板 PCB - 单个
× 1
跳线(通用)
× 1

必要的工具和机器

3D 打印机(通用)
烙铁(通用)

应用和在线服务

面向物联网的英特尔 XDK
Autodesk Fusion 360
PubNub 发布/订阅 API
Cloudinary
noble.js

关于这个项目

“是给小鸟的!”使用 Arduino 101 重塑生态监控的未来

介绍和动机:

衡量我们的气候和我们生活的生态系统健康状况的一种方法是测量其动植物种群的大小和种类。自 1987 年以来,每年冬天,康奈尔大学鸟类学实验室都会开展一项名为 Project FeederWatch 的大规模公民科学活动:

“FeederWatch 项目是一项针对在北美后院、自然中心、社区区域和其他地方访问喂食器的鸟类进行的为期冬季的调查……FeederWatch 数据显示,每年冬天哪些鸟类会访问非洲大陆数千个地点的喂食器.数据还表明每个物种有多少个体被看到。该信息可用于测量冬季范围内鸟类种类随时间的变化。 ”

这是我们第一年参与,我们希望将我们对制作和黑客的兴趣、我们对自然的兴趣以及我们参与 Project FeederWatch 结合起来。因此,我们决定使用 Arduino 101 重塑观鸟和环境监测的未来!

Arduino 101 是该项目的理想选择,因为它结合了 Arduino IDE 的简单性,使我们的嵌入式编程变得容易,板载功能(如蓝牙 LE)与大量传感器和分线板一应俱全。通过在自制的喂鸟器中嵌入 Arduino 101,我们开发了一个实验平台来测量天气参数并监测喂鸟器上的鸟类活动。添加来自 Cloudinary 和 PubNub 的一些令人兴奋的物联网技术,帮助我们重塑环境和生态系统健康监测的未来!

项目概述:

我们项目的核心是嵌入自制喂鸟器的 Arduino 101。我们使用 2 个 Sharp 红外距离传感器来检测栖息在穿过喂食器两侧的木销上的鸟类。力敏电阻器 (FSR) 用于检测进料器中存在的种子量。 Adafruit Si7021 温度和湿度传感器分线板连接到 i2c 引脚,用于提供我们的物理天气数据。 Arduino 101 设置为充当 BLE 外围设备,并通过 BLE 将来自这些传感器的数据发送到 BLE 中心设备。电源由 4 节 AA 电池提供。所有这些组件都安装在一个定制的 3D 打印外壳中。

我们在 Arduino Breakout Board 上使用 Intel Edison 作为 BLE 中心和互联网网关。罗技 c270 USB 网络摄像头连接到板上的 USB 端口,用于在接收到指示其中一个栖息地活动的 BLE 通知时拍照。这些图像本地存储在插入分线板上 SD 卡插槽的 SD 卡上。

我们利用英特尔 Edison 的 WiFi 功能将其用作互联网网关。这使我们能够使用超级技术,例如用于实时数据流的 PubNub 和用于云中图像存储和处理的 Cloudinary。

喂鸟器是用一个空的汽水瓶和一个木钉制成的,挂在我们院子里的一根柱子上。

构建项目:

Arduino 101 嵌入式喂鸟器。

该项目的基础是嵌入我们的喂鸟器中的 Arduino 101。喂鸟器将在户外,需要能够承受户外的身体严酷考验。它将需要一种实时无线传输数据的方法。发送 Arduino 101 和接收 Edison 之间的距离只有几英尺,由于 Arduino 101 板载了 BLE,我们将使用 BLE!

大多数电路都可以按照fritzing图构建,但是在制作和测试这个电路时我们遇到了一些挑战。这是我们将在这里重点关注的内容:

  • 第一个挑战:在户外检测喂食器上的鸟!对于这个项目,我们需要一个能够在户外工作的传感器,与元素隔绝。我们不希望它打扰或吓跑主题。它应该只检测鲈鱼上的东西。在评估了各种传感器的特性后,我们决定将 Pololu Carrier 与 Sharp GP2Y0D815Z0F 数字距离传感器一起使用。与常规 PIR 传感器不同,这些传感器的检测范围非常短。我们只想知道一只鸟是否栖息在离传感器几厘米远的地方。 PIR 传感器具有非常长和广泛的检测范围。这非常适合检测您房屋车道上的任何类型的运动,但我们不希望每次喂鸟器在微风中摇摆时都检测到树枝或其他“噪音”。此外,一项快速的台式评估表明,Sharp IR 传感器在放置在塑料汽水瓶中时可以正常工作。这很重要,因为我们需要保护电子设备免受元件的影响,并能够“看穿”外壳的这一部分。
  • 第二个挑战:在连接一个传感器并对其进行测试后,我们准备好了!因此,我们将第二个 Sharp IR 传感器连接到 Arduino 101 和 . . .他们没有用!查了很多次代码之后。在检查了几块板和不同的传感器后,没有什么可以使这两个传感器协同工作。因此,我们面临着第一个重大挑战。我们应该尝试不同类型的传感器吗?我们应该做一个单独的鲈鱼喂鸟器(跛脚!),怎么办?无奈之下,我们做了我们第一次应该做的事情,检查网站,在产品常见问题解答中我们发现了这一点:这个传感器的行为不像我期望的那样:我得到了很多间歇性检测比传感器的最大范围更远,并且未检测到广告检测范围内的物体。怎么了? 这样的问题可能是电源问题的结果,特别是因为该传感器以短时间、大爆发的方式消耗功率,因此请确保您的电源能够提供必要的电流。如果您遇到此问题,请尝试在传感器的电源和传感器附近的接地之间添加一个 10 µF 左右的电容器;这可以补偿电源不足,通常会​​恢复正常功能。 问题解决了!我们为每个传感器添加了一个 47uF 电解电容器,它们可以正常工作,但只有一个警告,它们都需要直接从板上的 +5V 引脚供电。您将在 Fritzing 图中看到它作为来自一个传感器的 +5V 线连接到另一个传感器的 +5V 电源。我们不是 EE,所以我无法解释这一点,这正是我们发现在室内和室外都可以使用的方法!
  • 第三个挑战:在 Project FeederWatch 网站的“相关活动和学习”部分,推荐的活动之一是在每次计数之前和之后对喂食器中的鸟类种子进行称重,并计算食用了多少种子。数次后,计算平均消耗率。与其手动称重,为什么不以自动方式捕获种子消耗量?我们的解决方案是使用力敏电阻器 (FSR)。这是一种电阻值随着施加在其上的力而变化的电阻器。它可以连接到模拟输入引脚。但是它是否足够灵敏以检测种子数量的变化?我们第一次尝试在一个小塑料容器中测量种子水平并不太成功。传感器对不同的手指压力反应良好,但对种子水平反应不佳。所以我们做了两个改动来解决这个问题。首先,模拟信号通过 2 个电阻分压器传送到 Arduino 101 模拟引脚,一个是 FSR,第二个是传统电阻。我们降低了第二个电阻器的值,​​传感器似乎对触摸更敏感,但它仍然不像我们希望的那样对种子变化做出响应。因此,在所有这些中添加了硬件更改。有点类似于帕斯卡的原理,如果不是在 FSR 的整个表面上施加种子的重量,而是创建一个在其中心有一个小接触点的平台,我们将大大增加种子对 FSR 的作用力FSR。与雪鞋相反,它奏效了!

另一个小挑战是以安全可靠的方式将 FSR 连接到 Arduino 101。这可以通过使用 2 针 3.5mm 接线端子轻松解决。只需确保接线端子的间距与您的电路板的间距匹配即可。

Arduino 101 硬件的其余部分很简单。我们将 Adafruit Si702 分线板连接到 I2C 总线引脚 () 并使用空的 +3.3V 供电。整个包装通过位于主外壳下方的 4XAA 可切换电池组供电。

我们将 IR 和 FSR 传感器焊接到 Adafruit Perma-Proto 四分之一大小的面包板 PCB 上,并用双面胶带将它们连接到 Arduino 101 的底部。整个包装被放置在苏打瓶喂鸟器内,并在零度以下的冰点温度、薄雾和小雨和雪(假暴风雪“斯特拉”!)中幸存下来。

Arduino 101 草图:

草图的主要工作是监控连接的传感器并通过 BLE 报告传感器的值。 BLE 中的所有数据都以字节包的形式传输。无论您的原始数据是字符数组的 int 浮点数,您都必须将其分解为字节表示以通过 BLE 传输。我所知道的最简单的方法是创建数据类型的联合。联合允许我们在两种不同的数据类型之间共享相同的内存位置。在我们的例子中,SI7021 温度和湿度传感器以浮点数的形式提供数据。 Arduino C 语言将浮点数表示为 4 个字节,因此我们在温度浮点数和湿度浮点数与 4 字节数组之间创建联合。

/** * union 指令允许这些变量共享相同的内存位置。请参阅*我的教程 Imu to You!(https://www.hackster.io/gov/imu-to-you-ae53e1?team=18045) 教程以进一步*讨论在 C 中使用 union 指令。 */ 联合 { 浮动 t;无符号字符字节[4]; } 临时数据;联合{浮动h;无符号字符字节[4]; } 湿度数据;联合{ int f;无符号字符字节[2]; } feedData;  

当我们在联合中存储浮点值时,字节数组也会被填充。为了传输数据,我们将字节数组传递给这些特征的setValue()函数。

对于嵌入式应用程序,使用 delay() 函数可能会导致问题。首先,在调用延迟函数时,所有处理器活动都会在延迟期间停止。当鸟类随时可以栖息时,这并不理想。第二个问题是 delay() 函数可能会导致 BLE 通知机制出现问题。避免这种情况的方法是不在我们的草图中使用 delay() 。然而,很多时候需要延迟代码程序。为了克服这个问题,我们将使用 Adafruit 的 Bill Earl 的 3 个超级教程中的方法概述。

概括地说,我们创建了一个代表我们嵌入式设备的对象。我们决定一个或一组时间间隔来轮询连接到该设备的传感器。然后我们创建一个 Update() 函数。

void Update() { // Serial.print("Feed Sensor:");Serial.println(analogRead(A0)); // Perch Activity 更新/通知取决于时间和接近传感器 currentPerchMillis =millis(); if ((currentPerchMillis - previousPerchMillis)> perchInterval ) { previousPerchMillis =currentPerchMillis; currentLeftPerch =digitalRead(LEFT_PERCH); currentRightPerch =digitalRead(RIGHT_PERCH); if ((currentLeftPerch ==0) &&(previousLeftPerch ==1)) { // leftperch 上的新活动 // BLE 通知 perchCharacteristic.setValue(1); Serial.println("左上方活动");以前的LeftPerch =0; } ...}  

此功能用于检查我们的传感器的时间间隔是否已过,如果已过,则更新传感器,如果不是则忽略它们。 Update() 函数在我们草图的 loop() 部分被重复调用。

void loop() { // 把你的主要代码放在这里,重复运行:blePeripheral.poll(); BirdFeeder.Update(); }  

因此,我们用我们的传感器模拟实时、多任务处理效果。

英特尔 Edison 和 Arduino 分线板:

与英特尔 Edison 合作最具挑战性的部分是对其进行设置。我在这方面找到的最好的教程是 Vincent Wong 的 Intel Edison 和 Intel XDK IoT Edition 101。我可以向您保证,通过这个过程并尝试一些 JavaScript 示例是非常值得的!

使用英特尔 XDK 物联网版本与您的 Edison 合作将允许您在命令行上进行交互和配置。您还可以利用许多 JavaScript/Node 示例程序和模板。学习和使用 JavaScript/Node 进行编程,会打开大量易用且功能强大的 API,如 PubNub、Noble.js 和 Cloudinary。

设置 Edison 并确认与 WiFi 网络的活动连接后,您可以安装此项目所需的库:

npm 安装高贵

npm install pubnub

npm install cloudinary

USB 网络摄像头

谷歌搜索“intel edison webcam”会产生几个很好的例子和教程。但是有一些令人困惑的材料,我认为这主要是由于 Yocto OS 中可用模块的一些更改。 Yocto 是运行 Intel edison 的嵌入式 linux 版本。罗技 c270 是一款兼容 uvcvideo 的网络摄像头。有很多教程可以确保您的 Edison 安装了 uvcvideo 驱动程序/模块。没有这个,你将无法与相机互动和拍照。

我使用了英特尔 Edison 上的网络摄像头的以下步骤,并上传到 s3,让网络摄像头在我的 Edison 上工作。我已经在下面发布了这篇博文中的说明,以防万一它过时了。

使用您的 Edison,将在 XDK 串行终端选项卡的命令行上执行以下说明。

“我们将使用一些额外的软件包,这些软件包可以使用 opkg 安装 包管理器。对于使用 vi 开始的 repos 编辑列表:

vi /etc/opkg/base-feeds.conf

并确保文件中包含所有这些行:

src/gz 所有 http://repo.opkg.net/edison/repo/all src/gz edison http://repo.opkg.net/edison/repo/edison src/gz core2–32 http://repo。 opkg.net/edison/repo/core2-32 src intel-iotdk http://iotdk.intel.com/repos/3.0/intelgalactic/opkg/i586

现在,更新包缓存:

opkg 更新

并安装内核模块以支持usb uvc相机。

opkg install kernel-module-uvcvideo

现在将您的网络摄像头连接到 USB 端口并运行此命令。

ls -l /dev/video*

如果您的相机成功检测到,输出将如下所示:

crw-rw---- 1 根视频 81, 0 Jul 25 09:35 /dev/video0

要使用网络摄像头并按时拍摄照片,我们必须安装 2 个额外的软件包:

opkg 安装 fswebcam 朋友

*** 注意我们没有为这个项目安装 cronie,我们只是安装了 opkg 安装 fswebcam。不需要 cronie,因​​为每当 IR 传感器被栖息在鲈鱼上的鸟绊倒时,我们都称其为 fswebcam,而不是按时间安排 ***

使用相机

要测试您的相机,请运行以下命令:

fswebcam -r 1280x720 --jpeg 100 -D 3 -S 13 "test.jpg"

  • -r 1280x720 设置图像的分辨率,最好使用相机的最大可用值(可选)
  • ——jpeg 100 将 JPEG 质量设置为最高。如果您以后打算对这些图像做一些事情,这很有用 (可选)
  • -D 3 -S 13 添加 3 秒延迟并跳过前 13 帧。这是必要的,因为一些网络摄像头需要时间才能获得最佳照片(推荐)
  • test.jpg 是输出文件的名称"

有关在 Edison 上使用网络摄像头的更多信息,以及其他非常巧妙的项目,可以在 Dr. Kim 的 github 页面上找到。她还向 Hackster.io 发布了很酷的项目!

除了确认存在正确的模块之外,我还需要将 microusb 电缆和 USB 端口之间的开关朝 USB 端口的方向翻转,并将 Arduino 扩展板连接到电源。我使用了紧凑型开关电源 - 可选输出 3-12VDC(Adafruit 产品 ID:1448)。

现在将您的 SD 卡放入 SD 卡插槽中。使用串行终端 在 Intel XDK 中,通过输入以下命令使用命令行检查卡:

cd /media/sdcard

ls

这应该显示卡上存在的所有文件,如果没有文件,则不显示任何文件。您不应该看到任何错误消息。如果您确实看到错误消息,我建议您输入以下命令重新启动 Edison 开发板,而无需移除 SD 卡:

重启

然后在重新登录 Edison 后重复上述命令。

现在,要允许我们的 Edison 访问蓝牙,请输入以下命令:

rfkill 解锁蓝牙

要确认蓝牙已打开并正常工作,请输入:

蓝牙控制

然后输入

扫描

这应该显示在 BLE 设备附近:

现在退出 bluetoothctl,然后单击 Intel XDK IoT 选项卡,然后连接到您的主板。从左侧菜单中选择一个项目,例如 BLESCAN。 取出 index.js 的内容并从 package.json 文件中删除依赖项。

将 index.js 的内容替换为我们 github 存储库中的程序。将此代码上传到您的爱迪生。确保 Arduino 101 已打开并运行 Edison 代码。一旦 Edison 检测到您的 Arduino 101,您应该会看到如下内容:

代码:

在 Edison 上运行的代码是用 JavaScript 编写的,或者更准确地说是用 Node.js 编写的。从我们导入的库中创建必要的对象后,我们将创建变量来表示在 Arduino 101 上运行的 BLE 服务。

noble.js

 // BLE 服务和贵族的特性 // 这些应该对应于外设的服务和特性 UUID //(在这种情况下在 Arduino 101 上) var LOCAL_NAME ='bird'; var SERVICE_UUID ='917649a0d98e11e59eec0002a5d5c51b'; //没有破折号!!!! var PERCH_UUID ='917649a1d98e11e59eec0002a5d5c51b'; var TEMPERATURE_UUID ='917649a2d98e11e59eec0002a5d5c51b'; var HUMIDITY_UUID ='917649a3d98e11e59eec0002a5d5c51b'; var FEED_UUID ='917649a4d98e11e59eec0002a5d5c51b';  

这些 UUID 将由 noble.js 使用。如果您更改了 Arduino 上的 UUID,则它们也必须在此处更改。确保没有破折号让 noble.js 正常工作很重要。

为了使用 noble.js,我们必须扫描外围 BLE 设备,然后发现它们,然后连接。连接后,我们将使用上面定义的 UUID 运行可用的特性。特征都是读/通知特征。

noble.on('discover', function(peripheral){ console.log('Found BLE Device:[' +peripheral.id + ']' +peripheral.advertisement.localName); if(peripheral. ads.localName ==LOCAL_NAME){ console.log('Found:' +peripheral.advertisement.localName); }peripheral.connect(function(error) { console.log('连接到外设:' +peripheral.uuid); noble.stopScanning(); // 防止我们获取“流浪”服务外设.discoverServices([SERVICE_UUID], function(error, services) { console.log('services:' + services.length); var feederService =services [0]; console.log('Bird Feeder Service!'); feederService.discoverCharacteristics([], function(error, features) { traits.forEach(function(characteristic) { console.log('characteristic UUID:' +characteristic .uuid);characteristic.on('data',function(data,isNotification){transformRawData(characteristic.uuid,data);});characteristic.notify('true',function(error){if(error)throwe错误; }); }); }); }); }); });  

上面的代码部分有两个关键元素需要指出。首先,您告诉 noble.js 这是读取/通知特性的方式发生了变化。来自 Sandeep Mistry 的 github 页面:

数据

当特征读取完成时发出,characteristic.read(...) 的结果 或特征值已由外设通过通知或指示更新 - 在使用 notify(true[, callback(error)]) 启用后 .

feature.on('data', callback(data, isNotification));

feature.once('read', callback(data, isNotification)); // 遗留

变化是从“读取”到“数据”。我们在这里无意中遇到了一些问题,使用旧版本的 noble 然后更改了最新版本。我们花了很多时间才弄清楚发生了什么,因此我们希望能够帮助您避免这种情况

这里的另一个关键是函数transformRawData(characteristic.uuid,data)。此函数获取从读取中传递的 uuid 和数据,并将其传递给庞大而笨拙的函数。每次 BLE 通知机制因特性变化而被激活时,都会调用此函数并处理接收到的数据。这是所有兴奋发生的地方。

tranformRawData 检查接收到的特征。

如果 Arduino 告诉我们鲈鱼有活动,我们想拍照。在这种情况下,我们使用 child_process 库来调用驻留在 Yocto(linux) 系统中的程序 fswebcam。 child_process 库允许我们从 node.js 代码中执行命令行函数。这是一个非常强大的功能。

childProcess.execFile('fswebcam',['-r 1280x720',fileName],function(error,stdout,stderr) { console.log(stdout); );  

PubNub 和 Cloudinary:

这个功能也是 PubNub 和 Cloudinary 发挥作用的地方! PubNub 为您的应用程序提供实时数据流网络。这意味着通过互联网连接,您的应用程序可以在世界任何地方实时流式传输数据。拥有已发布流的订阅密钥的任何其他应用程序或程序都可以访问表示您的数据的 JSON 有效负载。在我们的例子中,我们发送当前的种子水平、温度、湿度和鲈鱼访问计数。此外,我们发送了一个链接,指向喂食器的 3 张最新图片!这些是使用我们的程序上传到 Cloudinary 的 jpeg。无需运行服务器!一个带有嵌入式 JavaScript 的简单 HTML 文件用作我们的喂鸟器的实时界面,由 PubNub 提供!

在上图中,我只是通过电子邮件向自己发送了 HTML 文件,其中包含通过 PubNub 与喂鸟器连接的代码,并将每个文件从本地目录加载到 Chrome 浏览器中。您无需编写服务器代码即可在您的 Edison 上提供此页面。

Cloudinary 是一种图像上传、存储和转换服务。它有一个非常简单易用的api。在开发这个项目时,我找不到一个更简单、更直接的 api 来使用。没有什么可比的。他们的服务台也很棒。这绝对是您想要检查您的项目的东西!

在下面的代码中,我们使用 cloudinary api 从本地 SD 卡上传 3 个最新图像。此上传返回的 URL 然后保存在一个数组中。然后,这些 URL 作为 JSON 负载的一部分发送到 PubNub,以便我们的 HTML 页面访问它们以进行显示。美女,嗯?!

index.html

这个 index.html 文件是关于什么的? index.html 文件是我们的 UI。由于我们使用 PubNub 流式传输我们的数据,并使用 Cloudinary 将我们的图像放置在可公开访问的 URL 中,因此我们可以利用 Javascript/HTML/CSS 强大的三重奏来创建可移植的 UI。 PubNub 和 Cloudinary 都非常易于使用且功能强大 Javascript API。我们只需将它们导入到我们的 html 文件中即可使用它们:

     

在创建 PubNub 对象时,我们为它提供了数据流的订阅密钥,并且无论何时我们发布此流,它都可以实时访问数据流。

 

制造工艺

  1. 树莓派的 DHT Tiny Breakout
  2. 树莓派上的 HC-SR04 超声波距离传感器
  3. Raspberry Pi 的最佳配件
  4. SIGHT:For the Blind
  5. 英特尔邀请 Udacity 授予边缘人工智能学位
  6. 如何为灌装应用选择合适的传感器
  7. 航空航天传感器薄膜
  8. 国际空间站的 WiFi RSSI 传感器跟踪器
  9. 新的数学工具可以为工作选择最佳传感器
  10. 工业4.0对5S方式​​的挑战
  11. 英特尔 Edison IoT:如何为您的 IoT 原型选择英特尔 Edison
  12. 谢谢给的回忆!