به نام خدا : تو این مطلب پروژه mp3 player با آردوینو با استفاده از تراشه vs1053 رو میخوام قرار بدم که این مورد اولین پروژه از این سری هستش(حالا اگه بخوام پروژه های بعدیش رو انجامش بدم پروژه رو با صفحه تاچ و نمایشگر رنگی انجامش میدم، البته زمانش معلوم نیست، هر موقع سرم خلوت شد پروژش رو میزارم تو سایت)، تو این مطلب 2 تا پروژه قرار میدم، یه پروژه ساده و یه پروژه خوب که با کامپیوتر MP3 PLAYER رو کنترلش میکنم و لیست آهنگ ها برای کامپیوتر ارسال میشه و….
پروژه mp3 player با آردوینو با تراشه vs1053
توجه 1 : آموزش این تراشه رو بعدا میزارم تو سایت، فعلا وقتش رو ندارم.
توجه 2 : پروژه های مربوط به ضبط صدا رو هم به زودی! تو سایت میزارم.
توجه 3 : آهنگ هاتون رو با فرمت Mp3 داخل رم بریزید و بعد رم رو به شیلد وصل کنید.
توجه 4 : یه هنذفری هم برا این پروژه نیاز هستش که باید به شیلد وصل بشه.
پروژه آردوینو پخش آهنگ 1 ( از طریق پنجره سریال )
ماژول رو روی برد آردوینو قرار داده و کتابخونه ای که در بالا گزاشتم رو هم به آردوینو اضافه کنید و بعد برنامه زیر رو آپلود کنید و البته بعد از کدهای زیر توضیحات لازمه رو میدم :
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 |
#include <SPI.h> #include <Adafruit_VS1053.h> #include <SD.h> // These are the pins used for the breakout example #define BREAKOUT_RESET 8 // VS1053 reset pin (output) #define BREAKOUT_CS 6 // VS1053 chip select pin (output) #define BREAKOUT_DCS 7 // VS1053 Data/command select pin (output) // These are common pins between breakout and shield #define CARDCS 9 // Card chip select pin // DREQ should be an Int pin, see http://arduino.cc/en/Reference/attachInterrupt #define DREQ 2 // VS1053 Data request, ideally an Interrupt pin Adafruit_VS1053_FilePlayer musicPlayer = // create breakout-example object! Adafruit_VS1053_FilePlayer(BREAKOUT_RESET, BREAKOUT_CS, BREAKOUT_DCS, DREQ, CARDCS); // create shield-example object! //Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS); void setup() { Serial.begin(9600); if (! musicPlayer.begin()) { // initialise the music player Serial.println(F("Couldn't find VS1053, do you have the right pins defined?")); while (1); } else { Serial.println(F("VS1053 found")); } if (!SD.begin(CARDCS)) { // initialise sd-card Serial.println(F("SD failed, or not present")); while (1); // don't do anything more } else { Serial.println("SD OK!"); } //printDirectory(SD.open("/"), 0); // Set volume for left, right channels. lower numbers == louder volume! musicPlayer.setVolume(50,50); // Timer interrupts are not suggested, better to use DREQ interrupt! //musicPlayer.useInterrupt(VS1053_FILEPLAYER_TIMER0_INT); // timer int // If DREQ is on an interrupt pin (on uno, #2 or #3) we can do background // audio playing musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int // Play one file, don't return until complete //Serial.println(F("Playing track 001")); //musicPlayer.playFullFile("d1.mp3"); } void loop() { if (Serial.available()) { char c = Serial.read(); // پخش و متوقف کردن لحظه ای و کامل if (c == 's') { Serial.println(F("Playing Stoped.")); musicPlayer.stopPlaying(); } if (c == 'p') { if (! musicPlayer.paused()) { Serial.println("Paused"); musicPlayer.pausePlaying(true); } else { Serial.println("Resumed"); musicPlayer.pausePlaying(false); } } // تعیین آهنگی که باس پخش بشه if (c == 'a') { Serial.println("PLAY n1.mp3"); if (!musicPlayer.stopped())musicPlayer.stopPlaying(); musicPlayer.startPlayingFile("n1.mp3"); } if (c == 'b') { Serial.println("PLAY n2.mp3"); if (!musicPlayer.stopped())musicPlayer.stopPlaying(); musicPlayer.startPlayingFile("n2.mp3"); } if (c == 'c') { Serial.println("PLAY n3.mp3"); if (!musicPlayer.stopped())musicPlayer.stopPlaying(); musicPlayer.startPlayingFile("n3.mp3"); } // تنظیم صدا if(c >= '0' && c <= '9' ) musicPlayer.setVolume( (c-'0')*10, (c-'0')*10 ); } } void printDirectory(File dir, int numTabs) { while(true) { File entry = dir.openNextFile(); if (! entry) { // no more files //Serial.println("**nomorefiles**"); break; } for (uint8_t i=0; i<numTabs; i++) { Serial.print('\t'); } Serial.print(entry.name()); if (entry.isDirectory()) { Serial.println("/"); printDirectory(entry, numTabs+1); } else { // files have sizes, directories do not Serial.print("\t\t"); Serial.println(entry.size(), DEC); } entry.close(); } } |
ارسال کاراکتر s از طریق پنجره سریال : Stop کردن آهنگ.
ارسال کاراکتر p از طریق پنجره سریال : Pause کردن آهنگ.
ارسال کاراکتر a از طریق پنجره سریال : پخش آهنگ 1 – نام آهنگ1 رو در خط 88 پروژه تعیین کنید.
ارسال کاراکتر b از طریق پنجره سریال : پخش آهنگ 2 – نام آهنگ2 رو در خط 93 پروژه تعیین کنید.
ارسال کاراکتر c از طریق پنجره سریال : پخش آهنگ 3 – نام آهنگ3 رو در خط 98 پروژه تعیین کنید.
پروژه آردوینو پخش آهنگ 2 ( کنترل آردوینو از طریق #C )
تو این پروژه که اول مطلب توضیحش دادم، به کمک برنامه نوشته شده تو #C اومدم یه نرم افزار تحت ویندوز نوشتم برا کنترل اون شید VS1053 و تغییراتی در پروژه آردوینو هم دادم بلتبع!، امیدوارم اینجور پروژه ها براتون مفید باشه و برید سمت اینجور پروژه ها
تو این پروژه باید به این شیوه عمل کنید تا مشکلی رخ نده : اول شیلد رو به آردوینو وصل میکنید و بعد آردوینو رو به کامیپوتر و بعد نرم افزار رو اجرا میکنید و بعد آردوینو رو ریست میکنید.
کدهای پروژه آردوینو به صورت زیر هستش :
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 |
#include <SPI.h> #include <Adafruit_VS1053.h> #include <SD.h> // These are the pins used for the breakout example #define BREAKOUT_RESET 8 // VS1053 reset pin (output) #define BREAKOUT_CS 6 // VS1053 chip select pin (output) #define BREAKOUT_DCS 7 // VS1053 Data/command select pin (output) // These are common pins between breakout and shield #define CARDCS 9 // Card chip select pin // DREQ should be an Int pin, see http://arduino.cc/en/Reference/attachInterrupt #define DREQ 2 // VS1053 Data request, ideally an Interrupt pin Adafruit_VS1053_FilePlayer musicPlayer = // create breakout-example object! Adafruit_VS1053_FilePlayer(BREAKOUT_RESET, BREAKOUT_CS, BREAKOUT_DCS, DREQ, CARDCS); // create shield-example object! //Adafruit_VS1053_FilePlayer(SHIELD_RESET, SHIELD_CS, SHIELD_DCS, DREQ, CARDCS); String Buffer; String MusicName[20]; void setup() { Serial.begin(9600); Serial.setTimeout(100); if (! musicPlayer.begin()) { // initialise the music player //Serial.println(F("Couldn't find VS1053, do you have the right pins defined?")); while (1); } else { //Serial.println(F("VS1053 found")); } if (!SD.begin(CARDCS)) { // initialise sd-card //Serial.println(F("SD failed, or not present")); while (1); // don't do anything more } else { //Serial.println("SD OK!"); } SaveMP3Name_in_ArrayString(); // Set volume for left, right channels. lower numbers == louder volume! musicPlayer.setVolume(50, 50); musicPlayer.useInterrupt(VS1053_FILEPLAYER_PIN_INT); // DREQ int } void loop() { if (Serial.available()) { String Data = Serial.readString(); if (Data.startsWith(">") && Data.endsWith("<")) { if(Data == ">MusicName<") { for (int i = 0; MusicName[i] != '\0'; i++) Serial.println(MusicName[i]); } if (Data.startsWith(">0")) { // تعیین آهنگی که باس پخش بشه Data.remove(0, 2); // Remove 2First Character Data.remove(Data.length() - 1, 1); // Remove 2Last Character // Serial.print(Data + Data.length()); int mn; // MusicNumber for (mn = 0; MusicName[mn] != '\0'; mn++) { if (Data == MusicName[mn]) goto Up; } goto Down; Up: if (!musicPlayer.stopped()) { musicPlayer.stopPlaying(); } char Music[20]; MusicName[mn].toCharArray(Music, 20); musicPlayer.startPlayingFile(Music); // "N3.MP3" Down: {} } if (Data.startsWith(">1")) { // توقف کامل musicPlayer.stopPlaying(); } if (Data.startsWith(">2")) { // توقف لحظه ای if (! musicPlayer.paused()) { musicPlayer.pausePlaying(true); } else { musicPlayer.pausePlaying(false); } } // تنظیم قطع و وصل بودن صدا if (Data.startsWith(">3")) musicPlayer.setVolume( 255, 255 ); if (Data.startsWith(">4")) { int Volome = 0; if (Data.length() == 4) { Volome = Data[2] - '0'; musicPlayer.setVolume( 99 - Volome, 99 - Volome ); } if (Data.length() == 5) { Volome = (Data[2] - '0') * 10 + (Data[3] - '0'); musicPlayer.setVolume( 99 - Volome, 99 - Volome ); } } if (Data.startsWith(">5")) { // تنظیم صدا int Volome = 0; if (Data.length() == 4) { Volome = Data[2] - '0'; musicPlayer.setVolume( 99 - Volome, 99 - Volome ); } if (Data.length() == 5) { Volome = (Data[2] - '0') * 10 + (Data[3] - '0'); musicPlayer.setVolume( 99 - Volome, 99 - Volome ); } } } Data.remove(0, Data.length()); // پاک کردن دیتا از رشته دیتا while (Serial.available()) char Data = Serial.read(); // خالی کردن بافر دریافت } } void SaveMP3Name_in_ArrayString() { int i = 0; File dir = SD.open("/"); while (true) { File entry = dir.openNextFile(); if (! entry) break; Buffer = entry.name(); if (Buffer.endsWith(".mp3") || Buffer.endsWith(".MP3")) MusicName[i++] = Buffer; entry.close(); } } |
کدهای پروژه #C به صورت زیر هستش :
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 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
using System; using System.Drawing; using System.Windows.Forms; using System.IO.Ports; namespace WindowsFormsApplication1 { public partial class Form1 : Form { string DataRecieve_string = ""; bool VolomeValueChange = false; Size Form1OldSize; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Invoke(new EventHandler(Refresh_toolStripMenuItem_Click)); Invoke(new EventHandler(default_ToolStripMenuItem_Click)); Mute_pictureBox.Visible = false; Volome_pictureBox.Visible = true; Play_pictureBox.Visible = true; Pause_pictureBox.Visible = false; Form1OldSize = this.Size; } private void default_ToolStripMenuItem_Click(object sender, EventArgs e) { BaudRate_ToolStripMenuItem.SelectedIndex = 5; // 9600 try { ComPort_ToolStripMenuItem.SelectedIndex = 0; } catch { MessageBox.Show("پورت کامی وجود ندارد"); } } private void Refresh_toolStripMenuItem_Click(object sender, EventArgs e) { ComPort_ToolStripMenuItem.Items.Clear(); foreach (string s in SerialPort.GetPortNames()) { ComPort_ToolStripMenuItem.Items.Add(s); } } private void ClosePort_ToolStripMenuItem_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { serialPort1.Close(); OpenPort_ToolStripMenuItem.BackColor = Color.Red; OpenPort_ToolStripMenuItem.Text = "OpenPort"; OpenPort_ToolStripMenuItem.Click -= this.ClosePort_ToolStripMenuItem_Click; OpenPort_ToolStripMenuItem.Click += this.OpenPort_ToolStripMenuItem_Click; } else { MessageBox.Show("پورتی باز نیست که بخوام ببندمش"); } } private void OpenPort_ToolStripMenuItem_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { MessageBox.Show("قبلا پورتی باز شده است"); } else { if (ComPort_ToolStripMenuItem.SelectedIndex == -1) { MessageBox.Show("داش پورت مد نظر رو انتخاب کن و \nبعد رو بر قراری ارتباط کلیک کن"); return; } serialPort1.PortName = ComPort_ToolStripMenuItem.SelectedItem.ToString(); if (BaudRate_ToolStripMenuItem.SelectedIndex == -1) { MessageBox.Show("داش نرخ انتقال داده رو تعیین کن"); return; } serialPort1.BaudRate = Convert.ToInt32(BaudRate_ToolStripMenuItem.Text); try { serialPort1.Open(); OpenPort_ToolStripMenuItem.Text = "ClosePort"; OpenPort_ToolStripMenuItem.BackColor = Color.Green; OpenPort_ToolStripMenuItem.Click -= this.OpenPort_ToolStripMenuItem_Click; OpenPort_ToolStripMenuItem.Click += this.ClosePort_ToolStripMenuItem_Click; MusicList_listBox1.Items.Clear(); Play_pictureBox.Visible = true; Pause_pictureBox.Visible = false; serialPort1.Write(">MusicName<"); // درخواست اددن برای دریافت لیست آهنگ ها } catch (UnauthorizedAccessException) { MessageBox.Show("این پورت توسط دستگاه دیگری استفاده میشود\nپورت دیگری را انتخاب کنید"); } } } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { DataRecieve_string = serialPort1.ReadTo('\n'.ToString()); Invoke(new EventHandler(DisplayDataRecieve)); } private void DisplayDataRecieve(object sender, EventArgs e) { DataRecieve_string = DataRecieve_string.Remove(6, 1); MusicList_listBox1.Items.Add(DataRecieve_string); } private void Play_pictureBox_Click(object sender, EventArgs e) { if (MusicList_listBox1.SelectedIndex != -1) // یعنی گزینه ای انتخاب شده { if (serialPort1.IsOpen) { string DataSend = ">" + "0" + MusicList_listBox1.SelectedItem.ToString() + "<"; serialPort1.Write(DataSend); Play_pictureBox.Visible = false; Pause_pictureBox.Visible = true; Mute_pictureBox.Visible = false; Volome_pictureBox.Visible = true; } else MessageBox.Show("پورت کامی باز نکردی داش"); } else MessageBox.Show("اول یه آهنگ انتخاب کن و بعد روی دکمه پخش کلیک کن"); } private void Stop_pictureBox_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { string DataSend = ">" + "1" + "<"; serialPort1.Write(DataSend); Play_pictureBox.Visible = true; Pause_pictureBox.Visible = false; } else MessageBox.Show("پورت کامی باز نکردی داش"); } private void Pause_pictureBox_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { string DataSend = ">" + "2" + "<"; serialPort1.Write(DataSend); Play_pictureBox.Visible = true; Pause_pictureBox.Visible = false; } else MessageBox.Show("پورت کامی باز نکردی داش"); } private void Mute_pictureBox_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { int Val = volume_trackBar.Value; string DataSend = ">" + "4" + Val.ToString() + "<"; // Volume serialPort1.Write(DataSend); Mute_pictureBox.Visible = false; Volome_pictureBox.Visible = true; } else MessageBox.Show("پورت کامی باز نکردی داش"); } private void Volome_pictureBox_Click(object sender, EventArgs e) { if (serialPort1.IsOpen) { string DataSend = ">" + "3" + "<"; // Mute serialPort1.Write(DataSend); Mute_pictureBox.Visible = true; Volome_pictureBox.Visible = false; } else MessageBox.Show("پورت کامی باز نکردی داش"); } private void volume_trackBar_ValueChanged(object sender, EventArgs e) { VolomeValueChange = true; } private void volume_trackBar_MouseUp(object sender, MouseEventArgs e) { if (VolomeValueChange == true) { VolomeValueChange = false; if (serialPort1.IsOpen) { int Val = volume_trackBar.Value; string DataSend = ">5" + Val.ToString() + "<"; serialPort1.Write(DataSend); } else MessageBox.Show("پورت کامی باز نکردی داش"); } } private void DMF313_IR_MouseHover(object sender, EventArgs e) { toolTip1.Show( "سلام" + "\n" + "امیدوارم پروژه آموزشی مفیدی باشه براتون" + "\n" + "و برید سمت پروژه های ارتباط میکرو با کامپیوتر" + "\n" + "DMF313.IR" + "\n" + "مهدی دمرچیلو" + "\n", DMF313_IR); } private void DMF313_IR_Click(object sender, EventArgs e) { System.Diagnostics.Process.Start("https://dmf313.ir/"); } private void Form1_SizeChanged(object sender, EventArgs e) { if (Size.Width >= 235 && Size.Height >= 300) { volume_trackBar.Size = new Size(volume_trackBar.Width, volume_trackBar.Height + (this.Size.Height - Form1OldSize.Height)); MusicList_listBox1.Size = new Size(MusicList_listBox1.Size.Width, MusicList_listBox1.Size.Height + (this.Size.Height - Form1OldSize.Height)); Form1OldSize = this.Size; } } } } |
شمای نرم افزار نوشته شده با #C به صورت زیر هستش :
خب این مطلب هم تموم شد، امیدوارم مفید بوده باشه براتون، در ضمن فیلم پروژه هم بمونه برا وقتی که من یه موبایل دوربین دار خریدم.اگه مطلب مفید بود برا سلامتی رهبر انقلاب 3 تا صلوات بفرستید(هزینه این مطلب)، فعلا یا علی.
مهمان
سلام .
میخاستم بدونم میشه خروجی صدا از روی یه برد دیگه را با ترک به ورودی این ماژول وصل کنیم ؟ و آیا با این کار می تونیم صدا را هم توی کارت SD ذخیره کنیم یا خیر ؟
مهمان
سلام.دستت درد نکنه واقعا خیلی زحمت میکشی….
ی سوال؟ اگر از برد من Nano باشه چطور باید با شیلد vs1053 ارتباط بگیرم….ارایش ارتباط پایه ها چطور میشه؟ ممنون
مهمان
سلام در این ماژول میشه یه فایل خاصی رو مثلا تکست txt رو توی sd card ذخیره کرد???
میخوام صدا از این ماژول در یه ساعات خاصی پخش بکنم . این ساعاتو یوزر مشخص میکنه.مثلا برنامه اذان گو؟
میشه راهنمایی کنید چطوری این ساعاتو بهش بدم با این ماژول؟؟میخوام تمام زمان ها در این ماژول ذهیره بشن و بعد از خوانده شدن پاک بشن
نویسنده این مطلب
سلام
آره میشه – خود ماژول آهنگارو از رم میخونه دیگه – شما هم برو تو کتابخونه یکی دو تا تابع بهش اضافه کن برا این کارت.
مهمان
سلام
آقا من میخوام توسط آردیونو صدای یه منبع صوتی دیگه رو که دارم رو مموری ذخیره کنم. ماژولی هس که این کارو برام انجام بده؟
نویسنده این مطلب
سلام.نمیدونم.تو فروشگاه ها سرچ کنید
مهمان
اگه لطف کنی پروژه یه هشدار دهنده صوتی با ماژول vs1053 و LCD کاراکتری بذارید بسیار لطف کردین
نویسنده این مطلب
پروژه که انجام نمیشه ولی دارم یه پخش آهنگ ساده درست میکنم که نیاز به vs1053 هم نداره – فقط یه میکرو و یه بلندگو
مهمان
با آردینو دیگه؟
اگه بشه هشدار دهنده صوتی باشه خوبه…
نویسنده این مطلب
هم اردوینو.هم کدویژن و هم lpc
مهمان
جناب دمرچی لو آموزش این ماژول رو نذاشتی
مهمان
سلام با sd کارتش فقط میشه کار کرد
مهمان
یعنی پروژت از پهنا تو حلقم. خیلی لایک داری. (استیکر قلب) به خاطر گسترش دادن رایگان دانشت، و به خاطر طرز بیان گیرا و قابل فهمت
مهمان
بسیار عالی بود …….. با تشکر فراوان
فقط یه سوال هم داشتم ……
این کتابخونه واسه آی سی vs1003 هم کاربرد داره ؟؟؟
بازم ممنون از مطالب خوبتون
نویسنده این مطلب
سلام
دیتاشیتون رو بررسی کنید ببینید تو ریجستر ها تفاوت دارن یا نه – ولی اگه تو این کتابخونه 1053 از ویژگی هایی که فقط مختص 1053 نیست و تو 1003 هم هستش نباید مشکلی رخ بده.
مهمان
با تشکر از شما