极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10734|回复: 3

Arduino 备忘录 1 --- 超声波控制RGB LED

[复制链接]
发表于 2013-10-8 17:36:07 | 显示全部楼层 |阅读模式
今天Arduino UNO R3的版子到了。超喜欢啊。

准备吧学习笔记一一发在这里。希望坛友们提出意见建议,共同进步!



刚做了一个小玩意,通过超声波模块返回的数据,输出PWM来控制一个RGB LED。

用手掌挡在超声波探头前方来回移动距离,距离探头越近LED越亮,越远越按,直到熄灭。



原理图特别简单,就不上了。

超声波模块里: Trig  接  2,  Echo 接 3。

RGB LED 因为是共阴的,所以第二根脚,也就是最长的那根上330欧姆电阻接地。其他三根按顺序红绿蓝接9 10 11口。


这里用到了新的超声波模块库,也就是NewPing这个库,据说准一点。我随之一起传上来。





[pre lang="arduino" line="1" file="LED"]#include <NewPing.h>
#define TRIGGER_PIN  2
#define ECHO_PIN     3
#define MAX_DISTANCE 350
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

float MaxCm;
float reCm;

int led4 = 11;
int led3 = 10;
int led1 = 9;

void setup() {               
  //  Serial.begin(9600);   串口调试蒙蔽了,影响速度。
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(led4, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led1, OUTPUT);
  analogReference(DEFAULT);
}
void rgb(char r,char g,char b)
    {
      analogWrite(led1,r);
      analogWrite(led3,g);
      analogWrite(led4,b);
    }
void loop() {
        unsigned char t=0;
         reCm=0;
         MaxCm=0;
         
  for (int i=0;i<10;i++)
        {                     
        float uS = sonar.ping();
        reCm=uS/US_ROUNDTRIP_CM;
            if (reCm>0)
            {
                    MaxCm=reCm;        
            }
            delay(2);
        }
    // Serial.print(MaxCm);
    // Serial.print("cm");
    //Serial.println();
     t=255-MaxCm*10+10;  
     rgb(0,0,t) ; //控制PWM输出蓝色光,也可以改红绿,或者自己配颜色。rgb(t-x,t-x,t-x) 随自己喜欢。
      
        
}[/code]


现在问题是即使阻挡探头的物体移动比较慢,超声波得出的数据也会有很大跳动,导致LED一闪一闪的。
有待解决。
回复

使用道具 举报

发表于 2013-10-8 18:28:03 | 显示全部楼层
需要使用滤波算法去除传感器噪声干扰
回复 支持 反对

使用道具 举报

发表于 2013-10-8 18:44:18 | 显示全部楼层
我寫一個不用函式庫的:
  1. #define TrigPin 12
  2. #define EchoPin 13

  3. float EchoTime()
  4. {
  5.   digitalWrite( TrigPin, LOW );
  6.   delayMicroseconds( 2 );
  7.   digitalWrite( TrigPin, HIGH );
  8.   delayMicroseconds( 10 );
  9.   digitalWrite( TrigPin, LOW );
  10.   return pulseIn( EchoPin, HIGH );
  11. }

  12. void setup()
  13. {
  14.   pinMode( TrigPin, OUTPUT );
  15.   pinMode( EchoPin, INPUT );
  16.   Serial.begin( 9600 );
  17. }

  18. void loop() {
  19.   float duration, cm;
  20.   duration = EchoTime();
  21.   cm = 0.0346*(duration/ 2);
  22.   Serial.print(cm);
  23.   Serial.print( " cm     " );
  24.   Serial.print(  duration );
  25.   Serial.println( "  us" );
  26.   delay( 100 );
  27. }
复制代码
使用函式庫的:
  1. #include <Ultrasonic.h>
  2. #define TRIGGER_PIN  12
  3. #define ECHO_PIN     13
  4. Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
  5. void setup()
  6. {
  7. Serial.begin(9600);
  8. }

  9. void loop()

  10. {
  11. float cmMsec, inMsec;
  12. long microsec = ultrasonic.timing();
  13. cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); // 計算距離,單位: 公分
  14. inMsec = ultrasonic.convert(microsec, Ultrasonic::IN); // 計算距離,單位: 英吋
  15. Serial.print("uS: ");
  16. Serial.print(microsec);
  17. Serial.print(", CM: ");
  18. Serial.print(cmMsec);
  19. Serial.print(", IN: ");
  20. Serial.println(inMsec);
  21. delay(100);
  22. }
复制代码
兩種寫法供大家參考
回复 支持 反对

使用道具 举报

发表于 2014-3-17 15:40:40 | 显示全部楼层
NewPing.h库可以上传下吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 06:08 , Processed in 0.064888 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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