这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 电源与模拟 » 用Arduino兼容设备(M5Stack)和传感器制作迷你遥控车!(第三部分)

共12条 1/2 1 2 跳转至

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

工程师
2023-02-17 20:30:37     打赏
通过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侧
(下方)
VDO3.3V (橙)
GNDGND (蓝)
SDAGPIO21 (黄)
SCLGPIO22 (绿)
INTNA

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 <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/”。 ]

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侧
(左侧侧面)
VCC5V (红)
TrigGPIO2 (橙)
EchoGPIO5 (黄)
GNDGND (黑)

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

 

驱动这个距离传感器的程序“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屏幕与手等障碍物之间的距离。

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 <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。当您接通电源后,车轮将开始转动并向前行驶。请您确认一下,在遥控车遇到障碍物或要从桌子上掉落下来时,电机能否反转。

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

行驶中的视频如下。



4. 总结

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

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

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

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

本系列连载一览

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


吉田 显一(Yoshiken)

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

http://blog.ktrips.net





关键词: Arduino     兼容     设备     M5Stack     传感器    

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

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


专家
2023-02-18 01:34:56     打赏
3楼

感谢楼主的分享


高工
2023-02-18 03:20:29     打赏
4楼

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


专家
2023-02-18 06:19:03     打赏
5楼

感谢楼主的分享


专家
2023-02-18 06:21:24     打赏
6楼

感谢楼主的分享


专家
2023-02-18 06:54:16     打赏
7楼

看看


专家
2023-02-18 09:51:49     打赏
8楼

感谢分享


高工
2023-02-18 12:37:34     打赏
9楼

谢谢分享


高工
2023-02-18 12:42:49     打赏
10楼

谢谢分享


共12条 1/2 1 2 跳转至

回复

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