《Arduino 手册(思路与案例)》栏目介绍:
在电子制作与智能控制的应用领域:广泛涉及了Arduino BLDC、Arduino CNC、Arduino ESP32 SPP、Arduino FreeRTOS、Arduino FOC、Arduino GRBL、Arduino HTTP、Arduino HUB75、Arduino IoT Cloud、Arduino JSON、Arduino LCD、Arduino OLED、Arduino LVGL、Arduino PID 及 Arduino TFT 等方面的相关拓展思路和众多参考案例。本专栏目前博客近2300篇。
https://blog.csdn.net/weixin_41659040/category_12422453.html
Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。
Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。
作为我的机器人项目 Andar 的一部分,我需要构建一个声纳环,让 Andar 了解周围的环境。
这是一个关于如何构建带有 12 个超声波测距仪和一个 Arduino nano 的声纳环的教程,就像 Andar 机器人使用的一样。
第 1 步:收集材料
- 说实话,声纳可以有你需要的机器人的任何直径。就我而言,我使用了 4 英寸 PVC 耦合器,因为它具有 Andar 的完美措施。
- 您还需要声纳测距仪。我使用了 12 个 HC-SR04 传感器。据我所知,它们是最便宜的。
- 其他应该列出的是
4.扁平电缆
5.连接器
6.焊料
7.花几个小时来组装和测试所有东西。
第 2 步:布局传感器位置
您需要将圆柱体的周长分成 12 个相等的部分。
这些垂直线中的每条都将是一个超声波测距仪的轴。
为了标记每条线的绘制位置,我使用了您在宜家获得的免费纸尺之一来测量家具等(宜家是一家可以在加拿大购买家居用品的商店)。如果你没有,你甚至可以在一小段透明胶带上线性地做标记,然后用胶带把它粘在夹子上。
要画垂直线,您可以使用厨房里能找到的任何产品的任何盒子,并且足够高,即 90 度的底座。
第 3 步:画出标记超声波测距仪孔的线条
您需要画 4 条线,分别用于 Emiter 和 Receiver Clinder,另外两条用于 Oscilator。
我在声纳传感器下方和上方放置了 5 毫米的自由线。我们将使用该空间来放置底部和顶部盖(当然,如果你想要它们)
更具体地说,这是四行中每一行的详细信息:
1.底部填充器:从底部开始,第一行应在 XX mm.2
处。顶部压片机:在 XX 毫米处画第二条线,也是从底部开始。
3. 摆动器底部:在距底部
XX mm 处画一条新线 4.振荡器顶部:在距底部
XX 毫米处画这条线现在,cilinder 已经完成了我们需要钻孔的所有点。
第 4 步:开始钻孔
现在我们将开始在放置超声波测距仪的位置打所有孔。
使用上一步中绘制的标记检查每个孔的制作位置。请记住,如果您先打一个小孔,您将对它的位置有更多的控制权。之后,您可以使用正确的位。
我提出的另一个建议是只为一个传感器打孔,测试它是否正确安装,如果合适,则转到下一组孔。如果你一起做所有事情,你犯了错误,你将无法解决它。
从 las 图像中可以看出,两个振荡器孔应该连接在一起。
确保所有测距仪都正确安装在预期位置。如果情况并非如此(一开始我不是这样),请纠正孔,这样您就知道一切都会适合。
第 5 步:创建电缆以连接所有传感器
如果您以前使用过超声波测距仪,那么您已经知道它们(至少)有 4 个引脚
• Vcc
• GND
• Trig
• Echo
因此,由于我们将使用 12 个声纳,因此我们谈论的是 Trig 和 Echo 的 24 个引脚。Arduino Nano 没有 24 个数字引脚可供使用。好吧,我们要做的是将 Trig 和 Echo 引脚连接在一起,这样我们每个传感器就可以只使用一个信号引脚。(这不是我的想法,它是您可以在我在代码中使用的 NewPing 库中找到的示例的一部分。
思考是…你将不得不焊接一大堆连接…
正如您在图像中看到的,所有 Vcc 都连接在一起。所有 GND pins的运行相同。
其余电缆连接到每个传感器上 Trig/Echo 的 12 个引脚。
第 6 步:Arduino Nano 连接
第 7 步:将您的 Sketch 安装到 Arduino 中
/*
【Arduino 动手做】构建全方位声纳矩阵 让机器人感知环境
*/
#include <NewPing.h> // **引入 NewPing 库,用于控制超声波传感器**
#define SONAR_NUM 12 // **超声波传感器数量**
#define MAX_DISTANCE 200 // **最大检测距离(单位:厘米)**
#define PING_INTERVAL 29 // **每个传感器之间的检测间隔时间(单位:毫秒),避免相互干扰**
unsigned long pingTimer[SONAR_NUM]; // **存储每个传感器下一次执行 ping 的时间**
unsigned int cm[SONAR_NUM]; // **用于存储测得的距离**
uint8_t currentSensor = 0; // **当前活动的传感器编号**
NewPing sonar[SONAR_NUM] = { // **初始化超声波传感器数组,每个传感器独立指定触发和回响引脚**
NewPing(2, 2, MAX_DISTANCE), // **定义第 1 个传感器(触发引脚 2,回响引脚 2,最大测量 200cm)**
NewPing(3, 3, MAX_DISTANCE), // **第 2 个传感器**
NewPing(4, 4, MAX_DISTANCE), // **第 3 个传感器**
NewPing(5, 5, MAX_DISTANCE),
NewPing(6, 6, MAX_DISTANCE),
NewPing(7, 7, MAX_DISTANCE),
NewPing(8, 8, MAX_DISTANCE),
NewPing(9, 9, MAX_DISTANCE),
NewPing(10, 10, MAX_DISTANCE),
NewPing(11, 11, MAX_DISTANCE),
NewPing(12, 12, MAX_DISTANCE),
NewPing(13, 13, MAX_DISTANCE)
};
void setup() {
Serial.begin(115200); // **启动串口调试**
pingTimer[0] = millis() + 75; // **第一个传感器的首次测距延迟 75ms(让 Arduino 完全启动后再执行)**
for (uint8_t i = 1; i < SONAR_NUM; i++) // **初始化每个传感器的检测时间**
pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
}
void loop() {
for (uint8_t i = 0; i < SONAR_NUM; i++) { // **轮询所有传感器**
if (millis() >= pingTimer[i]) { // **当前时间 >= 传感器的下次执行时间**
pingTimer[i] += PING_INTERVAL * SONAR_NUM; // **更新该传感器的下次执行时间**
if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // **所有传感器扫描完成,执行数据处理**
sonar[currentSensor].timer_stop(); // **确保之前的传感器检测被终止**
currentSensor = i; // **更新当前活动传感器编号**
cm[currentSensor] = 0; // **如果没有回声,默认距离设置为 0**
sonar[currentSensor].ping_timer(echoCheck); // **启动超声波测距(事件驱动方式)**
}
}
// **此处可以添加其他代码(不会影响超声波测距)**
}
void echoCheck() { // **测距回调函数,检测到回声后记录测得的距离**
if (sonar[currentSensor].check_timer())
cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM; // **转换为厘米**
}
void oneSensorCycle() { // **所有传感器扫描完成,处理测得的距离**
for (uint8_t i = 0; i < SONAR_NUM; i++) {
Serial.print(cm[i]); // **打印测得的距离**
if(i < SONAR_NUM - 1) Serial.print(",");
}
Serial.print("|"); // **分隔符**
}
第 8 步:连接到 PC 并运行 Sonar .net 应用程序
附录
【Arduino 动手做】构建全方位声纳矩阵 让机器人感知环境
项目链接:https://www.instructables.com/member/now/
项目作者:加拿大多伦多
(我是男朋友、父亲、软件开发人员和创客,在阿根廷长大,目前住在加拿大多伦多。)
项目视频(只有类似参考演示):https://www.youtube.com/watch?v=SvLObGL-5ZY
项目代码:https://bitbucket.org/nahueltaibo/andar/src/wheelsWorking/
3D打印文件:无需打印