Estel 发表于 2013-10-8 17:36:07

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

今天Arduino UNO R3的版子到了。超喜欢啊。

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



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

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



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

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

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


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





#include <NewPing.h>
#define TRIGGER_PIN2
#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) 随自己喜欢。
      
      
}


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

davidce 发表于 2013-10-8 18:28:03

需要使用滤波算法去除传感器噪声干扰

隨風大俠 发表于 2013-10-8 18:44:18

我寫一個不用函式庫的:#define TrigPin 12
#define EchoPin 13

float EchoTime()
{
digitalWrite( TrigPin, LOW );
delayMicroseconds( 2 );
digitalWrite( TrigPin, HIGH );
delayMicroseconds( 10 );
digitalWrite( TrigPin, LOW );
return pulseIn( EchoPin, HIGH );
}

void setup()
{
pinMode( TrigPin, OUTPUT );
pinMode( EchoPin, INPUT );
Serial.begin( 9600 );
}

void loop() {
float duration, cm;
duration = EchoTime();
cm = 0.0346*(duration/ 2);
Serial.print(cm);
Serial.print( " cm   " );
Serial.print(duration );
Serial.println( "us" );
delay( 100 );
}使用函式庫的:#include <Ultrasonic.h>
#define TRIGGER_PIN12
#define ECHO_PIN   13
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
void setup()
{
Serial.begin(9600);
}

void loop()

{
float cmMsec, inMsec;
long microsec = ultrasonic.timing();
cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM); // 計算距離,單位: 公分
inMsec = ultrasonic.convert(microsec, Ultrasonic::IN); // 計算距離,單位: 英吋
Serial.print("uS: ");
Serial.print(microsec);
Serial.print(", CM: ");
Serial.print(cmMsec);
Serial.print(", IN: ");
Serial.println(inMsec);
delay(100);
}
兩種寫法供大家參考

2/3圆的月 发表于 2014-3-17 15:40:40

NewPing.h库可以上传下吗?
页: [1]
查看完整版本: Arduino 备忘录 1 --- 超声波控制RGB LED