2016年10月14日金曜日

秋の夜長の電子工作 - ミンティアブリーズ MP3プレーヤー V2

ミンティアブリーズ MP3プレーヤーを少し改良してみました。

○変更点
・充電器モジュールをミニUSBタイプからマイクロUSBタイプに変更
・lipoバッテリーを120mAhに変更
・プッシュボタンの接続端子を変更
・リピート機能、リピートのLEDインジケータを追加
・レイアウトを変更

 befor 













 After
 

○回路図

○ファームウェア(Arduinoスケッチ)

#include <SoftwareSerial.h>
#define ARDUINO_RX 8 //should connect to TX of the Serial MP3 Player module
#define ARDUINO_TX 9 //connect to RX of the module
SoftwareSerial mp3(ARDUINO_RX, ARDUINO_TX);
unsigned char playmode = 1;
#define PLAY 1
#define PAUSE 0
unsigned char repmode = 1;
#define REP_ON 1
#define REP_OFF 0
static int8_t Send_buf[8] = {0};
unsigned int count=12000;
int key=-1;
int oldkey=-1;
#define DOWN_BTN 4
#define CENTER_BTN 2
#define UP_BTN 5
#define LED 13
#define REP_LED 10
/************Command byte**************************/
#define CMD_NEXT_SONG 0X01
#define CMD_PREV_SONG 0X02
#define CMD_PLAY_W_INDEX 0X03
#define CMD_VOLUME_UP 0X04
#define CMD_VOLUME_DOWN 0X05
#define CMD_SET_VOLUME 0X06
#define CMD_SINGLE_CYCLE_PLAY 0X08
#define CMD_SEL_DEV 0X09
#define DEV_TF 0X02
#define CMD_SLEEP_MODE 0X0A
#define CMD_WAKE_UP 0X0B
#define CMD_RESET 0X0C
#define CMD_PLAY 0X0D
#define CMD_PAUSE 0X0E
#define CMD_PLAY_FOLDER_FILE 0X0F
#define CMD_STOP_PLAY 0X16
#define CMD_FOLDER_CYCLE 0X17
#define CMD_SET_SINGLE_CYCLE 0X19
#define SINGLE_CYCLE_ON 0X00
#define SINGLE_CYCLE_OFF 0X01
#define CMD_SET_DAC 0X1A
#define DAC_ON 0X00
#define DAC_OFF 0X01
#define CMD_PLAY_W_VOL 0X22
void sendCommand(int8_t command, int16_t dat)
{
delay(20);
Send_buf[0] = 0x7e; //
Send_buf[1] = 0xff; //
Send_buf[2] = 0x06; //
Send_buf[3] = command; //
Send_buf[4] = 0x00;//
Send_buf[5] = (int8_t)(dat >> 8);//datah
Send_buf[6] = (int8_t)(dat); //datal
Send_buf[7] = 0xef; //
for(uint8_t i=0; i<8; i++)//
{
mp3.write(Send_buf[i]) ;
}
}
int get_key() {
unsigned int pcount = 0;
bool wait = 0;
if(digitalRead(DOWN_BTN)==LOW) {
delay(50);
while(digitalRead(DOWN_BTN)==LOW){
pcount++;
if(pcount > count){
wait = 1;
digitalWrite(LED,HIGH);
}
}
if(wait == 1) {
return 0;
} else return 2;
}
if(digitalRead(CENTER_BTN)==LOW) {
delay(50);
while(digitalRead(CENTER_BTN)==LOW){
pcount++;
if(pcount > count){
wait = 1;
digitalWrite(LED,HIGH);
}
}
if(wait == 1) {
return 5;
} else return 4;
}
if(digitalRead(UP_BTN)==LOW) {
delay(50);
while(digitalRead(UP_BTN)==LOW){
pcount++;
if(pcount > count){
wait = 1;
digitalWrite(LED,HIGH);
}
}
if(wait == 1) {
return 1;
} else return 3;
}
return -1;
}
void setup() {
mp3.begin(9600);
Serial.begin(9600);
pinMode(DOWN_BTN, INPUT_PULLUP);
pinMode(CENTER_BTN, INPUT_PULLUP);
pinMode(UP_BTN, INPUT_PULLUP);
pinMode(LED, OUTPUT);
pinMode(REP_LED, OUTPUT);
delay(500);
sendCommand(CMD_SEL_DEV, DEV_TF); // Select SD card as the player device.
delay(200);
sendCommand(CMD_PLAY_W_VOL, 0X0F01); // Set the volume(0x0F) and play first song
}
void loop() {
delay(100);
digitalWrite(LED,LOW);
int key = get_key();
Serial.println(key);
if (key != oldkey) {
oldkey = key;
if (key >=0) {
switch(key)
{
case 0:Serial.println("Prev");
sendCommand(CMD_PREV_SONG, 0);
digitalWrite(REP_LED,LOW);
break;
case 1:Serial.println("Next");
sendCommand(CMD_NEXT_SONG, 0);
digitalWrite(REP_LED,LOW);
break;
case 2:Serial.println("Vol Down");
sendCommand(CMD_VOLUME_DOWN, 0);
break;
case 3:Serial.println("Vol Up");
sendCommand(CMD_VOLUME_UP, 0);
break;
case 4:if(playmode == PLAY){
playmode = PAUSE;
sendCommand(CMD_PAUSE,0);
Serial.println("Pause");
} else {
playmode = PLAY;
sendCommand(CMD_PLAY,0);
Serial.println("Play");
}
break;
case 5:if(repmode == REP_ON){
repmode = REP_OFF;
sendCommand(CMD_SET_SINGLE_CYCLE, SINGLE_CYCLE_OFF);
Serial.println("Repert off");
digitalWrite(REP_LED,LOW);
} else {
repmode = REP_ON;
digitalWrite(REP_LED,HIGH);
sendCommand(CMD_SET_SINGLE_CYCLE, SINGLE_CYCLE_ON);
Serial.println("Repert on");
}
break;
}
}
}
}
view raw MP3_V2.ino hosted with ❤ by GitHub

・中央:プレイ/ポーズ、長押しで現在の曲をリピート(リピートLED点灯)
・左 :ボリュームダウン、長押しで前の曲へ
・右 :ボリュームダウン、長押しで次の曲へ

 今回は、MP3のライブラリは使用していません。





0 件のコメント:

コメントを投稿