ArduinoMp3プレーヤー+距離センサー=FUN
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 |
このプロジェクトについて
CATALEXのシリアルMP3プレーヤーの使用方法
それについての私の以前のチュートリアルでは、必要なライブラリは1つだけです( #include
)、および前のチュートリアルですでに説明したいくつかの簡単な機能:
void sendCommand(int8_t command、int16_t dat){if(command ==CMD_PLAY_WITHFOLDER or command ==CMD_PLAY_WITHVOLUME){Serial.print( "PLAYING SONG、SLIGHTLY MOVE YOUR HEAD FOR GREAT EFFECT");} delay( 20); Send_buf [0] =0x7e; //開始バイトSend_buf [1] =0xff; //バージョンSend_buf [2] =0x06; //開始バイトと終了バイトがないコマンドのバイト数Send_buf [3] =command; // Send_buf [4] =0x00; // 0x00 =フィードバックなし、0x01 =フィードバック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 ++)// {mySerial.write(Send_buf [i]); //ビットをシリアルmp3に送信} Serial.println(); }
<図>
HC-SR04超音波範囲の使用方法
それについての私の以前のチュートリアルは、ライブラリは必要なく、とにかく使いやすいです。以前のhc-sr04の投稿を取得して、この関数に入れました:
long measureDistance(){long duration、distance; digitalWrite(trigPin、LOW); // PULSE ___ | --- | ___ delayMicroseconds(2); digitalWrite(trigPin、HIGH); delayMicroseconds(10); digitalWrite(trigPin、LOW);期間=pulseIn(echoPin、HIGH);距離=(期間/ 2)/ 29.1; Serial.println( "距離:"); Serial.println(距離);戻り距離; //距離をcmで返します}
<図>
両方の使用方法バージョン1:シンプルなmp3距離トリガー
ライブラリをまだインストールしていない場合は、最初にインストールします(
このバージョンのコードでは、何かが50cmに近づくと、mp3オーディオがトリガーされます。私はそれを使って、非常に大きな「サプライズマザーファッカー」クリップでルームメイトを怖がらせました。
注: 完全な .ino
コードは以下のプロジェクト添付ファイルにあります。
void loop(){if(measureDistance()<50){sendCommand(CMD_PLAY_WITHFOLDER、0X0203); // 2番目のフォルダーの3番目の曲を再生するdelay(1000); //エラーを回避するために待つ} delay (300); }
バージョン2と外乱mp3距離トリガーの両方を使用する方法
このバージョンは距離を気にせず、測定値間の違いのみを検出します。エラーによって突然トリガーされた場合は、 if(gap>
20){.......
に高い値を入力します ループの外側で新しい変数を宣言する必要があります。私はコードの最初にそれをしました。
int firstTime =0; //ループの外側でfirstTimeを宣言する必要がありますlongDistance、auxDistance、gap =0; void loop(){Distance =measureDistance(trigPin、echoPin); //距離を測定してgapを保存=abs(Distance-auxDistance); //現在と最後の読み取り値の差を計算if(firstTime ==0){//必要安定性のためにauxDistance =Distance;ギャップ=0; //最初のループの不正行為を回避するために、曲を再生した後に初めて実行しますfirstTime ++; delay(1000); } if(gap>
20){//距離の変動が20cmの場合sendCommand(CMD_PLAY_WITHFOLDER、0X0201); // 2番目のフォルダーの最初の曲を再生firstTime =0; //エラーを回避!!エラーが気に入らないdelay(2000); } Serial.print( "New Distace:"); // debugggggg Serial.print(Distance); Serial.print( "古い距離:"); Serial.print(auxDistance); Serial.println(gap); delay(300); auxDistance =Distance; //次のループにif()の値を格納します}
両方の使用方法バージョン3:2つの距離センサー
2つの距離センサーを使用すると、実際に移動方向を推測できます だから私は「 hello
"または" さようなら
「人の動きの方向によって異なります。
- 最初に、2番目のHC-SR04を制御するための別の2つのDIGITALピンを定義します。
#define trigPin 13 // FIRST距離モジュールの場合#defineechoPin 12 #define trigPin2 10 // 2番目の距離モジュールの場合#defineechoPin2 9
- 新しい変数!ええ!
long Distance、auxDistance、gap =0; long Distance2、auxDistance2、gap2 =0; //新しい変数
-
setup()
内 新しいピン宣言を追加します。
pinMode(trigPin、OUTPUT); pinMode(echoPin、INPUT); pinMode(trigPin2、OUTPUT); pinMode(echoPin2、INPUT);
-
measureDistance()
を変更します 関数、関数は引数からピンを読み取ります。
long measureDistance(int trigger、int echo){long duration、distance; digitalWrite(trigger、LOW); // PULSE ___ | --- | ___ delayMicroseconds(2); digitalWrite(トリガー、HIGH); delayMicroseconds(10); digitalWrite(trigger、LOW);期間=pulseIn(echo、HIGH);距離=(期間/ 2)/ 29.1; Serial.println( "距離:"); Serial.println(距離);戻り距離; }
-
loop():
void loop(){Distance =measureDistance(trigPin、echoPin); // distance1を測定してDistance2を格納=measureDistance(trigPin2、echoPin2); // distance2を測定してgap =abs(Distance-auxDistance);を格納//現在と最後の読み取り値の差を計算しますgap2 =abs(Distance2-auxDistance2); //現在と最後の読み取り値の差を計算しますif(firstTime ==0){//安定性のために必要なものauxDistance =Distance; auxDistance2 =Distance2;ギャップ=0; gap2 =0; //最初のループの不正行為を回避するために、曲を再生した後に初めて実行しますfirstTime ++; delay(2000); } if(gap>
20 and gap2 <20){//距離の変動が20cmの場合sendCommand(CMD_PLAY_WITHFOLDER、0X0201); // 2番目のフォルダーの最初の曲を再生firstTime =0; //エラーを回避!!エラーは嫌いSerial.println( "右の動きが検出されました"); delay(2000); } if(gap2> 20 and gap <20){//距離の変動が20cmの場合sendCommand(CMD_PLAY_WITHFOLDER、0X0202); // 2番目のフォルダーの2番目の曲を再生firstTime =0; //エラーを回避!!エラーは嫌いSerial.println( "左の動きが検出されました"); delay(2000); } Serial.println( "\\\\\\\\\\\\\\\\\\\\\\"); // debugggggg Serial.print( "New Distace:"); // debuggggggSerial。 print(距離); Serial.print( "古い距離:"); Serial.print(auxDistance); Serial.print( "GAP"); Serial.println(gap); Serial.print( "New Distace2:"); // debugggggg Serial.print(Distance); Serial.print( "Old Distance2:"); Serial.print(auxDistance); Serial.print( "GAP2"); Serial.println(gap); Serial.println( "\\\\\\\\\\\\\\\\\\\\\\"); // debugggggg delay(300); auxDistance =Distance; //次のループにif()の値を格納しますauxDistance2 =Distance2; //次のループにif()の値を格納します} Disturbance2 =0; left =0; right =0; delay (1000); //エラーを回避するために待機} delay(300); auxDistance =Distance; //次のループにif()の値を格納しますauxDistance2 =Distance2; //次のループにif()の値を格納します}
ハッピーハッキング、仲間!
コード
- バージョン1、シンプルなmp3距離トリガー
- バージョン2、外乱mp3距離トリガー
- バージョン3、2つのセンサー、方向検出
バージョン1、シンプルなmp3距離トリガー Arduino
このバージョンのコードでは、何かが50cmに近づくと、mp3オーディオがトリガーされます。私はそれを使って、非常に大きな「サプライズマザーファッカー」クリップでルームメイトを怖がらせました。 5 //シリアルMP3プレーヤーモジュールのTXに接続する必要があります#defineARDUINO_TX6 //モジュールのRXに接続します#definetrigPin 13 //距離モジュールの場合#defineechoPin 12SoftwareSerial mySerial(ARDUINO_RX、ARDUINO_TX); //初期化シリアルプロトコル、ピンがTXとRXであるかmyserialに伝えます////////////////////////////////////// ////////////////////////////////////////////////全てのデータシートに必要なコマンド(http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf)static int8_t Send_buf [8] ={0}; // MP3プレーヤーは8int文字列の注文を理解しません// 0X7E FF 06 command 00 00 00 EF;(コマンド=01次の曲の順序の場合)#define NEXT_SONG 0X01 #define PREV_SONG 0X02 #define CMD_PLAY_W_INDEX 0X03 //データが必要です(曲の数)#define VOLUME_UP_ONE 0X04#define VOLUME_D OWN_ONE 0X05#define CMD_SET_VOLUME 0X06 //データが必要です(0から30(0x1E)までのボリュームの数)#defineSET_DAC 0X17#define CMD_PLAY_WITHVOLUME 0X22 //データが必要です0x7E06 22 00 xx yy EF;(xxボリューム)( yy曲数)#defineCMD_SEL_DEV 0X09 //ストレージデバイスを選択、データが必要#define DEV_TF 0X02 //こんにちは、必要なデータをIM #define SLEEP_MODE_START 0X0A#define SLEEP_MODE_WAKEUP 0X0B#define CMD_RESET 0X0C // CHIP RESET# // RESUME PLAYBACK#define CMD_PAUSE 0X0E // PLAYBACK IS PAUSED#define CMD_PLAY_WITHFOLDER 0X0F // DATA IS NEEDED、0x7E 06 0F 00 01 02 EF;(ディレクトリ\ 01 \ 002xxxxxx.mp3#define STOP_PLAY 0X16#defineで曲を再生PLAY_FOLDER 0X17 //データが必要0x7E06 17 00 01 XX EF;(01フォルダーを再生)(値xxは気にしない)#define SET_CYCLEPLAY 0X19 //データが必要00start; 01 close#define SET_DAC 0X17 //データが必要00start DAC OUTPUT; 01DAC出力なし////////////////////////////// ////////////////////////////////////////////////// //// void setup(){Serial.begin(9600); // pcmySerial.begin(9600);でシリアルモニターのシリアルcomを開始します; // MP3delay(500); //待機のシリアルcomを開始しますチップの初期化が完了しましたsendCommand(CMD_SEL_DEV、DEV_TF); // TFカードを選択delay(200); // 200mspinMode(trigPin、OUTPUT); pinMode(echoPin、INPUT);} void loop(){if(measureDistance( trigPin、echoPin)<50){sendCommand(CMD_PLAY_WITHFOLDER、0X0203); // 2番目のフォルダーの3番目の曲を再生delay(1000); //エラーを回避するために待機} delay(300);} 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; // 0x00 =フィードバックなし、0x01 =フィードバック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 ++)// {mySerial.write(Send_buf [i]); //ビットをシリアルmp3に送信Serial.print(Send_buf [i]、HEX); / / PCのシリアルモニターにビットを送信} Serial.println();} long measureDistance(int trigger、int echo){long duration、distance; digitalWrite(trigger、LOW); // PULSE ___ | --- | ___ delayMicroseconds(2); digitalWrite(トリガー、HIGH); delayMicroseconds(10); digitalWrite(trigger、LOW);期間=pulseIn(echo、HIGH);距離=(期間/ 2)/ 29.1; Serial.println( "距離:"); Serial.println(距離);戻り距離;}バージョン2、外乱mp3距離トリガー Arduino
このバージョンは距離を気にせず、読み取り値の違いのみを検出します。//JavierMuñozによって再配置されたコード2016/10/[email protected]#include#define ARDUINO_RX 5 //で私に尋ねてくださいシリアルMP3プレーヤーモジュールのTXに接続する必要があります#defineARDUINO_TX6 //モジュールのRXに接続します#definetrigPin 13 //距離モジュールの場合#defineechoPin 12SoftwareSerial mySerial(ARDUINO_RX、ARDUINO_TX); //シリアルプロトコルを初期化します、ピンがTXとRXであるかをmyserialに伝えます///////////////////////////////////////// /////////////////////////////////////////////データシート(http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf)static int8_t Send_buf [8] ={0}; // MP3プレーヤーは8int文字列の注文を理解しません// 0X7E FF06コマンド0000 00 EF;(コマンド=01次の曲の順序の場合)#define NEXT_SONG 0X01 #define PREV_SONG 0X02 #define CMD_PLAY_W_INDEX 0X03 //データが必要です(曲の数)#define VOLUME_UP_ONE 0X04#define VOLUME_DOWN_ONE 0X05#define CMD_SET_VOLUME 0X06 // DATA IS REQUIRED(number of volume from 0 up to 30(0x1E))#define SET_DAC 0X17#define CMD_PLAY_WITHVOLUME 0X22 // data required 0x7E 06 22 00 xx yy EF;(xx volume)( yy曲数)#defineCMD_SEL_DEV 0X09 //ストレージデバイスを選択、データが必要#define DEV_TF 0X02 //こんにちは、必要なデータをIM #define SLEEP_MODE_START 0X0A#define SLEEP_MODE_WAKEUP 0X0B#define CMD_RESET 0X0C // CHIP RESET# // RESUME PLAYBACK#define CMD_PAUSE 0X0E // PLAYBACK IS PAUSED#define CMD_PLAY_WITHFOLDER 0X0F // DATA IS NEEDED、0x7E 06 0F 00 01 02 EF;(ディレクトリ\ 01 \ 002xxxxxx.mp3#define STOP_PLAY 0X16#defineで曲を再生PLAY_FOLDER 0X17 //データが必要0x7E06 17 00 01 XX EF;(01フォルダーを再生)(値xxは気にしない)#define SET_CYCLEPLAY 0X19 //データが必要00start; 01 close#define SET_DAC 0X17 //データが必要00start DAC OUTPUT; 01DAC出力なし////////////////////////////// ////////////////////////////////////////////////// //// int firstTime =0; //ループの外側でfirstTimeを宣言する必要がありますlongDistance、auxDistance、gap =0; void setup(){Serial.begin(9600); //シリアルモニターのシリアルコムを開始しますpcmySerial.begin(9600); // MP3delay(500);のシリアルコムを開始します; //チップの初期化が完了するのを待ちますsendCommand(CMD_SEL_DEV、DEV_TF); // TFカードの遅延を選択します(200); //待機します200mspinMode(trigPin、OUTPUT); pinMode(echoPin、INPUT);} void loop(){Distance =measureDistance(trigPin、echoPin); //距離とstoregap =abs(Distance-auxDistance); //の差を計算するそして最後のreadingif(firstTime ==0){//安定性のために必要thingsauxDistance =Distance; gap =0; //最初のループを回避するために、曲を再生した後に初めて実行するmalfuntcionfirstTime ++; delay(1000);} if(gap> 20){//距離の変動が20cmの場合sendCommand(CMD_PLAY_WITHFOLDER、0X0201); // 2番目のフォルダーの最初の曲を再生するfirstTime =0; //エラーを回避する!!エラーを回避するdelay (2000); } Serial.print( "New Distace:"); // debuggggggSerial.print(Distance); Serial.print( "Old Distance:"); Serial.print(auxDistance); Serial.println(gap); delay(300); auxDistance =Distance; //次のループにif()の値を格納する} void sendCommand(int8_t command、int16_t dat){if(command ==CMD_PLAY_WITHFOLDERまたはcommand ==CMD_PLAY_WITHVOLUME){Serial.print( "PLAYING SONG、頭を少し動かして効果を高めましょう ");} delay(20); Send_buf [0] =0x7e; //開始バイトSend_buf [1] =0xff; //バージョンSend_buf [2] =0x06; //開始バイトと終了バイトがないコマンドのバイト数Send_buf [3] =command; // Send_buf [4] =0x00; // 0x00 =フィードバックなし、0x01 =フィードバック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 ++)// {mySerial.write(Send_buf [i]); //ビットをシリアルmp3に送信} Serial.println();} long measureDistance(int trigger 、int echo){長い期間、距離; digitalWrite(trigger、LOW); // PULSE ___ | --- | ___ delayMicroseconds(2); digitalWrite(トリガー、HIGH); delayMicroseconds(10); digitalWrite(trigger、LOW);期間=pulseIn(echo、HIGH);距離=(duration / 2)/ 29.1; // Serial.println( "distance:"); // Serial.println(distance);戻り距離;}
バージョン3、2つのセンサー、方向検出 Arduino
2つの距離センサーを使用して//JavierMuñozによってコードが再配置されました10/11/[email protected]で私に尋ねてください#include#define ARDUINO_RX 5 //シリアルMP3プレーヤーのTXに接続する必要がありますmodule#define ARDUINO_TX 6 //モジュールのRXに接続#definetrigPin 13 // FIRST距離モジュールの場合#defineechoPin 12 #define trigPin2 10 // 2番目の距離モジュールの場合#defineechoPin2 9#define trigPin 13 // for距離module#define echoPin 12SoftwareSerial mySerial(ARDUINO_RX、ARDUINO_TX); //シリアルプロトコルを初期化し、ピンがTXとRXであるかをmyserialに通知します/////////////////// ////////////////////////////////////////////////// ////////////////データシートに必要なすべてのコマンド(http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf)static int8_t Send_buf [8] ={0}; // MP3プレーヤーは8int文字列の順序を理解しません// 0X7E FF06コマンド0000 00 EF;(コマンド=01次の曲の順序の場合)#define NEXT_SONG 0X01 #define PREV_SONG 0X02 #define CMD_PLAY _W_INDEX 0X03 //データが必要です(曲の数)#defineVOLUME_UP_ONE 0X04#define VOLUME_DOWN_ONE 0X05#define CMD_SET_VOLUME 0X06 // DATA IS REQUIRED(0から30(0x1E)までのボリュームの数)#defineSET_DAC 0X17#define CMD //データが必要です0x7E06 22 00 xx yy EF;(xx volume)(yy number of song)#define CMD_SEL_DEV 0X09 //ストレージデバイスを選択し、データが必要です#define DEV_TF 0X02 // HELLO、IM必要なデータ#define SLEEP_MODE_START 0X0A#define SLEEP_MODE_WAKEUP 0X0B#define CMD_RESET 0X0C // Chip RESET#define CMD_PLAY 0X0D // RESUME PLAYBACK#define CMD_PAUSE 0X0E // PLAYBACK IS PAUSED#define CMD_PLAY_WITHFOLDER 0X0F /ディレクトリ\ 01 \ 002xxxxxx.mp3#define STOP_PLAY 0X16#define PLAY_FOLDER 0X17 //データが必要です0x7E06 17 00 01 XX EF;(01フォルダを再生)(値xx私たちは気にしない)#define SET_CYCLEPLAY 0X19 //データが必要です00start; 01 close#define SET_DAC 0X17 //データが必要00start DAC OUTPUT; 01DAC出力なし////////////////////////////// ////////////////////////////////////////////////// //// int firstTime =0; //ループの外側でfirstTimeを宣言する必要がありますlongDistance、auxDistance、gap =0; long Distance2、auxDistance2、gap2 =0; void setup(){Serial.begin(9600); / / pcmySerial.begin(9600); // MP3delay(500);のシリアルcomのシリアルcomを開始します; //チップの初期化が完了するのを待ちますsendCommand(CMD_SEL_DEV、DEV_TF); // TFカードを選択しますdelay(200); // 200mspinMode(trigPin、OUTPUT);を待ちますpinMode(echoPin、INPUT); pinMode(trigPin2、OUTPUT); pinMode(echoPin2、INPUT); } void loop(){Distance =measureDistance(trigPin、echoPin); // distance1とstoreDistance2 =measureDistance(trigPin2、echoPin2); // distance2とstoregap =abs(Distance-auxDistance); //の差を計算するそして最後のreadinggap2 =abs(Distance2-auxDistance2); //現在と最後のreadingの差を計算しますif(firstTime ==0){//安定性のために必要thingsauxDistance =Distance; auxDistance2 =Distance2; gap =0; gap2 =0; / /最初のループmalfuntcionfirstTime ++を回避するために、曲を再生した後に初めて実行します。 delay(2000);} if(gap> 20 and gap2 <20){//距離の変動が20cmの場合sendCommand(CMD_PLAY_WITHFOLDER、0X0201); // 2番目のフォルダーの最初の曲を再生firstTime =0; //エラーを回避!! errorsSerial.println( "RIGHT MOVEMENT DETECTED"); delay(2000);は好きではありません。 } if(gap2> 20 and gap <20){//距離の変動が20cmの場合sendCommand(CMD_PLAY_WITHFOLDER、0X0202); // 2番目のフォルダーの2番目の曲を再生firstTime =0; //エラーを回避!! errorsSerialは好きではありません。 println( "LEFT MOVEMENT DETECTED"); delay(2000); } Serial.println( "\\\\\\\\\\\\\\\\\\\\\\"); // debuggggggSerial.print( "New Distace:"); // debuggggggSerial.print( Distance); Serial.print( "Old Distance:"); Serial.print(auxDistance); Serial.print( "GAP"); Serial.println(gap); Serial.print( "New Distace2:"); // debuggggggSerial.print(Distance); Serial.print( "Old Distance2:"); Serial.print(auxDistance); Serial.print( "GAP2"); Serial.println(gap); Serial.println( "\\\\ \\\\\\\\\\\\\\\\\\ "); // debuggggggdelay(300); auxDistance =Distance; //次のループにif()の値を格納しますauxDistance2 =Distance2; //次のループにif()の値を格納します} void sendCommand(int8_t command、int16_t dat){if(command ==CMD_PLAY_WITHFOLDERまたはcommand ==CMD_PLAY_WITHVOLUME){Serial.print( "歌を再生し、頭を少し動かして効果を高めます");} delay(20); Send_buf [0] =0x7e; //開始バイトSend_buf [1] =0xff; //バージョンSend_buf [2] =0x06; //開始バイトと終了バイトがないコマンドのバイト数Send_buf [3] =command; // Send_buf [4] =0x00; // 0x00 =フィードバックなし、0x01 =フィードバック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 ++)// {mySerial.write(Send_buf [i]); //ビットをシリアルmp3に送信} Serial.println();} long measureDistance(int trigger 、int echo){長い期間、距離; digitalWrite(trigger、LOW); // PULSE ___ | --- | ___ delayMicroseconds(2); digitalWrite(トリガー、HIGH); delayMicroseconds(10); digitalWrite(trigger、LOW);期間=pulseIn(echo、HIGH);距離=(duration / 2)/ 29.1; // Serial.println( "distance:"); // Serial.println(distance);戻り距離;}
回路図
唯一の距離センサー 2つの距離センサー、ピン10、9にもう1つ追加するだけです 製造プロセス