大数跨境
0
0

想让音乐存入留声机?用角度传感器和避障传感器就可以做到!

想让音乐存入留声机?用角度传感器和避障传感器就可以做到! DF创客社区
2018-11-30
1
导读:一台木质留声机……

欢迎来到服“造”的世界


*项目作者: 章






制作背景

       美国科学家托马斯•爱迪生发明了第一台留声机,由于留声机唱片能较简易地大量复制,放音时间也比大多数筒形录音介质长,因此,留声机被称为爱迪生最伟大的发明之一。小时候老爸买过好几台留声机,也做过一些唱片机的外壳及音箱,全村的老老少少经常来我家听,现在也时常想起小时候的情景,不过那些机器现在都再也找不到了,于是就萌发了做一台模拟的留声机。


功能描述

       我们把唱头放在模拟唱片的不同位置就会播放不同的歌曲,这里主要通过角度传感器和避障传感器检测到不同的值传送给主控板,让主控板指挥MP3模块播放不同的歌曲,如果把唱头移开唱片,音乐就会停止播放。我们还可以通过旋转功放模块上的旋钮来改变声音的大小。


硬件清单


 序号

名称

数量

1

DFRduino UNO R3

1

2

DF IO传感器扩展板 V7.1

1

3

步进电机

1

4

步进电机驱动板

1

5

角度传感器模块

1

6

功放模块

1

7

DFPlayer Mini 播放器模块

1

8

3 W4欧喇叭

2

9

杜邦线

若干

10

电源线

若干

11

激光切割结构件

1

12

电池盒及电池

1



结构及电子元件的安装

       1、设计外观结构件并进行激光切割

       为了使外观更加好看,我采用椴木板来制作,先在电脑上设计图纸并用激光切割机进行切割。






       2、把两张底座用热熔胶固定起来,如图所示。






       3、把底座与四周的面板用热熔胶固定好,并安装上两只喇叭。如下图:








       4、把功放模块、步进电机、步时电机驱动板及角度传感器安装在最上面面板上





       5、根据下图的步骤,组装唱头部分结构,最后把避障传感器安装上唱头上。








       6、把模拟唱片的两个圆盘安装在步进电机上,安装时要注意距离及水平位置,使他们旋转起来不会与面板相接触,位置固定好后可以用热熔胶或502胶水加以固定。




       7、把唱头部分与角度传感器进行连接,用用热熔胶或502胶水加以固定,使转动唱头时,角度传感器也会跟着转动,这里唱头带动角度传感器转动的角度与下面编程时播放的歌曲有关。固定时要注意初始角度,使唱头可以在唱片两侧都留有一定的转动余地。




       8、把电池盒、主控板及MP播放模块等固定好,并线路图所示连接好所有模块。




       9、复制相关的音乐到SD卡中。先在SD卡根目录下命名一个mp3的文件夹,然后再把相关的音乐复制到mp3文件夹中,而mp3文件命名需要是4位数字,例如"0001.mp3",如需中英文命名,可以添加在数字后,例如"0001ZAYN.mp3"或者"0001体面.mp3"


       10、最后盖上面板并固定好,这样整个留声机的结构及元器件与连接全部完成,效果图如下:




程序编写

       编程编写在用到的DFRobot DFPlayerMini库文件,所以事先我们要把这个库文件导入。详细程序如下图所示:

 


向上滑动阅览

#include "Arduino.h"[/align]#include "SoftwareSerial.h"

#include "DFRobotDFPlayerMini.h"

#include <Stepper.h>

Stepper mystepper(100,4,5,6,7);

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX

DFRobotDFPlayerMini myDFPlayer;

void printDetail(uint8_t type, int value);

volatile int a;

void setup()

{

  mySoftwareSerial.begin(9600);

  Serial.begin(115200);

  Serial.println();

  Serial.println(F("DFRobot DFPlayer Mini Demo"));

  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

   if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.

    Serial.println(F("Unable to begin:"));

    Serial.println(F("1.Please recheck the connection!"));

    Serial.println(F("2.Please insert the SD card!"));

    while(true);

  }

  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(20);  //Set volume value. From 0 to 30

  myDFPlayer.play(1);  //Play the first mp3

  mystepper.setSpeed(100);

  pinMode(8, INPUT);

  a = 0;

}

void loop()

{

   if (digitalRead(8) && (analogRead(A0) > 425 && analogRead(A0) < 440)) {

    mystepper.step(10);

    if (a != 1) {

      myDFPlayer.play(1);  //Play next mp3 every 3 second.

    }

    a = 1;

  } else if (digitalRead(8) && (analogRead(A0) > 442 && analogRead(A0) < 460)) {

    mystepper.step(10);

    if (a != 2) {

      myDFPlayer.play(2);  //Play next mp3 every 3 second.

    }

    a = 2;

  } else if (digitalRead(8) && (analogRead(A0) > 462 && analogRead(A0) < 480)) {

    mystepper.step(10);

    if (a != 3) {

      myDFPlayer.play(3);  //Play next mp3 every 3 second.

    }

    a = 3;

  } else if (digitalRead(8) && (analogRead(A0) > 482 && analogRead(A0) < 500)) {

    mystepper.step(10);

    if (a != 4) {

      myDFPlayer.play(4);  //Play next mp3 every 3 second.

    }

    a = 4;

  } else if (digitalRead(8) && (analogRead(A0) > 502 && analogRead(A0) < 522)) {

    mystepper.step(10);

    if (a != 5) {

      myDFPlayer.play(5);  //Play next mp3 every 3 second.

    }

    a = 5;

  } else {

    a = 0;

    myDFPlayer.stop();  //Play next mp3 every 3 second.

  }

}

void printDetail(uint8_t type, int value){

  switch (type) {

    case TimeOut:

      Serial.println(F("Time Out!"));

      break;

    case WrongStack:

      Serial.println(F("Stack Wrong!"));

      break;

    case DFPlayerCardInserted:

      Serial.println(F("Card Inserted!"));

      break;

    case DFPlayerCardRemoved:

      Serial.println(F("Card Removed!"));

      break;

    case DFPlayerCardOnline:

      Serial.println(F("Card Online!"));

      break;

    case DFPlayerPlayFinished:

      Serial.print(F("Number:"));

      Serial.print(value);

      Serial.println(F(" Play Finished!"));

      break;

    case DFPlayerError:

      Serial.print(F("DFPlayerError:"));

      switch (value) {

        case Busy:

          Serial.println(F("Card not found"));

          break;

        case Sleeping:

          Serial.println(F("Sleeping"));

          break;

        case SerialWrongStack:

          Serial.println(F("Get Wrong Stack"));

          break;

        case CheckSumNotMatch:

          Serial.println(F("Check Sum Not Match"));

          break;

        case FileIndexOut:

          Serial.println(F("File Index Out of Bound"));

          break;

        case FileMismatch:

          Serial.println(F("Cannot Find File"));

          break;

        case Advertise:

          Serial.println(F("In Advertise"));

          break;

        default:

          break;

      }

      break;

    default:

      break;

  }

}


当你站于隆冬爱河边 俯身朝下望去

有人破冰做你 一生倒影

你会凝视他 如同另个自己






*欢迎转发朋友圈。如需转载,请注明出处和原作者。


项目干货戳这里


 MIDI控制自动弹钢琴 | mini热带温室 无线蓝牙机械键盘 

变脸娃娃 给lcd触摸屏做了个soulmate……

属于理工男的梦幻立方体

动态像素眼镜 复古ComputeModule 3

磁悬浮盆景 | LED项链

吃币机器人 | 骨骼追踪抛物预判垃圾桶 | 弹球机

 三角轮胎 | 物联伺服器 | 物联网体重计 

DIY树莓派游戏机 | 波士顿动力

 家庭萌宠Pando |  物联网项目精选 自制酸奶机 


点击“阅读原文”,查看更多项目

【声明】内容源于网络
0
0
DF创客社区
我们是专注于创新和开源硬件开发的公司——DFRobot成立的创客社区,无论你是资深创客还是小白,这里都有你的一席之地。一个人玩自己的项目,你只是寂寞宅;一群人看你玩项目,你就是技术牛!快来分享你的项目吧!
内容 1282
粉丝 0
DF创客社区 我们是专注于创新和开源硬件开发的公司——DFRobot成立的创客社区,无论你是资深创客还是小白,这里都有你的一席之地。一个人玩自己的项目,你只是寂寞宅;一群人看你玩项目,你就是技术牛!快来分享你的项目吧!
总阅读2.4k
粉丝0
内容1.3k