In dit project gaan we een toongenerator ontwikkelen met Arduino Uno. We zullen knoppen hebben die zijn gekoppeld aan de UNO en elk van hen genereert een andere toonintensiteit. De frequentie van de toon die door de UNO wordt gegenereerd, is bij elk intern geluid hetzelfde. Het is de intensiteit van het geluid dat bij elke druk verandert. Dit is een van de gemakkelijkste manieren om een piano te maken met Arduino Uno. Bekijk ook dit pianocircuit.
De tonen kunnen worden verhoogd tot 20. Dit geeft de beste toonvariatie en veel vloeiendere veranderingen. De intensiteit van de toon wordt gewijzigd door PWM (Pulse Width Modulation). Een voorbeeld van PWM wordt getoond in onderstaande grafiek.
In PWM is de frequentie van het signaal of de tijdsperiode van het signaal (Ton + Toff) altijd constant. Alleen de verhouding tussen de tijd INSCHAKELEN en UITSCHAKELEN verandert. In de tweede grafiek in de bovenstaande afbeelding is de INSCHAKEL-tijd bijvoorbeeld 80% en de UIT-tijd 20% van de volledige duur.
In de derde grafiek is de INSCHAKEL-tijd 50% en de UIT-tijd is 50% van de volledige duur. Dus in het eerste geval hebben we een duty-ratio van 80% en in het tweede geval hebben we een duty-ratio van 20%.
Met deze verandering in de duty-ratio hebben we een verandering in Vrms (Root Mean Square-waarde van spanning), wanneer deze spanning aan de zoemer wordt gegeven, maakt deze een ander geluid wanneer er een verandering in de duty-ratio is.
We gaan de UNO programmeren om voor elk van de knoppen een PWM-signaal met een verschillende duty-ratio te leveren. We hebben dus een toongenerator bij de hand die bij elke druk op de knop een andere toon genereert.
Componenten vereist
Hardware: Arduino Uno, voeding (5v), 1000 uF condensator, 100 nF condensator, zoemer, knoppen (8 stuks).
Software: AURDINO nightly of Atmel studio 6.2
Schakelschema en werkuitleg
Het circuit voor toongenerator wordt getoond in onderstaand diagram.
Om de ruis van de voedingsspanning weg te filteren, worden condensatoren over de klemmen geplaatst, zoals weergegeven in het diagram.
De PWM van Arduino Uno kan worden bereikt op elk van de pinnen die op de printplaat worden gesymboliseerd als "~". Er zijn zes PWM-kanalen in UNO. We kunnen echter geen PWM-pinnen gebruiken die zijn ingesteld via de PINS 0-7, omdat de PINS de voorkeur hebben voor de knoppeninterface.
Er is een reden om PINS 0-7 als invoer te selecteren, omdat de PINS 0-7 de PORTD van microcontroller vertegenwoordigen. Dus in het laatste geval kunnen we de volledige BYTE van PORTD nemen.
Om nu een andere duty-ratio PWM te krijgen, gaan we de volgende opdracht gebruiken.
analogWrite (9, VALUE); |
Van bovenaf kunnen we het PWM-signaal direct op de bijbehorende pin krijgen. De eerste parameter tussen haakjes is voor het kiezen van het pinnummer van het PWM-signaal. De tweede parameter is voor de schrijfverhoudingen.
De PWM-waarde van Arduino Uno kan worden gewijzigd van 0 tot 255. Met "0" als laagste en "255" als hoogste. Met 255 als duty-ratio krijgen we 5V bij PIN9. Als de duty-ratio wordt gegeven als 125, krijgen we 2,5 V bij PIN9. We gaan de duty-ratio van 0-250 verdelen over 8 knoppen die zijn aangesloten op PORTD van UNO. Hier kies ik 25 stappen voor elke knop, maar het is naar jouw keuze.
Daarmee hebben we een PWM-signaal waarvan de duty-ratio met elke knop verandert. Omdat dit aan de zoemer wordt gegeven, hebben we een toongenerator. De werking van deze op Arduino gebaseerde toongenerator wordt stap voor stap uitgelegd in de onderstaande C-code.