前几天帮人测试代码的时候,稍微学习了一下超声波模块,实现了小车测距,快接近障碍物时转弯,否则直行。
先来一张超声波模块的图:
有4个引脚,CVV、GND、TRIGGER、ECHO。前两个是接地、接电源,后面两个就随便选两个IO口接,就好了。
分享一个超声波的库,里面有个NewPing example ,打开上传即可。
在测试的过程中,接线引脚对应的OK,但是出现了0、0、0、0、0的反馈,说明TRIGGER、ECHO没有数据传输。
于是我开始查找问题所在:
第一,超声波坏了
这个可能性很大,手上一共有4块超声波,于是我换了第二个超声波,不行,还是0、0、0,于是换第三块、第四块,都是0、0、0!!!
然后我蒙了,4块都是坏的么?这概率……不会吧!
第二,杜邦线坏了
于是,果断换线,这下,恩,出来数据了,如图:
问题就在杜邦线上面!
解决了超声波问题之后,开始写程序,代码如下: - const int TrigPin = 12;
- const int EchoPin = 11;
- float cm;
- void setup()
- {
- Serial.begin(9600);
- pinMode(TrigPin, OUTPUT);
- pinMode(EchoPin, INPUT);
- }
- void loop()
- {
- digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
- cm = (int(cm * 100.0)) / 100.0; //保留两位小数
- //Serial.print(cm);
- Serial.print("cm");
- Serial.println(cm); //串口打印输出CM
- // delay(50);
-
- if (cm > 10)
- {
- digitalWrite(3, HIGH); //松开电机A的制动
- digitalWrite(4, LOW); //松开电机B的制动
- digitalWrite(5, HIGH); //采用全功率输出
- digitalWrite(6, LOW); //设置方向为正向
-
- }
- if (cm < 10) //小于10厘米就拐右边
- {
- digitalWrite(3, HIGH); //松开电机A的制动
- digitalWrite(4, LOW); //松开电机B的制动
- digitalWrite(5, LOW); //采用全功率输出
- digitalWrite(6, LOW); //设置方向为正向
- Serial.println("guai");
- }
-
- }
复制代码
电机转动的部分,按实际情况写入你的代码。
到此,一个基本的效果就实现了。但是,迷你强大神说过,这种便宜的超声波测距是会因为周围环境的变化而变化的,也就是说程序里面说的10cm,到实际上就不是10cm了……
忽略忽略……O(∩_∩)O哈哈哈~
最后,把测试超声波的库给大家附上, |