Inhoudsopgave:

Klinkersspel met Arduino en YX5300 MP3-module Catalex - Ajarnpa
Klinkersspel met Arduino en YX5300 MP3-module Catalex - Ajarnpa

Video: Klinkersspel met Arduino en YX5300 MP3-module Catalex - Ajarnpa

Video: Klinkersspel met Arduino en YX5300 MP3-module Catalex - Ajarnpa
Video: Test MP3 module 2024, November
Anonim
Klinkersspel met Arduino en YX5300 MP3-module Catalex
Klinkersspel met Arduino en YX5300 MP3-module Catalex

Kunt u deze vraag lezen? Dat is vreemd! Ik heb deze vraag met opzet gesteld. Als je deze tekst kunt lezen, is dat omdat je het hele alfabet kent en natuurlijk alle klinkers hebt geleerd.

Klinkers zijn aanwezig in alle woorden. Het is onmogelijk om aan elk van hen te ontsnappen. Nu, laat me je een vraag stellen. Was het leren in je kindertijd leuk en waren er technologische hulpmiddelen bij betrokken?

Ik weet zeker dat er weinig leermiddelen waren en je gebruikte traditionele methoden om de klinkers en het alfabet te leren.

Is het tenslotte mogelijk om wat technologische middelen te gebruiken om klinkers te leren?

In dit artikel leer ik je hoe je je leerlingen en kinderen klinkers kunt leren door middel van een spel.

Ik leer je hoe je een systeem maakt met een stem, waarbij je kind/leerling de klank van de letter hoort en op een knop moet drukken om de juiste letter aan te geven.

Zo leren ze spelenderwijs en zijn ze altijd gemotiveerd om te studeren.

Nu ga ik je het stapsgewijze proces laten zien om je eigen spel te maken en de klinkers aan kinderen te leren.

Benodigdheden

JLCPCB printplaat

Arduino Uno

Drukknopschakelaar:

10kR Weerstand

Mannelijke kop 2, 54mm 1x7

Stap 1: Ontwikkelen van het spel van klinkers met Arduino

Het spel van klinkers ontwikkelen met Arduino
Het spel van klinkers ontwikkelen met Arduino

Het hart van het spel is de JLCPCB printplaat van de Vowels. U kunt deze link openen en de projectbestanden downloaden. Het heeft 5 knoppen. Je zult elke knop gebruiken om een klinker weer te geven en deze te verbinden met je Arduino.

De printplaat wordt getoond in figuur 1.

Stap 2:

Afbeelding
Afbeelding

Met dit PCB-project kun je het verbinden met de Arduino en je spel maken. Vervolgens zal ik u een elektronisch schema aanbieden om het project op uw protoboard te monteren of te bouwen.

Stap 3:

Vanuit dit schema hebben we de lay-out van het elektronische bord opgezet. Het wordt weergegeven in figuur 2 en u kunt de bestanden downloaden en uw project maken.

Kies 5 pinnen van de Arduino en verbind de jumpers op het bord met de Arduino. Of anders kunt u het volgende elektronische diagram samenstellen.

Stap 4: Het projectidee

Het projectidee
Het projectidee

Ik zal je leren hoe je een MP3-geluidssysteem in elkaar zet met Arduino. Dit systeem zal verantwoordelijk zijn voor het reproduceren van de stem die de brief spreekt. Het geluid van elke letter wordt getekend met een waarde van 1 tot 5, waarbij 1 staat voor A en 5 voor U.

Dus wanneer het kind het geluid hoort, moet het naar het toetsenbord kijken, de spelling van de klinker herkennen en de juiste toets indrukken.

Als het niet lukt, zal het systeem de rode LED 3 keer laten knipperen. Anders zal het systeem gedurende 5 seconden een zoemer activeren en een nieuwe klinker tekenen.

Om dit te doen, moet u het volgende circuit samenstellen.

In dit circuit sluit je de MP3-module en het klinkerbord op de Arduino aan. De Bluetooth-module werd gebruikt om de Catalex MP3-module weer te geven.

De Arduino is verantwoordelijk voor het sorteren van de 5 nummers en het verzenden van de opdracht om de getekende klinker te activeren

Stap 5:

Afbeelding
Afbeelding

Daarna wachten we tot het kind het hoort en op een knop drukt, zoals weergegeven in de bovenstaande afbeelding.

Elke knop hierboven vertegenwoordigt een klinker van het alfabet. Vervolgens laat ik je zien hoe je de programmeerlogica voor dit project gaat bouwen.

Stap 6: De programmeerlogica van het spel bouwen

De programmeerlogica van het spel bouwen
De programmeerlogica van het spel bouwen

Het klinkerspelsysteem is gebaseerd op de werking van de YX5300-module. Deze module heeft enkele functies, maar we zullen ons concentreren op het presenteren van de werkstructuur van het spel via de belangrijkste functies van de YX5300-module.

Hieronder geef ik u alle programmeerlogica van het project.

Stap 7:

Hieronder zal ik stap voor stap uitleggen hoe je de logica van dit leuke spel voor kinderen opbouwt.

#erbij betrekken

#define ARDUINO_RX 5 //moet verbinding maken met TX van de seriële MP3-spelermodule #define ARDUINO_TX 6 //verbinden met RX van de module SoftwareSerial mp3(ARDUINO_RX, ARDUINO_TX); statisch int8_t Send_buf[8] = {0}; // Buffer voor verzendopdrachten. // BETER LOKAAL statisch uint8_t ansbuf [10] = {0}; // Buffer voor de antwoorden. // BETER LOKAAL String mp3Antwoord; // Antwoord van de MP3. String antwoord (ongeldig); Tekenreeks sbyte2hex(uint8_t b); /*************** Commandobyte *************************/ #define CMD_NEXT_SONG 0X01 // Volgende afspelen liedje. #define CMD_PREV_SONG 0X02 // Speel vorig nummer af. #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 // Afspelen in één cyclus. #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_FILE 0X0C #define CMD_FOLDER_CYCLE 0X17 #define CMD_SHUFFLE_PLAY 0x18 // #define CMD_SET_SNGL_CYCL 0X19 // Stel enkele cyclus in. #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 / ********* *** Opties *************************/ #define DEV_TF 0X02 /*************** ************************************************** *****/ int numero; byte-instelling; byte-zoemer = 2; byte-pin = 0; byte SortNumber = 0; bool-knop = 0; void setup() { Serial.begin(9600); mp3.begin(9600); vertraging (500); voor (pin = 8; pin 13) { pin = 8; } Serial.println("Varrendo…"); Serieel.println(pin); //vertraging (1000); }terwijl(knop !=1); Serial.println("Saiu…"); if(button == 1 && (pin-1) != SortNumber) { sendCommand (0x03, 0, 6); vertraging (3000); } if(button == 1 && (pin-1) == SortNumber) { sendCommand (0x03, 0, 7); vertraging (3000); } // Kijk voor het antwoord. if (mp3.available()) { Serial.println(decodeMP3Answer()); } vertraging(100); //Serial.println ("Tocando musica…"); } /************************************************** *******************************/ /*Functie sendMP3Command: zoek naar een 'c'-commando en stuur het naar MP3 */ /*Parameter: c. Code voor het MP3-commando, 'h' voor hulp. */ /*Return: void */ void sendMP3Command (char c) { switch (c) { case '?': case 'h': Serial.println ("HELP "); Serial.println ("p = Afspelen"); Serial.println ("P = Pauze"); Serial.println ("> = Volgende"); Serial.println(" ': Serial.println("Volgende"); sendCommand(CMD_NEXT_SONG); sendCommand(CMD_PLAYING_N); // vraag naar het nummer van het bestand dat wordt afgespeeld pauze; case 'Geheugenkaart geplaatst."; pauze; case 0x3D: decodedMP3Answer += " -> Completed play num " + String (ansbuf [6], DEC); //sendCommand (CMD_NEXT_SONG); //sendCommand (CMD_PLAYING_N); // vraag naar het nummer van het bestand dat wordt afgespeeld; case 0x40: decodedMP3Answer += " -> Error"; break; case 0x41: decodedMP3Answer += " -> Gegevens correct ontvangen. "; break; case 0x42: decodedMP3Answer += " -> Status afspelen: " + String(ansbuf[6], DEC); break; case 0x48: decodedMP3Answer += " -> File count: " + String(ansbuf[6], DEC); break; case 0x4C: decodedMP3Answer += " -> Spelen: " + String(ansbuf[6], DEC); break; case 0x4E: decodedMP3Answer += " -> Folder file count: " + String(ansbuf[6], DEC); break; case 0x4F: decodedMP3Answer += " -> Folder count: " + String(ansbuf [6], DEC); break; } return gedecodeerd MP3Answer; } /*********************************** *********** *******************************/ /*Functie: Stuur commando naar de MP3 */ /*Parameter: byte opdracht */ /*Parameter: byte dat1-parameter voor de opdracht */ /*Parameter: byte dat2-parameter voor de opdracht */ void sendCommand (byteopdracht){ sendCommand (opdracht, 0, 0); } void sendCommand (byte-opdracht, byte dat1, byte dat2) {vertraging (20); Send_buf[0] = 0x7E; // Send_buf [1] = 0xFF; // Send_buf [2] = 0x06; // Len Send_buf [3] = commando; // Send_buf [4] = 0x01; // 0x00 NO, 0x01 feedback Send_buf [5] = dat1; // datah Send_buf [6] = dat2; // data Send_buf [7] = 0xEF; // Serial.print ("Verzenden: "); voor (uint8_t ik = 0; ik < 8; i++) { mp3.write(Send_buf); Serial.print(sbyte2hex(Send_buf)); } Serieel.println(); } /************************************************** *******************************/ /*Functie: sbyte2hex. Retourneert bytegegevens in HEX-indeling. */ /*Parameter:- uint8_t b. Byte om te converteren naar HEX. */ /*Return: String */ String sbyte2hex(uint8_t b) { String shex; shex = "0X"; als (b < 16) shex += "0"; shex += String (b, HEX); shex += " "; terugkeer shex; } /************************************************** *******************************/ /*Functie: shex2int. Retourneert een int van een HEX-tekenreeks. */ /*Parameter: s. char *s om te converteren naar HEX. */ /*Parameter: n. char *s' lengte. */ /*Return: int */ int shex2int(char *s, int n){ int r = 0; voor (int i=0; i='0' && s='A' && s<='F'){ r *= 16; r += (s - 'A') + 10; } } retourneer r; } /************************************************** *******************************/ /*Functie: sanswer. Retourneert een String-antwoord van de mp3-UART-module. */ /*Parameter:- uint8_t b. leegte. */ /*Retour: tekenreeks. Als het antwoord goed geformuleerd is. */ String sanswer(void) { uint8_t i = 0; String mp3answer = ""; // Krijg slechts 10 Bytes while (mp3.available() && (i < 10)) { uint8_t b = mp3.read(); ansbuf = b; i++; mp3answer += sbyte2hex(b); } // als het antwoordformaat correct is. if ((ansbuf[0] == 0x7E) && (ansbuf[9] == 0xEF)) { return mp3answer; } return "???: " + mp3antwoord; }

Eerst definiëren we alle programmavariabelen en de toegangsregisteradressen van de YX5300-module.

#erbij betrekken

#define ARDUINO_RX 5 //moet verbinding maken met TX van de seriële MP3-spelermodule #define ARDUINO_TX 6 //verbinden met RX van de module SoftwareSerial mp3(ARDUINO_RX, ARDUINO_TX); statisch int8_t Send_buf[8] = {0}; // Buffer voor verzendopdrachten. // BETER LOKAAL statisch uint8_t ansbuf [10] = {0}; // Buffer voor de antwoorden. // BETER LOKAAL String mp3Antwoord; // Antwoord van de MP3. String antwoord (ongeldig); Tekenreeks sbyte2hex(uint8_t b); /*************** Commandobyte *************************/ #define CMD_NEXT_SONG 0X01 // Volgende afspelen liedje. #define CMD_PREV_SONG 0X02 // Speel vorig nummer af. #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 // Afspelen in één cyclus. #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_FILE 0X0C #define CMD_FOLDER_CYCLE 0X17 #define CMD_SHUFFLE_PLAY 0x18 // #define CMD_SET_SNGL_CYCL 0X19 // Stel enkele cyclus in. #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 / ********* *** Opties *************************/ #define DEV_TF 0X02 /*************** ************************************************** *****/ int numero; byte-instelling; byte-zoemer = 2; byte-pin = 0; byte SortNumber = 0; bool-knop = 0;

Stap 8:

Deze registeradressen worden gebruikt om de werking van de module te configureren. Zie bijvoorbeeld dit registratieadres hieronder.

#define CMD_PLAY_W_INDEX 0X03

Adres 0x03 is gedefinieerd met de naam CMD_PLAY_W_INDEX. Het wordt gebruikt om een nummer te triggeren vanaf het nummer, dat wil zeggen, u voert het nummer van het geluid in en het wordt afgespeeld.

Met deze waarden zullen we ze gebruiken en de werking van ons project configureren.

Nadat u de verschillende adressen hebt gedefinieerd die zullen worden gebruikt, gaan we naar de setup-functie en configureren we de pinnen en seriële communicatie voor ons project.

Stap 9: De functie Void Setup()

Zie vervolgens de functie ongeldig instellen. Ik deed alle instellingen van de knoppinnen, seriële communicatie van de MP3-module en initialisatie van de kaartmodule in de MP3.

ongeldige setup()

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

Ik startte de seriële communicatie om gegevens af te drukken op de seriële computer van de computer en daarna begonnen we de seriële communicatie via het mp3-object.

Serieel.begin(9600);

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

De mp3-module wordt bestuurd via opdrachten die worden ontvangen door de Arduino-serie. In dit proces hebben we de SoftwareSerial-bibliotheek gebruikt en een serienummer op de Arduino digitale pinnen geëmuleerd.

U kunt dus de Arduino gebruiken om de MP3-module te besturen via opdrachten die ernaartoe worden gestuurd.

Daarnaast hebben we de configuratie van de digitale pinnen en initialisatie van de MP3-kaartmodule gemaakt

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

Nadat we de configuratie hebben gemaakt, moeten we naar de hoofdlogica in de void-lusfunctie gaan.

Stap 10: De hoofdfunctie Void Loop ()

De code is heel eenvoudig en de hele logische structuur wordt hieronder weergegeven. Hieronder zal ik u de volledige logica van de hoofdfunctie uitleggen.

lege lus()

{ pin = 8; randomSeed (analogRead (A0)); numero = willekeurig (8, 12); Sorteernummer = numero; numero = numero - 7; Serial.println(numero); sendCommand (0x03, 0, numero); vertraging (1000); doen { knop = digitalRead (pin); Serial.println(knop); pin++; if (pin > 13) { pin = 8; } Serial.println("Varrendo…"); Serial.println(pin); //vertraging (1000); }terwijl(knop !=1); Serial.println("Saiu…"); if(button == 1 && (pin-1) != SortNumber) { sendCommand (0x03, 0, 6); vertraging (3000); } if(button == 1 && (pin-1) == SortNumber) { sendCommand (0x03, 0, 7); vertraging (3000); } // Kijk voor het antwoord. if (mp3.available()) { Serial.println(decodeMP3Answer()); } vertraging(100); //Serial.println ("Tocando musica…"); }

Bij elke start van de lusfunctiecyclus zullen we een nieuwe waarde tussen 8 en 12 genereren om het geluid van een klinker te genereren. De waarde van 8 tot 12 verwijst naar de digitale pin van de klinker.

De code voor het genereren van de willekeurige waarde wordt hieronder weergegeven.

pin = 8;

randomSeed (analogRead (A0)); numero = willekeurig (8, 12); Sorteernummer = numero;

Bovendien trekken we 7 af van het getrokken bedrag tussen 8 en 12. Zo kunnen we de posities van 1 tot 5 van de nummers die op de geheugenkaart zijn opgenomen, aanwijzen.

numero = numero - 7;

Daarna reproduceerde ik het geluid van de klinker die op de onderstaande regel werd getekend.

sendCommand (0x03, 0, numero);

vertraging (1000);

Nu is het belangrijke moment aangebroken: het moment waarop we de door het kind ingedrukte knop gaan lezen. Het codegedeelte wordt hieronder weergegeven.

doen

{ knop = digitalRead (pin); Serial.println(knop); pin++; if (pin > 13) { pin = 8; } Serial.println("Varrendo…"); Serial.println(pin); //vertraging (1000); }terwijl(knop !=1);

Deze lus wordt uitgevoerd totdat de gebruiker op de knoppen drukt. Met de lus kunt u de 5 digitale pinnen scannen en op het moment dat het kind op een van de knoppen drukt, komt het uit de lus en controleert of het kind correct heeft gereageerd.

U doet de verificatie met behulp van de onderstaande code.

if(knop == 1 && (pin-1) != Sorteernummer)

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

De eerste voorwaarde wordt uitgevoerd wanneer de gebruiker een fout maakt omdat er op een knop is gedrukt en de geactiveerde waarde van de pin anders was dan de getekende pin (SortNumber).

Op dit punt moet u de onderstaande opdracht uitvoeren.

sendCommand (0x03, 0, 6);

vertraging (3000);

Dit commando wordt gebruikt om de verkeerde reactietoon te activeren. Ten slotte hebben we de tweede voorwaarde die zal worden gebruikt om te controleren of het kind gelijk heeft.

if(knop == 1 && (pin-1) == Sorteernummer)

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

Stap 11:

Afbeelding
Afbeelding

Als een knop is ingedrukt en de digitale pin die is ingedrukt is dezelfde als de getrokken pin, zal het systeem een correct antwoordgeluid activeren.

Zoals ik je uitleg, is deze code heel eenvoudig en zal elk kind helpen hun kennis van klinkers te ontwikkelen door middel van een spel met Arduino.

In de bovenstaande afbeelding voert de soundbox het nummer uit dat is opgeslagen op de SD-kaart van de MP3-module YX5300.

Stap 12: Conclusie

Het klassikaal onderwijs moet constant worden veranderd en de Arduino kan een geweldige bondgenoot zijn bij het maken van leuke taken.

Door dit project was het mogelijk om een eenvoudige activiteit te ontwikkelen die de vaardigheden van kinderen kan ontwikkelen door kennis van het geluid en de spelling van elke klinker.

In tegenstelling tot traditionele lesmethoden, leren kinderen door middel van klassikaal plezier door middel van spelletjes en elektronica.

Stap 13: Erkenning

Dit project is tot stand gekomen dankzij de steun en aanmoediging van het bedrijf JLCPCB. Ze moedigden het onderwijs aan en nodigden ons uit om het klinkersspel te ontwikkelen om kinderen in de klas les te geven.

Als je de elektronische platen van de Game of Vowels wilt kopen, kun je toegang krijgen tot deze link en 10 eenheden kopen voor $ 2 bij JLCPCB.

Aanbevolen: