├── README.md ├── _locales ├── en │ └── dfplayer-strings.json └── zh-tw │ └── dfplayer-strings.json ├── images ├── blocks.jpg ├── filesystem.jpg ├── sample1.jpg ├── sample2.jpg └── schema.png ├── main.ts └── pxt.json /README.md: -------------------------------------------------------------------------------- 1 | # dfplayer 2 | 這是專為micro:bit提供的MP3播放積木\ 3 | This is the package to play MP3 by using micro:bit attached DFPlayer mini 4 | 5 | ## Author 6 | Liou Zheng-Ji\ 7 | 劉正吉\ 8 | [my page, https://sites.google.com/jes.mlc.edu.tw/ljj/](https://sites.google.com/jes.mlc.edu.tw/ljj/) 9 | 10 | ## Description 11 | The blocks can let you attch DFPlayer Mini to micro:bit, let the micro:bit play MP3 music. 12 | 13 | ## Video1 14 | [![click here to see the sample video](https://img.youtube.com/vi/ql-_ZhzFF68/0.jpg)](https://www.youtube.com/watch?v=ql-_ZhzFF68) 15 | 16 | ## Video2 17 | [![click here to see the sample video](https://img.youtube.com/vi/ahkVE9Gdb_s/0.jpg)](https://www.youtube.com/watch?v=ahkVE9Gdb_s) 18 | 19 | ## Circuit 20 | ![image](images/schema.png) 21 | 22 | ## The filesystem in the microSD card 23 | ![image](images/filesystem.jpg) 24 | 25 | ## The MP3 player blocks 26 | ![image](images/blocks.jpg) 27 | 28 | ## Sample1 29 | ![image](images/sample1.jpg) 30 | 31 | ## Sample2 32 | ![image](images/sample2.jpg) 33 | 34 | ## License 35 | 36 | MIT 37 | 38 | ## Supported targets 39 | 40 | * for PXT/microbit 41 | (The metadata above is needed for package search.) 42 | 43 | ```package 44 | dfplayer=github:lioujj/pxt-mp3 45 | ``` 46 | -------------------------------------------------------------------------------- /_locales/en/dfplayer-strings.json: -------------------------------------------------------------------------------- 1 | { 2 | "dfplayer|block": "MP3 Player", 3 | "dfplayer.playType.type1|block": "Play", 4 | "dfplayer.playType.type2|block": "Stop", 5 | "dfplayer.playType.type3|block": "PlayNext", 6 | "dfplayer.playType.type4|block": "PlayPrevious", 7 | "dfplayer.playType.type5|block": "Pause", 8 | "dfplayer.yesOrNot.type1|block": "no", 9 | "dfplayer.yesOrNot.type2|block": "yes", 10 | "dfplayer.MP3_setSerial|block": "set DFPlayer mini RX to %pinTX| TX to %pinRX", 11 | "dfplayer.MP3_serialReconnect|block": "set DFPlayer reconnect to micro:bit", 12 | "dfplayer.execute|block": "execute procedure:%myType", 13 | "dfplayer.setTracking|block": "play the mp3 on the track:%tracking|repeat:%myAns", 14 | "dfplayer.folderPlay|block": "play the mp3 in the folder:%folderNum|filename:%fileNum|repeat:%myAns", 15 | "dfplayer.setLoop|block": "loop play all the MP3s in the SD card", 16 | "dfplayer.setLoopFolder|block": "loop play all the MP3s in the folder:%folderNum", 17 | "dfplayer.setVolume|block": "set volume(0~30):%volume" 18 | } -------------------------------------------------------------------------------- /_locales/zh-tw/dfplayer-strings.json: -------------------------------------------------------------------------------- 1 | { 2 | "dfplayer|block": "MP3播放器", 3 | "dfplayer.playType.type1|block": "播放", 4 | "dfplayer.playType.type2|block": "停止播放", 5 | "dfplayer.playType.type3|block": "播放下一首", 6 | "dfplayer.playType.type4|block": "播放前一首", 7 | "dfplayer.playType.type5|block": "暫停", 8 | "dfplayer.yesOrNot.type1|block": "否", 9 | "dfplayer.yesOrNot.type2|block": "是", 10 | "dfplayer.MP3_setSerial|block": "設定DFPlayer mini RX腳位:%pinTX|TX腳位:%pinRX", 11 | "dfplayer.MP3_serialReconnect|block": "DFPlayer mini重新連線", 12 | "dfplayer.execute|block": "執行程序:%myType", 13 | "dfplayer.setTracking|block": "指定播放歌曲,第%tracking|首,重覆播放:%myAns", 14 | "dfplayer.folderPlay|block": "指定播放資料夾中歌曲,資料夾:%folderNum|檔名:%fileNum| 重覆播放:%myAns", 15 | "dfplayer.setLoop|block": "循環播放記憶卡中所有歌曲", 16 | "dfplayer.setLoopFolder|block": "循環播放資料夾中歌曲,資料夾:%folderNum", 17 | "dfplayer.setVolume|block": "設定音量大小(0~48):%volume" 18 | } -------------------------------------------------------------------------------- /images/blocks.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lioujj/pxt-mp3/38a9b70595947ecbc0f3216e5fb746af10371bbf/images/blocks.jpg -------------------------------------------------------------------------------- /images/filesystem.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lioujj/pxt-mp3/38a9b70595947ecbc0f3216e5fb746af10371bbf/images/filesystem.jpg -------------------------------------------------------------------------------- /images/sample1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lioujj/pxt-mp3/38a9b70595947ecbc0f3216e5fb746af10371bbf/images/sample1.jpg -------------------------------------------------------------------------------- /images/sample2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lioujj/pxt-mp3/38a9b70595947ecbc0f3216e5fb746af10371bbf/images/sample2.jpg -------------------------------------------------------------------------------- /images/schema.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lioujj/pxt-mp3/38a9b70595947ecbc0f3216e5fb746af10371bbf/images/schema.png -------------------------------------------------------------------------------- /main.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * DFPlayer mini的函數 3 | */ 4 | 5 | 6 | //% weight=0 color=#b9a0e6 icon="\uf001" block="MP3 Player" 7 | namespace dfplayer { 8 | serial.onDataReceived("E", () => { 9 | }) 10 | let Start_Byte = 0x7E 11 | let Version_Byte = 0xFF 12 | let Command_Length = 0x06 13 | let End_Byte = 0xEF 14 | let Acknowledge = 0x00 15 | let CMD=0x00 16 | let para1=0x00 17 | let para2=0x00 18 | let highByte=0x00 19 | let lowByte=0x00 20 | let MP3_tx=SerialPin.P1 21 | let MP3_rx=SerialPin.P2 22 | let dataArr: number[] = [Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge, para1, para2, highByte, lowByte, End_Byte] 23 | 24 | export enum playType { 25 | //% block="Play" 26 | type1 = 0x0D, 27 | //% block="Stop" 28 | type2 = 0x16, 29 | //% block="PlayNext" 30 | type3 = 0x01, 31 | //% block="PlayPrevious" 32 | type4 = 0x02, 33 | //% block="Pause" 34 | type5 = 0x0E 35 | } 36 | 37 | export enum yesOrNot { 38 | //% block="no" 39 | type1 = 0, 40 | //% block="yes" 41 | type2 = 1 42 | } 43 | 44 | 45 | /** 46 | * @param pinRX to pinRX ,eg: SerialPin.P2 47 | * @param pinTX to pinTX ,eg: SerialPin.P1 48 | */ 49 | //% blockId="MP3_setSerial" block="set DFPlayer mini RX to %pinTX| TX to %pinRX" 50 | //% weight=100 blockGap=20 51 | export function MP3_setSerial(pinTX: SerialPin, pinRX: SerialPin): void { 52 | MP3_tx=pinTX; 53 | MP3_rx=pinRX; 54 | serial.redirect( 55 | MP3_tx, 56 | MP3_rx, 57 | BaudRate.BaudRate9600 58 | ) 59 | basic.pause(100) 60 | } 61 | 62 | //% blockId="MP3_serialReconnect" block="set DFPlayer reconnect to micro:bit serial" 63 | //% weight=99 blockGap=20 64 | export function MP3_serialReconnect(): void { 65 | serial.redirect( 66 | MP3_tx, 67 | MP3_rx, 68 | BaudRate.BaudRate9600 69 | ) 70 | basic.pause(20) 71 | } 72 | 73 | function checkSum():void { 74 | let total=0; 75 | for(let i=1;i<7;i++){ 76 | total+=dataArr[i] 77 | } 78 | total=65536 - total 79 | lowByte = total & 0xFF; 80 | highByte = total >> 8; 81 | dataArr[7]=highByte 82 | dataArr[8]=lowByte 83 | } 84 | //% blockId="execute" block="execute procedure:%myType" 85 | //% weight=90 blockExternalInputs=true blockGap=20 86 | export function execute(myType: playType):void{ 87 | CMD=myType 88 | para1=0x00 89 | para2=0x00 90 | dataArr[3]=CMD 91 | dataArr[5] = para1 92 | dataArr[6] = para2 93 | checkSum() 94 | sendData() 95 | } 96 | 97 | //% blockId="setTracking" block="play the mp3 on the track:%tracking|repeat:%myAns" 98 | //% weight=85 blockGap=20 tracking.min=1 tracking.max=255 99 | export function setTracking(tracking:number,myAns:yesOrNot):void{ 100 | CMD=0x03 101 | para1=0x00 102 | para2=tracking 103 | dataArr[3]=CMD 104 | dataArr[5] = para1 105 | dataArr[6] = para2 106 | checkSum() 107 | sendData() 108 | execute(0x0D) 109 | if (myAns==1) 110 | execute(0x19) 111 | } 112 | 113 | 114 | //% blockId="folderPlay" block="play the mp3 in the folder:%folderNum|filename:%fileNum|repeat:%myAns" 115 | //% weight=80 blockGap=20 folderNum.min=1 folderNum.max=99 fileNum.min=1 fileNum.max=255 116 | export function folderPlay(folderNum:number, fileNum:number,myAns:yesOrNot):void{ 117 | CMD=0x0F 118 | para1=folderNum 119 | para2=fileNum 120 | dataArr[3]=CMD 121 | dataArr[5] = para1 122 | dataArr[6] = para2 123 | checkSum() 124 | sendData() 125 | if (myAns==1) 126 | execute(0x19) 127 | } 128 | 129 | //% blockId="setLoop" block="loop play all the MP3s in the SD card" 130 | //% weight=75 blockGap=20 131 | export function setLoop():void{ 132 | CMD=0x11 133 | para1=0 134 | para2=0x01 135 | dataArr[3]=CMD 136 | dataArr[5] = para1 137 | dataArr[6] = para2 138 | checkSum() 139 | sendData() 140 | } 141 | 142 | //% blockId="setLoopFolder" block="loop play all the MP3s in the folder:%folderNum" 143 | //% weight=73 blockGap=20 folderNum.min=1 folderNum.max=99 144 | export function setLoopFolder(folderNum:number):void{ 145 | CMD=0x17 146 | para1=0 147 | para2=folderNum 148 | dataArr[3]=CMD 149 | dataArr[5] = para1 150 | dataArr[6] = para2 151 | checkSum() 152 | sendData() 153 | } 154 | 155 | 156 | //% blockId="setVolume" block="set volume(0~30):%volume" 157 | //% weight=70 blockGap=20 volume.min=0 volume.max=30 158 | export function setVolume(volume:number):void{ 159 | CMD=0x06 160 | para1=0 161 | para2=volume 162 | dataArr[3]=CMD 163 | dataArr[5] = para1 164 | dataArr[6] = para2 165 | checkSum() 166 | sendData() 167 | } 168 | 169 | function sendData():void{ 170 | let myBuff = pins.createBuffer(10); 171 | for(let i=0;i<10;i++){ 172 | myBuff.setNumber(NumberFormat.UInt8BE, i, dataArr[i]) 173 | } 174 | serial.writeBuffer(myBuff) 175 | basic.pause(100) 176 | } 177 | 178 | } -------------------------------------------------------------------------------- /pxt.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dfplayer", 3 | "version": "0.0.1", 4 | "description": "這是DFPlayer mini的Makecode專用積木", 5 | "license": "MIT", 6 | "dependencies": { 7 | "core": "*" 8 | }, 9 | "files": [ 10 | "README.md", 11 | "main.ts", 12 | "_locales/zh-tw/dfplayer-strings.json", 13 | "_locales/en/dfplayer-strings.json" 14 | ], 15 | "public": true 16 | } --------------------------------------------------------------------------------