○変更点
・充電器モジュールをミニUSBタイプからマイクロUSBタイプに変更
・lipoバッテリーを120mAhに変更
・プッシュボタンの接続端子を変更
・リピート機能、リピートのLEDインジケータを追加
・レイアウトを変更
befor
After
○回路図
○ファームウェア(Arduinoスケッチ)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} | |
} | |
} | |
} |
・中央:プレイ/ポーズ、長押しで現在の曲をリピート(リピートLED点灯)
・左 :ボリュームダウン、長押しで前の曲へ
・右 :ボリュームダウン、長押しで次の曲へ
今回は、MP3のライブラリは使用していません。
0 件のコメント:
コメントを投稿