超声波中级实践篇--三点定位
最近博主发现超声波这个玩意还是挺实用的,因此不慌不忙搞了一个定位的项目,接下来仅供参考!
1. 工作过程
(每一个位置各3个超声波,角度范围最高可达到45度,如果想要效果更好,可以考虑增加数量或者加电机或舵机使其扫描。根据图更改上面的数值!
实验材料:
- Arduino mega 2560 X1
- RS04超声波传感器 X1
- 杜邦线 若干
- 面包板 X1
- USB下载线 X1
- 纸巾 1包(建议初学者准备,因为看不懂看久了可能会冒冷汗的,嘻嘻嘻)
2. 接线方法
下面trigpin和echopin为发射和接收的引脚,需要更改的话直接改二维数组里的数字
* 所有正极接到mega的5v引脚上,
* 所有负极接到mega的gnd引脚上,
* 三个超声波0的TrigPin依次接到22,24,26口
* 三个超声波0的EchoPin依次接到23,25,27口
* 三个超声波1的TrigPin依次接到28,30,32
* 三个超声波1的EchoPin依次接到29,31,33
* 三个超声波2的TrigPin依次接到34,36,38
* 三个超声波2的EchoPin依次接到35,37,39
* 注意:根据实际更改上面Lx,Ly,size of thing的值
* 注意:测量范围不能太小(超声波反应不过来),太大(超过测量范围),角度不能太偏(超声波模块限制)
* 反馈:打开arduino ide的串口监视器,3行3列的数为9个超声波测量值,输出x,y值为计算所得值。若出现单个超声波值一直为0.00,请考虑硬件故障。
3.代码
float cm[3][3];
int TrigPin[3][3] = {
{22,24,26},{28,30,32},{34,36,38}};
int EchoPin[3][3] = {
{23,25,27},{29,31,33},{35,37,39}};//双数发,单数收
float target_cm[3];
float p = 0;
int y = 0;
int x = 0;
void setup()
{
Serial.begin(9600); //设置波特率
for(int i = 0;i<3;i++)
for(int j = 0;j<3;j++)
{
pinMode(TrigPin[i][j], OUTPUT);
pinMode(EchoPin[i][j], INPUT);
}
}
void loop()
{
for(int i = 0;i<3;i++)
for(int j = 0;j<3;j++)
{
digitalWrite(TrigPin[i][j], LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2); // delayMicroseconds在更小的时间内延时准确
digitalWrite(TrigPin[i][j], HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin[i][j], LOW); //通过这里控制超声波的发射
cm[i][j] = pulseIn(EchoPin[i][j], HIGH) / 58.0; //将回波时间换算成cm
cm[i][j] = (int)(cm[i][j] * 100.0) / 100.0; //保留两位小数
//delay(50);
}
/
Serial.println();
Serial.println();
for(int i = 0;i<3;i++)
{
for(int j = 0;j<3;j++)
{
Serial.print(cm[i][j]);
Serial.print(" ");
}
Serial.println();
}
Serial.println();
Serial.println();
//
for(int i = 0;i<3;i++)
{
target_cm[i] = cm[i][0];
for(int j = 0;j<3;j++)
{
if(cm[i][j] > 0 && cm[i][j] <= 350 && target_cm[i] >= cm[i][j])
target_cm[i] = cm[i][j]; //取最小值
}
Serial.println(target_cm[i]);
}
y = 0;
x = 0;
if( target_cm[0]> 0 && target_cm[1]> 0 && target_cm[2]> 0)
{
int a = target_cm[0] +size_of_thing;
int b = target_cm[1] +size_of_thing;
int c = target_cm[2] +size_of_thing;
p = (a+b+Lx)/2.0;
int S = (int)(sqrt(p*(p-a)*(p-b)*(p-c)));
int h = 2*S/a;
y = h;
x = (int)(sqrt((a*a) - (y*y)));
Serial.print("x = ");
Serial.print(x);
Serial.print(" ");
Serial.print("y = ");
Serial.println(y);
}
else
{
Serial.println("请放在指定位置");
}
}
4.实验现象
自己动手丰衣足食,想学习的自己购买电子元器件测试,实践出真理!哈哈哈哈!
5.总结
有志者,事竟成!遇到困难不要慌,先把手机掏出来,三铭学长一直伴您同行!
加油!有问题请留言,第二次发博客,技术一般般,嘻嘻嘻,不要见怪,将就看!
本账户为了改善各种网站上Arduino 元器件资料示例太多不方便查找的问题,在这里你只需要搜索传感器名称或者元器件名称就可以了。同时博主会经常发表案例,以供学习参考使用!有需要关注一下哈,真的对你有帮助的!
谢谢关注!未完,待续......,敬请期待!