masayasanのアイコン画像

ガチャポンMP3プレイヤー

masayasan 2021年10月09日に作成  (2021年10月12日に更新)

ガチャポンMP3プレイヤー

概要

ガチャポンケースで何か電子工作が出来ないか考えた結果、MP3プレイヤーを制作することにしました。
私が子供の頃は100円タイプのガチャポンしかなかったが、今は300~500円のガチャポンもあり、ケースも結構大きいものがあります。
単4乾電池3本ケースくらいなら余裕でカプセル内に入れることが可能です。

主な部品

・PICマイコンPIC16F18323
 特にマイコンの種類は何でも良いのですがMCCで設定出来るものが楽です。
・DFplayer mini
 秋月やアマゾン等で購入可能、aliexpress が最安かも。
・RGB LED
 動作確認用に。
・タクトスイッチ
 音楽停止用
・スライドスイッチ
 電源入切り用
・スピーカー 50φ
 40φのが秋月にあったのでそちらを使った方が収まりやすいでしょう。

回路図

キャプションを入力できます

MCC設定

キャプションを入力できます
キャプションを入力できます
キャプションを入力できます
キャプションを入力できます
キャプションを入力できます
キャプションを入力できます
キャプションを入力できます
キャプションを入力できます

プログラムソース

#include "mcc_generated_files/mcc.h"
#include "stdio.h"

void play(uint8_t num) {
    EUSART_Write(0x7E); //$S
    EUSART_Write(0xFF); //VER
    EUSART_Write(0x06); //Len
    EUSART_Write(0x0F); //CMD
    EUSART_Write(0x00); //Feedback 
    EUSART_Write(0x01); // para1
    EUSART_Write(num); //para2z
    EUSART_Write(0xEF); //end

}

void volume(uint8_t num) {
    EUSART_Write(0x7E); //$S
    EUSART_Write(0xFF); //VER
    EUSART_Write(0x06); //Len
    EUSART_Write(0x06); //CMD
    EUSART_Write(0x00); //Feedback
    EUSART_Write(0x00); //para1
    EUSART_Write(num); //para2    
    EUSART_Write(0xEF); //end
}

void Pause() {
    EUSART_Write(0x7E); //$S
    EUSART_Write(0xFF); //VER
    EUSART_Write(0x06); //Len
    EUSART_Write(0x0E); //CMD
    EUSART_Write(0x00); //Feedback 
    EUSART_Write(0x00); // para1
    EUSART_Write(0x00); //para2
    EUSART_Write(0xEF); //end
}

void Standby() {
    EUSART_Write(0x7E); //$S
    EUSART_Write(0xFF); //VER
    EUSART_Write(0x06); //Len
    EUSART_Write(0x0A); //CMD
    EUSART_Write(0x00); //Feedback 
    EUSART_Write(0x00); // para1
    EUSART_Write(0x00); //para2
    EUSART_Write(0xEF); //end
}

void Reset() {
    EUSART_Write(0x7E); //$S
    EUSART_Write(0xFF); //VER
    EUSART_Write(0x06); //Len
    EUSART_Write(0x0B); //CMD
    EUSART_Write(0x00); //Feedback 
    EUSART_Write(0x00); // para1
    EUSART_Write(0x00); //para2
    EUSART_Write(0xEF); //end   
}

void main(void) {
    SYSTEM_Initialize();
    PWM1_LoadDutyValue(10);
    PWM2_LoadDutyValue(10);
    PWM3_LoadDutyValue(10);
    __delay_ms(200);
    int CNTTIM1 = TMR0_ReadTimer();
    Pause();
    while (1) {
        int CNTTIM2 = TMR0_ReadTimer() - CNTTIM1;
        int Val = ADC_GetConversion(channel_ANA4);
        int Val1;
        int Val2;
        int Val3;
        int playmusic;

        if (Val <= 30) {
            Val = 0;
        }

        Val1 = Val / 100;
        Val2 = Val % 100;
        Val2 = Val2 / 10;
        Val3 = Val % 10;
        
        playmusic = Val % 100;        
        if(playmusic==0){
            playmusic=1;
        }else if(playmusic>77){
            if(Val3==0){
                Val3=1;
            }
            playmusic=Val3;
        }


        if (Val > 30) {
            if (Val3 == 0) {
                Val3 = 1;
            }
            volume(0x1A);
            __delay_ms(2);
            play(playmusic);
            __delay_ms(100);
        }
        if (RA2 == 0) {
            CNTTIM1 = TMR0_ReadTimer();
        }

        // printf("Val,%d\n", Val);
        //  printf("Val1,%d\n", Val1);
        //   printf("Val2,%d\n", Val2);
        //    printf("Val3,%d\n", Val3);


        Val1 = Val1 * 1;
        Val2 = Val2 * 1;
        Val3 = Val3 * 1;
        PWM1_LoadDutyValue(Val1);
        PWM2_LoadDutyValue(Val2);
        PWM3_LoadDutyValue(Val3);

        if (RA3 == 0) {
            Pause();
        }

        if (CNTTIM2 > 100 && RA2 == 1) {
            PWM1_LoadDutyValue(0);
            PWM2_LoadDutyValue(0);
            PWM3_LoadDutyValue(0);
            Standby();
            SLEEP(); 
        }

    }
}

写真・動画

スライドスイッチは電源入切り用。タクトスイッチは音楽停止。
ビスネジに触れると皮膚抵抗値に合わせた音楽が流れます。
音楽停止状態で数秒放置しておくとスリープモードになります。
復帰はスライドスイッチで電源再起動。
キャプションを入力できます キャプションを入力できます キャプションを入力できます キャプションを入力できます

ここに動画が表示されます

まとめ

出来るだけ部品点数を少なくしたかったが、DFplayerのStandby modeからの復帰方法が電源リセットでしか復帰出来なかったのでスライドスイッチを追加しました。
PICのMCLRに使用していたタクトスイッチは音楽停止ボタンに機能変更。
折角LEDがあるので音楽に合わせて点灯させても良かったかも。

1
ログインしてコメントを投稿する