您的位置:首页 > 其它

Intel Galileo笔记(七)小小的玩耍之超声波测距

2014-11-04 23:35 204 查看

一,前言

车队终于从襄阳比好了赛,感觉时隔一个月终于回来了,并且考完了该死的生化期中!再次开始研究我的galileo了,因为得知了edison要出来了,我感觉我的重心可以转移到了edison了,很大的原因就是edison是一块核心板,更方便我们开发了,当然我先做一个测距仪先!
至于为什么要做这个小东西呢,因为我想靠超声波去测流速,没错就是空气流速!!感觉是超酷的!
F1上用的是皮托管,就像下面这样的,我觉得我完全可以做一个超声波的!

二,原理

其实是超级简单的,就是一个测距仪,当空气流动的时候,自然距离就变短边长了,当然我想谈的还是使用galileo中碰到的一些问题。

三,问题来了

1.串口模式

我买的模块型号是US-100 ,能工作在两个状态,一个是通过串口通讯,还有一个就是发一个信号,然后自己计时,首先是串口的问题,galileo上的串口分配在arduino ide中还是很神奇的,手册如下:



不难看出,应该有两个串口,那arduino里面改怎么用呢?没错就是这么用:

Serial.println(); //通过USB传到 arduino monitor
Serial1.println(); //IO0,1所对应的串口
Serial2.println();//tty 设备输出

这里又牵涉到一个 galileo 和 galileo gen 2 的区别了,galileo gen 2 是可以使用软串口的(就是你可以任意找两个端口做串口,是不是很酷!),你可以在例子里面看到 software serial,当选择目标板子为 galileo的时候会出错而gen 2 就不会,这点我也很困惑,照理来说不应该啊??
其他也就没什么问题了,下面贴上我的代码:

/*
BY DIG
*/
unsigned int HighLen = 0;
unsigned int LowLen  = 0;
unsigned int Len_mm  = 0;
int temp=0;
void setup()
{
Serial.begin(9600);
Serial1.begin(9600);
Serial.println("Ultrasonic sensor:");
}
void loop() {
Serial1.write(0X55); // 发送0X55,触发US-100开始测距
delay(500);          //延时500毫秒
HighLen = Serial1.read();                   //距离的高字节
LowLen  = Serial1.read();                   //距离的低字节
Len_mm  = HighLen*256 + LowLen;             //计算距离值
Serial1.write(0X50); // 发送0X55,触发US-100开始测距
delay(10);          //延时500毫秒
temp = Serial1.read();                   //距离的高字节
Len_mm  = HighLen*256 + LowLen;             //计算距离值
Serial.print("Present Length is: ");   //输出结果至串口监视器
Serial.print(Len_mm, DEC);            //输出结果至串口监视器
Serial.println("mm");                  //输出结果至串口监视器
Serial.print("Temperature is: ");   //输出结果至串口监视器
Serial.print(temp-45, DEC);            //输出结果至串口监视器
Serial.println("C");                  //输出结果至串口监视器
delay(10);                                     //等待500ms*/
}


2.触发模式

说实话,这一步我也是醉了,直接贴代码:
/*
BY DIG
*/
const int TrigPin = 4;
const int EchoPin = 3;
float distance;
void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
Serial.println("Ultrasonic sensor:");
}
void loop()
{
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
distance = pulseIn(EchoPin, HIGH);
Serial.print(distance);
Serial.print("cm");
Serial.println(distance);
}

这段代码是完全正确的,但是在galileo上一直显示0cm的,以为看手册:



记住是有上拉电阻的!也就是一直是高电平,谈何触发呢?因此,实际电路上应该有个电阻下拉的应该就ok了!
正是这个问题,我看了pulsein半天!!

四,总结

虽然是个比较简单的东西,但是还是有很多的问题,最主要还是不看手册,不看文档!
其次我想说一个问题就是,很多人都要弄C++编译,其实直接用arduino ide 就行了,因为他的原理就是一个交叉C++编译器!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: