资讯专栏INFORMATION COLUMN

TFmini与舵机结合的机器人小车避障应用方案

raoyi / 1184人阅读

摘要:舵机接线小车避障原理小车启动后,小车开始向前运动。搭载的外部电源过重时,会影响小车车轮的摩擦力,可能两个车轮的转速不一致,导致小车并不能按照轨迹行驶。小车车轮在光滑地面有可能造成空转的现象,导致小车不能走直线。

1.试验设备及接线
1.1实验设备
• MiniQ 桌面机器人底盘

底盘直径:122mm

轮子直径:42mm

底盘高度:15mm

兼容 Arduino 标准板及 Romeo 控制器固定孔

电机参数:

• N20 电机电压:3-9V
• 无负载转速:13000rpm
• 50:1 减速箱
• 260rpm@6V
• 40mA@6V
• 360mA 堵转@6V
• 10 盎司英寸扭矩@6V

• Romeo 三合一 Arduino 兼容控制器

采用 Atmel Atmega328 单片机

Arduino UNO bootloader

完全兼容 Aruduino UNO 的端口布局

集成 APC220 无线数传和 DF-BluetoothV3(SKU:TEL0026)蓝牙模块接口

支持 5 组 I2C 总线接口

支持两路电机驱动,峰值电流 2A,4 个控制口使用跳线切换

外部输入电压范围:6V~20V

更详细的参数介绍详见附录的网页地址。

• MiniQ 小车上层安装板

• Benewake TFmini 标版

TFmini 详细参数见 TFmini 使用说明。

• 9g 舵机

1.2接线

2.小车避障原理
小车启动后,小车开始向前运动。当雷达探测到前方阈值内有障碍物时,小车停止运动,开始左右扫描寻路。舵机搭载 TFmini 从 90°开始向 180°扫描,然后从 180°向 0°扫描。

当扫描方向无障碍物时,小车向此方向转向,舵机回正到 90°。若从左至右扫描一圈都没有可以行进的路线,则小车后退,舵机回正。
逻辑流程图如下所示:

3.注意事项
• 当前避障原理模型只用来抛砖引玉,探索用 TFmini 避障的可行性,并不能大范围的适用于大规模的商业场景,如有需要,应以专业软件开发人员的代码为准。
• 搭载的外部电源过重时,会影响小车车轮的摩擦力,可能两个车轮的转速不一致,导致小车并不能按照轨迹行驶。
• 小车车轮在光滑地面有可能造成空转的现象,导致小车不能走直线。
• 如果多带带对 TFmini 外部供电,则需将外部电源和控制板共地处理。
• 如果搭载更高复杂度的程序,要考虑芯片的能力,当前开发板在跑程序时已经发现会有卡顿的现象。
4.附录
4.1代码

include

Servo myservo;
int pos=90; //定义舵机角度
bool flag=true;//定义舵机转向
float dist_f;//定义 foward 方向距离
float dist_s;//定义 sideway 方向距离
int E1=5; //定义 M1 使能
int E2=6; //定义 M2 使能
int M1=4; //定义 M1 控制
int M2=7; //定义 M2 控制
int temp_distance =0;
/**

双轮停止

*/
void brake(void){
digitalWrite(E1,LOW); //给 E1 低电平
digitalWrite(E2,LOW); //给 E2 低电平
}
/**

双轮前进

*/
void advance(char a, char b){
analogWrite(E1,a);
digitalWrite(M1,LOW);
analogWrite(E2,b);
digitalWrite(M2,LOW);
}
/**

双轮后退

*/
void back(char a, char b){
analogWrite(E1,a);
digitalWrite(M1,HIGH);
analogWrite(E2,b);
digitalWrite(M2,HIGH);
}
/**

左转

*/
void turn_L(char a, char b){
analogWrite(E1,a);
digitalWrite(M1,LOW);
analogWrite(E2,b);
digitalWrite(M2,HIGH);
}
/**

右转

*/
void turn_R(char a, char b){
analogWrite(E1,a);
digitalWrite(M1,HIGH);
analogWrite(E2,b);
digitalWrite(M2,LOW);
}
/**

读取 TFmini 测量结果

*/
void getTFminiData(int distance, int strength) {
static char i = 0;
char j = 0;
int checksum = 0;
static int rx[9];
if(Serial.available()) {
rx = Serial.read();
if(rx[0] != 0x59) {
i = 0;
} else if(i == 1 && rx[1] != 0x59) {
i = 0;
} else if(i == 8) {
for(j = 0; j < 8; j++) {
checksum += rx[j];
}
/*
if(rx[8] == (checksum % 256)) {
distance = rx[2] + rx[3] 256;
strength = rx[4] + rx[5] 256;
}*/
distance = rx[2] + rx[3] 256;
strength = rx[4] + rx[5] 256;
i = 0;
} else {
i++;
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
//舵机的插口在 4
myservo.attach(4);
brake();
/*

将雷达指向前方

*/
myservo.write(pos);
/*

设置轮胎电机输出口

*/
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
delay(10);
}
void loop() {
/*

读数一次

*/
int distance = 0;
int strength = 0;
getTFminiData(&distance, &strength);
while(!distance) {
getTFminiData(&distance, &strength);
Serial.print("Distance: ");
Serial.print(distance);
Serial.print("cm ");
Serial.print("strength: ");
Serial.println(strength);
}
/*

设置 30CM 阈值

*/
if(distance <= 30 && distance > 0){
temp_distance = distance;
}
delay(10);
/*

判断读数距离

如果度数距离小于阈值,则停车,开始向左向右扫描,直到扫描出有空隙可以走,然后车轮转弯,然后扫描器回正

如果读数距离大于阈值,则开车

*/
if(temp_distance <= 30 && temp_distance >= 0){
brake();
/*

判断当前舵机应该向左还是向右转

*/
if(flag){
if(pos<170){
pos=pos+45;
}else{
flag = false;
}
/*

如果探测距离大于阈值,则舵机回正,小车转向

*/
if(distance > 32){
pos = 90;
myservo.write(pos);
delay(1200);
//判断小车回正方向
if(pos >= 90){
turn_L(35,35);
}else{
turn_R(35,35);
}
delay(250);
temp_distance = distance;
}
/*

如果探测距离小于阈值,则继续扫描

*/
else{
myservo.write(pos);
delay(1200);
}
}else{
if(pos>10){
pos=pos-45;
}else{
flag=true;
}
/*

如果探测距离大于阈值,则舵机回正,小车转向

*/
if(distance > 32){
pos = 90;
myservo.write(pos);
delay(1200);
//判断小车回正方向
if(pos >= 90){
turn_L(35,35);
}else{
turn_R(35,35);
}
delay(250);
temp_distance = distance;
}
/*

如果探测距离小于阈值,则继续扫描

*/
else{
myservo.write(pos);
delay(1200);
}
}
}
/*

如果前方没有障碍物,直行

*/
else if(distance > 32 && distance < 1200){
advance(35,35);
}
/*

如果雷达挂了,小车停止

*/
else if(distance == -3){
brake();
}
}
如您认可上述经验,欢迎您的联系:
010-57456983
www.benewake.com
北醒(北京)光子科技有限公司
北醒激光雷达
电话:010-5745 6983
邮箱:bw@benewake.com
官方微信公众号:benewake-bj
或搜索淘宝:北醒光子科技有限公司https://shop155404578.taobao....

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105679.html

相关文章

  • 树莓派31/100 - Pico连接HC-SR04超声波传感器,为自动避障智能小车打好基础

    摘要:超声波传感器,英文,既可以发射超声波,也可以接收超声波,它有一个重要作用,可以提前探测到附近的物体,而且通过声波速度,能够推算出附近物体离传感器的大概距离。 超声波...

    neuSnail 评论0 收藏0
  • 基于STM32f103c8t6和L292N驱动设计避障小车(核心函数建立为自己所写)

    基于STM32f103c8t6和L292N驱动设计避障小车(核心函数的建立为自己所写) 一.项目感触 完成这个项目自己一开始也是无法从本身上出发,看着这个最小系统板和这个电机驱动模块上面想着怎样实现让这两块板子实现四个电机上面转动呢,还要加入避障模块,自己一开始一头雾水,于是开始了漫长的借鉴之路,首先作为一个开发者,我觉得学习的地方首选是B站,所以我找了相关的做智能小车的视频 首先是B站智能小车教...

    CoffeX 评论0 收藏0
  • 四足机器狗——12自由度舵机狗DIY(一)

    摘要:四足仿生机器人具有高机动性,负载能力和适应能力强,可运用于物资运输抢险救援等方面,具有广阔前景。由于制作电机狗需要高昂的成本。自主设计制造一款舵机狗来学习研究四足机器狗的步态算法是一件性价比极高且很有意义的一件事。 文章目录 前言 一、初步了解四足结构 1.1.2串联机构 1.2 ...

    不知名网友 评论0 收藏0
  • 树莓派视觉小车 -- 小球追踪(颜色追踪)(OpenCV色彩空间HSV)

    摘要:一般调高饱和度会降低中相对较低的数值,凸显主要颜色的纯度。对当前唯一的方法霍夫梯度法,它表示在检测阶段圆心的累加器阈值。第八个参数,类型的有默认值,表示圆半径的最小值。 目录 效果展示  基础理论(HSV) 为什么用HSV空间而不是RGB空间? HSV 1、Hue(色相) 2、Value(明...

    developerworks 评论0 收藏0
  • TFmini-Plus 实现人流、身高测量方案

    摘要:人流身高测量仪说明本方案为利用北醒公司产品和板结合开发出的小设备。其作用为统计人流数量以及相应目标身高高度。人流身高测量原理雷达启动后,设置安装高度身高限度下限值。考虑人行走时身高会浮动,尽量让脚落在光斑左右,探测到最高值,减小误差。 人流身高测量仪说明 本方案为利用北醒公司产品 TFmini-Plus 和 Arduino-UNO 板结合开发出的小设备。其作用为:统计人流数量以及相应目...

    xbynet 评论0 收藏0

发表评论

0条评论

raoyi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<