使用ardunio制作神秘礼物(环境光传感器、舵机、LED、蜂鸣器)

一、课题介绍

        本课题要从魔仙堡讲起,黑魔仙冰城本是暗黑世界的主使,一次与白界小魔仙蜜雪的打斗之后,惨败,回去反省之后,发现自己有生之年作恶多端,发生在自己身上倒霉事越来越多,心想这一定是遭受了魔界的诅咒和惩罚。于是黑魔仙送给小魔仙一个神秘礼盒,以此和解。当盒子遇到白色的正义之光后,缓缓打开,一道红光渐渐显示在眼前,净化心灵的音乐(蜜雪冰城主题曲)响起,从此,黑界与白界和好,再也没有了厮杀和掠夺,人性的险恶从此封印于这个神秘盒子中……

        其次,本项目属于娱乐玩具项目,对于少儿的身心健康良好发展有较大的价值。首先,该玩具能给小朋友带来快乐,对小孩的各种感知觉、动作、技巧等有促进作用,能提高孩子的想象力、观察力和注意力,开阔视野,促进多巴胺的产生,使孩子处于欢乐状态。与此同时,有积极意义的故事背景间接培养孩子的良好品德,对孩子未来的成长有重要意义。

二、设计思路

        该项目以Dfduino UNO控制板和Xbee传感器扩展板作为主处理器,环境光传感器作为输入模块,蜂鸣器、食人鱼红色LED作为输出模块,舵机角度由环境光传感器的变化而变化。当环境光传感器数值大于val1=40(可自主设定)的时候(光线变亮),舵机的角度开始变大,LED灯逐渐变亮,当大于val2=110时(该数值可自主设定,但必须大于val1),之后蜂鸣器发出音乐。当音乐响完一个周期的时候,如果环境光传感器的输入值仍然大于val2,蜂鸣器还会再次响起。当环境光传感器数值变小,即光线变暗时,舵机的角度会减小,LED随着舵机的减小而减小,音乐也会停下,直至盒子的盖子关闭。

三、硬件设计

该项目使用的硬件及接入的扩展板引脚如下:

Dfduino UNO控制板、Xbee传感器扩展板、若干根杜邦线

环境光传感器——A0

蜂鸣器模块——D8

TowerPro SG90舵机——D9

食人鱼红色LED发光模块——D3

四、软件设计

设计代码如下:

#include <Servo.h>

//定义各种数组字符对应音的频率

#define NOTE_B0  31

#define NOTE_C1  33

#define NOTE_CS1 35

#define NOTE_D1  37

#define NOTE_DS1 39

#define NOTE_E1  41

#define NOTE_F1  44

#define NOTE_FS1 46

#define NOTE_G1  49

#define NOTE_GS1 52

#define NOTE_A1  55

#define NOTE_AS1 58

#define NOTE_B1  62

#define NOTE_C2  65

#define NOTE_CS2 69

#define NOTE_D2  73

#define NOTE_DS2 78

#define NOTE_E2  82

#define NOTE_F2  87

#define NOTE_FS2 93

#define NOTE_G2  98

#define NOTE_GS2 104

#define NOTE_A2  110

#define NOTE_AS2 117

#define NOTE_B2  123

#define NOTE_C3  131

#define NOTE_CS3 139

#define NOTE_D3  147

#define NOTE_DS3 156

#define NOTE_E3  165

#define NOTE_F3  175

#define NOTE_FS3 185

#define NOTE_G3  196

#define NOTE_GS3 208

#define NOTE_A3  220

#define NOTE_AS3 233

#define NOTE_B3  247

#define NOTE_C4  262 //do 中音

#define NOTE_CS4 277

#define NOTE_D4  294

#define NOTE_DS4 311

#define NOTE_E4  330 //mi

#define NOTE_F4  349

#define NOTE_FS4 370

#define NOTE_G4  392 //so

#define NOTE_GS4 415

#define NOTE_A4  440

#define NOTE_AS4 466

#define NOTE_B4  494

#define NOTE_C5  523

#define NOTE_CS5 554

#define NOTE_D5  587

#define NOTE_DS5 622

#define NOTE_E5  659

#define NOTE_F5  698

#define NOTE_FS5 740

#define NOTE_G5  784

#define NOTE_GS5 831

#define NOTE_A5  880

#define NOTE_AS5 932

#define NOTE_B5  988

#define NOTE_C6  1047

#define NOTE_CS6 1109

#define NOTE_D6  1175

#define NOTE_DS6 1245

#define NOTE_E6  1319

#define NOTE_F6  1397

#define NOTE_FS6 1480

#define NOTE_G6  1568

#define NOTE_GS6 1661

#define NOTE_A6  1760

#define NOTE_AS6 1865

#define NOTE_B6  1976

#define NOTE_C7  2093

#define NOTE_CS7 2217

#define NOTE_D7  2349

#define NOTE_DS7 2489

#define NOTE_E7  2637

#define NOTE_F7  2794

#define NOTE_FS7 2960

#define NOTE_G7  3136

#define NOTE_GS7 3322

#define NOTE_A7  3520

#define NOTE_AS7 3729

#define NOTE_B7  3951

#define NOTE_C8  4186

#define NOTE_CS8 4435

#define NOTE_D8  4699

#define NOTE_DS8 4978



#define musicPin 8//蜂鸣器或扬声器到8引脚



int melody[] = {//定义各种音出现的旋律顺序

NOTE_E4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_E4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_C4, NOTE_D4,

NOTE_E4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_E4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4,

NOTE_F4, NOTE_F4, NOTE_F4, NOTE_A4, NOTE_G4, NOTE_G4, NOTE_E4, NOTE_D4,

NOTE_E4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_G4, NOTE_E4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4,



};

int noteDurations[] = {

4,4,4,8,4,4,4,8,8,4,4,4,4,1,

4,4,4,8,4,4,4,8,8,4,4,4,4,1,

2,2,8,2,2,4,4,1,

4,4,4,8,4,4,4,8,8,4,4,4,4,1,



};

 Servo myservo;

 int LED=3;    //置 LED 灯为数字引脚3

 int val=0;    //val 存储环境光传感器的值

 int pos=0;   //舵机的角度初始值为0

 int light=0;



 void setup(){

   pinMode(LED,OUTPUT); // LED 为输出模式

   Serial.begin(9600); //串口波特率设置为9600

   myservo.attach(9);//舵机接到数字口9

   myservo.write(0);//初始角度为0

 }



 void loop(){

   val=analogRead(0);//读取传感器的值(光线越强,值越大)

   Serial.println(val);//串口查看电压值的变化

   if( val>40){//一旦大于设定的值,增加角度

     pos = pos +2;

     for (int thisNote = 0; thisNote < 50; thisNote++) {

       if (val>110) {//如果值大于串口中的电压值大于一个值,播放音乐

          int noteDuration = 800/noteDurations[thisNote];

          tone(musicPin, melody[thisNote],noteDuration);

          int pauseBetweenNotes = noteDuration * 1.30;

          delay(pauseBetweenNotes);

          noTone(musicPin);

          }

     }

     if ( pos>=90){ //转到了90后,就保持90

         pos =90;

     }

     myservo.write(pos);//写入舵机的角度

     delay(100);

     light=map(pos,0,90,0,255); //随角度增大, LED 亮度增大

     analogWrite(LED,light );//写入亮度值

    

    }else{

          pos=pos-2;//减2°

      

     if(pos<=0){

          pos=0;//减到°为止

          }

      myservo.write(pos);//写入舵机的角度

      delay(100);

      light=map( pos,0,90,0,255);//随角度减小,LED 亮度减小

      analogWrite(LED,light);//写入亮度值

      }

}

五、外观设计

外观设计如下图所示:

六、总结与展望

        该项目制作过程中,参考本学期的教学课程实践项目与互联网上的蜂鸣器声音频率相关资料,顺利完成。在此过程中遇到了一些问题,声音的不同频率对应的ardunio乐曲编写需要一定的乐理基础,各种音调的持续时间需要细心计算。其次,当测试不同程序的时候要记得刷新硬件,以此擦除上次实验烧录的程序。

       本项目因器材有限,暂未做出精美的外观设计与丰富的功能设计,希望在将来若有充足的硬件设备下,能开发出更好的产品,由此给更多的小朋友带来快乐。

七、参考资料

_______________________

编曲:

https://www.renrendoc.com/paper/159927607.html

猜你喜欢

转载自blog.csdn.net/qq_46351409/article/details/124986752
今日推荐