第1部分:用小型Arduino兼容设备(M5Stack)享受电子制作的乐趣
第2部分:通过M5Stack使用电机驱动器
大家好,我是吉田!
本系列连载将为您介绍使用小型Arduino兼容设备M5Stack制作遥控车的过程。这次我们将在M5Stack上添加各种传感器,以便实现自动控制。M5Stack有很多引脚,因此仅需插入接近传感器或距离传感器即可轻松增加相应的功能。
本部分的流程
照度、接近一体型传感器的设置
距离传感器的设置
用传感器进行测量,同时自动驾驶
总结
本部分所需部件M5Stack Core
搭载了ESP32、显示器、传感器等的Arduino兼容设备
ROHM的照度、接近一体型传感器 (RPR-0521RS)
通过****红外光并测量其反射光来测量光强和接近程度。
超声波距离传感器 (HC-SR04)
****超声波并通过其反弹声波来测量距离的模块。
Grove I2C电机驱动器
使用“I2C”通信方式与Grove引脚连接即可使用的电机驱动器
9V电池和电池盒
小型电机、车轮等
1. 照度、接近一体型传感器的设置
我希望遥控车在行驶时,在即将撞到障碍物或即将从桌子上掉下来的情况下,能够自动避让并避免掉落。
首先,我们使用接近传感器来判断是否即将掉落。接近传感器我们用ROHM传感器评估套件中的照度、接近一体型传感器模块(RPR-0521RS)。
该传感器通过****红外LED光并检测其反射光来测量物体等的接近程度。另外,还可以通过亮度传感器来同时测量亮度。
要使用该传感器,需要进入下面的ROHM传感器页面并下载Arduino用的库。
https://www.rohm.com.cn/sensor-shield-support/ps-als-sensor
在ROHM官网上下载zip文件后,通过其菜单安装Arduino IDE库。
接下来,我们把M5Stack和传感器连接起来。M5Stack上下有8个引脚,左右有15个引脚,背面写有引脚排列编号。Arduino的GPIO(输入输出引脚)与数字标注的引脚编号相对应。
照度、接近一体型传感器使用“I2C”通信方式。我们用M5Stack下方引脚中的SDA=G21和SCL=G22进行I2C通信。请按照下表连接传感器和M5Stack。
传感器侧引脚 (右起) | M5Stack侧 (下方) |
VDO | 3.3V (橙) |
GND | GND (蓝) |
SDA | GPIO21 (黄) |
SCL | GPIO22 (绿) |
INT | NA |
传感器和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 <M5Stack.h> #include <Wire.h> #include <RPR-0521RS.h> 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/”。 ]
完成该更改后,运行“M5Stack_PRP-0521RS.ino”。将会开始自动测量,当您将手指靠近设备时,屏幕上会出现如图所示的“Near!”消息。
2. 距离传感器的设置
接下来,我们在M5Stack上安装距离传感器,以便能够检测出并避让障碍物。我们使用这种名为“HC-SR04”的超声波距离传感器。这是一种能够****超声波并通过其反弹声波来测量距离的模块。
按照下表和照片所示连接该超声波传感器。
传感器侧引脚 (左起) | M5Stack侧 (左侧侧面) |
VCC | 5V (红) |
Trig | GPIO2 (橙) |
Echo | GPIO5 (黄) |
GND | GND (黑) |
驱动这个距离传感器的程序“M5Stack_Dist.ino”如下。由于G2与输出TRIG连接,G5与输入ECHO连接,因此程序中分别指定了GPIO编号。
[M5Stack_Dist.ino]
#include <M5Stack.h> #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屏幕与手等障碍物之间的距离。
3. 用传感器进行测量,同时自动驾驶
最后,要能够根据传感器的测量结果进行控制,以避让障碍物并避免从桌子上掉落下来。首先,我们需要将电机驱动器、车轮等连同传感器重新连接起来。将电机驱动器连接在Grove引脚上,将距离传感器设置在容易捕捉前方情况的位置,将接近传感器设置在下方。
还要创建一个使传感器和电机联动的程序。在程序中,当距离传感器测到距离小于5cm时,即判断为“附近有障碍物”。另外,当接近传感器测量到与地板之间的接近程度变为“Far”时,即判断为“即将从桌子边缘掉落”。此时,电机将会反转,以避免掉落(避让障碍物)。否则将继续前进。
示例程序“M5Stack_Near_Dist_Motor.ino”如下:
#include <M5Stack.h> #include <Wire.h> #include <RPR-0521RS.h> 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。当您接通电源后,车轮将开始转动并向前行驶。请您确认一下,在遥控车遇到障碍物或要从桌子上掉落下来时,电机能否反转。
行驶中的视频如下。
在这个连载系列中,将为您介绍使用M5Stack进行遥控并实现自动驾驶小车的制作过程。在第三部分中,我们使用距离传感器来确认了前方物体,并使用接近传感器来确认了接近情况。
我们还让这两种传感器和电机的旋转联动实现了自动驾驶。怎么样,效果还不错吧?由于还需要微调与障碍物之间的距离设置、反转时间等参数,因此您需要一边试用一边调整数值。
M5Stack仍然有可以使用的引脚,因此您还可以尝试添加其他传感器来实现相应的功能,这可能会更有趣。比如,可以让它在自由行驶的同时测量室内温度和空气清洁度。
在下一部分中,我们将介绍通过智能手机等从外部来控制遥控车的方法,敬请期待!
本系列连载一览
第1部分:用小型Arduino兼容设备(M5Stack)享受电子制作的乐趣
第2部分:通过M5Stack使用电机驱动器
第3部分:通过M5Stack使用传感器实现自动驾驶和自动避让功能
剧终篇:实现M5Stack与智能手机联动控制(本章)
在普通公司工作的上班族,非常喜欢创作的周末创客,出版了电子书MESHBOOK,平时也写写博客。
http://blog.ktrips.net