Sommario:

Gioco di vocali con Arduino e modulo MP3 YX5300 Catalex: 13 passaggi
Gioco di vocali con Arduino e modulo MP3 YX5300 Catalex: 13 passaggi

Video: Gioco di vocali con Arduino e modulo MP3 YX5300 Catalex: 13 passaggi

Video: Gioco di vocali con Arduino e modulo MP3 YX5300 Catalex: 13 passaggi
Video: Neopixel Music (Software e Hardware di Valentino d'Altilia) (terminato il 28 ottobre 2018) 2024, Dicembre
Anonim
Gioco di vocali con Arduino e modulo MP3 YX5300 Catalex
Gioco di vocali con Arduino e modulo MP3 YX5300 Catalex

Riesci a leggere questa domanda? Quello è strano! Ho fatto questa domanda apposta. Se riesci a leggere questo testo, è perché conosci l'intero alfabeto e, naturalmente, hai imparato tutte le vocali.

Le vocali sono presenti in tutte le parole. È impossibile sfuggire a ciascuno di loro. Ora, lascia che ti faccia una domanda. La tua infanzia è stata divertente e ha coinvolto risorse tecnologiche?

Sono sicuro che le risorse per l'apprendimento erano poche e hai usato metodi tradizionali per imparare le vocali e l'alfabeto.

Dopotutto, è possibile utilizzare alcune risorse tecnologiche per imparare le vocali?

In questo articolo, ti insegnerò come insegnare ai tuoi studenti e ai tuoi figli le vocali attraverso un gioco.

Ti insegnerò come creare un sistema con una voce, dove tuo figlio/studente sentirà il suono della lettera e dovrà premere un pulsante per indicare la lettera corretta.

Così impareranno giocando e saranno sempre motivati a studiare.

Ora ti mostrerò il processo passo passo per creare il tuo gioco e insegnare le vocali ai bambini.

Forniture

Circuito stampato JLCPCB

Arduino Uno

Interruttore a pulsante

Resistenza 10kR

Testata maschio 2, 54mm 1x7

Passaggio 1: sviluppo del gioco delle vocali con Arduino

Sviluppare il gioco delle vocali con Arduino
Sviluppare il gioco delle vocali con Arduino

Il cuore del gioco è il circuito stampato JLCPCB delle Vocali. Puoi accedere a questo link e scaricare i file del progetto. Ha 5 pulsanti. Utilizzerai ciascun pulsante per rappresentare una vocale e collegarla al tuo Arduino.

Il circuito stampato è mostrato in Figura 1.

Passo 2:

Immagine
Immagine

Con questo progetto PCB, puoi collegarlo con Arduino e creare il tuo gioco. Successivamente, ti offrirò uno schema elettronico per assemblare o costruire il progetto sulla tua scheda prototipi.

Passaggio 3:

Da questo schema, impostiamo il layout della scheda elettronica. È mostrato in Figura 2 e puoi scaricare i file e realizzare il tuo progetto.

Scegli 5 pin da Arduino e collega i jumper sulla scheda con Arduino. Oppure, puoi assemblare il seguente schema elettronico.

Passaggio 4: l'idea del progetto

L'idea del progetto
L'idea del progetto

Ti insegnerò come assemblare un sistema audio MP3 con Arduino. Questo sistema sarà responsabile della riproduzione della voce che pronuncia la lettera. Il suono di ogni lettera verrà disegnato utilizzando un valore da 1 a 5, dove 1 rappresenta A e 5 rappresenta U.

Pertanto, quando il bambino sente il suono, deve guardare la tastiera, riconoscere l'ortografia della vocale e premere il tasto corretto.

Se fallisce, il sistema lampeggerà 3 volte il LED rosso. In caso contrario, il sistema attiverà un cicalino per 5 secondi e disegnerà una nuova vocale.

Per fare ciò, è necessario assemblare il seguente circuito.

In questo circuito, collegherai il modulo MP3 e la scheda vocale su Arduino. Il modulo Bluetooth è stato utilizzato per rappresentare il modulo Catalex MP3.

Sarà compito di Arduino ordinare i 5 numeri e quindi inviare il comando per attivare la vocale disegnata

Passaggio 5:

Immagine
Immagine

Dopodiché, aspetteremo che il bambino senta e prema un pulsante, come mostrato nella figura sopra.

Ogni pulsante sopra rappresenta una vocale dell'alfabeto. Successivamente, ti mostrerò come creerai la logica di programmazione per questo progetto.

Passaggio 6: costruire la logica di programmazione del gioco

Costruire la logica di programmazione del gioco
Costruire la logica di programmazione del gioco

Il sistema di gioco vocale si basa sul funzionamento del modulo YX5300. Questo modulo ha alcune funzioni, tuttavia, ci concentreremo sulla presentazione della struttura di lavoro del gioco attraverso le funzioni principali del modulo YX5300.

Di seguito vi fornisco tutta la logica di programmazione del progetto.

Passaggio 7:

Di seguito spiegherò passo dopo passo la costruzione della logica di questo divertente gioco per bambini.

#includere

#define ARDUINO_RX 5 //dovrebbe collegarsi a TX del modulo Serial MP3 Player #define ARDUINO_TX 6 //connettersi a RX del modulo SoftwareSerial mp3(ARDUINO_RX, ARDUINO_TX); statico int8_t Send_buf[8] = {0}; // Buffer per i comandi di invio. // MEGLIO LOCALMENTE static uint8_t ansbuf[10] = {0}; // Buffer per le risposte. // MEGLIO LOCALMENTE String mp3Answer; // Risposta dall'MP3. Stringa risposta(void); Stringa sbyte2hex(uint8_t b); /*********** Byte di comando *************************/ #define CMD_NEXT_SONG 0X01 // Riproduci successivo canzone. #define CMD_PREV_SONG 0X02 // Riproduce il brano precedente. #define CMD_PLAY_W_INDEX 0X03 #define CMD_VOLUME_UP 0X04 #define CMD_VOLUME_DOWN 0X05 #define CMD_SET_VOLUME 0X06 #define CMD_SNG_CYCL_PLAY 0X08 // Single Cycle Play. #define CMD_SEL_DEV 0X09 #define CMD_SLEEP_MODE 0X0A #define CMD_WAKE_UP 0X0B #define CMD_RESET 0X0C #define CMD_PLAY 0X0D #define CMD_PAUSE 0X0E #define CMD_PLAY_FOLDER_UP #define CMD_PLAY_FOLDER_FILE 0X0F. #define CMD_FOLDER_CYCLE 0X17 #define CMD_SHUFFLE_PLAY 0x18 // #define CMD_SET_SNGL_CYCL 0X19 // Imposta ciclo singolo. #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 / ********* *** Opzioni **************************/ #define DEV_TF 0X02 /************** ************************************************** *****/ int numero; byte stato; byte cicalino = 2; byte pin = 0; byte SortNumber = 0; pulsante bool = 0; void setup() { Serial.begin(9600); mp3.begin(9600); ritardo (500); for(pin = 8; pin 13) { pin = 8; } Serial.println("Varrendo…"); Serial.println(pin); //ritardo(1000); }while(pulsante != 1); Serial.println("Sai…"); if(pulsante == 1 && (pin-1) != SortNumber) { sendCommand(0x03, 0, 6); ritardo (3000); } if(pulsante == 1 && (pin-1) == SortNumber) { sendCommand(0x03, 0, 7); ritardo (3000); } // Controlla la risposta. if (mp3.available()) { Serial.println(decodeMP3Answer()); } ritardo(100); //Serial.println("Tocando musica…"); } /************************************************** *******************************/ /*Funzione sendMP3Command: cerca un comando 'c' e invialo a MP3 */ /*Parametro: c. Codice per il comando MP3, 'h' per aiuto. */ /*Return: void */ void sendMP3Command(char c) { switch (c) { case '?': case 'h': Serial.println("HELP"); Serial.println("p = Riproduci"); Serial.println("P = Pausa"); Serial.println(" > = Avanti"); Serial.println(" ': Serial.println("Next"); sendCommand(CMD_NEXT_SONG); sendCommand(CMD_PLAYING_N); // chiedi il numero di file in riproduzione break; case ' Memory card inserita."; break; case 0x3D: decodedMP3Answer += " -> Completed play num " + String(ansbuf[6], DEC); //sendCommand(CMD_NEXT_SONG); //sendCommand(CMD_PLAYING_N); // chiedi il numero di file in riproduzione break; case 0x40: decodedMP3Answer += " -> Error"; break; case 0x41: decodedMP3Answer += " -> Dati ricevuti correttamente. "; break; case 0x42: decodedMP3Answer += " -> Stato riproduzione: " + String(ansbuf[6], DEC); break; case 0x48: decodedMP3Answer += " -> Conteggio file: " + String(ansbuf[6], DEC); break; case 0x4C: decodedMP3Answer += " -> Riproduzione: " + String(ansbuf[6], DEC); break; case 0x4E: decodedMP3Answer += " -> Conteggio file cartella: " + String(ansbuf[6], DEC); break; case 0x4F: decodedMP3Answer += " -> Conteggio cartelle: " + String(ansbuf [6], DEC); break; } return decodificatoMP3Answer; } /*********************************** ************ *******************************/ /*Funzione: invia il comando all'MP3 */ /*Parametro: byte command */ /*Parameter: byte dat1 parametro per il comando */ /*Parameter: byte dat2 parametro per il comando */ void sendCommand(byte command){ sendCommand(command, 0, 0); } void sendCommand(byte comando, byte dat1, byte dat2){ delay(20); Send_buf[0] = 0x7E; // Send_buf[1] = 0xFF; // Send_buf[2] = 0x06; // Len Send_buf[3] = comando; // Send_buf[4] = 0x01; // 0x00 NO, 0x01 feedback Send_buf[5] = dat1; // datah Send_buf[6] = dat2; // dati Send_buf[7] = 0xEF; // Serial.print("Invio: "); for (uint8_t i = 0; i < 8; i++) { mp3.write(Send_buf); Serial.print(sbyte2hex(Send_buf)); } Serial.println(); } /************************************************** ******************************/ /*Funzione: sbyte2hex. Restituisce un byte di dati in formato HEX. */ /*Parametro:- uint8_t b. Byte da convertire in HEX. */ /*Return: String */ String sbyte2hex(uint8_t b) { String shex; shex = "0X"; if (b < 16) shex += "0"; shex += Stringa(b, HEX); shex += " "; ritorno shex; } /************************************************** ******************************/ /*Funzione: shex2int. Restituisce un int da una stringa HEX. */ /*Parametro: s. char *s da convertire in HEX. */ /*Parametro: n. char *s' lunghezza. */ /*Return: 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; } } restituisce r; } /************************************************** ******************************/ /*Funzione: rispondi. Restituisce una risposta String dal modulo UART mp3. */ /*Parametro:- uint8_t b. vuoto. */ /*Ritorno: Stringa. Se la risposta è ben formata, rispondi. */ String sanswer(void) { uint8_t i = 0; String mp3answer = ""; // Ottieni solo 10 byte while (mp3.available() && (i < 10)) { uint8_t b = mp3.read(); ansbuf = b; io++; mp3risposta += sbyte2hex(b); } // se il formato della risposta è corretto. if ((ansbuf[0] == 0x7E) && (ansbuf[9] == 0xEF)) { return mp3answer; } return "???: " + mp3answer; }

Innanzitutto, definiamo tutte le variabili del programma e gli indirizzi del registro di accesso del modulo YX5300.

#includere

#define ARDUINO_RX 5 //dovrebbe collegarsi a TX del modulo Serial MP3 Player #define ARDUINO_TX 6 //connettersi a RX del modulo SoftwareSerial mp3(ARDUINO_RX, ARDUINO_TX); statico int8_t Send_buf[8] = {0}; // Buffer per i comandi di invio. // MEGLIO LOCALMENTE static uint8_t ansbuf[10] = {0}; // Buffer per le risposte. // MEGLIO LOCALMENTE String mp3Answer; // Risposta dall'MP3. Stringa risposta(void); Stringa sbyte2hex(uint8_t b); /*********** Command byte **************************/ #define CMD_NEXT_SONG 0X01 // Riproduci successivo canzone. #define CMD_PREV_SONG 0X02 // Riproduce il brano precedente. #define CMD_PLAY_W_INDEX 0X03 #define CMD_VOLUME_UP 0X04 #define CMD_VOLUME_DOWN 0X05 #define CMD_SET_VOLUME 0X06 #define CMD_SNG_CYCL_PLAY 0X08 // Single Cycle Play. #define CMD_SEL_DEV 0X09 #define CMD_SLEEP_MODE 0X0A #define CMD_WAKE_UP 0X0B #define CMD_RESET 0X0C #define CMD_PLAY 0X0D #define CMD_PAUSE 0X0E #define CMD_PLAY_FOLDER_UP #define CMD_PLAY_FOLDER_FILE 0X0F. #define CMD_FOLDER_CYCLE 0X17 #define CMD_SHUFFLE_PLAY 0x18 // #define CMD_SET_SNGL_CYCL 0X19 // Imposta ciclo singolo. #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 / ********* *** Opzioni **************************/ #define DEV_TF 0X02 /************** ************************************************** *****/ int numero; byte stato; byte cicalino = 2; byte pin = 0; byte SortNumber = 0; pulsante bool = 0;

Passaggio 8:

Questi indirizzi di registro vengono utilizzati per configurare il funzionamento del modulo. Ad esempio, vedere questo indirizzo di registrazione di seguito.

#define CMD_PLAY_W_INDEX 0X03

L'indirizzo 0x03 è definito con il nome CMD_PLAY_W_INDEX. Viene utilizzato per attivare una canzone dal suo numero, cioè inserisci il numero del suono e verrà riprodotto.

Sarà con questi valori che li utilizzeremo e configureremo il funzionamento del nostro progetto.

Dopo aver definito i vari indirizzi che verranno utilizzati, entreremo nella funzione di setup e configureremo i pin e la comunicazione seriale per il nostro progetto.

Passaggio 9: la funzione Void Setup()

Quindi, vedere la funzione di configurazione annullata. Ho eseguito tutte le impostazioni dei pin dei pulsanti, la comunicazione seriale del modulo MP3 e l'inizializzazione del modulo della scheda nell'MP3.

configurazione nulla()

{ Serial.begin(9600); mp3.begin(9600); ritardo (500); for(pin = 8; pin < 13; pin++) { pinMode(pin, INPUT); } sendCommand(CMD_SEL_DEV, 0, DEV_TF); ritardo (500); }

Ho avviato la comunicazione seriale per stampare i dati sulla seriale del computer e poi abbiamo avviato la comunicazione seriale tramite l'oggetto mp3.

Serial.begin(9600);

mp3.begin(9600); ritardo (500);

Il modulo mp3 è controllato tramite comandi ricevuti dalla seriale Arduino. In questo processo, abbiamo utilizzato la libreria SoftwareSerial ed emulato un seriale sui pin digitali di Arduino.

Pertanto, sarai in grado di utilizzare Arduino per controllare il modulo MP3 tramite i comandi inviati ad esso.

Inoltre, abbiamo effettuato la configurazione dei pin digitali e l'inizializzazione del modulo MP3 Card

for(pin = 8; pin < 13; pin++) { pinMode(pin, INPUT); } sendCommand(CMD_SEL_DEV, 0, DEV_TF); ritardo (500);

Dopo aver effettuato la configurazione, dobbiamo passare alla logica principale nella funzione void loop.

Passaggio 10: la funzione principale Void Loop()

Il codice è molto semplice e l'intera struttura logica viene presentata di seguito. Di seguito ti spiego la logica completa della funzione principale.

ciclo vuoto()

{ pin = 8; randomSeed(analogRead(A0)); numero = casuale(8, 12); SortNumber = numero; numero = numero - 7; Serial.println(numero); sendCommand(0x03, 0, numero); ritardo(1000); do { pulsante = digitalRead(pin); Serial.println(pulsante); pin++; if(pin > 13) { pin = 8; } Serial.println("Varrendo…"); Serial.println(pin); //ritardo(1000); }while(pulsante != 1); Serial.println("Sai…"); if(pulsante == 1 && (pin-1) != SortNumber) { sendCommand(0x03, 0, 6); ritardo (3000); } if(pulsante == 1 && (pin-1) == SortNumber) { sendCommand(0x03, 0, 7); ritardo (3000); } // Controlla la risposta. if (mp3.available()) { Serial.println(decodeMP3Answer()); } ritardo(100); //Serial.println("Tocando musica…"); }

Ad ogni avvio del ciclo della funzione loop, genereremo un nuovo valore compreso tra 8 e 12 per generare il suono di una vocale. Il valore da 8 a 12 si riferisce al pin digitale della vocale.

Il codice per generare il valore casuale è mostrato di seguito.

perno = 8;

randomSeed(analogRead(A0)); numero = casuale(8, 12); SortNumber = numero;

Inoltre, sottraiamo 7 dall'importo prelevato tra 8 e 12. Questo ci permetterà di puntare alle posizioni da 1 a 5 dei brani registrati sulla scheda di memoria.

numero = numero - 7;

Successivamente, ho riprodotto il suono della vocale tracciata sulla riga sottostante.

sendCommand(0x03, 0, numero);

ritardo(1000);

Adesso è arrivato il momento importante: il momento in cui andremo a leggere il bottone premuto dal bambino. La porzione di codice viene presentata di seguito.

fare

{ pulsante = digitalRead(pin); Serial.println(pulsante); pin++; if(pin > 13) { pin = 8; } Serial.println("Varrendo…"); Serial.println(pin); //ritardo(1000); }while(pulsante != 1);

Questo ciclo verrà eseguito finché l'utente non premerà i pulsanti. Il loop consente di scansionare i 5 pin digitali e nel momento in cui il bambino preme uno dei pulsanti, uscirà dal loop e controllerà se il bambino ha risposto correttamente.

Farai la verifica usando il codice qui sotto.

if(pulsante == 1 && (pin-1) != SortNumber)

{ sendCommand(0x03, 0, 6); ritardo (3000); } if(pulsante == 1 && (pin-1) == SortNumber) { sendCommand(0x03, 0, 7); ritardo (3000); }

La prima condizione verrà eseguita quando l'utente commette un errore perché è stato premuto un pulsante e il valore attivato del pin era diverso dal pin disegnato (SortNumber).

A questo punto, devi eseguire il comando seguente.

sendCommand(0x03, 0, 6);

ritardo (3000);

Questo comando viene utilizzato per attivare il tono di risposta errato. Infine, abbiamo la seconda condizione che verrà utilizzata per verificare se il bambino ha ragione.

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

{ sendCommand(0x03, 0, 7); ritardo (3000); }

Passaggio 11:

Immagine
Immagine

Se è stato premuto un pulsante e la puntina digitale che è stata premuta è la stessa della puntina disegnata, il sistema attiverà un suono di risposta corretta.

Come ti spiego, questo codice è molto semplice e aiuterà ogni bambino a sviluppare la propria conoscenza delle vocali attraverso un gioco con Arduino.

Nella figura sopra la soundbox sta eseguendo il brano memorizzato nella SD Card del Modulo MP3 YX5300.

Passaggio 12: Conclusione

L'istruzione in classe deve essere costantemente modificata e Arduino può essere un ottimo alleato nella creazione di attività divertenti.

Attraverso questo progetto è stato possibile sviluppare una semplice attività in grado di sviluppare le abilità dei bambini attraverso la conoscenza del suono e dell'ortografia di ogni vocale.

A differenza dei metodi di insegnamento tradizionali, i bambini impareranno divertendosi in classe attraverso giochi ed elettronica.

Passaggio 13: Riconoscimento

Questo progetto è stato sviluppato grazie al supporto e all'incoraggiamento della società JLCPCB. Hanno incoraggiato l'educazione e ci hanno invitato a sviluppare il gioco delle vocali per insegnare ai bambini in classe.

Se desideri acquistare le piastre elettroniche del Gioco delle Vocali, puoi accedere a questo link e acquistare 10 unità per $ 2 presso JLCPCB.

Consigliato: