Lily∞机器人:4声纳避障(HC-SR04)
这个项目是百合∞机器人运动控制项目的扩展。它将展示如何添加声纳传感器,编写代码来测试声纳传感器,并在机器人上使用声纳进行潜在的场地障碍物躲避。
我是开源硬件的开拓者,这是我的指南的一部分,向学者们展示如何通过使用开源机器人参与教育、服务和研究的开源硬件。
- 专业网站:
- https://wordpress.rose-hulman.edu/berry123/open-source-hardware-trailblazer/
- 企业网站:
- https://noiresteminist.com/
- YouTube播放列表在频道:
- https://youtube.com/playlist?list=PL175eO9NwPXJm3xZPF113ve4L6tO8ckNi
- Instructables:
- //www.smiletrl.com/member/carlottaberry/settings/?cb=1658526069
- Hackster.io:
- https://www.hackster.io/berry123
供应
步骤1:构建Lily∞Bot
完成Lily-Bot:学术开源机器人项目链接制造带有电机驱动器和led的机器人来测试运动控制。
步骤2:连接4个超声波距离传感器
- 将LED与220Ω电阻串联在面包板上
- 将电阻的另一端连接到面包板接地母线上
- 使用一根电线将LED的另一侧连接到面包板上的数字引脚4
- 将每个声纳传感器连接到其中一个支架上
- 将声纳安装在机器人的前、后、左、右四个位置。
- 使用公母线将VCC引脚连接到Arduino 5V面包板上的5V母线
- 使用公母线从Arduino地面将GND引脚连接到面包板上的GND总线
- 将前声纳触发引脚连接到Arduino上的数字引脚2
- 将后声纳触发引脚连接到Arduino上的模拟引脚A2
- 将左声纳触发引脚连接到Arduino上的模拟引脚A0
- 将右声纳触发引脚连接到Arduino上的模拟引脚A4
- 将前声纳回波引脚连接到Arduino上的数字引脚3
- 将后声纳回声引脚连接到Arduino上的模拟引脚A3
- 将左声纳回波引脚连接到Arduino上的模拟引脚A1
- 将右声纳回声引脚连接到Arduino上的模拟引脚A5
- 接线图如下图所示。
- 请参阅接线视频。
步骤3:编写代码来测试传感器(图形化和Arduino草图)
如果您从未在Arduino草图中编程,请参阅链接学习如何使用云编辑器或IDE编程。
- 使用下面的代码工具包链接使用图形化编程来测试每个传感器是否工作正常。
- 图形化程序生成的在Arduino IDE中运行的代码如下所示。
- 有关该程序如何工作的更多细节,请查看视频。
- 注意,示例代码只测试A0处的传感器。
int ylwLED, redLED,三角,bliled, grnLED,回声;
浮动距离,回波时间;
//读取声纳和返回距离
Int get_distance2() {
digitalWrite(三角、高);
delayMicroseconds (10);
digitalWrite(三角、低);
echotime = pulseInLong(echo, HIGH);
Dist =回声时间/ 148;
返回经销;
}
//打开所有led灯
void all_LEDS_off2() {
digitalWrite (bluLED、低);
digitalWrite (grnLED、低);
digitalWrite (redLED、低);
digitalWrite (ylwLED、低);
}
无效设置(){
pinMode (ylwLED、输出);
pinMode (redLED、输出);
pinMode (bluLED、输出);
pinMode (grnLED、输出);
ylwLED = 10;
redLED = 11;
bliled = 12;
grnLED = 13;
回声= 18;
Trig = 19;
pinMode(三角、输出);
}
无效循环(){
If ((get_distance2()) < 4) {
digitalWrite (ylwLED、高);
} else if ((get_distance2()) < 7) {
digitalWrite (redLED、高);
} else if ((get_distance2()) < 10) {
digitalWrite (bluLED、高);
}其他{
digitalWrite (grnLED、高);
}
延迟(500);
all_LEDS_off2 ();
}
步骤4:编写代码测试所有4个声纳都在工作
观看视频,并编写以下代码来测试所有4个声纳传感器一起工作。
/*
莉莉∞机器人
LilyBot-SonarSensors.ino
用TB6612电机控制器控制2台直流电机(https://www.adafruit.com/product/2448)
这个程序将创建低水平的运动控制:前进,逆转,旋转,转向,枢轴,停止
4个声纳传感器来测试这4个都能正常工作。
Carlotta A. Berry博士
2022年8月8日
硬件连接:
Vmotor -电机电压,非逻辑电平(4.5-13.5V)
Vcc -用于逻辑电平的电压(Arduinos, 5V)
GND -共享逻辑和电机接地
INA1, INA2 -电机A h桥的两个输入
PWMA - PWM输入电机A h桥,如果你不需要PWM控制,将其连接到逻辑高。
INB1, INB2 -电机B h桥的两个输入
PWMB -电机B h桥的PWM输入,如果你不需要PWM控制,将其连接到逻辑高。
STBY -备用引脚,快速禁用两个电机,通过10K电阻拉到Vcc。连接到地面关闭。
这些是“Vmotor级”功率输出
电机A -这是电机A的两个输出,由INA1, INA2和PWMA控制
电机B -这是电机B的两个输出,由INB1, INB2和PWMB控制
Vmotor到VIN
Vcc到5V
地对地
AIN1到数字4
AIN2转数字5
BIN1到数字6
BIN2到数字7
PWMA和PWMB到Vcc
* /
/ /状态led
int ledPins[3] = {5,6,7};
int redLED = 5;
int bliled = 6;
int grnLED = 7;
/ /声纳变量
int trigPins[4] = {2, A0, A2, A4};
int echoPins[4] = {3, A1, A3, A5};
Int state = 0b0;
const int trigPin = 2;
const int echoPin = 3;
浮动距离= 0;//变量存储距离传感器测量的距离
浮动dist [4];
//左侧电机将由电机驱动器上的电机A引脚控制
const int AIN1 = 8;//左电机驱动器上的控制引脚1
const int AIN2 = 9;//左电机驱动器上的控制引脚2
const int PWMA = 10;//左边电机驱动器上的速度控制销
//右侧电机由电机驱动器上的电机B引脚控制
const int PWMB = 11;//右电机的电机驱动器上的速度控制销
const int BIN2 = 12;//右侧电机驱动器上的控制引脚2
const int BIN1 = 13;//右侧电机驱动器上的控制引脚1
//机器人行为变量
int moveTime = 200;//机器人移动的时间
int robotSpeed = 100;/ /机器人速度
/********************************************************************************/
无效的设置()
{
pinMode (trigPin、输出);//该引脚将从距离传感器发送超声波脉冲
pinMode (echoPin、输入);//当脉冲反射回距离传感器时,该引脚将感知
For (int I = 0;I < 3;我+ +){
pinMode (ledPins[我],输出);
}
For (int I = 0;I < 4;我+ +){
pinMode (trigPins[我],输出);
}
For (int I = 0;I < 4;我+ +){
pinMode (echoPins[我],输入);
}
//for (int I = 0;I < 3;我+ +){
// digitalWrite(ledPins[i], HIGH);
/ /}
//设置电机控制引脚为输出
pinMode (AIN1、输出);
pinMode (AIN2、输出);
pinMode (PWMA、输出);
pinMode (BIN1、输出);
pinMode (BIN2、输出);
pinMode (PWMB、输出);
Int波特率= 9600;//串口通信波特率
Serial.begin(波特率);//启动串行通信
系列。打印(“莉莉∞机器人开始”);//打印开始信息
Int等待时间= 5000;//机器人等待时间
延迟(waittime);//机器人移动前延时
allLedsOff ();
}
/********************************************************************************/
无效循环()
{
距离= getDistance();
系列。打印(“距离:”);
并同时(距离);
系列。println(“的”);//打印单位
If(距离< 5){
并同时“障碍\ n”);
allLedsOff ();
停止();
延迟(moveTime);
牧师(robotSpeed);
delay(4 * moveTime);
自旋(robotSpeed, 1);
延迟(8 * moveTime);
}其他{
并同时“转发”);
fwd (robotSpeed);
延迟(moveTime);
}
}
//机器人停止功能
无效停止(){
allLedsOff ();
digitalWrite (redLED、高);
//左电机停止
digitalWrite (AIN1、低);//设置引脚1为低电平
digitalWrite (AIN2、低);//设置引脚2到低电平
//右电机停止
digitalWrite (BIN1、低);//设置引脚1为低电平
digitalWrite (BIN2、低);//设置引脚2到低电平
}
//机器人前进函数
无效fwd(int speed) {
allLedsOff ();
digitalWrite (grnLED、高);
digitalWrite (AIN1、高);//设置引脚1到高
digitalWrite (AIN2、低);//设置引脚2到低电平
digitalWrite (BIN1、高);//设置引脚1为低电平
digitalWrite (BIN2、低);//设置引脚2到高
analogWrite (PWMA、abs(速度));//设置前进速度
analogWrite (PWMB、abs(速度));//设置前进速度
}
//机器人反向函数
Void rev(int speed) {
allLedsOff ();
digitalWrite (bluLED、高);
digitalWrite (AIN1、低);//设置引脚1为低电平
digitalWrite (AIN2、高);//设置引脚2到高
digitalWrite (BIN1、低);//设置引脚1为低电平
digitalWrite (BIN2、高);//设置引脚2到高
analogWrite (PWMA、abs(速度));//设置反向速度
analogWrite (PWMB、abs(速度));//设置反向速度
}
//机器人旋转函数
Void spin(int speed, int dir) {
/ / digitalWrite (grnLED、高);
If (dir > 0) {
digitalWrite (AIN1、低);//设置引脚1为低电平
digitalWrite (AIN2、高);//设置引脚2到高
digitalWrite (BIN1、高);//设置引脚1为低电平
digitalWrite (BIN2、低);//设置引脚2到高
}其他{
digitalWrite (AIN1、高);//设置引脚1为低电平
digitalWrite (AIN2、低);//设置引脚2到高
digitalWrite (BIN1、低);//设置引脚1为低电平
digitalWrite (BIN2、高);//设置引脚2到高
}
analogWrite (PWMA、abs(速度));//设置反向速度
analogWrite (PWMB、abs(速度));//设置反向速度
}
//机器人转弯功能
Void turn(int speed, int dir) {
/ / digitalWrite (redLED、高);
/ / digitalWrite (bluLED、高);
digitalWrite (AIN1、高);//设置引脚1为低电平
digitalWrite (AIN2、低);//设置引脚2到高
digitalWrite (BIN1、高);//设置引脚1为低电平
digitalWrite (BIN2、低);//设置引脚2到高
If (dir > 0) {
analogWrite(PWMA, robbotspeed * 1.5);
analogWrite(PWMB, robbotspeed * 0.5);
}
其他{
analogWrite(PWMA, robbotspeed * 0.5);
analogWrite(PWMB, robbotspeed * 1.5);
}
}
//机器人枢轴函数
Void pivot(int speed, int dir) {
/ / digitalWrite (bluLED、高);
/ / digitalWrite (grnLED、高);
digitalWrite (AIN1、高);//设置引脚1为低电平
digitalWrite (AIN2、低);//设置引脚2到高
digitalWrite (BIN1、高);//设置引脚1为低电平
digitalWrite (BIN2、低);//设置引脚2到高
If (dir > 0) {
analogWrite (PWMA 0);
analogWrite (PWMB、abs(速度));
}
其他{
analogWrite (PWMA、abs(速度));
analogWrite (PWMB 0);
}
}
//关闭所有的led灯
void allLedsOff () {
For (int I = 0;I < 3;我+ +){
digitalWrite (ledPins[我],低);
}
}
//获取声纳距离
浮动getDistance ()
{
浮动echoTime;//变量用来存储ping从一个对象反弹所需要的时间
浮动calculatedDistance;//变量存储从echo time计算出的距离
//发出一个10毫秒长的超声波脉冲
digitalWrite (trigPin、高);
delayMicroseconds (10);
digitalWrite (trigPin、低);
echoTime = pulseIn(echoin, HIGH);//使用pulsein命令查看需要多长时间
//脉冲反射回传感器
calculatedDistance = echoTime / 148.0;//计算反射脉冲的物体的距离(弹跳时间的一半乘以声速)
返回calculatedDistance;//返回计算的距离
}
第五步:避免障碍
观看视频并编写下面的代码,在机器人上实现砰砰控制避障。
第六步:用速度比例控制避障
步骤7:用避障距离进行比例控制

这是
分组代码竞赛
2的评论
11天前
非常感谢
14天前简介
非常感谢你努力讨论这个问题,我对这个问题有强烈的感觉,喜欢在这个问题上学习更多.