“SKU:RB-02S103 復(fù)眼傳感器”的版本間的差異

來自ALSROBOT WiKi
跳轉(zhuǎn)至: 導(dǎo)航、 搜索
?產(chǎn)品參數(shù)
第7行: 第7行:
  
 
==產(chǎn)品參數(shù)==
 
==產(chǎn)品參數(shù)==
?
 
 
===基本參數(shù)===
 
===基本參數(shù)===
 
#品名  紅外線復(fù)眼傳感器<br/>
 
#品名  紅外線復(fù)眼傳感器<br/>
第32行: 第31行:
  
  
?
===使用方法===
+
==使用方法==
?
1、連接圖 <br/>
+
===example1_Arduino===
?
[[文件:02S10301.png|700px|縮略圖|居中]]
+
* 主要硬件
 +
:Arduino UNO 控制器
 +
:復(fù)眼傳感器
 +
:杜邦線
 +
:USB 數(shù)據(jù)線
  
?
2、例子程序
+
* 硬件連接 <br/>
?
<pre style='color:blue'>#include "Wire.h"
+
[[文件:02S10301.png|700px|縮略圖|居中]]
?
#include <Servo.h>
+
  
 +
* 示例程序
 +
<pre style='color:blue'>
 +
#include <Wire.h>
 
#define PCF8591 (0x90 >> 1) // I2C bus address  
 
#define PCF8591 (0x90 >> 1) // I2C bus address  
 +
 
byte value0, value1, value2, value3;  
 
byte value0, value1, value2, value3;  
?
 
?
Servo jjdyz_shang;   
 
?
Servo jjdyz_xia;   
 
?
Servo jjdyz_zhong; 
 
?
Servo myservo;  //創(chuàng)建一個舵機控制對象
 
?
 
?
//const int buttonPin = A0;    // 定義紅外傳感器的接收引腳為模擬A0引腳
 
?
//int buttonState = 0;          // 定義紅外傳感器的狀態(tài)緩存
 
?
 
?
//定義每個舵機的旋轉(zhuǎn)角度的緩存值
 
?
int pos=0;                   
 
?
int pos1=0;
 
?
int pos2=0;
 
?
 
?
int gongji = 0;                //定義一個是否處于攻擊狀態(tài)的標(biāo)志緩存
 
?
 
?
void jjdyz()
 
?
{
 
?
  if(value0<2&&value1>value0&&value2>value0&&value3>value0)
 
?
  {   
 
?
      if(gongji == 1)            //處于攻擊狀態(tài)時,但敵人走了,慢慢恢復(fù)到初始位置
 
?
      {
 
?
          for(pos = 40; pos <= 88; pos += 1)  //上面的舵機恢復(fù)初始位置
 
?
          {
 
?
              jjdyz_shang.write(pos); 
 
?
              delay(300);
 
?
          }
 
?
          gongji = 0;                          //解除攻擊狀態(tài)
 
?
      }
 
?
  }
 
?
  if (value2<2&&value1>value2&&value0>value2&&value3>value2)      //檢測到前方有獵物,進(jìn)行攻擊,(紅外傳感器返回低電平)
 
?
  {
 
?
      jjdyz_shang.write(70);
 
?
      delay(200);
 
?
      jjdyz_xia.write(88);
 
?
      delay(200);
 
?
      jjdyz_zhong.write(40);
 
?
      delay(200);
 
?
      gongji = 1;                //設(shè)置攻擊狀態(tài)緩存為正在攻擊
 
?
  }
 
?
  if (value1<2&&value0>value1&&value2>value1&&value3>value1)
 
?
  {
 
?
      for(pos1 = 88; pos1 < 160; pos1 += 1)  // 從0度到180度運動
 
?
      {                                                    // 每次步進(jìn)一度
 
?
        jjdyz_xia.write(pos1);        // 指定舵機轉(zhuǎn)向的角度
 
?
        delay(15);                      // 等待15ms讓舵機到達(dá)指定位置
 
?
      } 
 
?
      for(pos1 = 160; pos1>=88; pos1-=1)  //從180度到0度運動 
 
?
      {                               
 
?
        jjdyz_xia.write(pos1);        // 指定舵機轉(zhuǎn)向的角度
 
?
        delay(15);                        // 等待15ms讓舵機到達(dá)指定位置
 
?
      } 
 
?
  }
 
?
  if (value3<2&&value0>value3&&value0>value3&&value2>value3)
 
?
  {
 
?
        for(pos1 = 88; pos1>=10; pos1-=1)  //從180度到0度運動 
 
?
      {                               
 
?
        jjdyz_xia.write(pos1);        // 指定舵機轉(zhuǎn)向的角度
 
?
        delay(15);                        // 等待15ms讓舵機到達(dá)指定位置
 
?
      } 
 
?
      for(pos1 = 10; pos1 < 88; pos1 += 1)  // 從0度到180度運動
 
?
      {                                                    // 每次步進(jìn)一度
 
?
        jjdyz_xia.write(pos1);        // 指定舵機轉(zhuǎn)向的角度
 
?
        delay(15);                      // 等待15ms讓舵機到達(dá)指定位置
 
?
      }   
 
?
  }
 
?
  else
 
?
  {
 
?
      jjdyz_shang.write(88);
 
?
      delay(15);
 
?
      jjdyz_xia.write(88);
 
?
      delay(15);
 
?
      jjdyz_zhong.write(88);
 
?
      delay(15);
 
?
  }
 
?
}
 
  
 
void readvalues(){  
 
void readvalues(){  
 
   Wire.beginTransmission(PCF8591); // wake up PCF8591  
 
   Wire.beginTransmission(PCF8591); // wake up PCF8591  
?
   Wire.write(0x04); // control byte - read ADC0 then auto-increment
+
   Wire.write(0x04);  
?
   Wire.endTransmission(); // end tranmission
+
   Wire.endTransmission();  
 
   Wire.requestFrom(PCF8591, 5);  
 
   Wire.requestFrom(PCF8591, 5);  
 +
  value0=Wire.read();
 
   value0=Wire.read();  //上  
 
   value0=Wire.read();  //上  
?
  value0=Wire.read();  //上
+
   value1=Wire.read();  //右  
?
   value1=Wire.read();  // 右  
+
 
   value2=Wire.read();  //下  
 
   value2=Wire.read();  //下  
 
   value3=Wire.read();  //左  
 
   value3=Wire.read();  //左  
?
   Serial.print(value0); Serial.print(" ");  
+
   Serial.print("value0= "); Serial.print(value0);Serial.print("\t");
?
   Serial.print(value1); Serial.print(" ");  
+
   Serial.print("value1= "); Serial.print(value1);Serial.print("\t");
?
   Serial.print(value2); Serial.print(" ");  
+
   Serial.print("value2= "); Serial.print(value2);Serial.print("\t");
?
   Serial.print(value3); Serial.print(" ");  
+
   Serial.print("value3= "); Serial.print(value3);Serial.print("\t");
 
   Serial.println();   
 
   Serial.println();   
 
}  
 
}  
第139行: 第69行:
 
{  
 
{  
 
  Wire.begin();  
 
  Wire.begin();  
?
  gongji = 0; 
+
  Serial.begin(9600);  
?
jjdyz_shang.attach(10);          //上面的舵機引腳為2
+
?
jjdyz_xia.attach(6);        //下面的舵機引腳為4
+
?
jjdyz_zhong.attach(7);        // 中間的舵機引腳為3
+
?
//三路舵機初始化
+
?
jjdyz_shang.write(88);
+
?
delay(15);
+
?
jjdyz_xia.write(88);
+
?
delay(15);
+
?
jjdyz_zhong.write(88);
+
?
delay(15);
+
?
Serial.begin(9600);  
+
 
}  
 
}  
 
void loop()  
 
void loop()  
 
{  
 
{  
 
   readvalues();  
 
   readvalues();  
?
  jjdyz();
+
}
?
}</pre>
+
</pre>
  
?
說明:通過串口監(jiān)視器,即可讀取傳感器返回的數(shù)據(jù)。<br/>
+
* 程序效果
 +
通過串口監(jiān)視器,即可讀取傳感器返回的數(shù)據(jù)。<br/>
 +
 
 +
===example2_Arduino===
 +
* 主要硬件
 +
:Arduino UNO 控制器
 +
:Motor Driver Shield 電機驅(qū)動板
 +
:復(fù)眼傳感器
 +
:杜邦線
 +
:USB 數(shù)據(jù)線
 +
:二自由度云臺
 +
 
 +
* 硬件連接
 +
D5 - Servo1
 +
D10 - Servo2
 +
復(fù)眼 - IIC接口
 +
 
 +
* 示例程序
 +
<pre style='color:blue'>
 +
#include <Servo.h>
 +
#include <Wire.h>
 +
#define PCF8591 (0x90 >> 1)
 +
#define panPin 10
 +
#define tiltPin 5
 +
 
 +
byte LRscalefactor=10; 
 +
byte UDscalefactor=10; 
 +
int distancemax=80;   
 +
int PanZero=90;       
 +
int TiltZero=90;       
 +
int LRmax=170;         
 +
int LRmin=10;         
 +
 
 +
int UDmax=150;         
 +
int UDmin=30;         
 +
 
 +
int pan=PanZero;
 +
int tilt=TiltZero;
 +
int panscale;
 +
int tiltscale;
 +
int panOld;
 +
int tiltOld;
 +
int distance;
 +
int temp;
 +
 
 +
int updown;
 +
int leftright;
 +
 
 +
Servo panLR;
 +
Servo tiltUD;
 +
byte up_value0, right_value1, down_value2, left_value3;
 +
 
 +
void readvalues(){
 +
  Wire.beginTransmission(PCF8591);
 +
  Wire.write(0x04);
 +
  Wire.endTransmission();
 +
  Wire.requestFrom(PCF8591, 5);
 +
  up_value0=Wire.read();
 +
  up_value0=Wire.read();    //上
 +
  right_value1=Wire.read(); //右
 +
  down_value2=Wire.read();  //下
 +
  left_value3=Wire.read();  //左
 +
  distance=(up_value0+right_value1+down_value2+left_value3)/4;
 +
  Serial.print("up_value0= "); Serial.print(up_value0);Serial.print("\t");
 +
  Serial.print("right_value1= "); Serial.print(right_value1);Serial.print("\t");
 +
  Serial.print("down_value2= "); Serial.print(down_value2);Serial.print("\t");
 +
  Serial.print("left_value3= "); Serial.print(left_value3);Serial.print("\t");
 +
  Serial.print("distance= "); Serial.print(distance);Serial.print("\t");
 +
  Serial.println(); 
 +
}
 +
 
 +
void IRfollow()
 +
{
 +
    if (distance<distancemax)
 +
  {
 +
    ;
 +
//    if (pan>PanZero)pan=pan-1;
 +
//    if (pan<PanZero)pan=pan+1;
 +
//    if (tilt>TiltZero)tilt=tilt-1;
 +
//    if (tilt<TiltZero)tilt=tilt+1;
 +
  }
 +
  else
 +
  {
 +
    panscale=(right_value1+left_value3)*LRscalefactor/10;
 +
    tiltscale=(up_value0+down_value2)*UDscalefactor/10;
 +
 
 +
    if (left_value3>right_value1)
 +
    {
 +
      leftright=(left_value3-right_value1)*15/panscale;
 +
      pan=pan-leftright;
 +
    }
 +
 
 +
    if (left_value3<right_value1)
 +
    {
 +
      leftright=(right_value1-left_value3)*15/panscale;
 +
      pan=pan+leftright;
 +
    }
 +
 
 +
    if (up_value0>down_value2)
 +
    {
 +
      updown=(up_value0-down_value2)*15/tiltscale;
 +
      tilt=tilt-updown;
 +
    }
 +
 
 +
    if (down_value2>up_value0)
 +
    {
 +
      updown=(down_value2-up_value0)*15/tiltscale;
 +
      tilt=tilt+updown;
 +
    }
 +
 
 +
    panOld=pan;
 +
    tiltOld=tilt;
 +
    if (pan<LRmin) pan=LRmin;
 +
    if (pan>LRmax) pan=LRmax;
 +
    if (tilt<UDmin)tilt=UDmin;
 +
    if (tilt>UDmax)tilt=UDmax;
 +
  }
 +
  }
 +
 
 +
void setup()
 +
{
 +
Wire.begin();
 +
Serial.begin(9600);
 +
panLR.attach(panPin);
 +
panLR.write(PanZero);
 +
tiltUD.attach(tiltPin);
 +
tiltUD.write(TiltZero);
 +
}
 +
 
 +
void loop()
 +
{
 +
  panLR.write(pan);
 +
  tiltUD.write(tilt);
 +
  readvalues();
 +
  IRfollow();
 +
}
 +
</pre>
 +
* 程序效果
  
 
==產(chǎn)品相關(guān)推薦==
 
==產(chǎn)品相關(guān)推薦==

2018年9月28日 (五) 11:07的版本

02S10300.png


目錄

產(chǎn)品概述

復(fù)眼傳感是奧松機器人推出的復(fù)眼傳感器由許多對紅外線敏感的晶體管和發(fā)光二極管組成。它可以追蹤20厘米范圍內(nèi)物體的移動。盡管傳感器是一個整體,但是你依然可以讀取到每一個紅外線(IR)光敏晶體管的信息。復(fù)眼傳感器采用IIC通訊方式,數(shù)據(jù)傳輸更加簡便。
校正周圍光線是通過關(guān)閉IR LED和比較數(shù)值完成的。如果要改善從復(fù)眼中讀取的數(shù)值,你必須要進(jìn)行校準(zhǔn)。最好等到晚上當(dāng)IR光線不存在時進(jìn)行。注意紅外線可以穿過關(guān)閉的百合窗,所以如果你不想等到晚上,可以去地下室,或者是沒有窗戶的房間,這樣就可以測量數(shù)值了。將一張紙置于傳感器的前方(約20厘米遠(yuǎn)),觀察每支引腳的數(shù)值差異。使用紙張時數(shù)值差異不大(+/- 100)。如果某個數(shù)值過高,可以使用不透明的膠帶或熱收縮膜阻擋部分紅外線。如果數(shù)值過低,則阻擋一部分分散到其他傳感器上的紅外線。

產(chǎn)品參數(shù)

基本參數(shù)

  1. 品名 紅外線復(fù)眼傳感器
  2. 貨號 RB-02S103
  3. 品牌 AlsRobot
  4. 產(chǎn)地 哈爾濱
  5. 尺寸 50mm×48mm
  6. 重量 9g
  7. 包裝 防靜電包裝
  8. 固定孔 M3*4個

電氣參數(shù)

  1. 產(chǎn)品類型:數(shù)字傳感器
  2. 接口類型:4P防插反接口
  3. 信號類型:IIC數(shù)字信號
  4. 工作電壓:3.0V~5.0V
  5. 工作電流:100mA
  6. 引腳定義:+ 電源正;- 電源負(fù);SDA IIC數(shù)據(jù)引腳;SCL IIC時鐘引腳
  7. 連接線: 4P 傳感器連接線
  8. 檢測范圍:0~20cm
  9. 工作溫度:-20℃~70℃
  10. 測試范圍:上、下、左、右輸出四路模擬值范圍(0-255)
  11. 固定孔:M3*4個
  12. 產(chǎn)品尺寸(mm):50mm*48mm


使用方法

example1_Arduino

  • 主要硬件
Arduino UNO 控制器
復(fù)眼傳感器
杜邦線
USB 數(shù)據(jù)線
  • 硬件連接
02S10301.png
  • 示例程序
#include <Wire.h> 
#define PCF8591 (0x90 >> 1) // I2C bus address 

byte value0, value1, value2, value3; 

void readvalues(){ 
  Wire.beginTransmission(PCF8591); // wake up PCF8591 
  Wire.write(0x04); 
  Wire.endTransmission(); 
  Wire.requestFrom(PCF8591, 5); 
  value0=Wire.read();
  value0=Wire.read();   //上 
  value1=Wire.read();   //右 
  value2=Wire.read();   //下 
  value3=Wire.read();   //左 
  Serial.print("value0= "); Serial.print(value0);Serial.print("\t");
  Serial.print("value1= "); Serial.print(value1);Serial.print("\t");
  Serial.print("value2= "); Serial.print(value2);Serial.print("\t");
  Serial.print("value3= "); Serial.print(value3);Serial.print("\t");
  Serial.println();   
} 

void setup() 
{ 
 Wire.begin(); 
 Serial.begin(9600); 
} 
void loop() 
{ 
   readvalues(); 
}
  • 程序效果

通過串口監(jiān)視器,即可讀取傳感器返回的數(shù)據(jù)。

example2_Arduino

  • 主要硬件
Arduino UNO 控制器
Motor Driver Shield 電機驅(qū)動板
復(fù)眼傳感器
杜邦線
USB 數(shù)據(jù)線
二自由度云臺
  • 硬件連接

D5 - Servo1 D10 - Servo2 復(fù)眼 - IIC接口

  • 示例程序
#include <Servo.h>
#include <Wire.h> 
#define PCF8591 (0x90 >> 1)
#define panPin 10
#define tiltPin 5 

byte LRscalefactor=10;  
byte UDscalefactor=10;  
int distancemax=80;    
int PanZero=90;        
int TiltZero=90;         
int LRmax=170;          
int LRmin=10;           

int UDmax=150;          
int UDmin=30;           

int pan=PanZero;
int tilt=TiltZero;
int panscale;
int tiltscale;
int panOld;
int tiltOld;
int distance;
int temp;

int updown;
int leftright;

Servo panLR;
Servo tiltUD;
byte up_value0, right_value1, down_value2, left_value3; 

void readvalues(){ 
  Wire.beginTransmission(PCF8591);
  Wire.write(0x04); 
  Wire.endTransmission(); 
  Wire.requestFrom(PCF8591, 5); 
  up_value0=Wire.read();
  up_value0=Wire.read();    //上 
  right_value1=Wire.read(); //右 
  down_value2=Wire.read();  //下 
  left_value3=Wire.read();  //左 
  distance=(up_value0+right_value1+down_value2+left_value3)/4;
  Serial.print("up_value0= "); Serial.print(up_value0);Serial.print("\t");
  Serial.print("right_value1= "); Serial.print(right_value1);Serial.print("\t");
  Serial.print("down_value2= "); Serial.print(down_value2);Serial.print("\t");
  Serial.print("left_value3= "); Serial.print(left_value3);Serial.print("\t");
  Serial.print("distance= "); Serial.print(distance);Serial.print("\t");
  Serial.println();   
} 

void IRfollow()
{
    if (distance<distancemax)
  {
    ;
//    if (pan>PanZero)pan=pan-1;
//    if (pan<PanZero)pan=pan+1;
//    if (tilt>TiltZero)tilt=tilt-1;
//    if (tilt<TiltZero)tilt=tilt+1;
  }
  else
  {
    panscale=(right_value1+left_value3)*LRscalefactor/10;
    tiltscale=(up_value0+down_value2)*UDscalefactor/10; 

    if (left_value3>right_value1)
    {
      leftright=(left_value3-right_value1)*15/panscale;
      pan=pan-leftright;
    }

    if (left_value3<right_value1)
    {
      leftright=(right_value1-left_value3)*15/panscale;
      pan=pan+leftright;
    }

    if (up_value0>down_value2)
    {
      updown=(up_value0-down_value2)*15/tiltscale;
      tilt=tilt-updown;
    }

    if (down_value2>up_value0)
    {
      updown=(down_value2-up_value0)*15/tiltscale;
      tilt=tilt+updown;
    }

    panOld=pan;
    tiltOld=tilt;
    if (pan<LRmin) pan=LRmin;
    if (pan>LRmax) pan=LRmax;
    if (tilt<UDmin)tilt=UDmin;
    if (tilt>UDmax)tilt=UDmax;
  }
  }

void setup() 
{ 
 Wire.begin(); 
 Serial.begin(9600); 
 panLR.attach(panPin);
 panLR.write(PanZero);
 tiltUD.attach(tiltPin);
 tiltUD.write(TiltZero);
} 

void loop() 
{
  panLR.write(pan);
  tiltUD.write(tilt); 
  readvalues(); 
  IRfollow();
}
  • 程序效果

產(chǎn)品相關(guān)推薦

Erweima.png

購買地址

復(fù)眼傳感器

相關(guān)學(xué)習(xí)資料

奧松機器人技術(shù)論壇