极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27695|回复: 15

求助!!!6个超声波探测器的问题

[复制链接]
发表于 2012-5-25 19:54:19 | 显示全部楼层 |阅读模式
我要完成6个超声波探测器同时工作,分别探测四周障碍物的位置,然后通过LCD128显示,并且通过语音模块报出障碍物位置···我现在我完成了2个超声波探头的工作,但是装上3个超声波探测器就arduino168就崩了···那个大神可以给小弟我点意见,多个探测器的写法是什么···之后我会把我3个报错的代码公布的
回复

使用道具 举报

发表于 2012-5-25 20:27:25 | 显示全部楼层
用KS101B/KS103 接20个都没问题哦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-26 11:07:39 | 显示全部楼层
wing 发表于 2012-5-25 20:27
用KS101B/KS103 接20个都没问题哦

可以不可以具体详细的说下?我现在只有6个超声波探测器+arduino+LCD,可以实现功能么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-26 11:11:17 | 显示全部楼层
饥渴的 发表于 2012-5-26 11:07
可以不可以具体详细的说下?我现在只有6个超声波探测器+arduino+LCD,可以实现功能么?

http://v.qq.com/boke/page/9/L/V/9LiAb9jSwLV.html那个例子我看过他是一个一个来的,我的要求是几乎同时实现
回复 支持 反对

使用道具 举报

发表于 2012-5-27 00:25:32 | 显示全部楼层
KS101B/KS103 I2C接口,直接输出数字信号.要做到完全同时基本没可能.
一般的做法都是通过轮询实现的,至于模块的探测时间:测频率可达500Hz,即每秒可探测500次,最快探测时间1-2ms.
算上接口延时可能有数十毫秒的时间差
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-27 11:28:05 | 显示全部楼层
wing 发表于 2012-5-27 00:25
KS101B/KS103 I2C接口,直接输出数字信号.要做到完全同时基本没可能.
一般的做法都是通过轮询实现的,至于模 ...

int inputPin=2;
int outputPin=3;
//////////////
int inputPin1=12;
int outputPin1=13;

////////
int inputPin2=0;
int outputPin2=1;
///////
int distance;
int distance1;
int distance2;
void setup()
     {
     Serial.begin(9600);
     //第一个超声波
     pinMode(inputPin,INPUT);
     pinMode(outputPin,OUTPUT);
     //第2个超声波
     
      pinMode(inputPin1,INPUT);
     pinMode(outputPin1,OUTPUT);
     //
      pinMode(inputPin2,INPUT);
     pinMode(outputPin2,OUTPUT);
     
     //小车运动
      pinMode(8,OUTPUT);
      pinMode(9,OUTPUT);
      pinMode(11,OUTPUT);
      pinMode(5,OUTPUT);
      pinMode(6,OUTPUT);
      pinMode(7,OUTPUT);
     }
void loop()
    {
    //第一个超声波
    digitalWrite(outputPin,LOW);
    delayMicroseconds(2);
    digitalWrite(outputPin,HIGH);
    delayMicroseconds(10);
    int distance=pulseIn(inputPin,HIGH);
    distance=distance/58;
    //第二个超声波
    digitalWrite(outputPin1,LOW);
    delayMicroseconds(2);
    digitalWrite(outputPin1,HIGH);
    delayMicroseconds(10);
    distance1=pulseIn(inputPin1,HIGH);
    distance1=distance1/58;
   //第3个超声波
    digitalWrite(outputPin2,LOW);
    delayMicroseconds(2);
    digitalWrite(outputPin2,HIGH);
    delayMicroseconds(10);
    distance2=pulseIn(inputPin2,HIGH);
    distance2=distance2/58;
   
    //
    //Serial.print("distance = ");
    //Serial.println(distance);
    //
    Serial.print(",distance = ");
  Serial.println(distance1);
    //
    Serial.print(",distance = ");
    Serial.println(distance2);
     
     
     Goahead();
     delay(20);
     if( distance >= 50)
    {
   // digitalWrite(ledpin,HIGH);
    // delay(100);
     Goahead();
    }
    else
    {
   // digitalWrite(ledpin,LOW);
     //delay(100);
    Turn_left();
     }
   
   if( distance1 >= 50 )
    {
     // digitalWrite(ledpin,HIGH);
    // delay(100);
    // Goahead();
    }
    else
    {
   // digitalWrite(ledpin,LOW);
     //delay(100);
     //Stop();
     Turn_right();
    }  
   
   
     if( distance2 >= 50)
        {
        // digitalWrite(ledpin,HIGH);
        // delay(100);
       Goahead();   
        }
    else
       {
         // digitalWrite(ledpin,LOW);
        //delay(100);
         Stop();
      }
   
   
    }
   
  ///////////////////////////////  
void Goahead()
     {
     analogWrite(5,145);
     digitalWrite(6,HIGH);
     digitalWrite(7,LOW);
     analogWrite(11,160);
     digitalWrite(8,HIGH);
     digitalWrite(9,LOW);
    }


void Stop()//停止程序
     {
    digitalWrite(6,HIGH);
    digitalWrite(7,HIGH);
    digitalWrite(8,HIGH);
    digitalWrite(9,HIGH);
    }  
  
void Turn_right()//右转
    {
    analogWrite(5,165);
    digitalWrite(6,LOW);
    digitalWrite(7,HIGH);
    analogWrite(11,140);
    digitalWrite(8,HIGH);
   digitalWrite(9,LOW);
   }

void Turn_left()
   {
    analogWrite(5,165);
    digitalWrite(6,HIGH);
    digitalWrite(7,LOW);
    analogWrite(11,160);
    digitalWrite(8,LOW);
    digitalWrite(9,HIGH);
   
   }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-27 11:29:09 | 显示全部楼层
wing 发表于 2012-5-27 00:25
KS101B/KS103 I2C接口,直接输出数字信号.要做到完全同时基本没可能.
一般的做法都是通过轮询实现的,至于模 ...

这个我的程序 inputPin和outputpin是连上超声波的,你帮我看下怎么用轮询
回复 支持 反对

使用道具 举报

发表于 2012-5-27 14:35:02 | 显示全部楼层
从程序来看,您用的应该是属于性价格比高的模块.
这种模块是通过反应时间来判断距离的,和KS101B/KS103 的用法是完全不同的.KS101B/KS103 可以通过IIC直接读取寄存器上的值,而且也不需要占用太多的针脚.问题是成本可能会有所增加.

其实这种模块的程序论坛里也有,稍后可以整一份给您
回复 支持 反对

使用道具 举报

发表于 2012-5-27 15:15:38 | 显示全部楼层
本帖最后由 wing 于 2012-5-27 16:01 编辑

超声波传感器,有四个脚:5v电源脚(Vcc),触发控制端(Trig),接收端(Echo),地端(GND)
这种是高性价比模块的结构,从程序上看我估计您是用这种.
下面的程序也是根据这种模块来写的.要注意的是:我之前提到的KS101B/KS103 是完全不一样,所以下面的程序是不适用于 KS10xx的.

先来做个简单的
假设有两个超声波模块:01 和02,
01 Trig -> D2
01 Echo->D3
02 Trig -> D4
02 Echo->D5
程序的功能就是定时去轮询这两个模快测出的距离,并在串口输出结果


const int TP01 = 2;
const int EP01 = 3;

const int TP02 = 4;
const int EP02 = 5;

float cm;
int m_no;

void setup()
{
Serial.begin(9600);

pinMode(TP01 OUTPUT);
pinMode(TP02 OUTPUT);

pinMode(EP01, INPUT);
pinMode(EP02, INPUT);

m_no=0;
}
void loop()
{


digitalWrite((m_no*2+2), LOW);
delayMicroseconds(2);
digitalWrite((m_no*2+2), HIGH);
delayMicroseconds(10);
digitalWrite((m_no*2+2), LOW);

cm = pulseIn((m_no*2+3), HIGH) / 58.0;
cm = (int(cm * 100.0)) / 100.0;

Serial.print("distance");
Serial.print(m_no);
Serial.print("=");
Serial.print(cm);
Serial.print("cm");
Serial.println();

m_no=m_no+1;
if (m_no>1){m_no=0;}

delay(1000);
}
回复 支持 反对

使用道具 举报

发表于 2012-5-27 16:01:02 | 显示全部楼层
如果两个成功的话可以扩展下试试6个的:

假设有6个超声波模块:01~06,
01 Trig -> D2
01 Echo->D3
02 Trig -> D4
02 Echo->D5
03Trig -> D6
03 Echo->D7
04 Trig -> D8
04 Echo->D9
05 Trig -> D10
05 Echo->D11
06 Trig -> D12
06 Echo->D13
程序的功能就是定时去轮询这6个模快测出的距离,并在串口输出结果
现在D0~D13都接上了 , 问题也来了:arduino D13一般是LED脚,它串联了一个电阻(如果我没记错的话),那么06的返回信号可能会出问题.可以考虑从IC的PB5引线出来.
不过对于我这种只用那些低成本洞洞板自制板的吝啬鬼是没有这个问题的.

写到这里问题可能就比较清晰了,一般的arduino只能用上述接口接这类超声波模块,D0和D1是不能乱用的.当然128和256那些接口会宽松很多,如果快些出due就好了(无限YY中....)


那么主程序基本就不改,只是开头加个接口定义
const int TP01 = 2;
const int EP01 = 3;
const int TP02 = 4;
const int EP02 = 5;
const int TP03 = 6;
const int EP03 = 7;
const int TP04 = 8;
const int EP04 = 9;
const int TP05 = 10;
const int EP05 = 11;
const int TP06 = 12;
const int EP06 = 13;   

float cm;
int m_no;

void setup()
{
Serial.begin(9600);

pinMode(TP01 OUTPUT);
pinMode(TP02 OUTPUT);
pinMode(TP03 OUTPUT);
pinMode(TP04 OUTPUT);
pinMode(TP05 OUTPUT);
pinMode(TP06 OUTPUT);

pinMode(EP01, INPUT);
pinMode(EP02, INPUT);
pinMode(EP03, INPUT);
pinMode(EP04, INPUT);
pinMode(EP05, INPUT);
pinMode(EP06, INPUT);

m_no=0;
}
void loop()
{
digitalWrite((m_no*2+2), LOW);
delayMicroseconds(2);
digitalWrite((m_no*2+2), HIGH);
delayMicroseconds(10);
digitalWrite((m_no*2+2), LOW);

cm = pulseIn((m_no*2+3), HIGH) / 58.0;
cm = (int(cm * 100.0)) / 100.0;

Serial.print("distance");
Serial.print(m_no);
Serial.print("=");
Serial.print(cm);
Serial.print("cm");
Serial.println();

m_no=m_no+1;
if (m_no>5){m_no=0;}

delay(1000);  
//这里每个模块间会有1秒的延时, 如果嫌太长可以适当减少  (唯一的问题是要自己去试什么叫做"适当",真是一个恶心的词)
}

我想方法就是这样了,但是我也没试过同时用6个这类型的模块.从接线的角度来说还是用KS101B/KS103 简单,只占用2个口
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-27 16:18:53 | 显示全部楼层
wing 发表于 2012-5-27 16:01
如果两个成功的话可以扩展下试试6个的:

假设有6个超声波模块:01~06,

谢谢,我现在在考虑模拟口当数字口用,我在网上看到模拟口1=数字口14,模拟口2=数字口15以此类推,不过,我先用你的试验下吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-5-27 16:22:18 | 显示全部楼层
wing 发表于 2012-5-27 16:01
如果两个成功的话可以扩展下试试6个的:

假设有6个超声波模块:01~06,

但是m_no*2+2是什么意思?
回复 支持 反对

使用道具 举报

发表于 2012-5-27 18:14:21 | 显示全部楼层
饥渴的 发表于 2012-5-27 16:22
但是m_no*2+2是什么意思?

接口顺序而已,
如果接线不一样算法也要跟着变,
这样写的代码比较短
回复 支持 反对

使用道具 举报

发表于 2012-6-6 00:50:25 | 显示全部楼层
wing 发表于 2012-5-27 18:14
接口顺序而已,
如果接线不一样算法也要跟着变,
这样写的代码比较短

是很聪明的“轮询”方法,学习了!
回复 支持 反对

使用道具 举报

发表于 2012-6-28 12:22:51 | 显示全部楼层
多个超声波一起使用,建议使用总线接口的,比如IIC,RS485接口的超声波。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-3 16:28 , Processed in 0.039098 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表