Stap 11: Analoge inputs en outputs.
Een aantal van de Arduino I/O pinnen kan ook worden gebruikt als digitale inputs en outputs, om te meten van spanningen (input) of dimmen van LEDs (uitgang) bijvoorbeeld.
Analoge ingangen
Meeste Arduinos hebben tussen 6 en 12 analoge input pinnen. Ze kunnen meten spanning, variërend van 0v tot de ingangsspanning (5v of 3v3)
Een het bord, deze pinnen A0-A5 worden aangeduid, en in het geval van het Leonardo, sommige van de pinnen op de digitale kant kan ook dienen als analoge ingangen. Ze zijn gemarkeerd met een punt en de naam (A6-A11) is geschreven op de rug.
Merk op dat het lezen van een analoge ingang (relatief) traag, in vergelijking met het lezen van digitale pinnen. Dit is omdat de Arduino spanningen met behulp van een interne verwijzing spanning generator (DAC, digitaal-naar-Analoog-Converter), en vervolgens vergelijken de ingangsspanning het voltage dat verwijzing, dan veranderen de referentie spanning, maatregelen weer vergelijken, veranderen de referentie spanning, vergelijken... totdat de twee spanningen gelijk zijn. http://apcmag.com/Arduino-Analog-to-Digital-conver...
De resolutie van de interne DAC is 10 bits. Dit betekent dat het maximum aantal het kan lezen 10 bits lang, of 210 = 1024, dus een getal tussen 0 (B0000000000) en 1023 (B1111111111). 1023 betekent de input 5v (of 3v3) en 0v 0 betekent.
Potentiometers
Een potentiometer, variabele weerstand of pot voor korte, is gewoon een knop met een wisser die over een ronde strook resistent materiaal glijdt. Op deze manier het varieert de weerstand tussen de Wisser en de eindpunten.
We gonna haak onze potentiometers en faders als eenvoudige spanning dividers. Meer op deze Wikipedia-pagina kunt u lezen als u niet vertrouwd met dit beginsel bent.
Als u een kijkje op het schema nemen, kunt u 2 weerstanden. R1 is de weerstand tussen de juiste pin van de potentiometer en de Wisser (middelste stift) en R2 de weerstand tussen de linker pin en de Wisser. Neem een kijkje op de formule ook. Aangezien onze potentiometer een vaste heeft waarde (50kΩ, bijvoorbeeld), R1 + R2 zal altijd 50kΩ, terwijl de R2 kan variëren tussen 0Ω en 50kΩ. (Indien R2 = 50k dan R1 = 0, en vice versa) De Fractie zal daarom altijd resulteren in een getal tussen 0 en 1. Vermenigvuldig deze verhouding met 5V (Vsubin/sub), en je krijgt een spanning tussen de 0V en 5V op uw output. Deze spanning kan worden gelezen door de Arduino van ADC (analoog digitaal conversie), en stelt de positie voor van de potentiometer (of fader). Zo fundamenteel, u de verlaten stift verbinden met de grond, de juiste pin aan de 5V pin op de Arduino, en de middelste stift op een analoge ingang. (afbeelding 3)
Een potentiometer verbinden met pin A0, het voorbeeld van en open AnalogReadSerial (bestand > voorbeelden > 01.Basics).
De enige nieuwe functie is analogRead(pin). Het is heel vanzelfsprekend, geeft het u enkel de 10-bits waarde, die de spanning op de bepaalde pin.
Het programma zal enkel print ze uit over seriële, dus open de seriële monitor (CTRL + SHIFT + M) of de seriële plotter (CTRL + SHIFT + L) en draai de potentiometer. U moet waarden variërend van 0 tot 1023 zien.
Instellen van de vertraging aan 10 of meer, in plaats van 1ms kan geven u betere resultaten in de seriële plotter.
U kunt de waarden van de 0-1023 toewijzen tot een andere reeks, bijvoorbeeld van 0 tot 100. Dit kan gedaan worden met behulp van de functie van de kaart. Neem een kijkje op voorbeeld AnalogReadSerialMap. De syntaxis van de functie van de kaart is: kaart (waarde, lowerLimitInput, upperLimitInput, lowerLimitOutput, upperLimitOutput) is gewoon de waarde aan toewijzen, in dit geval onze sensorgegevens. Het bereik van deze ingang is 0 tot 1023, zodat deze onze input grenzen zijn. Wij willen de output naar een bereik van 0 tot 100, zodat deze de grenzen van onze uitvoer zijn. Dit betekent dat als de sensor 1023 leest, de output waarde 100 zullen.
We konden hebben bereikt hetzelfde resultaat met behulp van sensorValue * 100 / 1023.
Om te zetten naar een verhouding, we moeten gebruiken een ander gegevenstype dan int: float (zwevend punt). Als wij onze sensor-waarde door 1023 verdelen, krijgen we een verhouding tussen nul en één.
We kan wijzigen van het gegevenstype van de variabele sensorValue te zweven, of de waarde van een int omzetten in een float. De eerste methode wordt gebruikt in AnalogReadSerialRatio-a, de laatstgenoemde in de AnalogReadSerialRatio-b.
Als we niet onze waarde niet eerst naar een float converteren, zal het resultaat als een int zo goed worden behandeld. De waarden na de decimale komma zullen gewoon worden genegeerd, bijvoorbeeld 1/2 = 0, maar 1.0/2 = 0,5. Normale nummers zoals '1' zal worden behandeld als ints, tenzij u een decimaalteken (1.0), dan het zal worden behandeld als een float. Als een van de factoren in een berekening een float is, zal het resultaat ook een float zijn.
Conversie van een int naar een float, kunt u de float(number) -functie gebruiken, of u kunt de notatie c ++ voor typecasting (omzetten van het ene gegevenstype naar het andere) (float) nummer .
Conversie van een float naar een int, hiervoor kunt u op dezelfde manier: int(number) of (int) nummer, maar de opmerking dat dit gewoon het nummer op de decimale komma wordt afgekapt, zal het gewoon negeren de waarden die beschikbaar na het decimaalteken zijn. Bijvoorbeeld, int(1.1) = 1, maar int(1.9) = 1, zelfs int(1.99999) 1 zal geven. Om het getal afronden, gebruikt u de functie round(number) bijvoorbeeld, round(1.1) = 1, round(1.5) = 2, ronde(1.99) = 2.
https://www.Arduino.CC/en/Reference/cast
https://www.Arduino.CC/en/Reference/FloatCast
Het meten van spanningen
Aangezien een analoge waarde van 1023 correspondeert met 5v (of 3.3V voor 3,3 v microcontrollers), u kunt dit gemakkelijk omzetten naar een spanning met behulp van analogRead(A0) * 5.0 / 1023. Dit wordt gebruikt in het voorbeeld AnalogReadSerialVoltage.
Om te lezen van de spanning hoger is dan 5v (3,3 v), moet u 2 weerstanden, maken een voltage divider. We kunnen transformeren om Vsubin/sub, als we Vsubout/sub weten in de bovenstaande formule. (zie afbeelding)
Verbinding maken met een weerstand (R2) vanaf de grond op de analoge input, dan sluit de grond van de spanning te meten met de Arduino van grond, en sluit vervolgens een andere weerstand (R1) van de spanning te meten aan op de analoge pin. (zie afbeelding) Gebruik de bovenstaande formule voor het berekenen van de waarden van de juiste weerstand. Eventuele waarden tussen 10k en 100 k moeten goed werken. Als de weerstand te laag is, het zal teveel stroom trekken, en beïnvloeden de lezing alot.
Ook bijvoorbeeld meten 12v, ik gebruik R1 = 47k en R2 = 22k. Dit geeft mij een maximale spanning van de 15.87v, als ik zou gaan hoger dan deze spanning, ik zou breken mijn Arduino.
Opmerking: als R2 - voor welke reden dan ook - losgekoppeld of onderbroken, zal de hoogspanning zal worden aangesloten op de Arduino rechtstreeks (via R1) en waarschijnlijk beschadigen of vernietigen. Dus niet gewijzigd de weerstanden, als een hoge spanning wordt toegepast.
Open de voorbeeld AnalogReadSerialHighVoltage.
Bij de bovenkant van het dossier zijn er sommige constante verklaringen. Als een variabele, constanten waarden van alle soorten kunnen opslaan, maar in tegenstelling tot de variabelen, constanten kunnen niet worden gewijzigd terwijl het programma wordt uitgevoerd. Dit betekent dat ze zijn opgeslagen in de opslagruimte van het programma, in plaats van het dynamische geheugen (RAM), waardoor meer ruimte voor variabelen en arrays enz.
Wijzig de waarden van deze constanten volgens uw setup. De verhouding wordt automatisch berekend zodat u niet hoeft te veranderen. U kunt de kleurcodes van uw weerstand om een theoretische waarde, maar krijg je een veel betere onderlinge aanpassing als je de weerstanden met behulp van een multimeter meten. Hetzelfde geldt voor de bedrijfsspanning.
Analoge uitgangen
De Arduino niet het uitvoeren van analoge spanningen, het kan alleen output van 5v of 0v. Spanningen tussen uitvoeren, het maakt gebruik van een techniek genaamd PWM (Pulsbreedtemodulatie).
De Arduino creëert een blokgolf, en vervolgens de op - en af-tijden van de golf varieert. Bijvoorbeeld, 2ms op, 2ms uit; of 1ms op 3ms af. Dit wordt genoemd de taakcyclus van de blokgolf. 2ms op, 2ms af is een taakcyclus van 50%; 1ms op 3ms af is een duty-cycle van 25%. (zie afbeelding)
U kunt nu het berekenen van de gemiddelde spanning, die het gebied onder de kromme, gedeeld door het aantal cycli. Neem een blik bij de voorbeeld van 50% duty cycle: het gebied (geëvalueerd op meer dan één cyclus) is gewoon een rechthoek van 5 door 0,5, dus het gebied 2.5 is. Gedeeld door het aantal cycli nog steeds geeft 2.5, dus de gemiddelde spanning 2.5v is.
Met andere woorden, kan de gemiddelde spanning worden geschreven als de taakcyclus vermenigvuldigd met de voedingsspanning. Bijvoorbeeld, zou een duty-cycle van 25% 5v · 0,25 = 1.25v.
Deze gemiddelde spanningen zijn aangegeven in rood weergegeven in de beelden.
Uw ogen zijn veel te traag om te zien de onderliggende blokgolf, zodat deze methode perfect in orde is voor het dimmen van LEDs.
Open de voorbeeld analogPotDimmer.
Een LED (+ weerstand) verbinding te maken met digitale pin 5, en een potentiometer aan analoge pin A0. Draaien van de potentiometer dimt de LED.
De enige nieuwe functie is analogWrite (pin, taakcyclus). Alleen wordt het pulserend sproeien van de pwm op een pin. Merk op dat de taakcyclus is een waarde tussen 0 en 255, dit komt overeen met 0% - 100%
Een ander voorbeeld is analogWriteDimmer. Sluit een drukknop aan op pin 2 en een LED aan op pin 5. Wanneer u de knop ingedrukt, de LED helderder, krijgt wanneer u vrij te geven, drukt u op en houd het weer, de helderheid zal afnemen.