こういう構成です。
Mp3再生の定番DFPlayer Mini を使ってみます。
スピーカーも2個ついて890円 でした( Amazon)。ただ2個あるからといってべつにステレオ再生できるというわけではないようです。
スピーカーにはリード線を半田付けします。
FAT32でフォーマットした16GBか32GBのMicroSDカードにMp3ファイルを保存して使います。
mp3というフォルダーを作成し、0001からの連番を曲名の先頭につけます。
0001xxx.mp3、0002xxx.mp3、0003xxx.mp3、………
参考までにMp3のサンプルは以下のサイトからダウンロードできます。
フリーWave、Mp3
Picoとの結線
RX とTX の結線はクロスしています。
諸般の事情でGP0、GP1は使っていません、理由は後で。
電源は3.3VでOKですが、安定を望むならVBUS(5V)から給電します(1kΩの抵抗が必要)。
Pi Pico のハードウェアシリアル通信のピンは以下のようになっているそうです。
ポート |
IDEの表記 |
デフォルトピン1
(TX,RX) |
対応ピン2
(TX,RX) |
対応ピン3
(TX,RX) |
UART0 |
Serial1 |
Gp0,GP1 |
GP12,GP13 |
GP16,GP17 |
UART1 |
Serial2 |
- |
GP4,GP5 |
GP8,GP9 |
Serial1のGP0、GP1を使用する分にはsetTX(),setRX()が不要なので楽ですが、Arduino IDE では問題なかったですが、MicroPythonではTXのピンが見当たらないというエラーが発生しました。
で、次点の策でSerial2の対応でGp4,Gp5を使ってみました。
Arduino IDE
Pi Pico W も使う場合は、Earle Philhower版ボードマネージャーを使います。
DFPlayer用のライブラリを使います。
ツール ー>ライブラリを管理 を選択。
dfplayer で検索して、DFPlayer Mini Mp3 by Makuna を選択してインストールします。
ファイル ー> スケッチ例 -> DFPlayer Mini Mp3 by Makuna ー> PlayMp3 を選択。
スケッチのコードの以下の部分を変更します。
fMp3 dfmp3(Serial1); ー> fMp3 dfmp3(Serial2);
void setup()で以下のように追加して変更
Serial2.setTX(4);
Serial2.setRX(5);
Serial2.begin(115200);
で、コンパイルしてマイコンボードに書き込みます。
MicroPython
Pico にMicoPython用uf2をセットします。
以下を参照
Pi PicoにMicroPythonをセットアップして実行してみる(メモ)
Thonny を起動します。
例えば曲再生用のコード
【main.py】
|
# ハードウェア関連のライブラリを読み込み import machine # UART初期設定(UART番号,クロックレート,TXピン:GP4 RXピン:GP5) uart = machine.UART(1,baudrate=9600,tx = machine.Pin(4),rx = machine.Pin(5)) # シリアルデータの作成(曲指定再生) sdata = bytearray([0x7E,0xFF,0x06,0x12,0x00,0x00,0x02,0xEF]) # シリアルデータの送信 uart.write(sdata) |
バイト列
[0x7E,0xFF,0x06,0x12,0x00,0x00,0x02,0xEF]
以下のような意味です。
[開始コード,バージョン情報,バイト数(開始コード・終了コードを除く),コマンド,
フィードバックの有無,上位ビット,下位ビット,終了コード]
コマンド -> 基本動作
下位ビット-> 動作オプション
上記の配列は
基本動作ー>再生
動作オプションー>2曲目 (曲順は01から)
詳細は マニュアルの
3.2 .Serial Communication Commands
1).Directly send commands, no parameters returned
を参照。ただし、肝心部分の説明が欠落してる可能性ありです。例えば、フォルダーにmp3とadvertの2種類ある理由とか…..。
この方のブログのほうが理解しやすいです。
pauseする場合は以下のようなコマンドを発行します。
sdata = bytearray([0x7E,0xFF,0x06,0x0E,0x00,0x00,0x00,0xEF])
uart.write(sdata)
Appendix
タクトスィッチでサウンドの再生・停止・先送り・戻りなどをやる「My Mp3Player」を作ってみました。
構成
DFPlayer やSpeaker の結線は上と同じ。
タクトスィッチの結線はこんな感じ。
GNDは1個に集約しても可。
緑 ー> 1曲目再生
赤 ー> ポーズ・再生(トグル)
青 ー> Next
黄 ー> Previous
send_data() やcalc_checksum()のコードはこの方からお借りしました、感謝。
MicroPythonコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
import machine import time uart = machine.UART(1,baudrate=9600,tx = machine.Pin(4),rx = machine.Pin(5)) #タクトスィッチ green_button = machine.Pin(10, machine.Pin.IN, machine.Pin.PULL_UP) yellow_button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP) red_button = machine.Pin(17, machine.Pin.IN, machine.Pin.PULL_UP) blue_button = machine.Pin(21, machine.Pin.IN, machine.Pin.PULL_UP) # LEDー光らせてみました、それだけ led = machine.Pin("LED", machine.Pin.OUT) # スィッチ1回だけ反応するためのフラグ B = 0 # トグルスィッチ(赤)用のフラグ T = 0 def chk_buttonState(): #global pressed_button pressed_button = -1 green_b = green_button.value() yellow_b = yellow_button.value() red_b = red_button.value() blue_b = blue_button.value() if not green_b: pressed_button = 10 if not yellow_b: pressed_button = 14 if not red_b: pressed_button = 17 if not blue_b: pressed_button = 21 return pressed_button def calc_checksum(sum_data): temp = ~sum_data + 1 h_byte = (temp & 0xFF00) >> 8 l_byte = temp & 0x00FF return h_byte, l_byte def send_data(command, param): ver = 0xFF d_len = 0x06 feedback = 0x00 param1 = (param & 0xFF00) >> 8 param2 = param & 0x00FF cs1, cs2 = calc_checksum(ver + d_len + command + feedback + param1 + param2) sdata = bytearray([0x7E, ver, d_len, command, feedback, param1, param2, cs1, cs2, 0xEF]) uart.write(sdata) #print(sdata) def play_sound(num): global T T = 0 send_data(0x12, num) #utime.sleep_ms(500) def pause_and_play(): global T if T == 0: send_data(0x0E, 0) T = 1 elif T == 1: send_data(0x0D, 0) T = 0 #utime.sleep_ms(500) def next_sound(): global T T = 0 send_data(0x01, 0) def prev_sound(): global T T = 0 send_data(0x02, 0) while True: try: btnState = chk_buttonState() if btnState != -1: led.value(1) B = B + 1 else: led.value(0) B = 0 if B == 1: print(btnState) #when any button pressed , do job just once if btnState == 10: #green play_sound(1) elif btnState == 14: #Yellow prev_sound() elif btnState == 17: #Red pause_and_play() elif btnState == 21: #Blue next_sound() else: pass time.sleep(0.1)# wait except KeyboardInterrupt: break |
Leave a Reply