Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン21(DFplayer関数作成)

 

STM32(nucleof401)用DFplayerの関数作成

1.本日の内容

 (1) STM32マイコン(nucleof401RE)で使用するDFplayerの関数を作成する。

 

・目次

 

2.内容

​​(1) やる内容の詳細​

 ・DFplayerの操作するための関数を作成する。

 

(2) CubeMXの設定

 ・関数作成のため、CubeMXの操作は無し。 

 

(3) 作成する関数

DFplayerを操作する関数として下記関数を作成する。

関数名 引数 返り値 役割
DFP_SEND int fd //function deseriptin void DFplayer UART通信送信関数
  int paraH //parameterのHigh byte - -
  int paraL //parameterのLow byte - -
DFP_NEXT void void 次の曲を再生
DFP_PREVIOUS void void 前の曲を再生
DFP_SPEC int track_set //トラック番号(1~2999) void 特定のトラックを再生
DFP_VOL_INC void void 音量を+1
DFP_VOL_DEC void void 音量を-1
DFP_VOL int volume //音量設定(1~30) void 指定した値に音量を設定
DFP_FOLDER_REP void void 現在のフォルダーをリピート
DFP_SINGLE_REP void void 現在の曲を1曲リピート
DFP_RANDOM void void 曲をランダム再生
DFP_POWER_LOW void void パワーオフ(低消費電力モード)
DFP_NW void void 通常起動
DFP_RES void void モジュールリセット
DFP_PLAY void void 現在の曲を再生
DFP_PAUSE void void 曲の再生を一時停止
DFP_FOLDER_PLAY

int folder_set

//リピートするフォルダーを指定(1~10)

void 指定したフォルダーをリピート
DFP_VOL_AD

int DH

//オープン制御、ボリュームセットの設定

void 音の設定
  int DL //音量設定値 - -
DFP_REP void void リピート再生

 

(4) プログラムの作成

 ・dfplayer.cファイルの作成

/**	********************************************************* */
/**
 *	@file		dfplayer.c
 *	@brief		DFplayer操作用
 *	@brief		Compiler 	: Atollic True Studio for STM32 9.3.0
 *	@brief		CPU			: STM32F401
 *	@date		$LastChangedDate	: 2021/11/13  $
 */
/**	********************************************************* */

/**	********************************************************* */
//		インクルード ファイル	
/**	********************************************************* */
#include "main.h"
#include "dfplayer.h" ///dfplayer操作用ヘッダファイル
/**	********************************************************* */
//		外部定義変数	
/**	********************************************************* */

/**	********************************************************* */
//		内部定義変数
/**	********************************************************* */
UART_HandleTypeDef huart1;	//huart1の宣言

/**	********************************************************* */
//		関数の作成
/**	********************************************************* */

/**	********************************************************** */
/**
 *	DFplayerデータ送信(USART)
*	@param	fd	            : function deseriptionの値
*	@param	paraH	        : parameterのhigh data byteの値
*	@param	paraL	        : parameterのlow data byteの値
*	@return	void			: None
 */
/**	********************************************************** */

void DFP_SEND(int fd, int paraH, int paraL)
{
    //配列の宣言
    //SINT dataset[]={};  //UART送信データ格納用配列
   // SINT dataset[] = {0x7E, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0xEF};
	//データ送信用配列を用意
    uint8_t dataset[] = {0x7E, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0xEF};
    dataset[3] = fd;    //function deseription の値を設定
    dataset[5] = paraH; //parameterのhigh data byteの値を設定
    dataset[6] = paraL; //parameterのlow data byteの値を設定

    //USARTデータ送信処理
	//USART1を使用
    HAL_UART_Transmit(&huart1, dataset, sizeof(dataset), 100);
}

/**	********************************************************** */
/**
*	次の曲を再生
*	@param	void        	: none
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_NEXT()
{
	DFP_Send(FD_NEXT, PARA, PARA);
}

/**	********************************************************** */
/**
*	前の曲を再生
*	@param	void        	: none
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_PREVIOUS() 
{
	DFP_Send(FD_PREVIOUS, PARA, PARA);
}

/**	********************************************************** */
/**
*	特定のトラックを再生
*	@param	int track_set   :トラック番号(1~2999)	 
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_SPEC(int track_set) 
{
    //tack_set:1~2999で曲を選択
	DFP_Send(FD_SPEC, PARA, track_set);
}

/**	********************************************************** */
/**
*	DFplayerの音量を+1
*	@param	void        	: none
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_VOL_INC() 
{
	DFP_Send(FD_VOL_INC, PARA, PARA);
}

/**	********************************************************** */
/**
*	DFplayerの音量を-1
*	@param	void        	: none
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_VOL_DEC() 
{
	DFP_Send(FD_VOL_DEC, PARA, PARA);
}

/**	********************************************************** */
/**
*	DFplayerの音量を設定
*	@param	int volume      : 音量設定値(1~30)
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_VOL(int volume) //音量の設定
{
	//volumeの値が1~30の時
	if(volume>0 && volume<31){
	    //volume:1~30で音量設定
		DFP_Send(FD_VOL, PARA, volume);
	}else{
		//何もしない。
	}
}

/**	********************************************************** */
/**
*	現在のフォルダーをリピート
*	@param	void        	: none
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_FOLDER_REP() 
{
    //set= 0:リピート
    //set= 1:フォルダーリピート
	DFP_Send(FD_SPEC_REP, PARA, 0x01);
}

/**	********************************************************** */
/**
*	現在の曲を1曲リピート
*	@param	void        	: none
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_SINGLE_REP() 
{
    //set= 2:シングルリピート
	DFP_Send(FD_SPEC_REP, PARA, 0x02);
}

/**	********************************************************** */
/**
*	ランダム再生
*	@param	void        	: none
*	@return	void		: none
*/
/**	********************************************************** */
void DFP_RANDOM() 
{
    //set= 3:ランダム再生
	DFP_Send(FD_SPEC_REP, PARA, 0x03);
}

/**	********************************************************** */
/**
*	パワーオフ(低消費電力モードに入る)
*	@param	void        	: none
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_POWER_LOW() //パワーオフ
{
	DFP_Send(FD_LOW, PARA, PARA);
}

/**	********************************************************** */
/**
*	通常起動
*	@param	void        	: none
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_NW()
{
	DFP_Send(FD_NW, PARA, PARA);
}

/**	********************************************************** */
/**
*	モジュールリセット
*	@param	void        	: none
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_RES() 
{
	DFP_Send(FD_RES, PARA, PARA);
}

/**	********************************************************** */
/**
*   現在の曲を再生
*	@param	void        	: none
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_PLAY()
{
	DFP_Send(FD_PLAY, PARA, PARA);
}

/**	********************************************************** */
/**
*	曲の再生を一時停止
*	@param	void        	: none
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_PAUSE()
{
	DFP_Send(FD_PAUSE, PARA, PARA);
}

/**	********************************************************** */
/**
*	指定したフォルダーの曲を再生
*	@param	int folder_set 	: 再生するフォルダーを設定
* @param int song_set : 再生する曲を設定
* @return void : none */ /** ********************************************************** */ void DFP_FOLDER_PLAY(int folder_set,int song_set) { DFP_Send(FD_FOLDER_PLAY, folder_set, song_set); } /** ********************************************************** */ /** * 音量設定 * @param void : none * @return void : none */ /** ********************************************************** */ void DFP_VOL_AD(int DH, int DL) { //DH:1:オープン制御 //DH:0:ボリュームセット(DL:1~31) DFP_Send(FD_VOL_AD, DH, DL); } /** ********************************************************** */ /** * リピート再生 * @param void : none * @return void : none */ /** ********************************************************** */ void DFP_REPEAT() //再生、停止 { //1:リピート開始 //2:停止 DFP_Send(FD_REPEAT, PARA, PARA); } /* **** ファイルの最後 ( dfplayer.c ) *********************** */

 

・dfplayer.hファイルの作成

/**	******************************************************* */
/**
 *	@file		dfplayer.h
 *	@brief		dfplayer操作用ヘッダファイル
 *	@date		$LastChangedDate	: 2021/11/13$
 */
/**	******************************************************** */

#ifndef DFPLAYER_H ///<DFPLAYER_H 未定義?
#define DFPLAYER_H ///<DFPLAYER_H 定義済み!!

/* *************************************************************** */
//		インクルード ファイル																			
/* *************************************************************** */

/* **************************************************************** */
//		定数値の定義																					
/* ****************************************************************** */
/** DFplayer動作ステート定義 */
#define PARA 0x00           ///NEXT,PAUSE,STOP,PLAY,RANDのLSB
#define FD_NEXT 0x01        ///次の曲を再生
#define FD_PREVIOUS 0x02    ///前の曲を再生
#define FD_SPEC 0x03        ///特定のトラック(曲)を再生
#define FD_VOL_INC 0x04     ///音量+
#define FD_VOL_DEC 0x05     ///音量-
#define FD_VOL 0x06         ///音量の設定
#define FD_SPEC_REP 0x08    ///特定の曲、ファイル、ランダムリピート
#define FD_LOW 0x0A         ///パワーオフモード
#define FD_NW 0x0B          ///通常起動
#define FD_RES 0x0C         ///モジュールをリセット
#define FD_PLAY 0x0D        ///曲を再生
#define FD_PAUSE 0x0E       ///曲の一時停止
#define FD_FOLDER_PLAY 0x0F ///フォルダの再生
#define FD_VOL_AD 0x10      ///ボリュームの調整
#define FD_REPEAT 0x11      ///曲のリピート再生
/* ************************************************************* */
//		構造体の定義																					
/* ************************************************************* */

/* ************************************************************** */
//		外部変数の定義																					
/* ************************************************************** */

/* ************************************************************** */
// 関数のプロトタイプ宣言 /* ************************************************************** */
extern void DFP_SEND(int fd, int paraH, int paraL); ///DFplayerデータ送信(USART) extern void DFP_NEXT(); ///次の曲を再生 extern void DFP_PREVIOUS(); //前の曲を再生 extern void DFP_SPEC(int track_set); ///特定のトラック(曲)を再生 extern void DFP_VOL_INC(); ///音量+ extern void DFP_VOL_DEC(); ///音量- extern void DFP_VOL(int vol); ///音量を設定 extern void DFP_FOLDER_REP(); ///フォルダリピート extern void DFP_SINGLE_REP(); ///1曲リピート extern void DFP_RANDOM(); ///ランダムリピート extern void DFP_POWER_LOW(); ///パワーオフ extern void DFP_NW(); ///通常起動 extern void DFP_RES(); ///モジュールリセット extern void DFP_PLAY(); ///曲の再生を再開 extern void DFP_PAUSE(); ///曲の再生を一時停止 extern void DFP_FOLDER_PLAY(int folder_set); ///フォルダーリピート extern void DFP_VOL_AD(int DH, int DL); ///音量調整 extern void DFP_REPEAT(); ///再生、停止 #endif ///<DFPLAYER_H 未定義 End /* **** ファイルの最後 ( dfplayer.h ) ***************************** */

 

 

※amazonのDFplayerで動作確認したところ、一部コマンド動作が違う部分がある。

・DFP_RANDOM/DFP_SINGLE_REPEAT/DFP_FOLDER_REPEATは、実際には動作しなかった。

 →0x08 DH DL を送った場合 DH DLで曲の選択、選択した曲を1曲リピートする。

 DL:0~255(0xff)曲目までを選択

 DH:それ以降を選択する場合に使用する。

 256の場合、DH:0x01 /DL:0x00

確認:DFplayer

 

/**	********************************************************** */
/**
*	選択した曲をシングルリピート
*	@param	int         	: song_set2:0~255まで選択
*	@param	int         	: song_set1:	0~255以降を選択
*	@return	void			: none
*/
/**	********************************************************** */
void DFP_SINGLE_REPEAT(int song_set1,int song_set2)
{
	///最大値確認
	song_set2 = song_set2<=255?song_set2:255;
	song_set1 = song_set1<=255?song_set1:255;

    //set= 2:シングルリピート
	DFP_Send(FD_SPEC_REP, song_set1, song_set2);
}

 

(4) プログラムの説明
 (a) DFP_SEND
  DFplayerのデータをUART通信により送る関数
       uint8_t dataset[] = {0x7E, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0xEF};
  送信用データ配列を作成する。
  この配列の3要素目が機能、5要素目がHigh byte、6要素目がLow byteとなっている。
  その要素を引数で渡すことにより、機能に関する関数を作成する。
  
  DFplayerについては下記記事を参照
 

3.関連記事

関連記事一覧:
 
DFplayer関連:
 
組み込みC言語