Arduino与超声波传感器中级实践篇--三点定位
超声波中级实践篇--三点定位
最近博主发现超声波这个玩意还是挺实用的,因此不慌不忙搞了一个定位的项目,接下来仅供参考!
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.总结
有志者,事竟成!遇到困难不要慌,先把手机掏出来,三铭学长一直伴您同行!
加油!有问题请留言,第二次发博客,技术一般般,嘻嘻嘻,不要见怪,将就看!
下一篇:
iconfont字体图标的使用