UltrasonicEyes
组件和用品
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
|
关于这个项目
我想使用一些 8x8 矩阵 LED 和一些超声波传感器来制作一个古怪的项目......与其他人通常用超声波制作的东西不同 - 我希望它既有趣又好玩。
所以我创造了我所谓的 UltrasonicEyes - 一个有趣的项目,你坐在靠近人们走动的地方,它会环顾四周,眨眼,好吧,只是以一种有趣和令人毛骨悚然的方式让你感到奇怪!
我们需要什么?
超声波传感器模块设计用于检测障碍物并确定障碍物的距离,因此它们的检测距离一般可达3-4米,对于这个项目放置在客厅或办公室内是一个很好的距离区域。
我使用的是从 e-Bay 购买的 2 个 HC-SR04 模块。你会发现它们超级便宜。
这些模块使用起来非常简单,只需要 3 或 4 根线,即可连接到 Arduino 微控制器。
我选择使用的 8x8 led 矩阵模块允许链接,所以其中一个模块需要连接到 Arduino,第二个模块连接到第一个。
这些模块使用 SPI,因此我们只需要 5 根电线连接到 Arduino 即可控制两个显示器上的眼睛图像。我们当然需要其中的两个!
注意: 提供的代码使用硬件 SPI ,所以如果您使用的是与 Nano 不同的 Arduino 板,请检查哪些引脚是 MOSI 和 SCK 的硬件 SPI 引脚,并相应地连接它们!
您还需要某种类型的 Arduino 兼容微控制器。我使用的是 Nano(兼容),因为它足够小,可以放入机箱,有 USB 用于为固件供电/编程,还有一堆 GPIO 可以连接所有东西。
我已经将所有东西都焊接到一个与半面包板大小相同的原型板上,但我建议您先将所有东西都构建在半面包板上,因为这样项目就不需要焊接并且可以轻松地拉开或改变了。
您需要的最后几样东西是用于检测光的 LDR(光敏电阻器)、一个 330 欧姆的电阻器和一堆面包板线,公对母,母对母。
注意: 你可以在这个项目中使用任何颜色的电线......没有要求使用我指定的相同颜色,但是 , 电源和地使用红色和黑色总是好的做法,其他布线使用其他颜色,因为这样可以非常容易地识别哪些电线有电源通过它们,哪些电线用于数据和信号。>
把它们放在一起
让我们首先将 Nano 插入面包板的最后,这样 USB 就挂在边缘,但仍然保持所有引脚插入电路板。
电源和地连接
现在将一根黑线从 Nano 上的 GND 连接连接到面包板上的 GND 导轨。现在用一根红线做同样的事情,将 3V(或 5V,如果这就是你的全部)连接到面包板上的电源轨。
当我们处理 GND 和 POWER 时,让我们在面包板每一侧的两个 GND 导轨之间连接一根黑线。用一根红线和两条 POWER 导轨做同样的事情。
*注意: 某些矩阵 LED 面板可能需要 5V 而不是 3.3V,具体取决于品牌。如果您发现结果不可靠,请尝试使用 Arduino 的 5V 引脚。
让我们连接超声波传感器
将每个超声波传感器上的 GND 引脚之间的黑线连接到面包板上的 GND 导轨。对传感器上的红线和 VCC(电源)引脚以及面包板上的电源轨执行相同操作。
现在让我们连接以下白线和蓝线:
- 从传感器 1 上的 TRIG 引脚到 Arduino 上的数字引脚 2 的白线
- 从传感器 1 上的 ECHO 引脚到 Arduino 上的数字引脚 3 的蓝线
- 从传感器 2 上的 TRIG 引脚到 Arduino 上的数字引脚 4 的白线
- 从传感器 2 上的 ECHO 引脚到 Arduino 上的数字引脚 5 的蓝线
很好!这就是超声波传感器!
连接两个 8x8 LED 矩阵显示器
在其中一个 LED 矩阵显示器上的输入 GND 引脚与面包板上的 GND 轨之间连接一根黑线。对显示器上的红线和输入 VCC(电源)引脚以及面包板上的电源轨执行相同操作。
在显示器一的输出 GND 引脚和显示器二的输入 GND 引脚之间连接一根黑线。对红线和显示器 1 上的输出 VCC 引脚和显示器 2 上的输入 VCC 引脚执行相同操作。
当我们在 2 个显示器之间连接电线时,让我们完成那部分......
- 在显示器一的输出 SCK(时钟)引脚和显示器二的输入 SCK 引脚之间连接一条黄线。
- 在显示器一上的输出 MOSI(数据)引脚和显示器二上的输入 MOSI 引脚之间连接一根蓝线。
- 在显示器一上的输出 CS(选择)引脚和显示器二上的输入 CS 引脚之间连接一根白线。
伟大的!现在让我们将显示器的其余部分连接到面包板...
- 在显示器 1 上的传入 SCK 引脚和 Arduino 上的数字引脚 13 之间连接一条黄线。
- 在显示器 1 上的传入 MOSI 引脚和 Arduino 上的数字引脚 11 之间连接一根蓝线。
- 在显示器 1 上的输入 CS 引脚和 Arduino 上的数字引脚 10 之间连接一根白线。
记住: 提供的代码使用硬件 SPI ,所以如果您使用的是与 Nano 不同的 Arduino 板,请检查哪些引脚是 MOSI 和 SCK 的硬件 SPI 引脚,并相应地连接它们!
做得好。现在进入最后的接线步骤...
连接 LDR 和电阻以检测环境光
在我们连接这些电线之前,我们为什么还要做这一步?好吧,我很高兴你问了!连接到 Arduino 的 LDR 将使我们能够检测 UltrasonicEyes 周围是亮还是暗,我们将使用该信息相应地使 LED 显示屏变亮或变暗。
我们不希望显示器在夜间像在较暗的光线下过亮,当亮度在 30% 左右时我们仍然可以很好地看到显示器,但是在白天或明亮的房间里,我们需要将亮度调高到使显示更明显。
好的,让我们完成最后一步,以便我们继续将其放入 3D 案例!
将 LDR 连接到面包板上的 2 行引脚,就像上面的接线图一样。留出空间放置电阻器和连接到 Arduino 的电线。
在LDR一侧的一排引脚和面包板的GND轨之间连接330ohm电阻。
将 LDR 另一侧的一排引脚之间的红线连接到面包板的电源轨。
最后,让我们在 330 欧姆电阻连接到的引脚行和 Arduino 上的模拟引脚 5 (A5) 之间连接一根棕色线。它需要是一个模拟引脚,因为我们需要从 LDR(光强度)中读取 0 到 255 之间的值,而不是像我们从数字引脚中读取的那样只读取 0 和 1。
让我们启动并上传代码
好的,就是这样,我们都连接好了。是时候将 USB 电缆插入 Arduino 和您的计算机之间,并上传下面提供的 UltrasonicEyes 草图以查看它是否正常工作。
启动并上传代码后,在传感器前走动,或将手移到传感器前,看看会发生什么!
想让它更持久?
想让您的 UltrasonicEyes 更持久?在此处查看我的视频,其中包括获取面包板版本并将其焊接到原型板上...
然后在任何 3D 打印机上打印外壳的 2 个部分并像我在视频中所做的那样组装!
我也在考虑将 UltrasonicEyes 扩展为具有电容式触摸按钮(或常规按钮)以在不同的眼睛形状之间循环......你可以在这里观看我的实验......
您可以在...unexpectedmaker.com 上查看我的其余项目和视频
在 twitter、Facebook、Instagram 和 Tindie 上关注我
https://www.patreon.com/unexpectedmaker
就这样!
代码
- 超声波眼
超声波眼C/C++
#include// 我们用它来控制 8x8 LED 矩阵显示器 - 如果你还没有它,你需要从库管理器安装它。#include // 我们使用 NewPing 来控制超声波传感器 - 如果您还没有这个库,您需要从库管理器安装它。// 定义连接到 LED 矩阵显示器的引脚 1//#define CLK_PIN 13 / / 我们正在使用硬件 SPI - 确保您已将 CLK 引脚连接到设备上的硬件 CLK 引脚//#define DATA_PIN 11 // 我们正在使用硬件 SPI - 确保您已将 MOSI 引脚连接到硬件 MOSI 引脚在您的设备上#define CS_PIN 10 // 芯片选择引脚#define MAX_DEVICES 2 // 显示器数量 - 我们需要 2 个,每只眼睛一个#define LIGHT A5 // 我们使用模拟引脚 5 从 LDR 读取光值/ / 我们使用的硬件 SPI 自动 MD_MAX72XX mx =MD_MAX72XX(CS_PIN, MAX_DEVICES); // 初始化 2 个矩阵显示#define t1 2 // 超声波传感器上的触发引脚 1#define e1 3 // 超声波传感器上的回波引脚 1#define t2 4 // 超声波传感器上的触发引脚 2#define e2 5 // 回波超声波传感器 2 上的引脚#define maxDist 400 // 超声波的最大距离pulseNewPing eyeR(t2, e2, maxDist); // 初始化超声波传感器 2NewPing eyeL(t1, e1, maxDist ); // 初始化超声波传感器 1 // 我们用这个整数变量跟踪系统的当前状态,这样在眨眼后,我们可以将眼睛转回看他们最后所在的方向 // 可能的状态是::// 0:向前看// 1:向右看// 2:向左看int currentState =-1; // 我们将每个超声波传感器的 ping 的时间和距离存储在这些变量中 long duration1, duration2;int distance1, distance2;// 我们希望将眨眼随机插入到循环浮动中 nextBlink =millis() + 1000;//我们当前的光强度存储在此variablefloat lightAmount =0; uint8_t eye_forward [COL_SIZE] ={0b00111100,0b01000010,0b01011010,0b10101101,0b10111101,0b10011001,0b01000010,0b00111100}; uint8_t eye_right [COL_SIZE] ={0b00111100,0b01000010,0b01110010, 0b11011001,0b11111001,0b10110001,0b01000010,0b00111100}; uint8_t eye_left [COL_SIZE] ={0b00111100,0b01000010,0b01001110,0b10010111,0b10011111,0b10001101,0b01000010,0b00111100}; uint8_t eye_blink [COL_SIZE] ={0b00000000,0b00111100,0b01111110,0b11111111, 0b10111101, 0b11000011, 0b01111110, 0b00111100};void setup(){ // 初始化矩阵显示库 mx.begin(); // 设置超声波传感器的引脚模式 1 pinMode( t1, OUTPUT ); pinMode( e1, 输入); // 设置超声波传感器的引脚模式 2 pinMode( t2, OUTPUT ); pinMode( e2, 输入); // 将超声波传感器上的每个触发引脚设置为从低电平开始 digitalWrite( t1, LOW ); digitalWrite( t2, LOW );// 将 LDR 的引脚模式设置为 INPUT pinMode( LIGHT, INPUT ); // 从眼睛向前看 ShowEye_Forward(); currentState =0;}void loop(){ // 读入当前亮度 lightAmount =analogRead( LIGHT ); // 确保光值在显示器的最大强度范围内 lightAmount =( lightAmount / 255 ) * MAX_INTENSITY; // 设置强度 mx.control(MD_MAX72XX::INTENSITY, lightAmount ); // Ping 左眼,递归为 5 distance1 =eyeL.ping_median( 5 ); // 在我们 ping 右眼之前延迟 500 毫秒,所以我们不会得到冲突的结果 delay(500); // Ping 右眼,递归为 5 distance2 =eyeR.ping_median( 5 ); // 检查是否应该尝试插入闪烁 if ( nextBlink 0) { ShowEye_Right();当前状态 =1; } // 现在如果 distance2 大于 distance1 并且 distance2 也大于 0,那么我们要向左看 else if ( distance1 0 ) { ShowEye_Left();当前状态 =2; } // 将循环延迟 250ms 以确保眼睛有时间正确显示 delay(250);}/**************************** ************//************ MAX7219 东西 ************//******** ********************************/void ShowEye_Right(){ // 清除显示 mx.clear(); // 设置当前显示亮度 mx.control(MD_MAX72XX::INTENSITY, lightAmount ); // 遍历显示器的每一行 for (uint8_t row=0; row
定制零件和外壳
使用任何 3D 打印机打印,无需特定设置。使用任何 3D 打印机打印,无需特定设置。示意图
超声波眼睛_final_Th84xpUyB2.fzz制造工艺