论坛» 综合技术» 电源与模拟

用Arduino兼容设备(M5Stack)和传感器制作迷你遥控车!(第三部分)

工程师
2023-02-17 20:30 1楼
通过M5Stack使用传感器实现自动驾驶和自动避让功能

第1部分:用小型Arduino兼容设备(M5Stack)享受电子制作的乐趣
第2部分:通过M5Stack使用电机驱动器

大家好,我是吉田!

本系列连载将为您介绍使用小型Arduino兼容设备M5Stack制作遥控车的过程。这次我们将在M5Stack上添加各种传感器,以便实现自动控制。M5Stack有很多引脚,因此仅需插入接近传感器或距离传感器即可轻松增加相应的功能。

arduino-m5stack-remote-control-car-03-01
arduino-m5stack-remote-control-car-03-02

在M5Stack上安装距离传感器和接近传感器,实现自动驾驶

本部分的流程
  1. 照度、接近一体型传感器的设置

  2. 距离传感器的设置

  3. 用传感器进行测量,同时自动驾驶

  4. 总结

本部分所需部件M5Stack Core

搭载了ESP32、显示器、传感器等的Arduino兼容设备

arduino-m5stack-remote-control-car-02

ROHM的照度、接近一体型传感器 (RPR-0521RS)

通过****红外光并测量其反射光来测量光强和接近程度。

arduino-m5stack-remote-control-car-03-03

超声波距离传感器 (HC-SR04)

****超声波并通过其反弹声波来测量距离的模块。

arduino-m5stack-remote-control-car-03-04

Grove I2C电机驱动器

使用“I2C”通信方式与Grove引脚连接即可使用的电机驱动器

arduino-m5stack-remote-control-car-07_01

9V电池和电池盒

arduino-m5stack-remote-control-car-02-02

小型电机、车轮等

arduino-m5stack-remote-control-car-08

1. 照度、接近一体型传感器的设置

我希望遥控车在行驶时,在即将撞到障碍物或即将从桌子上掉下来的情况下,能够自动避让并避免掉落。

首先,我们使用接近传感器来判断是否即将掉落。接近传感器我们用ROHM传感器评估套件中的照度、接近一体型传感器模块(RPR-0521RS)。

arduino-m5stack-remote-control-car-03-05

该传感器通过****红外LED光并检测其反射光来测量物体等的接近程度。另外,还可以通过亮度传感器来同时测量亮度。

要使用该传感器,需要进入下面的ROHM传感器页面并下载Arduino用的库。
https://www.rohm.com.cn/sensor-shield-support/ps-als-sensor

在ROHM官网上下载zip文件后,通过其菜单安装Arduino IDE库。

arduino-m5stack-remote-control-car-03-06

接下来,我们把M5Stack和传感器连接起来。M5Stack上下有8个引脚,左右有15个引脚,背面写有引脚排列编号。Arduino的GPIO(输入输出引脚)与数字标注的引脚编号相对应。

arduino-m5stack-remote-control-car-03-07

M5Stack背面的引脚排列图

照度、接近一体型传感器使用“I2C”通信方式。我们用M5Stack下方引脚中的SDA=G21和SCL=G22进行I2C通信。请按照下表连接传感器和M5Stack。

传感器侧引脚
(右起)
M5Stack侧
(下方)
VDO 3.3V (橙)
GND GND (蓝)
SDA GPIO21 (黄)
SCL GPIO22 (绿)
INT NA

arduino-m5stack-remote-control-car-03-08

传感器和M5Stack连接好之后,从Arduino IDE的草图示例中选择前面安装的示例PRP-0521RS。

添加到示例中之后还需要在M5Stack的显示器中显示等,所以要将其另存为“M5Stack_PRP-0521RS.ino”。在这里添加如下程序(第1、11〜14、20、29〜30、36、39行)。

是M5Stack用的库。Wire.begin(21,22)是为了使M5Stack能够使用I2C通信方式的声明。

[M5Stack_PRP-0521RS.ino]

#include  #include  #include  RPR0521RS rpr0521rs; void setup() { byte rc; Serial.begin(115200); while (!Serial); Wire.begin(21,22); M5.begin(); M5.Lcd.setTextSize(2); M5.Lcd.setRotation(3); rc = rpr0521rs.init(); } void loop() { Wire.begin(21,22); byte rc; unsigned short ps_val; float als_val; byte near_far; rc = rpr0521rs.get_psalsval(&ps_val, &als_val); if (rc == 0) { Serial.print(F("RPR-0521RS (Proximity) = ")); M5.Lcd.setCursor(10, 20); M5.Lcd.printf("RPR-0521RS: "); Serial.print(ps_val); Serial.print(F(" [count]")); near_far = rpr0521rs.check_near_far(ps_val); if (near_far == RPR0521RS_NEAR_VAL) { Serial.println(F(" Near")); M5.Lcd.printf("M5 Near!"); } else { Serial.println(F(" Far")); M5.Lcd.printf("M5 Far !"); } } delay(500); }

通过M5Stack使用该程序时,需要更改一项。打开文件“PRP-0521RS.cpp”并删除“#include”部分中的“avr/”(通常安装的库位于Arduino > Libraries > RPR-0521RS中)。进行该操作后,M5Stack就可以正常读取pgmspace.h了。

[PRP-0521RS.cpp的位置,更改前。删除红框部分的“avr/”。 ]

arduino-m5stack-remote-control-car-03-09

完成该更改后,运行“M5Stack_PRP-0521RS.ino”。将会开始自动测量,当您将手指靠近设备时,屏幕上会出现如图所示的“Near!”消息。

arduino-m5stack-remote-control-car-03-10

当手指靠近时,会输出“Near”来告知附近有东西

2. 距离传感器的设置

接下来,我们在M5Stack上安装距离传感器,以便能够检测出并避让障碍物。我们使用这种名为“HC-SR04”的超声波距离传感器。这是一种能够****超声波并通过其反弹声波来测量距离的模块。

arduino-m5stack-remote-control-car-03-04

按照下表和照片所示连接该超声波传感器。

传感器侧引脚
(左起)
M5Stack侧
(左侧侧面)
VCC 5V (红)
Trig GPIO2 (橙)
Echo GPIO5 (黄)
GND GND (黑)

arduino-m5stack-remote-control-car-03-11

驱动这个距离传感器的程序“M5Stack_Dist.ino”如下。由于G2与输出TRIG连接,G5与输入ECHO连接,因此程序中分别指定了GPIO编号。

[M5Stack_Dist.ino]

#include  #define TRIG 2 #define ECHO 5 int times; int distance; void setup() { Serial.begin(115200); while (!Serial); pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT); M5.begin(); M5.Lcd.setTextSize(2); M5.Lcd.setRotation(3); } void loop() { // ****超声波 digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW); // 接收超声波 times = pulseIn(ECHO, HIGH); distance = (int)(times * 0.017); // 在监视器、显示器上显示 Serial.println(distance); M5.Lcd.setCursor(0, 0); M5.Lcd.print(distance); delay(500); }

运行该程序,当将手指靠近距离传感器时,就会测量出距离。该距离数据表示串口监视器和M5Stack屏幕与手等障碍物之间的距离。

arduino-m5stack-remote-control-car-03-12

在串口监视器(左)和M5Stack屏幕(右)上显示测量到的距离

3. 用传感器进行测量,同时自动驾驶

最后,要能够根据传感器的测量结果进行控制,以避让障碍物并避免从桌子上掉落下来。首先,我们需要将电机驱动器、车轮等连同传感器重新连接起来。将电机驱动器连接在Grove引脚上,将距离传感器设置在容易捕捉前方情况的位置,将接近传感器设置在下方。

arduino-m5stack-remote-control-car-03-13

还要创建一个使传感器和电机联动的程序。在程序中,当距离传感器测到距离小于5cm时,即判断为“附近有障碍物”。另外,当接近传感器测量到与地板之间的接近程度变为“Far”时,即判断为“即将从桌子边缘掉落”。此时,电机将会反转,以避免掉落(避让障碍物)。否则将继续前进。

示例程序“M5Stack_Near_Dist_Motor.ino”如下:

#include  #include  #include  RPR0521RS rpr0521rs; #define TRIG 2 #define ECHO 5 int times; int distance; #include "Grove_I2C_Motor_Driver.h" #define I2C_ADDRESS 0x0f void setup() { Serial.begin(115200); while (!Serial); byte rc; rc = rpr0521rs.init(); pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT); Motor.begin(I2C_ADDRESS); Wire.begin(21,22); M5.begin(); M5.Lcd.setTextSize(4); M5.Lcd.setCursor(10,0); M5.lcd.print("M5 Near Dist Motor"); } void loop() { Wire.begin(21,22); byte rc; unsigned short ps_val; float als_val; byte near_far; M5.lcd.clear(); M5.Lcd.setCursor(10,0); M5.lcd.print("M5 Near Dist Motor"); M5.Lcd.setCursor(10,50); rc = rpr0521rs.get_psalsval(&ps_val, &als_val); if (rc == 0) { Serial.print(F("RPR-0521RS (Proximity) = ")); Serial.print(ps_val); Serial.print(F(" [count]")); near_far = rpr0521rs.check_near_far(ps_val); if (near_far == RPR0521RS_NEAR_VAL) { Serial.println(F(" Near")); M5.lcd.print("Near!"); } else { Serial.println(F(" Far")); M5.lcd.print("Far!"); } } // ****超声波 digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW); // 接收超声波 times = pulseIn(ECHO, HIGH); distance = (int)(times * 0.017); // 在显示器上显示 Serial.println(distance); M5.Lcd.setCursor(10, 100); M5.Lcd.print(distance); M5.Lcd.setCursor(10,150); // 当距离小于6时,如果接近程度继续变大,将使电机反转 if ( ((distance > 0) and (distance < 6)) or (near_far != RPR0521RS_NEAR_VAL) ) { Motor.speed(MOTOR1, 100); Motor.speed(MOTOR2, -100); delay(800); Motor.speed(MOTOR1, 100); Motor.speed(MOTOR2, 100); M5.lcd.print("Danger!"); delay(800); } else { // 如果没有障碍物就继续前进 Motor.speed(MOTOR1, -100); Motor.speed(MOTOR2, 100); M5.lcd.print("Forward!"); } delay(300); }

程序准备好后,将其导入M5Stack。当您接通电源后,车轮将开始转动并向前行驶。请您确认一下,在遥控车遇到障碍物或要从桌子上掉落下来时,电机能否反转。

arduino-m5stack-remote-control-car-03-14

行驶中的视频如下。



4. 总结

在这个连载系列中,将为您介绍使用M5Stack进行遥控并实现自动驾驶小车的制作过程。在第三部分中,我们使用距离传感器来确认了前方物体,并使用接近传感器来确认了接近情况。

我们还让这两种传感器和电机的旋转联动实现了自动驾驶。怎么样,效果还不错吧?由于还需要微调与障碍物之间的距离设置、反转时间等参数,因此您需要一边试用一边调整数值。

M5Stack仍然有可以使用的引脚,因此您还可以尝试添加其他传感器来实现相应的功能,这可能会更有趣。比如,可以让它在自由行驶的同时测量室内温度和空气清洁度。

在下一部分中,我们将介绍通过智能手机等从外部来控制遥控车的方法,敬请期待!

本系列连载一览

第1部分:用小型Arduino兼容设备(M5Stack)享受电子制作的乐趣
第2部分:通过M5Stack使用电机驱动器
第3部分:通过M5Stack使用传感器实现自动驾驶和自动避让功能
剧终篇:实现M5Stack与智能手机联动控制(本章)


吉田 显一(Yoshiken)

在普通公司工作的上班族,非常喜欢创作的周末创客,出版了电子书MESHBOOK,平时也写写博客。

http://blog.ktrips.net


专家
2023-02-18 01:33 2楼

感谢楼主的分享,很实用了。

专家
2023-02-18 01:34 3楼

感谢楼主的分享

高工
2023-02-18 03:20 4楼

感谢楼主的分享,很实用了。

专家
2023-02-18 06:19 5楼

感谢楼主的分享

专家
2023-02-18 06:21 6楼

感谢楼主的分享

专家
2023-02-18 06:54 7楼

看看

专家
2023-02-18 09:51 8楼

感谢分享

高工
2023-02-18 12:37 9楼

谢谢分享

高工
2023-02-18 12:42 10楼

谢谢分享

共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]