Thứ Bảy, 9 tháng 1, 2016

Mạch phát nhạc bằng arduino

Mấy hôm rồi tôi rảnh rỗi quá đến nỗi tìm đến 1 mạch điện tử để xem thế nào. Tôi tìm thấy 1 mạch điện chơi nhạc từ thẻ nhớ như sau:
Nguyên liệu:
- Arduino nano
- Module microSD
- 1 transistor NPN
- 1 điện trở 3k
- 1 điện trở 22k
- 5 nút bấm nhỏ
- 1 loa 3W
- vài dây dẫn để kết nối các thứ lại với nhau, mỏ hàn, dây chì....
Chúng ta sẽ thiết kế mạch như sau:

Điều thú vị của các vi điện tử là có thể lập trình cho nó, và ta làm một code sau đây, bạn cứ lên mạng tìm hiểu về lập trình Arduino là sẽ tìm được phần mềm và công cụ lập trình, điều quan trọng là arduino này có thể nạp code thông qua cổng USB của mình, không cần phải mua thêm mạch nạp này nọ, hoặc ra tiệm điện tử gì cả.
//thư viện đọc thẻ nhớ
#include <SD.h>
//thư viện đọc nhạc WAV
#define SD_ChipSelectPin 10
#include <TMRpcm.h>
//khởi tạo biến đọc nhạc WAV
TMRpcm audio;
//các biến trạng thái
int SV1;
int SV2;
int SV3;
int SV4;
int SV5;
int led=19;
int count=0;
char* temp;
void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.print("khoi dong");
    if (!SD.begin(SD_ChipSelectPin)) {  // see if the card is present and can be initialized:
  return;   // don't do anything more if not
  }
  //ta đặt chân 19 là chân ra tín hiệu đèn
  pinMode(led,OUTPUT);
  //các chân 14-18 dùng để đọc tín hiệu nút bấm
pinMode(14,INPUT);
pinMode(15,INPUT);
pinMode(16,INPUT);
pinMode(17,INPUT);
pinMode(18,INPUT);
//với arduino thì tín hiệu âm thanh nên được đặt là chân 9
audio.speakerPin = 9;//luon la 9 cho nano
//đặt âm lượng lớn nhất là 7
//audio.setVolume(6);
audio.play("dd_01.wav");
}
//bắt đầu vòng lặp
void loop() {
  //đọc tín hiệu từ các chân đã thiết lập đọc tín hiệu
  if(audio.isPlaying()==1){Serial.println("playing......");}else{Serial.println("no sound found");}
SV1=digitalRead(14);
SV2=digitalRead(15);
SV3=digitalRead(16);
SV4=digitalRead(17);
SV5=digitalRead(18);
//sau đó là so sánh, nếu ở chân đó được nối âm, điện thế bằng 0 thì ta cho phát nhạc tương đương với nút bấm
if(SV1==LOW) nplay("bt_01.wav");
if(SV2==LOW) nplay("lv_01.wav");
if(SV3==LOW) nplay("hlv_01.wav");
if(SV4==LOW) nplay("ngu_01.wav");
if(SV5==LOW) nplay("dd_01.wav");
if(audio.isPlaying()==0){
  if(count==1){audio.play(temp); count=0;}
  }
}
//đây là hàm phát nhạc từ tên bài hát

void nplay(char* fn){
  temp=fn;
  count=1;
  //kiểm tra xem có phải đang phát 1 bài nào ko, nếu phải thì cho dừng lại
  if(audio.isPlaying()==1){audio.stopPlayback();}
  //cho đèn led sáng nhé.
  digitalWrite(led,HIGH);
  //cho phát nhạc nào
  audio.play(fn);
  //tắt đèn led
  digitalWrite(led,LOW);
  }

Trong code của tôi còn cho tín hiệu đèn Led ra chân 19 nữa cơ, nếu bạn không thích bạn có thể bỏ đi, còn thích thì cứ lắp thêm 1 led vào chân 19 là được. đầu với arduino là đầu dương, đầu kia nối âm.

Nhạc lưu trong thẻ (định dạng Fat) là nhạc WAV (16Khz, mono, 8bit per sample)