תוכן עניינים:

משחק תנועות עם Arduino ו- YX5300 מודול MP3 Catalex: 13 שלבים
משחק תנועות עם Arduino ו- YX5300 מודול MP3 Catalex: 13 שלבים

וִידֵאוֹ: משחק תנועות עם Arduino ו- YX5300 מודול MP3 Catalex: 13 שלבים

וִידֵאוֹ: משחק תנועות עם Arduino ו- YX5300 מודול MP3 Catalex: 13 שלבים
וִידֵאוֹ: שירי משחק: הופ הופ הופ - ערוץ לולי 2024, נוֹבֶמבֶּר
Anonim
משחק תנועות עם Arduino ו- YX5300 מודול MP3 Catalex
משחק תנועות עם Arduino ו- YX5300 מודול MP3 Catalex

האם אתה מסוגל לקרוא את השאלה הזו? זה מוזר! שאלתי את השאלה הזו בכוונה. אם אתה יכול לקרוא את הטקסט הזה, זה בגלל שאתה יודע את האלף בית כולו וכמובן למדת על כל התנועות.

תנועות קיימות בכל המילים. אי אפשר להימלט מכל אחד מהם. עכשיו, הרשה לי לשאול אותך שאלה. האם למידת ילדותך הייתה מהנה וכללה משאבים טכנולוגיים?

אני בטוח שמשאבי הלמידה היו מועטים והשתמשת בשיטות מסורתיות ללימוד התנועות והאלף בית.

אחרי הכל, האם אפשר להשתמש בכמה משאבים טכנולוגיים כדי ללמוד את התנועות?

במאמר זה אלמד אותך כיצד ללמד את תלמידיך וילדיך תנועות באמצעות משחק.

אני אלמד אותך כיצד ליצור מערכת עם קול, שבה הילד/תלמיד שלך ישמע את צליל האות ועליו ללחוץ על כפתור כדי לציין את האות הנכונה.

כך הם ילמדו תוך כדי משחק ותמיד יהיו להם מוטיבציה ללמוד.

עכשיו, אני הולך להראות לך את התהליך שלב אחר שלב עבורך כדי ליצור משחק משלך, וללמד את התנועות לילדים.

אספקה

מעגל מודפס JLCPCB

ארדואינו אונו

לחץ על כפתור המתג

נגד 10kR

כותרת זכר 2, 54 מ מ 1x7

שלב 1: פיתוח משחק התנועות עם ארדואינו

פיתוח משחק התנועות עם ארדואינו
פיתוח משחק התנועות עם ארדואינו

לב המשחק הוא הלוח המודפס של JLCPCB של הווקאלים. אתה יכול לגשת לקישור זה ולהוריד את קבצי הפרויקט. יש לו 5 כפתורים. תוכל להשתמש בכל כפתור כדי לייצג תנועה ולחבר אותו לארדואינו שלך.

הלוח המודפס מוצג באיור 1.

שלב 2:

תמונה
תמונה

עם פרויקט ה- PCB הזה, אתה יכול לחבר אותו עם ה- Arduino וליצור את המשחק שלך. לאחר מכן, אציע לך סכמטי אלקטרוני עבורך להרכיב או לבנות את הפרויקט על לוח הבסיס שלך.

שלב 3:

מתוך סכמטי זה, הגדרנו את פריסת הלוח האלקטרוני. הוא מוצג באיור 2 ותוכל להוריד את הקבצים ולעשות את הפרויקט שלך.

בחר 5 סיכות מהארדואינו וחבר את המגשרים שעל הלוח עם הארדואינו. או אחרת, תוכל להרכיב את התרשים האלקטרוני הבא.

שלב 4: רעיון הפרויקט

רעיון הפרויקט
רעיון הפרויקט

אני אלמד אותך כיצד להרכיב מערכת צליל MP3 עם Arduino. מערכת זו תהיה אחראית לשחזור הקול המדבר את האות. הצליל של כל אות יימשך באמצעות ערך מ -1 עד 5, כאשר 1 מייצג A ו- 5 מייצג את U.

כך, כשהילד שומע את הצליל, עליו להסתכל על המקלדת, לזהות את האיות של התנועה וללחוץ על המקש הנכון.

אם הוא נכשל, המערכת תבהב את הנורית האדומה 3 פעמים. אחרת המערכת תפעיל זמזם למשך 5 שניות ותצייר תנועה חדשה.

לשם כך עליך להרכיב את המעגל הבא.

במעגל זה, תחבר את מודול ה- MP3 ואת לוח התנועה בארדואינו. מודול ה- Bluetooth שימש לייצוג מודול ה- Catalex MP3.

הארדואינו יהיה אחראי למיון חמשת המספרים ולאחר מכן שליחת הפקודה להפעלת התנועה המצוירת

שלב 5:

תמונה
תמונה

לאחר מכן, נחכה עד שהילד ישמע ולחץ על כפתור, כפי שמוצג באיור למעלה.

כל כפתור לעיל מייצג תנועה של האלף בית. לאחר מכן, אראה לך כיצד תוכל לבנות את היגיון התכנות לפרויקט זה.

שלב 6: בניית לוגיקת התכנות של המשחק

בניית לוגיקת התכנות של המשחק
בניית לוגיקת התכנות של המשחק

מערכת משחק התנועה מבוססת על הפעלת מודול YX5300. למודול זה יש כמה פונקציות, אולם נתמקד בהצגת מבנה העבודה של המשחק באמצעות הפונקציות העיקריות של המודול YX5300.

להלן אני מספק לך את כל ההיגיון התכנותי של הפרויקט.

שלב 7:

בהמשך, אסביר את שלב אחר שלב לבניית ההיגיון של משחק מהנה זה לילדים.

#לִכלוֹל

#define ARDUINO_RX 5 // צריך להתחבר ל- TX של מודול נגן MP3 סידורי #הגדר ARDUINO_TX 6 // להתחבר ל- RX של המודול SoftwareSerial mp3 (ARDUINO_RX, ARDUINO_TX); static int8_t Send_buf [8] = {0}; // מאגר לפקודות Send. // סטטי טוב יותר מקומי uint8_t ansbuf [10] = {0}; // מאגר לתשובות. // מחרוזת BETTER LOCALLY mp3Answer; // תשובה מתוך ה- MP3. שחרור מחרוזת (void); מחרוזת sbyte2hex (uint8_t b); / ************ בית הפקודה ************************/ #define CMD_NEXT_SONG 0X01 // הפעל הבא שִׁיר. #הגדר CMD_PREV_SONG 0X02 // השמע שיר קודם. #הגדר CMD_PLAY_W_INDEX 0X03 #הגדר CMD_VOLUME_UP 0X04 #הגדר CMD_VOLUME_DOWN 0X05 #הגדר CMD_SET_VOLUME 0X06 #הגדר CMD_SNG_CYCL_PLAY 0X08 // מחזור יחיד. #define CMD_SEL_DEV 0X09 #הגדר CMD_SLEEP_MODE 0X0A #הגדר CMD_WAKE_UP 0X0B #הגדר CMD_RESET 0X0C #הגדר CMD_PLAY 0X0D #הגדר CMD_PAUSE 0X0E #הגדר CMD_PLAY_FOLD #סטייפ_מ 0 #סטייפ_פליין 0 סטייפ_מ 0 #סטייפ_מסמך 0 STOPP_STIL_FOLD_DE_STIL_DEX0_FOLD_DE_STILL_DEPT_STIL #הגדר CMD_FOLDER_CYCLE 0X17 #הגדר CMD_SHUFFLE_PLAY 0x18 // #הגדר CMD_SET_SNGL_CYCL 0X19 // הגדר מחזור יחיד. #define CMD_SET_DAC 0X1A #define DAC_ON 0X00 #define DAC_OFF 0x01 #define CMD_PLAY_W_VOL 0X22 #define CMD_PLAYING_N 0x4C #define CMD_QUERY_STATUS 0x42 #define CMD_QUERY_VOLUME 0x43 #define CMD_QUERY_FLDR_TRACKS 0x4e #define CMD_QUERY_TOT_TRACKS 0x48 #define CMD_QUERY_FLDR_COUNT 0x4f / ********* *** Opitons ************************ / #define DEV_TF 0X02 / ************** ********************************************** *****/ int numero; בייט אסטדו; זמזם בתים = 2; סיכת בתים = 0; בייט SortNumber = 0; לחצן bool = 0; הגדרת void () {Serial.begin (9600); mp3.begin (9600); עיכוב (500); עבור (סיכה = 8; סיכה 13) {סיכה = 8; } Serial.println ("Varrendo …"); Serial.println (סיכה); // עיכוב (1000); } while (כפתור! = 1); Serial.println ("Saiu …"); if (button == 1 && (pin-1)! = SortNumber) {sendCommand (0x03, 0, 6); עיכוב (3000); } if (button == 1 && (pin-1) == SortNumber) {sendCommand (0x03, 0, 7); עיכוב (3000); } // בדוק את התשובה. if (mp3.available ()) {Serial.println (decodeMP3Answer ()); } עיכוב (100); //Serial.println("Tocando musica … "); } /********************************************* ***************************** / /*פונקציה sendMP3Command: חפש פקודה 'c' ושלח אותה ל- MP3 * / /*פרמטר: ג. קוד לפקודת MP3, 'h' לעזרה. *// *החזרה: void */ void sendMP3Command (char c) {switch (c) {case '?': Case 'h': Serial.println ("HELP"); Serial.println ("p = Play"); Serial.println ("P = השהה"); Serial.println ("> = הבא"); Serial.println ("': Serial.println (" Next "); sendCommand (CMD_NEXT_SONG); sendCommand (CMD_PLAYING_N); // בקשו את מספר הקובץ שהופעל הפסקה; מקרה' כרטיס זיכרון הוכנס. '; שבירה; מארז 0x3D: decodedMP3Answer + = " -> השמעת מספר הושלמה" + מחרוזת (ansbuf [6], DEC); // sendCommand (CMD_NEXT_SONG); // sendCommand (CMD_PLAYING_N); // בקשו את מספר הקובץ בהפעלה; מקרה 0x40: decodedMP3Answer += " -> Error"; break; case 0x41: decodedMP3Answer += " -> הנתונים התקבלו כראוי."; break; case 0x42: decodedMP3Answer += " -> משחק מצב:" +מחרוזת (ansbuf [6], DEC); break; case 0x48: decodedMP3Answer + = " -> ספירת קבצים:" + מחרוזת (ansbuf [6], DEC); break; case 0x4C: decodedMP3Answer + = " -> משחק:" + מחרוזת (ansbuf [6], DEC); break; case 0x4E: decodedMP3Answer + = " -> ספירת קבצים בתיקייה:" + מחרוזת (ansbuf [6], DEC); break; case 0x4F: decodedMP3Answer + = " -> ספירת תיקיות:" + מחרוזת (ansbuf) [6], DEC); break;} return decodedMP3Answer;} /********************************** ************* ****************************** / /*פונקציה: שליחת פקודה ל- MP3* / /*פרמטר: בייט פקודה *// *פרמטר: פרמטר byte dat1 לפקודה *// *פרמטר: פרמטר byte dat2 עבור הפקודה */ void sendCommand (פקודת בייט) {sendCommand (פקודה, 0, 0); } void sendCommand (פקודת בתים, בתים dat1, בתים dat2) {עיכוב (20); Send_buf [0] = 0x7E; // Send_buf [1] = 0xFF; // Send_buf [2] = 0x06; // Len Send_buf [3] = פקודה; // Send_buf [4] = 0x01; // 0x00 NO, 0x01 משוב Send_buf [5] = dat1; // datah Send_buf [6] = dat2; // datal Send_buf [7] = 0xEF; // Serial.print ("שליחה:"); עבור (uint8_t i = 0; i <8; i ++) {mp3.write (Send_buf ); Serial.print (sbyte2hex (Send_buf )); } Serial.println (); } /********************************************* ***************************** / /*פונקציה: sbyte2hex. מחזירה נתוני בתים בפורמט HEX. * / /*פרמטר:- uint8_t ב. בתים להמרה ל- HEX. *// *החזרה: מחרוזת */ מחרוזת sbyte2hex (uint8_t b) {מחרוזת שקס; shex = "0X"; אם (b <16) shex += "0"; shex += מחרוזת (b, HEX); shex += ""; להחזיר שיקס; } /********************************************* ****************************** / /*פונקציה: shex2int. מחזירה int ממחרוזת HEX. */ /*פרמטרים. char *s להמרה ל- HEX. * / /*פרמטר: n. אורך char *s. *// *החזרה: int */ int shex2int (char *s, int n) {int r = 0; for (int i = 0; i = '0' && s = 'A' && s <= 'F') {r *= 16; r + = (s - 'A') + 10; }} החזר r; } /********************************************* ****************************** / /*פונקציה: מענה. מחזירה תשובת מחרוזת ממודול UART mp3. * / /*פרמטר:- uint8_t ב. בָּטֵל. * / /*החזרה: מחרוזת. אם התשובה מנוסחת היטב התשובה. */ שורת מחרוזת (void) {uint8_t i = 0; מחרוזת mp3answer = ""; // קבל רק 10 בתים בעוד (mp3.available () && (i <10)) {uint8_t b = mp3.read (); ansbuf = ב; i ++; mp3answer += sbyte2hex (ב); } // אם פורמט התשובה נכון. if ((ansbuf [0] == 0x7E) && (ansbuf [9] == 0xEF)) {return mp3answer; } החזר "???:" + mp3answer; }

ראשית, אנו מגדירים את כל משתני התוכנית וכתובות רשום הגישה של מודול YX5300.

#לִכלוֹל

#define ARDUINO_RX 5 // צריך להתחבר ל- TX של מודול נגן MP3 סידורי #הגדר ARDUINO_TX 6 // להתחבר ל- RX של המודול SoftwareSerial mp3 (ARDUINO_RX, ARDUINO_TX); static int8_t Send_buf [8] = {0}; // מאגר לפקודות שלח. // סטטי טוב יותר מקומי uint8_t ansbuf [10] = {0}; // מאגר לתשובות. // מחרוזת BETTER LOCALLY mp3Answer; // תשובה מתוך ה- MP3. שחרור מחרוזת (void); מחרוזת sbyte2hex (uint8_t b); / ************ בית הפקודה ************************/ #define CMD_NEXT_SONG 0X01 // הפעל הבא שִׁיר. #הגדר CMD_PREV_SONG 0X02 // השמע שיר קודם. #הגדר CMD_PLAY_W_INDEX 0X03 #הגדר CMD_VOLUME_UP 0X04 #הגדר CMD_VOLUME_DOWN 0X05 #הגדר CMD_SET_VOLUME 0X06 #הגדר CMD_SNG_CYCL_PLAY 0X08 // מחזור יחיד. #define CMD_SEL_DEV 0X09 #הגדר CMD_SLEEP_MODE 0X0A #הגדר CMD_WAKE_UP 0X0B #הגדר CMD_RESET 0X0C #הגדר CMD_PLAY 0X0D #הגדר CMD_PAUSE 0X0E #הגדר CMD_PLAY_FOLD #סטייפ_מ 0 #סטייפ_פליין 0 סטייפ_מ 0 #סטייפ_מסמך 0 STOPP_STIL_FOLD_DE_STIL_DEX0_FOLD_DE_STILL_DEPT_STIL #הגדר CMD_FOLDER_CYCLE 0X17 #הגדר CMD_SHUFFLE_PLAY 0x18 // #הגדר CMD_SET_SNGL_CYCL 0X19 // הגדר מחזור יחיד. #define CMD_SET_DAC 0X1A #define DAC_ON 0X00 #define DAC_OFF 0x01 #define CMD_PLAY_W_VOL 0X22 #define CMD_PLAYING_N 0x4C #define CMD_QUERY_STATUS 0x42 #define CMD_QUERY_VOLUME 0x43 #define CMD_QUERY_FLDR_TRACKS 0x4e #define CMD_QUERY_TOT_TRACKS 0x48 #define CMD_QUERY_FLDR_COUNT 0x4f / ********* *** Opitons ************************* / #define DEV_TF 0X02 / ************** ********************************************** *****/ int numero; בייט אסטדו; זמזם בתים = 2; סיכת בתים = 0; בייט SortNumber = 0; לחצן bool = 0;

שלב 8:

כתובות רגיסטר אלה משמשות להגדרת פעולת המודול. לדוגמה, עיין בכתובת רישום זו למטה.

#הגדר CMD_PLAY_W_INDEX 0X03

כתובת 0x03 מוגדרת בשם CMD_PLAY_W_INDEX. הוא משמש להפעלת שיר מהמספר שלו, כלומר, אתה מזין את מספר הצליל והוא יושמע.

עם ערכים אלה נשתמש בהם ונקבע את תפקוד הפרויקט שלנו.

לאחר שתגדיר את הכתובות השונות שישמשו אותך, ניכנס לפונקציית ההתקנה ונקבע את הסיכות והתקשורת הטורית עבור הפרויקט שלנו.

שלב 9: הפונקציה Void Setup ()

לאחר מכן, עיין בפונקציית הגדרת הריק. ביצעתי את כל ההגדרות של סיכות הכפתורים, תקשורת טורית של מודול ה- MP3, ואתחול מודול הכרטיס ב- MP3.

הגדרת חלל ()

{Serial.begin (9600); mp3.begin (9600); עיכוב (500); עבור (pin = 8; pin <13; pin ++) {pinMode (pin, INPUT); } שלח פקודה (CMD_SEL_DEV, 0, DEV_TF); עיכוב (500); }

התחלתי את התקשורת הסדרתית כדי להדפיס נתונים על סדרת המחשב ואז התחלנו את התקשורת הטורית באמצעות אובייקט ה- mp3.

Serial.begin (9600);

mp3.begin (9600); עיכוב (500);

מודול ה- mp3 נשלט באמצעות פקודות שהתקבלו על ידי סדרת ה- Arduino. בתהליך זה השתמשנו בספריית SoftwareSerial וחיקנו סדרה על הפינים הדיגיטליים של Arduino.

לפיכך, תוכל להשתמש ב- Arduino לשליטה במודול ה- MP3 באמצעות פקודות שנשלחות אליו.

בנוסף, ביצענו את תצורת הפינים הדיגיטליים ואתחול מודול כרטיס ה- MP3

עבור (pin = 8; pin <13; pin ++) {pinMode (pin, INPUT); } שלח פקודה (CMD_SEL_DEV, 0, DEV_TF); עיכוב (500);

לאחר ביצוע התצורה, עלינו לעבור להגיון הראשי בפונקציית לולאת הריק.

שלב 10: הפונקציה העיקרית של הלולאה הריקת ()

הקוד פשוט מאוד וכל המבנה הלוגי מוצג להלן. בהמשך, אסביר לך את ההיגיון המלא של הפונקציה הראשית.

לולאת חלל ()

{pin = 8; randomSeed (analogRead (A0)); numero = אקראי (8, 12); SortNumber = numero; numero = numero - 7; Serial.println (numero); sendCommand (0x03, 0, מספר); עיכוב (1000); לעשות {button = digitalRead (pin); Serial.println (כפתור); סיכה ++; אם (סיכה> 13) {pin = 8; } Serial.println ("Varrendo …"); Serial.println (סיכה); // עיכוב (1000); } while (כפתור! = 1); Serial.println ("Saiu …"); if (button == 1 && (pin-1)! = SortNumber) {sendCommand (0x03, 0, 6); עיכוב (3000); } if (button == 1 && (pin-1) == SortNumber) {sendCommand (0x03, 0, 7); עיכוב (3000); } // בדוק את התשובה. if (mp3.available ()) {Serial.println (decodeMP3Answer ()); } עיכוב (100); //Serial.println("Tocando musica … "); }

בכל התחלה של מחזור פונקציות הלולאה, ניצור ערך חדש בין 8 ל -12 ליצירת צליל של תנועה. הערך בין 8 ל -12 מתייחס לסיכה הדיגיטלית של התנועה.

הקוד ליצירת הערך האקראי מוצג להלן.

סיכה = 8;

randomSeed (analogRead (A0)); numero = אקראי (8, 12); SortNumber = numero;

בנוסף, אנו מפחיתים 7 מהסכום שנמשך בין 8 ל -12. הדבר יאפשר לנו להצביע על המיקומים של 1 עד 5 מהשירים שהוקלטו בכרטיס הזיכרון.

numero = numero - 7;

לאחר מכן, שיחזרתי את צליל התנועה המצוירת בקו למטה.

sendCommand (0x03, 0, מספר);

עיכוב (1000);

עכשיו הגיע הזמן החשוב: הרגע שבו אנו הולכים לקרוא את הכפתור שהילד לחץ עליו. חלק הקוד מוצג להלן.

לַעֲשׂוֹת

{button = digitalRead (pin); Serial.println (כפתור); סיכה ++; אם (סיכה> 13) {pin = 8; } Serial.println ("Varrendo …"); Serial.println (סיכה); // עיכוב (1000); } while (כפתור! = 1);

לולאה זו תבוצע עד שהמשתמש ילחץ על הכפתורים. הלולאה מאפשרת לך לסרוק את 5 הסיכות הדיגיטליות וברגע שהילד לוחץ על אחד הכפתורים, הוא ייצא מהלולאה ויבדוק אם הילד הגיב נכון.

תבצע את האימות באמצעות הקוד שלהלן.

אם (כפתור == 1 && (סיכה 1)! = SortNumber)

{sendCommand (0x03, 0, 6); עיכוב (3000); } if (button == 1 && (pin-1) == SortNumber) {sendCommand (0x03, 0, 7); עיכוב (3000); }

התנאי הראשון יבוצע כאשר המשתמש יטעה כיוון שלחצו על כפתור והערך המופעל של הסיכה היה שונה מהסיכה המשורטטת (SortNumber).

בשלב זה, עליך לבצע את הפקודה שלהלן.

sendCommand (0x03, 0, 6);

עיכוב (3000);

פקודה זו משמשת להפעלת צליל תגובה שגוי. לבסוף, יש לנו את התנאי השני שישמש כדי לבדוק אם הילד צודק.

if (button == 1 && (pin-1) == SortNumber)

{sendCommand (0x03, 0, 7); עיכוב (3000); }

שלב 11:

תמונה
תמונה

אם נלחץ על כפתור והסיכה הדיגיטלית שנלחצה זהה לסיכה המצוירת, המערכת תפעיל צליל תשובה נכון.

כפי שאני מסביר לך, הקוד הזה הוא פשוט מאוד ויעזור לכל ילד לפתח את הידע שלו בנושאים באמצעות משחק עם Arduino.

באיור למעלה תיבת הקול מבצעת את השיר המאוחסן בכרטיס SD של מודול MP3 YX5300.

שלב 12: סיכום

צריך לשנות את החינוך בכיתה כל הזמן והארדואינו יכול להיות בעל ברית נהדר ביצירת משימות מהנות.

באמצעות פרויקט זה ניתן היה לפתח פעילות פשוטה שיכולה לפתח כישורי ילדים באמצעות הכרת הצליל וכתיב של כל תנועה.

בניגוד לשיטות הוראה מסורתיות, ילדים ילמדו באמצעות כיף בכיתה באמצעות משחקים ואלקטרוניקה.

שלב 13: הכרה

פרויקט זה פותח בזכות התמיכה והעידוד של חברת JLCPCB. הם עודדו את החינוך והזמינו אותנו לפתח את משחק התנועות להוראת ילדים בכיתה.

אם ברצונך לרכוש את הלוחות האלקטרוניים של משחקי התהיות, תוכל לגשת לקישור זה ולרכוש 10 יחידות תמורת 2 $ ב- JLCPCB.

מוּמלָץ: