“SKU:RB-02S103 复眼传感器”的版本间的差异

来自ALSROBOT WiKi
跳转至: 导航搜索
产品参数
相关资料
 
(未显示1个用户的7个中间版本)
第7行: 第7行:
  
 
==产品参数==
 
==产品参数==
 
 
===基本参数===
 
===基本参数===
 
#品名  红外线复眼传感器<br/>
 
#品名  红外线复眼传感器<br/>
第32行: 第31行:
  
  
===使用方法===
+
==使用方法==
1、连接图 <br/>
+
===example1_Arduino===
[[文件:02S10301.png|700px|缩略图|居中]]
+
* 主要硬件
 +
:Arduino UNO 控制器
 +
:传感器扩展板 V5.0
 +
:复眼传感器
 +
:4P 传感器连接线
 +
:USB 数据线
  
2、例子程序
+
* 硬件连接 <br/>
<pre style='color:blue'>#include "Wire.h"
+
[[文件:02S103101.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;    
+
void readvalues(){
Servo jjdyz_xia;    
+
  Wire.beginTransmission(PCF8591); // wake up PCF8591
Servo jjdyz_zhong;   
+
  Wire.write(0x04);  
Servo myservo; //创建一个舵机控制对象
+
  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(); 
 +
}
  
//const int buttonPin = A0;     // 定义红外传感器的接收引脚为模拟A0引脚
+
void setup()
//int buttonState = 0;         // 定义红外传感器的状态缓存
+
{
 +
Wire.begin();  
 +
Serial.begin(9600);  
 +
}
 +
void loop()
 +
{
 +
  readvalues();
 +
}
 +
</pre>
  
//定义每个舵机的旋转角度的缓存值
+
* 程序效果
int pos=0;                   
+
通过串口监视器,即可读取传感器返回的数据。<br/>
int pos1=0;
+
int pos2=0;
+
  
int gongji = 0;                //定义一个是否处于攻击状态的标志缓存
+
===example2_Arduino===
 +
* 主要硬件
 +
:Arduino UNO 控制器
 +
:Motor Driver Shield 电机驱动板
 +
:复眼传感器
 +
:杜邦线
 +
:USB 数据线
 +
:二自由度云台
  
void jjdyz()  
+
* 硬件连接
 +
[[文件:02S103102.png|700px|缩略图|居中]]
 +
* 示例程序
 +
<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()  
 
{  
 
{  
  if(value0<2&&value1>value0&&value2>value0&&value3>value0)
+
Wire.begin();  
  {   
+
Serial.begin(9600);  
      if(gongji == 1)            //处于攻击状态时,但敌人走了,慢慢恢复到初始位置
+
panLR.attach(panPin);
      {
+
panLR.write(PanZero);
          for(pos = 40; pos <= 88; pos += 1)  //上面的舵机恢复初始位置
+
  tiltUD.attach(tiltPin);
          {
+
  tiltUD.write(TiltZero);
              jjdyz_shang.write(pos);  
+
              delay(300);
+
          }
+
          gongji = 0;                          //解除攻击状态
+
      }
+
  }
+
  if (value2<2&&value1>value2&&value0>value2&&value3>value2)      //检测到前方有猎物,进行攻击,(红外传感器返回低电平)
+
  {
+
      jjdyz_shang.write(70);  
+
      delay(200);
+
      jjdyz_xia.write(88);  
+
      delay(200);
+
      jjdyz_zhong.write(40);  
+
      delay(200);
+
      gongji = 1;                //设置攻击状态缓存为正在攻击
+
  }
+
  if (value1<2&&value0>value1&&value2>value1&&value3>value1)
+
  {
+
      for(pos1 = 88; pos1 < 160; pos1 += 1) // 从0度到180度运动
+
      {                                                    // 每次步进一度
+
        jjdyz_xia.write(pos1);       // 指定舵机转向的角度
+
        delay(15);                      // 等待15ms让舵机到达指定位置
+
      } 
+
      for(pos1 = 160; pos1>=88; pos1-=1)  //从180度到0度运动 
+
      {                               
+
        jjdyz_xia.write(pos1);        // 指定舵机转向的角度
+
        delay(15);                        // 等待15ms让舵机到达指定位置
+
      } 
+
  }
+
  if (value3<2&&value0>value3&&value0>value3&&value2>value3)
+
  {
+
        for(pos1 = 88; pos1>=10; pos1-=1)  //从180度到0度运动 
+
      {                               
+
        jjdyz_xia.write(pos1);        // 指定舵机转向的角度
+
        delay(15);                        // 等待15ms让舵机到达指定位置
+
      } 
+
      for(pos1 = 10; pos1 < 88; pos1 += 1) // 从0度到180度运动
+
      {                                                    // 每次步进一度
+
        jjdyz_xia.write(pos1);       // 指定舵机转向的角度
+
        delay(15);                      // 等待15ms让舵机到达指定位置
+
      }   
+
  }
+
  else
+
  {
+
      jjdyz_shang.write(88);
+
      delay(15);
+
      jjdyz_xia.write(88);
+
      delay(15);
+
      jjdyz_zhong.write(88);
+
      delay(15);
+
  }
+
 
}  
 
}  
 +
 +
void loop()
 +
{
 +
  panLR.write(pan);
 +
  tiltUD.write(tilt);
 +
  readvalues();
 +
  IRfollow();
 +
}
 +
</pre>
 +
* 程序效果
 +
 +
===example3_Arduino & Processing===
 +
* 主要硬件
 +
:Arduino UNO 控制器
 +
: 传感器扩展板 V5.0
 +
:复眼传感器
 +
:杜邦线
 +
:USB 数据线
 +
 +
* 硬件连接 <br/>
 +
[[文件:02S103101.png|700px|缩略图|居中]]
 +
 +
* 示例程序 -- Processing
 +
<pre style='color:blue'>
 +
import processing.serial.*;   
 +
Serial myPort;               
 +
int sWidth=640, sHeight=640;
 +
float xHairLength = 200;
 +
float xpos, ypos;         
 +
 +
void setup()
 +
{
 +
  size(640,  640);
 +
  println(Serial.list());
 +
  myPort = new Serial(this, Serial.list()[0], 9600);
 +
  smooth();
 +
}
 +
 +
void draw()
 +
{
 +
  background(255);
 +
  ellipse((640/2)+xpos, (640/2)+ypos, 20, 20);
 +
  stroke(0);
 +
  line((sWidth/2)-250, sHeight/2, (sWidth/2)+250, sHeight/2);
 +
  stroke(0);
 +
  line(sWidth/2, (sHeight/2)-250, sWidth/2, (sHeight/2)+250);
 +
}
 +
 +
void serialEvent(Serial myPort)
 +
{
 +
  String myString = myPort.readStringUntil('\n');
 +
  if(myString != null)
 +
  {
 +
    myString = trim(myString);
 +
    int sensors[] = int(split(myString, ','));
 +
  for (int sensorNum = 0; sensorNum < sensors.length; sensorNum++)
 +
  {
 +
      print("Sensor " + sensorNum + ": " + sensors[sensorNum] + "\t");
 +
  }
 +
    println();
 +
  if (sensors.length > 1)
 +
  {
 +
      float left,right,up,down;
 +
      left = map(sensors[3], 0,1000,0,width);
 +
      right = map(sensors[1], 0,1000,0,height); 
 +
      up = map(sensors[0], 0,1000,0,width);
 +
      down = map(sensors[2], 0,1000,0,height);
 +
      xpos=right-left;
 +
      ypos=up-down;
 +
    }
 +
  }
 +
  }
 +
</pre>
 +
 +
* 示例程序 -- arduino
 +
<pre style='color:blue'>
 +
#include <Wire.h>
 +
#define PCF8591 (0x90 >> 1) // I2C bus address
 +
 +
byte value0, value1, value2, value3;
  
 
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(",");
   Serial.print(value1); Serial.print(" ");  
+
   Serial.print(value1);Serial.print(",");
   Serial.print(value2); Serial.print(" ");  
+
   Serial.print(value2);Serial.print(",");
   Serial.print(value3); Serial.print(" ");
+
   Serial.print(value3);
  Serial.println();   
+
  Serial.print("\n");   
 
}  
 
}  
  
第139行: 第304行:
 
{  
 
{  
 
  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>
  
说明:通过串口监视器,即可读取传感器返回的数据。<br/>
+
* 程序效果
 +
[[文件:02S103100.png|600px|缩略图|居中]]
  
==产品相关推荐==
+
==相关资料==
 
[[文件:erweima.png|230px|无框|右]]
 
[[文件:erweima.png|230px|无框|右]]
===购买地址===
+
* 产品资料
[http://www.alsrobot.cn/goods-816.html 复眼传感器]
+
下载链接: https://pan.baidu.com/s/1wPQh9f7bCNVx92ODYYXKug
===相关学习资料===
+
提取码:kgjt
[http://www.makerspace.cn/portal.php 奥松机器人技术论坛]
+
* 产品购买链接:http://www.alsrobot.cn/goods-816.html

2021年7月27日 (二) 17:45的最后版本

02S10300.png


目录

产品概述

复眼传感是奥松机器人推出的复眼传感器由许多对红外线敏感的晶体管和发光二极管组成。它可以追踪20厘米范围内物体的移动。尽管传感器是一个整体,但是你依然可以读取到每一个红外线(IR)光敏晶体管的信息。复眼传感器采用IIC通讯方式,数据传输更加简便。
校正周围光线是通过关闭IR LED和比较数值完成的。如果要改善从复眼中读取的数值,你必须要进行校准。最好等到晚上当IR光线不存在时进行。注意红外线可以穿过关闭的百合窗,所以如果你不想等到晚上,可以去地下室,或者是没有窗户的房间,这样就可以测量数值了。将一张纸置于传感器的前方(约20厘米远),观察每支引脚的数值差异。使用纸张时数值差异不大(+/- 100)。如果某个数值过高,可以使用不透明的胶带或热收缩膜阻挡部分红外线。如果数值过低,则阻挡一部分分散到其他传感器上的红外线。

产品参数

基本参数

  1. 品名 红外线复眼传感器
  2. 货号 RB-02S103
  3. 品牌 AlsRobot
  4. 产地 哈尔滨
  5. 尺寸 50mm×48mm
  6. 重量 9g
  7. 包装 防静电包装
  8. 固定孔 M3*4个

电气参数

  1. 产品类型:数字传感器
  2. 接口类型:4P防插反接口
  3. 信号类型:IIC数字信号
  4. 工作电压:3.0V~5.0V
  5. 工作电流:100mA
  6. 引脚定义:+ 电源正;- 电源负;SDA IIC数据引脚;SCL IIC时钟引脚
  7. 连接线: 4P 传感器连接线
  8. 检测范围:0~20cm
  9. 工作温度:-20℃~70℃
  10. 测试范围:上、下、左、右输出四路模拟值范围(0-255)
  11. 固定孔:M3*4个
  12. 产品尺寸(mm):50mm*48mm


使用方法

example1_Arduino

  • 主要硬件
Arduino UNO 控制器
传感器扩展板 V5.0
复眼传感器
4P 传感器连接线
USB 数据线
  • 硬件连接
02S103101.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(); 
}
  • 程序效果

通过串口监视器,即可读取传感器返回的数据。

example2_Arduino

  • 主要硬件
Arduino UNO 控制器
Motor Driver Shield 电机驱动板
复眼传感器
杜邦线
USB 数据线
二自由度云台
  • 硬件连接
02S103102.png
  • 示例程序
#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();
}
  • 程序效果

example3_Arduino & Processing

  • 主要硬件
Arduino UNO 控制器
传感器扩展板 V5.0
复眼传感器
杜邦线
USB 数据线
  • 硬件连接
02S103101.png
  • 示例程序 -- Processing
import processing.serial.*;     
Serial myPort;                 
int sWidth=640, sHeight=640;
float xHairLength = 200;
float xpos, ypos;           

void setup()
{
  size(640,  640);
  println(Serial.list());
  myPort = new Serial(this, Serial.list()[0], 9600);
  smooth();
}

void draw()
{
  background(255);
  ellipse((640/2)+xpos, (640/2)+ypos, 20, 20);
  stroke(0);
  line((sWidth/2)-250, sHeight/2, (sWidth/2)+250, sHeight/2);
  stroke(0);
  line(sWidth/2, (sHeight/2)-250, sWidth/2, (sHeight/2)+250);
}

void serialEvent(Serial myPort)
{ 
  String myString = myPort.readStringUntil('\n');
  if(myString != null)
  {
    myString = trim(myString);
    int sensors[] = int(split(myString, ','));
  for (int sensorNum = 0; sensorNum < sensors.length; sensorNum++) 
  {
      print("Sensor " + sensorNum + ": " + sensors[sensorNum] + "\t"); 
  }
    println();
  if (sensors.length > 1) 
  {
      float left,right,up,down;
      left = map(sensors[3], 0,1000,0,width);
      right = map(sensors[1], 0,1000,0,height);   
      up = map(sensors[0], 0,1000,0,width);
      down = map(sensors[2], 0,1000,0,height);
      xpos=right-left;
      ypos=up-down;
    }
  }
  }
  • 示例程序 -- arduino
#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(",");
  Serial.print(value1);Serial.print(",");
  Serial.print(value2);Serial.print(",");
  Serial.print(value3);
  Serial.print("\n");   
} 

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

相关资料

Erweima.png
  • 产品资料

下载链接: https://pan.baidu.com/s/1wPQh9f7bCNVx92ODYYXKug 提取码:kgjt