[项目分享]DIY留声机 精华

查看: 7788|回复: 16

[项目分享] DIY留声机

[复制链接]
本帖最后由 章 于 2019-8-9 14:56 编辑

留声机4.jpg


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

功能描述
       我们把唱头放在模拟唱片的不同位置就会播放不同的歌曲,这里主要通过角度传感器和避障传感器检测到不同的值传送给主控板,让主控板指挥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、设计外观结构件并进行激光切割
       为了使外观更加好看,我采用椴木板来制作,先在电脑上设计图纸并用激光切割机进行切割。


1.jpg


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

2.JPG

3.JPG

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

4.JPG

5.JPG

6.JPG

7.JPG

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

8.JPG

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

9.JPG

10.JPG

11.JPG

12.JPG

13.JPG


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

14.JPG

15.JPG

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

16.JPG

17.JPG


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

19.JPG

线路图.jpg

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

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

20.jpg

留声机2.jpg


程序编写
       编程编写在用到DF的DFRobotDFPlayerMini库文件,所以事先我们要把这个库文件导入。详细程序如下图所示:
   
[AppleScript] 纯文本查看 复制代码
#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;
  }
}
     




  作者其它帖子  

   小尚,别跟丢了!——自动跟随的麦克纳姆轮小车 http://mc.dfrobot.com.cn/thread-296803-1-1.html
   来吧!一起动手制作一台架子鼓 http://mc.dfrobot.com.cn/thread-289948-1-1.html
   钥匙忘带提醒器  http://mc.dfrobot.com.cn/thread-280445-1-1.html
   麦昆智能晾衣架  http://mc.dfrobot.com.cn/thread-280329-1-1.html
   炫彩电子钢琴的设计与制作 http://mc.dfrobot.com.cn/thread-280116-1-1.html
   [micro:bit×OBLOQ物联网挑战赛第三轮] 坐姿矫正仪 http://mc.dfrobot.com.cn/thread-269139-1-1.html
   【挑战2】基于物联网的智能闸道、人数统计与安全预警系统 http://mc.dfrobot.com.cn/thread-268643-1-1.html
   物联网比赛第一关:远程监测温度和亮度 http://mc.dfrobot.com.cn/thread-268162-1-1.html
   来来来,让我们一起来打地鼠!  http://mc.dfrobot.com.cn/thread-268413-1-1.html




killerlist  初级技匠

发表于 2018-11-20 15:36:21

虽然不是真的留声机,但是能做到留声机做不到的事情,叫留声机2.0MAX吧(滑稽)
回复 支持 反对

使用道具 举报

lilei8488  中级技师

发表于 2018-11-21 11:26:07

很有年代感,棒棒
回复 支持 反对

使用道具 举报

杨2  学徒

发表于 2018-11-22 14:34:09

这个很有意思,楼主花了不少时间啊。佩服
回复 支持 反对

使用道具 举报

铁熊  版主

发表于 2018-11-24 09:23:08

创意好赞
回复 支持 反对

使用道具 举报

gada888  版主

发表于 2018-11-24 18:26:20

这个漂亮
回复 支持 反对

使用道具 举报

digi_cow  中级技匠

发表于 2018-11-26 18:07:44

章老师的制图功力深厚:victory:
回复 支持 反对

使用道具 举报

逆光  见习技师

发表于 2018-11-29 15:22:04

有创意的作品,学习了
回复 支持 反对

使用道具 举报

小蹬子  见习技师

发表于 2018-12-5 08:31:48

不vVB是否会回家就看
回复 支持 反对

使用道具 举报

choco  学徒

发表于 2018-12-20 00:02:03

您好请问完整的代码可以分享一份吗?而且我没有买到同款的mp3 player播放器 买的是功能一样名称不一样的 是不是这个代码中的名称都是需要修改的呢?因为是新手第一次接触arduino很多地方都不太懂!如果您能回复的话真的万分感谢!!我的微信是chaos-98 希望您能看到留言!!!
回复 支持 反对

使用道具 举报

gada888  版主

发表于 2018-12-20 10:42:10

很漂亮
回复 支持 反对

使用道具 举报

 初级技匠
 楼主|

发表于 2018-12-28 10:57:31

choco 发表于 2018-12-20 00:02
您好请问完整的代码可以分享一份吗?而且我没有买到同款的mp3 player播放器 买的是功能一样名称不一样的 是 ...

代码上面不是有了吗,关于mp3模块我不知道你买的是哪一款的,我不知道能不能使用,还是买同一款的吧。
回复 支持 反对

使用道具 举报

bobobobo  见习技师

发表于 2018-12-31 18:28:07

想问下的就是电机会不会转的很快呀?
回复 支持 反对

使用道具 举报

 初级技匠
 楼主|

发表于 2019-1-3 16:03:58

bobobobo 发表于 2018-12-31 18:28
想问下的就是电机会不会转的很快呀?

用步进电机
回复 支持 反对

使用道具 举报

和静清寂  学徒

发表于 2019-1-28 15:56:01

请问有没图纸
回复 支持 反对

使用道具 举报

DFBkweycOwE  学徒 来自手机

发表于 2019-3-15 10:37:08

章 发表于 2018-11-19 14:13
【制作背景】       美国科学家托马斯•爱迪生发明了第一台留声机,由于留声机唱片能较简易地大量复制, ...

请问一下能不能加微信 想了解一下详细的程序 我们用这个程序出了点问题
回复 支持 反对

使用道具 举报

想做一个魔法师  学徒

发表于 2019-6-19 17:45:57

想要学习这个!
回复 支持 反对

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail