[项目]DIY留声机 精华

查看: 1577|回复: 8

[项目] DIY留声机

[复制链接]
本帖最后由 章 于 2018-11-19 14:43 编辑

留声机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;
  }
}
     

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

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

使用道具 举报

逆光  学徒

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

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

使用道具 举报

小蹬子  见习技师

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

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

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail