Arduino与超声波传感器中级实践篇--三点定位

超声波中级实践篇–三点定位

最近博主发现超声波这个玩意还是挺实用的,因此不慌不忙搞了一个定位的项目,接下来仅供参考!

1. 工作过程

《Arduino与超声波传感器中级实践篇--三点定位》

(每一个位置各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 元器件资料示例太多不方便查找的问题,在这里你只需要搜索传感器名称或者元器件名称就可以了。同时博主会经常发表案例,以供学习参考使用!有需要关注一下哈,真的对你有帮助的!

谢谢关注!未完,待续……,敬请期待!

    原文作者:三铭学长
    原文地址: https://blog.csdn.net/m0_51518878/article/details/109050251
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞