精华内容
下载资源
问答
  • } //传感器检测 void light_test() { //读取光电传感器数值 int value=0; v_light1=digitalRead(light1); value=v_light1; Serial.print(value); Serial.println(); //条件判断 if(value==0) { digitalWrite(LED_...
    本文为作者学习笔记
    欢迎交流讨论,喜欢的话点个赞吧
    

    L298N电机驱动

    const int negR=4;//右负极
    const int posR=5;//右正极
    const int negL=6;//左负极
    const int posL=7;//左正极
    const int pwmR=9;//右轮pwm
    const int pwmL=10;//左轮pwm
    
    
    //设置初值
    void setup()
    {
      pinMode(posR,OUTPUT);//引脚4
      pinMode(negR,OUTPUT);//引脚5
      pinMode(posL,OUTPUT);//引脚6
      pinMode(negL,OUTPUT);//引脚7
      pinMode(pwmR,OUTPUT);//引脚9
      pinMode(negL,OUTPUT);//引脚10
    }
    
    //主循环
    void loop()
    {
      forward(200,200);
      delay(2000);
      pause(0,0);
      delay(2000);
      back(200,200);
      delay(2000);
      pause(0,0);
      delay(2000);
    }
    
    //前进函数
    void forward(byte RmotorSpeed,byte LmotorSpeed)
    {
      analogWrite(pwmR,RmotorSpeed);//右轮转速
      analogWrite(pwmL,LmotorSpeed);//左轮转速
      digitalWrite(posR,HIGH);//右轮正转
      digitalWrite(negR,LOW);
      digitalWrite(posL,LOW);//左轮反转
      digitalWrite(negL,HIGH);
    }
    
    //后退函数
    void back(byte RmotorSpeed,byte LmotorSpeed)
    {
      analogWrite(pwmR,RmotorSpeed);//右轮转速
      analogWrite(pwmL,LmotorSpeed);//左轮转速
      digitalWrite(posR,LOW);//右轮反转
      digitalWrite(negR,HIGH);
      digitalWrite(posL,HIGH);//左轮正转
      digitalWrite(negL,LOW);
    }
    
    //停止函数
    void pause(byte RmotorSpeed,byte LmotorSpeed)
    {
      analogWrite(pwmR,RmotorSpeed);//右轮转速
      analogWrite(pwmL,LmotorSpeed);//左轮转速
      digitalWrite(posR,LOW);//右轮停止
      digitalWrite(negR,LOW);
      digitalWrite(posL,LOW);//左轮停止
      digitalWrite(negL,LOW);
    }
    
    //右转
    void right(byte RmotorSpeed,byte LmotorSpeed)
    {
      analogWrite(pwmR,RmotorSpeed);//右轮转速
      analogWrite(pwmL,LmotorSpeed);//左轮转速
      digitalWrite(posR,LOW);//右轮停止
      digitalWrite(negR,LOW);
      digitalWrite(posL,LOW);//左轮反转
      digitalWrite(negL,HIGH);
    }
    
    //左转
    void left(byte RmotorSpeed,byte LmotorSpeed)
    {
      analogWrite(pwmR,RmotorSpeed);//右轮转速
      analogWrite(pwmL,LmotorSpeed);//左轮转速
      digitalWrite(posR,HIGH);//右轮正转
      digitalWrite(negR,LOW);
      digitalWrite(posL,LOW);//左轮停止
      digitalWrite(negL,LOW);
    }
    

    超声波传感器

    const int trig =4;//引脚
    const int echo =5;
    
    float distance;//返回数值
    
    void setup()
    {
      Serial.begin(9600);//串口调试
      
      pinMode(trig,OUTPUT);//针脚输出
      pinMode(echo,INPUT);//针脚输入
      
    }
    
    void loop()
    {
      //向引脚发送10us的高电平
      digitalWrite(trig,LOW);
      delayMicroseconds(2);
      digitalWrite(trig,HIGH);
      delayMicroseconds(10);
      digitalWrite(trig,LOW);
    
      //测算距离
      distance = (pulseIn(echo,HIGH)/58.00);
      
      //串口打印
      Serial.print(distance);
      Serial.print("cm");
      Serial.println();
      
      //延迟1000ms
      delay(1000);
    }
    

    舵机

    #include <Servo.h>
    
    Servo myservo;  // 定义Servo对象来控制
    int pos = 0;    // 角度存储变量
    
    void setup() 
    {
        myservo.attach(9);  // 控制线连接数字9
    }
    
    void loop() 
    {
        for (pos = 0; pos <= 180; pos++) { // 0°到180°
          // in steps of 1 degree
            myservo.write(pos);              // 舵机角度写入
            delay(5);                       // 等待转动到指定角度
        }
        for (pos = 180; pos >= 0; pos--) { // 从180°到0°
            myservo.write(pos);              // 舵机角度写入
            delay(5);                       // 等待转动到指定角度
        }
    }
    

    舵机红色线接开发板5V,棕色线接开发板GND,橙色信号线接开发板数字引脚

    #include <Servo.h>
    
    Servo myservo;  // 定义Servo对象来控制
    int pos = 180;    // 角度存储变量
    
    void setup() 
    {
        myservo.attach(7);  // 控制线连接数字7
        myservo.write(90);
        delay(2000);
    }
    
    void loop() 
    {
      pos=pos-180;
      myservo.write(pos);
      delay(3000);
      pos=pos+360;
      myservo.write(pos);
      delay(3000);
      pos=pos-180;
      myservo.write(pos);
      delay(3000);
    }
    

    image

    #include <Servo.h>
    
    Servo myservo;  // 定义Servo对象来控制
    int pos = 180;    // 角度存储变量
    
    void setup() 
    {
        myservo.attach(9);  // 控制线连接数字7
        myservo.write(0);
        delay(2000);
    }
    
    void loop() 
    {
      myservo.write(0);
      delay(1500);
      myservo.write(200);
      delay(1500);
      myservo.write(0);
      delay(1500);
      myservo.write(200);
      delay(1500);
      myservo.write(0);
      delay(1500);
    }
    

    image

    光电传感器

    int light1=3;//光电传感器
    int v_light1;//光电传感器返回数值
    
    void setup()
    {
      pinMode(LED_BUILTIN, OUTPUT);//LED闪烁 
      Serial.begin(9600);
    }
    
    //主循环
    void loop()
    {
      light_test();
    }
    
    //传感器检测
    void light_test()
    {
      //读取光电传感器数值
      int value=0;
      v_light1=digitalRead(light1);
      value=v_light1;
      Serial.print(value);
      Serial.println();
      //条件判断
      if(value==0)
      {
          digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
      }
      else
      {
          digitalWrite(LED_BUILTIN, LOW);   // turn the LED on (HIGH is the voltage level)
      }
    }
    

    棕色正极蓝色负极黑色信号输出

    灯亮(距离近)时digital.read()为0(LOW)

    灯灭(距离远)时digital.read()为1(HIGH)

    HIGH和LOW是系统常量,定义分别是1(高)0(低),还有,=是赋值,==是判断

    灰度传感器

    
    const int gray1 = A1;//灰度传感器GR1
    int graynum1;//灰度传感器返回数值
    int* level = NULL;//灰度传感器数值的指针
    
    // the setup function runs once when you press reset or power the board
    void setup()
    {
    	Serial.begin(9600);//开启9600端口
    	Serial.println("Senesor:");
    	pinMode(gray1, INPUT);//灰度传感器GR4
    
    }
    
    // the loop function runs over and over again until power down or reset
    void loop() 
    {
    	Gray();
    	Serial.print(*level);
    	Serial.println();
    }
    
    //灰度传感器Gray(指针写法) 
    int Gray()
    {
    	graynum4 = analogRead(4);
    	level = &graynum4;
    }
    

    灰度传感器连续快速返回数值,因此,在不是很稳定的情况下,建议配合快速排序函数取中值一同使用

    const int gray1 = A0;//灰度传感器GR1(车左前)
    int graynum1;//灰度传感器返回数值
    int* level1 = NULL;//存储灰度传感器数值graynum的指针
    
    void setup()
    {
      Serial.begin(9600);
      pinMode(gray1, INPUT);//灰度传感器GR1
      pinMode(LED_BUILTIN, OUTPUT);//LED闪烁 
    }
    
    
    void loop()
    {
      int gray_level1[21] = {0};
      for (int m = 0; m < 21; m++)
        {
            Gray1();
            gray_level1[m] = *level1;
        }
      int median1 = quickSort(gray_level1, 0, 20);
      Serial.print(median1);
      Serial.println();
      
    }
    
    
    //取中值函数
    int quickSortPartition(int s[], int l, int r) {
        //Swap(s[l], s[(l + r) / 2]); //若以中间数为基准,则先将中间的这个数和第一个数交换即可
        int i = l, j = r, x = s[l]; //将最左元素记录到x中
        while (i < j)
        {
            // 从右向左找第一个<x的数
            // 无需考虑下标越界
            while (i < j && s[j] >= x)
                j--;
            if (i < j)
                s[i++] = s[j]; //直接替换掉最左元素(已在x中存有备份)
    
            // 从左向右找第一个>x的数
            while (i < j && s[i] <= x)
                i++;
            if (i < j)
                //替换掉最右元素(已在最左元素中有备份)
                //最左元素一定被覆盖过,若没有,则表明右侧所有元素都>x,那么算法将终止
                s[j--] = s[i];
        }
        s[i] = x;  //i的位置放了x,所以其左侧都小于x,右侧y都大于x
        return i;
    }
    
    int quickSort(int s[], int l, int r)
    {
        //数组左界<右界才有意义,否则说明都已排好,直接返回即可
        if (l >= r) {
            return s[10];
        }
    
        // 划分,返回基准点位置
        int i = quickSortPartition(s, l, r);
    
        // 递归处理左右两部分,i处为分界点,不用管i了
        quickSort(s, l, i - 1);
        quickSort(s, i + 1, r);
    
        return s[10];
    }
    
    //灰度传感器Gray1
    int Gray1()
    {
        graynum1 = analogRead(0);
        level1 = &graynum1;
        return graynum1;
    }
    
    

    红外ToF传感器

    
    /*
    This example takes range measurements with the VL53L1X and displays additional 
    details (status and signal/ambient rates) for each measurement, which can help
    you determine whether the sensor is operating normally and the reported range is
    valid. The range is in units of mm, and the rates are in units of MCPS (mega 
    counts per second).
    */
    
    #include <Wire.h>
    #include <VL53L1X.h>
    
    VL53L1X sensor;
    
    void setup()
    {
      Serial.begin(115200);
      Wire.begin();
      Wire.setClock(400000); // use 400 kHz I2C
    
      sensor.setTimeout(500);
      if (!sensor.init())
      {
        Serial.println("Failed to detect and initialize sensor!");
        while (1);
      }
      
      // Use long distance mode and allow up to 50000 us (50 ms) for a measurement.
      // You can change these settings to adjust the performance of the sensor, but
      // the minimum timing budget is 20 ms for short distance mode and 33 ms for
      // medium and long distance modes. See the VL53L1X datasheet for more
      // information on range and timing limits.
      sensor.setDistanceMode(VL53L1X::Long);
      sensor.setMeasurementTimingBudget(50000);
    
      // Start continuous readings at a rate of one measurement every 50 ms (the
      // inter-measurement period). This period should be at least as long as the
      // timing budget.
      sensor.startContinuous(50);
    }
    
    void loop()
    {
      sensor.read();
      
      Serial.print("range: ");
      Serial.print(sensor.ranging_data.range_mm);
      Serial.print("\tstatus: ");
      Serial.print(VL53L1X::rangeStatusToString(sensor.ranging_data.range_status));
      Serial.print("\tpeak signal: ");
      Serial.print(sensor.ranging_data.peak_signal_count_rate_MCPS);
      Serial.print("\tambient: ");
      Serial.print(sensor.ranging_data.ambient_count_rate_MCPS);
      
      Serial.println();
    }
    

    串口函数

    void setup()
    {
    	Serial.begin(9600);
    	Serial.println("Senesor:");
    }
    
    void loop() 
    {
    	Serial.print();
    	Serial.println();
    }
    

    若有需要同时输出多个数值:

    //以灰度传感器为例
    Serial.print(XHEADER + analogRead(xpin) + TAB);
    Serial.print(YHEADER + analogRead(ypin) + TAB);
    Serial.print(ZHEADER + analogRead(zpin));
    Serial.println();
    delay(200);
    

    或者

    Serial.print(((float)x - zero_G)/scale);
    Serial.print("\t");
    Serial.print(((float)y - zero_G)/scale);
    Serial.print("\t");
    Serial.print(((float)z - zero_G)/scale);
    Serial.print("\n"); 
    
    展开全文
  • PulseSensor 是一款用于脉搏心率测量的光电反射式模拟传感器。将其佩戴于手指、耳垂等处,利用人体组织在血管搏动时造成透光率不同来进行脉搏测量。传感器光电信号进行滤波、放大,最终输出模拟电压值。单片机通过...

    PulseSensor 脉搏传感器介绍

    基本参数

    • 供电电压:3.3~5V
    • 检测信号类型:光反射信号(PPG)
    • 输出信号类型:模拟信号
    • 输出信号大小:0~VCC
    • 电流大小:~4ma(5v 下)

    功能原理

    PulseSensor 是一款用于脉搏心率测量的光电反射式模拟传感器。将其佩戴于手指、耳垂等处,利用人体组织在血管搏动时造成透光率不同来进行脉搏测量。传感器对光电信号进行滤波、放大,最终输出模拟电压值。单片机通过将采集到的模拟信号值转换为数字信号,再通过简单计算就可以得到心率数值。

    传感器只有三个引脚,分别为信号输出 S 脚 、电源正极 VCC 以及电源负极 GND,供电电压为 3.3V - 5V,可通过杜邦线与开发板连接。上电后, 传感器会不断从 S 脚输出采集到的电压模拟值。需要注意的是,印有心形的一面才是与手指接触面,在测量时要避免接触布满元件的另一面,否则会影响信号准确性

    核心操作 —— 识别一个脉搏信号

    IBI和BPM

    心率,指的是一分钟内的心跳次数,得到心率最笨的方法就是计时一分钟后数有多少次脉搏。但这样的话每次测心率都要等上个一分钟才有一次结果,效率极低。另外一种方法是,测量相邻两次脉搏的时间间隔,再用一分钟除以这个间隔得出心率。这样的好处是可以实时计算脉搏,效率高。

    IBI: 相邻两次脉搏的时间间隔,单位:s。

    BPM:心率,一分钟内的心跳次数。即BPM = 6000 / IBI

    无论是采用计数法还是计时法,只有能识别出一个脉搏,才能数出一分钟内脉搏数或者计算两个相邻脉搏之间的时间间隔。那怎么从采集的电压波形数据判断是不是一个有效的脉搏呢?显然,可以通过检测波峰来识别脉搏。最简单粗暴的方法是设定一个阈值,当读取到的信号值大于此阈值时便认为检测一个脉搏。

    https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino/tree/master/PulseSensorAmped_Arduino_1.5.0

    下载以上链接文件,用arduino打开里面的PulseSensorAmped_Arduino_1.5.0.ino文件,即可与plusesensor配套使用。

    注意事项:

    • 避免手指触碰传感器背面
    • 传感器与手指之间不要施加过大压力,否则会阻碍血液流动而读不到脉搏信号
    • 传感器与手指之间的接触要保持稳定,按压力度的轻微变化都会影响电压值

     MQ-2烟雾传感器

    模拟烟雾传感器 (MQ2)模拟烟雾传感器 (MQ2)

    产品参数

    • 具有输出调节电位器:顺时针调节大,逆时针调节小。
    • 传感器类型:模拟
    • 快速响应和高灵敏度
    • 简单电路板
    • 5V供电
    • 尺寸:36.4x26.6mm

    功能原理

    MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。传感器有四个引脚,其中两个可以只接一个虚拟引脚或者两个接数字和虚拟引脚 、另外两个接电源正极 VCC 以及电源负极 GND

    样例代码

    ///Arduino Sample Code
    #define Sensor_AO A0
    void setup()
    {
      Serial.begin(9600); //Set serial baud rate to 9600 bps
    }
    void loop()
    {
    int val;
    val=analogRead(0);//Read Gas value from analog 0
    Serial.println(val,DEC);//Print the value to serial port
    delay(100);
    }

     

     或

    #define Sensor_DO 2
    #define Sensor_AO A0
    
    unsigned int sensorValue = 0;
    
    void setup()
    {
      pinMode(Sensor_DO, INPUT);
      Serial.begin(9600);
    }
    
    void loop()
    {
      sensorValue = analogRead(Sensor_AO);
      Serial.print("Sensor AD Value = ");
      Serial.println(sensorValue);
    
      if (digitalRead(Sensor_DO) == LOW)
      {
        Serial.println("Alarm!");
      }
      delay(1000);
    }

     

    展开全文
  • 在本篇文章中,我们将学习如何使用Arduino开发板和颜色传感器TCS230 / TCS3200来检测颜色。 色彩传感器TCS230的工作原理 TCS230通过内部的8 x 8光电二极管阵列感应彩色光线。然后使用电流 - 频率转换器将来自光电...

    在本篇文章中,我们将学习如何使用Arduino开发板和颜色传感器TCS230 / TCS3200来检测颜色。

    色彩传感器TCS230的工作原理

    TCS230通过内部的8 x 8光电二极管阵列感应彩色光线。然后使用电流 - 频率转换器将来自光电二极管的读数转换成方波,其频率与光强度成正比。最后,我们可以使用Arduino开发板读取方波输出并获得颜色的结果。

    在这里插入图片描述

    如果我们仔细观察传感器,我们可以看到它如何检测各种颜色。光电二极管具有三种不同的滤色器。其中,16个有红色滤光片,另外16个有绿色滤光片,另外16个有蓝色滤光片,另外16个光电二极管是透明的,没有滤光片。

    在这里插入图片描述

    每16个光电二极管并联连接,因此使用两个控制引脚S2和S3,我们可以选择读取哪个。因此,例如,如果我们想要检测红色,我们可以通过根据表格将两个引脚设置为低逻辑电平来使用16个红色滤波光电二极管。

    在这里插入图片描述

    传感器还有两个控制引脚S0和S1,用于缩放输出频率。频率可以缩放到三个不同的预设值100%、20%或2%。这种频率调整功能允许传感器的输出针对各种频率计数器或微控制器进行优化。

    更多内容请访问以下链接:https://www.yiboard.com/thread-1002-1-1.html

    展开全文
  • 一个中断引脚连接到带有光电管的分压器,以监控来自家用功率计 LED 的光脉冲。 当它变高时,Arduino 唤醒,增加计数器并返回睡眠状态。 第二个连接到 XBee 的 ON_SLEEP 引脚,因此当 XBee 唤醒时将引脚置为低电平,...
  • 在本篇文章中,您将了解TCS230传感器以及如何将其与Arduino开发板一起使用来识别颜色。在本文结束时,您将找到一个创建颜色选择笔的迷人想法。使用此笔,您可以扫描周围物体的颜色,并使用该颜色开始在LCD上绘画。 ...

    在本篇文章中,您将了解TCS230传感器以及如何将其与Arduino开发板一起使用来识别颜色。在本文结束时,您将找到一个创建颜色选择笔的迷人想法。使用此笔,您可以扫描周围物体的颜色,并使用该颜色开始在LCD上绘画。

    什么是TSC230传感器?

    TSC230芯片包含一个8×8阵列的硅光电二极管,可用于识别颜色。这些光电二极管中的16个具有红色滤光器,16个具有绿色滤光器,16个具有蓝色滤光器而另外16个没有滤光器。

    在这里插入图片描述

    TCS230模块有4个白色LED灯。光电二极管从物体表面接收这些LED的反射光,然后根据它们接收的颜色产生电流。

    除光电二极管外,该传感器还有一个电流 - 频率转换器。它将光电二极管产生的电流转换为频率。

    该模块的输出采用方波脉冲形式,占空比为50%。

    该传感器的最佳测量范围约为2至4厘米。

    在这里插入图片描述

    更多内容请参考以下链接:https://www.yiboard.com/thread-1219-1-1.html

    展开全文
  • 火焰传感器模块包含一个用于检测光照的光电二极管和一个用于控制灵敏度的运算放大器。该模块用于检测火灾,一旦检测到火情时,它将输出高电平信号。 Arduino读取到该信号,然后打开蜂鸣器和LED报警。这里使用的火焰...
  • 我将向您展示如何使用便宜的零件(例如IR LED和光电二极管)制造一个简单的障碍物感应系统。
  • Arduino 库,用于读取由光电管和 RGB LED 制成的颜色传感器。 由 Jakob Coray 在 Gabriel 的帮助下创建。 用法 这个库是作为一个项目的一部分设计的,该项目构建一个可以解决 rubix 立方体的机器人。 它是 Cube.h 库...
  • 本文档介绍的是一款基于arduino开发板FRDM-KL25Z设计的光电反射式模拟脉搏心率传感器。可将脉搏心率传感器佩戴于手指或耳垂等处,通过导线连接可将采集到的模拟信号传输给Arduino 信号,再通过arduino单片机简单计算...
  • 导读:本文介绍了一种基于Arduino新型集成开发环境的光电编码器检测仪, 为了能快速简便地判断光电编码器的好坏,实现了Arduino板与可编程智能液晶触摸显示器终端的通信控制,完成了对光电编码器信号准确的计数,并...
  • Arduino简单实例之二_光敏传感器

    万次阅读 2017-02-20 12:53:39
    光敏传感器是把光信号变成电信号的一种传感器,它利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器;入射光强,电阻减小,入射光弱,电阻增大。 可用电位器(螺丝)调节亮度阀值,亮度大于设定值时DO...
  • 二手传感器:1个电位计,1个开关按钮,1个距离传感器(HCSR04),1个光电管,2个电位计,2个开关按钮,2个光电管。 在文件夹内布线原理图。 B_p5js代码将来自1个传感器的数据接收到Web浏览器中。 编辑sketch.js...
  • 37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里...
  • U型光电传感器实验 PCF8591模数转换器传感器实验 雨滴传感器实验 PS2操纵杆实验 电位器传感器实验 模拟霍尔传感器实验 模拟温度传感器实验 声音传感器实验 双色LED实验 光敏传感器实验 火焰报警实验 烟雾传感器检测...
  • 37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。...实验七十七:模拟灰度传感器 (反射式光电模块) 灰度 灰度使用黑色调表示物体,即用黑色为基准色,不同的饱和度
  • 颜色识别原理 通常我们看到的物体颜色,实际上是物体表面吸收了照射在它上面的白光中的一部分有色成分,而反射出的...为了实现颜色识别,我们可以设置三个光电二级管,分别覆盖三个经过修正的红、绿、蓝滤波片,然后...
  • 导读:本文介绍了一种基于Arduino新型集成开发环境的光电编码器检测仪, 为了能快速简便地判断光电编码器的好坏,实现了Arduino板与可编程智能液晶触摸显示器终端的通信控制,完成了对光电编码器信号准确的计数,并...
  • Arduino教程】GP2Y1014AU粉尘传感器原理分析及使用

    万次阅读 多人点赞 2018-12-27 16:10:10
    GP2Y1014AU粉尘传感器是夏普开发的一款光学灰尘监测传感器模块,在其中间有一个大洞,空气可以自由流过,它里面邻角位置放着红外发光二极管和光电晶体管,红外发光二极管定向发送红外,当空气中有微粒阻碍红外时,...

空空如也

空空如也

1 2 3 4 5 6
收藏数 101
精华内容 40
关键字:

arduino光电传感器