Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 4837|回復: 10
打印 上一主題 下一主題

超音波URM-04抓值一問

[複製鏈接]
跳轉到指定樓層
1#
發表於 2011-10-17 22:28:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
板上的各位先進你們好

小弟我這學期因為老闆的要求開始學Arduino,老闆便丟了一套
FB004 二輪式獨立馬達移動平臺這個模組給我玩目前問題來了,關於裡面的紅外線,碰撞板我已經懂得如何抓值測距來避障

但是裡面附的超音坡模組把我難倒了,總共有三個URM-04串聯起來
最後拉一條出來接到他付的擴充板

可不可以請板上的神人們大概教我一下如何下手
如何抓取到他們三個超音波的值呢?
2#
發表於 2011-10-18 17:42:44 | 只看該作者
回復 1# phfd2013

你的URM-04是否如下圖接到他付的這種擴充板?

=============
你的擴充板是否如下圖與arduino做結合?

=================================
是的話,這裡有sample code,(不過他好像是接六個URM-04)你一樣拿來試用看看:
//Connect the URM04 with the I/O Expansion Shield V5 (SKU:DFR0088) For Arduino
//
#include <Metro.h>
int EN = 2;
Metro TriggerMetro = Metro(120,true); //100
Metro readurmMetro = Metro(20,true);
byte cmdst[10];
int address[6]={0x11,0x12,0x13,0x14,0x15,0x16};
int URM[6];
byte delivered=0x00;
void setup()
{
  pinMode(EN, OUTPUT);
  Serial.begin(19200);
  cmdst[0]=0x55;
  cmdst[1]=0xaa;
}
int tmp=0;
boolean sent=true;
void loop()
{
  if(TriggerMetro.check()==1)
  {
    digitalWrite(EN, HIGH);
    for(int i=0;i<4;i++)
    {
      cmdst[2]=address;
      Trigger();
      delay(2);
    }
    readurmMetro.interval(40);//25
    delivered=0x00;
    digitalWrite(EN, LOW);
  }
  if(int(delivered)<4&&readurmMetro.check()==1)
  {
    getds(delivered);
    readurmMetro.interval(18);//16
    delivered+=0x01;
  }
  
}
byte cmdrd[10];
void getds(byte num)
{
  digitalWrite(EN, HIGH);
  cmdst[2]=address[int(num)];
  Readds();
  digitalWrite(EN, LOW);
  serial_read();
}
void Trigger()
{
  cmdst[3]=0x00;
  cmdst[4]=0x01;
  TransCode();
}
void TransCode()
{
  cmdst[5]=cmdst[0]+cmdst[1]+cmdst[2]+cmdst[3]+cmdst[4];
  for(int j=0;j<6;j++)
  Serial.print(cmdst[j],BYTE);
}
void Readtmp()
{
  cmdst[3]=0x00;
  cmdst[4]=0x03;
  TransCode();
  delay(1);
}
void Readds()
{
  cmdst[3]=0x00;
  cmdst[4]=0x02;
  TransCode();
  delay(1);
  //delayMicroseconds(500);
}
int S_comd[10];
void serial_read()
{
  if(Serial.available())
  {
    int sum=0;
    int i=0;
    //int j=0;
    boolean flag=true;
    while(flag)
    {
      cmdrd=Serial.read();
      if(cmdrd==0xaa&&cmdrd[i-1]==0x55)
      {
        S_comd[0]=i;
        //j++;
      }
      if(cmdrd!=0xff)
      {
        //Serial.print(cmdrd);
        i++;
      }
      if(i>7)
      flag=false;
    }
    for(int h=0;h<7;h++)
    sum+=cmdrd[h];
    if(byte(sum)==cmdrd[7])
    {
      int num=S_comd[0]+1;
      if(cmdrd[num+2]==0x02&&cmdrd[num+1]==0x02)
      {
        switch (cmdrd[num])
        {
          case 0x11:
          URM[0]=cmdrd[num+3]*256+cmdrd[num+4];
          //Serial.print("0x11:");
          //Serial.println(URM[0]);
          break;
        
          case 0x12:
          URM[1]=cmdrd[num+3]*256+cmdrd[num+4];
          //Serial.print("0x12:");
          //Serial.println(URM[1]);
          break;
         
          case 0x13:
          URM[2]=cmdrd[num+3]*256+cmdrd[num+4];
          //Serial.print("0x13:");
          //Serial.println(URM[2]);
          break;
         
          case 0x14:
          URM[3]=cmdrd[num+3]*256+cmdrd[num+4];
          //Serial.print("0x14:");
          //Serial.println(URM[3]);
          break;
         
          default:
          break;
        }
        //delivered+=0x01;
      }
    }
  }
}
3#
 樓主| 發表於 2011-10-18 18:58:47 | 只看該作者
本帖最後由 phfd2013 於 2011-10-18 19:09 編輯

沒錯,就是類似這樣子的接法(左邊是主要的板子,右邊是擴充)

可以請問sample code是在哪裡取得的嗎?
真的非常謝謝你的幫忙,我立刻試試看

我剛剛debug一下,但是顯示"Metro do not name a type"
可以請問為什麼嗎?
4#
 樓主| 發表於 2011-10-18 20:50:45 | 只看該作者
不好意思,上面的問題我解決了
可是...抓出來的值都是0
5#
發表於 2011-10-19 16:04:29 | 只看該作者
回復 4# phfd2013


    你先測試一個就好,
首先你要先Trigger啟動它,
在下面的程式upload之後,緊盯著 URM04看它led有沒有閃
#include <Metro.h>
int EN = 2;
Metro TriggerMetro = Metro(120,true); //100
Metro readurmMetro = Metro(20,true);
byte cmdst[10];
int address[6]={0x11,0x12,0x13,0x14,0x15,0x16};
int URM[6];
byte delivered=0x00;
void setup()
{
  pinMode(EN, OUTPUT);
  Serial.begin(19200);
  cmdst[0]=0x55;
  cmdst[1]=0xaa;
}
void loop()
{
  if(TriggerMetro.check()==1)
  {
    digitalWrite(EN, HIGH);
    for(int i=0;i<4;i++)
    {
      cmdst[2]=address;
      Trigger();
      delay(2);
    }
    readurmMetro.interval(40);//25
    delivered=0x00;
    digitalWrite(EN, LOW);
  }
}

void Trigger()
{
  cmdst[3]=0x00;
  cmdst[4]=0x01;
  TransCode();
}
void TransCode()
{
  cmdst[5]=cmdst[0]+cmdst[1]+cmdst[2]+cmdst[3]+cmdst[4];
  for(int j=0;j<6;j++)
  Serial.print(cmdst[j],BYTE);
}
6#
 樓主| 發表於 2011-10-24 17:42:38 | 只看該作者
謝謝大大的分享
我已經有嘗試過.但是有一行有ERROR
cmdst[2]=address;
他顯示invalid conversion from 'int*' to 'byte'
可以請問怎麼解決嗎?
7#
發表於 2011-10-24 18:07:37 | 只看該作者
本帖最後由 vegewell 於 2011-10-24 18:10 編輯

回復 6# phfd2013
這一行應該是:
cmdst[2]=address[ i ];
我怎麼會copy成那樣,???
8#
 樓主| 發表於 2011-10-25 10:44:43 | 只看該作者
感謝大大(終於有一點點進展了Q_Q)  
他真的有觸發道開始亮燈了
接下來是抓距離部分的話
也是照這樣子的寫法嗎?
9#
發表於 2011-10-25 21:52:29 | 只看該作者
本帖最後由 vegewell 於 2011-10-25 22:17 編輯

回復 8# phfd2013

先只連接一個 試試看:
//Connect the URM04 with the I/O Expansion Shield V5 (SKU:DFR0088) For Arduino
//
#include <Metro.h>
int EN = 2;
Metro TriggerMetro = Metro(120,true); //100
Metro readurmMetro = Metro(20,true);
byte cmdst[10];
int address[6]={0x11,0x12,0x13,0x14,0x15,0x16};
int URM[6];
byte delivered=0x00;
void setup()
{
  pinMode(EN, OUTPUT);
  Serial.begin(19200);
  cmdst[0]=0x55;
  cmdst[1]=0xaa;
}
int tmp=0;
boolean sent=true;
void loop()
{
  if(TriggerMetro.check()==1)
  {
    digitalWrite(EN, HIGH);
    for(int i=0;i<4;i++)
    {
      cmdst[2]=address[ i ];
      Trigger();
      delay(2);
    }
    readurmMetro.interval(40);//25
    delivered=0x00;
    digitalWrite(EN, LOW);
  }
  if(int(delivered)<4 && readurmMetro.check()==1)
  {
    getds(delivered);
    readurmMetro.interval(18);//16
    delivered+=0x01;
  }
  
}
byte cmdrd[10];
void getds(byte num)
{
  digitalWrite(EN, HIGH);
  cmdst[2]=address[int(num)];
  Readds();
  digitalWrite(EN, LOW);
  serial_read();
}
void Trigger()
{
  cmdst[3]=0x00;
  cmdst[4]=0x01;
  TransCode();
}
void TransCode()
{
  cmdst[5]=cmdst[0]+cmdst[1]+cmdst[2]+cmdst[3]+cmdst[4];
  for(int j=0;j<6;j++)
  Serial.print(cmdst[j],BYTE);
}
void Readtmp()
{
  cmdst[3]=0x00;
  cmdst[4]=0x03;
  TransCode();
  delay(1);
}
void Readds()
{
  cmdst[3]=0x00;
  cmdst[4]=0x02;
  TransCode();
  delay(1);
  //delayMicroseconds(500);
}
int S_comd[10];
void serial_read()
{
  if(Serial.available())
  {
    int sum=0;
    int i=0;
    //int j=0;
    boolean flag=true;
    while(flag)
    {
      cmdrd[ i ]=Serial.read();
      if(cmdrd[ i ]==0xaa && cmdrd[i-1]==0x55)
      {
        S_comd[0]=i;
        //j++;
      }
      if(cmdrd[ i ]!=0xff)
      {
        //Serial.print(cmdrd[ i ]);
        i++;
      }
      if(i>7)
      flag=false;
    }
    for(int h=0;h<7;h++)
    sum+=cmdrd[h];
    if(byte(sum)==cmdrd[7])
      {
      int num=S_comd[0]+1;
      if(cmdrd[num+2]==0x02 && cmdrd[num+1]==0x02)
        {
          URM[0]=cmdrd[num+3]*256+cmdrd[num+4];
          Serial.print("0x11:");
          Serial.println(URM[0]);
                 
         
        }
        //delivered+=0x01;
      
      }
  }
}
10#
發表於 2011-10-25 21:57:28 | 只看該作者
本帖最後由 vegewell 於 2011-10-25 22:00 編輯

超音波感測器前面差不多一公尺,放個東西看看,
11#
 樓主| 發表於 2011-10-26 14:38:14 | 只看該作者
感謝大大的熱心幫忙
等等回實驗室我會試試看的,感恩Q_Q
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-5-19 01:36 , Processed in 0.418037 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表