Vraag:
Waarom meldt mijn schets dat er te vaak op een knop wordt gedrukt?
Peter Bloomfield
2014-02-24 03:43:23 UTC
view on stackexchange narkive permalink

Ik heb een knop gebruikt om met een schets te werken (op mijn Uno), en het werkt meestal prima. Soms lijkt het echter alsof het meerdere keren drukken detecteert wanneer het maar één keer wordt ingedrukt.

Het is een kleine op een circuit gemonteerde kortstondige knop, die normaal open is. Het is rechtstreeks vanaf + 5V verbonden met een ingangspen. Ik heb ook een 10K pull-down-weerstand op de pin toegevoegd om er zeker van te zijn dat de invoer niet zweeft.

Hier is een testschets die ik heb gebruikt, die het aantal keren drukken aan de seriële monitor:

  int oldState = LOW; int numPresses = 0; void setup () {pinMode (5, INPUT); Serial.begin (9600);} void loop () {const int newState = digitalRead (5); if (newState! = oldState) {if (newState == HIGH) Serial.println (++ numPresses); oldState = newState; }}  

Soms, als ik eenmaal op de knop druk, toont de seriële monitor twee keer achter elkaar drukken. Het meldt soms zelfs een pers wanneer ik de knop loslaat .

Is het mogelijk om dit op te lossen? Of heb ik gewoon een defecte knop of pin of zoiets?

Dus het lijkt alsof de spanning raar wordt als je op de knop drukt ... zou je het erg vinden om de spanning met een meter te controleren om te zien wat er gebeurt? Het kan zomaar zijn dat de knop een raar contact creëert, en dus contacten wanneer het niet zou moeten ...
De meter blijft stabiel als hij is aangesloten tussen + 5V en aarde (hoewel hij meestal geen korte pieken vertoont).
@hichris123 Multimeters werken het display slechts een paar keer per seconde bij. Wat we zoeken, duurt maximaal een paar honderdsten van een seconde. Je hebt echt een oscilloscoop nodig om het te zien. Zie mijn antwoord voor een foto.
@sachleen Ja, dat wist ik niet zeker. Ik heb nu een oscilloscoop nodig (ik heb alleen een multimeter en wat andere dingen).
Hehe, misschien had je de titel van je vraag anders moeten formuleren als "wat zijn goede redenen om een ​​oscilloscoop te betalen?" :-)
Drie antwoorden:
#1
+10
sachleen
2014-02-24 04:35:03 UTC
view on stackexchange narkive permalink

Contact Bounce

Dit staat bekend als contact bounce en treedt op wanneer de metalen contacten in de knop of schakelaar tegen elkaar stuiteren wanneer je erop drukt. De microcontroller is snel genoeg om deze bounces op te vangen en wat het betreft, schakel je de schakelaar vele malen in maar liefst 10 milliseconden tijd.

Verschillende schakelaars en knoppen hebben een andere hoeveelheid contact bounce, en zelfs een schakelaar gedraagt ​​zich anders tussen twee keer drukken.

Hier is een knopdruk vastgelegd op een scoop (afbeelding van Maxim):

enter image description here

Bij 2ms / div zien we pas 6ms na het eerste contact een stabiel signaal!

Oplossingen

Voeg een vertraging toe

De absoluut eenvoudigste oplossing is om een ​​korte vertraging in te voeren nadat u de knopinvoer heeft gelezen. Dit zal voorkomen dat de code bounces oppikt en wanneer het hervat, zou het signaal stabiel moeten zijn.

  if (digitalRead (A3) == 0) {// doe iets hier delay (500 );}  

In het bovenstaande voorbeeld vertraag ik 500 ms na het lezen van de status van de pin. De knop is normaal gesproken hoog, dus als ik erop druk, gaat de status van de pin naar logica 0. Ik pak dat op in de code en doe iets en wacht dan minstens 500 ms voordat ik verder ga.

Het is duidelijk dat deze code stopt elke keer dat u op een knop drukt een halve seconde, wat al dan niet acceptabel is in uw toepassing. Je kunt de vertraging ook verkleinen, afhankelijk van de bounce-tijd van het contact van je switch, maar ik speel hier op safe.

Negeerknoppen worden te dicht bij elkaar ingedrukt

Vergelijkbaar met de bovenstaande oplossing, maar in plaats van een harde vertraging toe te voegen, gebruikt u de functie millis () om bij te houden wanneer de laatste keer dat de schakelaar werd geactiveerd. Elke keer dat je een schakelaar-trigger ziet, vergelijk je met de tijd en, als er niet genoeg tijd is verstreken (bijvoorbeeld 500 ms in mijn vorige voorbeeld), negeer je deze.

Dit lost het probleem op dat je moet gebruiken delay () in uw code.

Switch debouncer IC

Er zijn dingen zoals de MAX6816, een IC die je tussen je switch en microcontroller input plaatst. Het zal het signaal voor u aan de kaak stellen. Voor een prijs van $ 1,62 @ 1k zul je dit waarschijnlijk nooit gebruiken.

Overig

Er zijn veel oplossingen voor dit probleem ... ik doe het altijd in software, maar sommige anderen omvatten het gebruik van een vergrendeling of condensator.

Debouncecode - één bericht om ze allemaal te regelen

bedankt, ik ben aan het leren en dit maakte me gek!
#2
+3
jlbnjmn
2014-02-24 04:05:29 UTC
view on stackexchange narkive permalink

De knopcontacten zelf stuiteren waarschijnlijk in en uit contact, waardoor het circuit meerdere keren open en dicht gaat, ook al verandert de positie van de knop niet.

Het is een veelvoorkomend probleem met knoppen en zou het eerste zijn dat ik zou controleren. Om dit op te lossen, moet u de knop de-bouncen. Er zijn verschillende manieren om dit te bereiken, waarvan sommige in de sketch zelf kunnen worden gedaan.

Een goede oplossing is code die de duur van elke knopstatus meet en alleen een verandering in status registreert als de huidige duur is groter dan de gewenste duur. Die optie moet worden gebruikt voor complexere projecten. De code ervoor zal projectspecifiek zijn en waarschijnlijk door schetsen gedefinieerde variabelen gebruiken, maar een voorbeeld van wat er moet gebeuren is hier te vinden.

Als de sketch erg basic is of je wilt er gewoon zeker van zijn dat bounce het probleem is, kun je een korte vertraging toevoegen nadat de knopstatus verandert. Bijvoorbeeld:

  void loop () {const int newState = digitalRead (5); if (newState! = oldState) {if (newState == HIGH) Serial.println (++ numPresses); oldState = newState; delay (10) // Pas de vertragingsduur zo kort mogelijk aan zonder fouten te veroorzaken}}  
#3
+2
jfpoilpret
2014-02-24 04:11:04 UTC
view on stackexchange narkive permalink

Dit is je knop bouncen , wat vrij normaal gedrag is; het heeft niets te maken met de kwaliteit van de knoppen.

Er zijn 2 manieren om een ​​knop te "debounen": door hardware of door software.

Persoonlijk geef ik de voorkeur aan hardware; google gewoon voor knop debouncing circuit en je zou veel voorbeelden moeten vinden.

Als je niet over de benodigde componenten beschikt, kun je software debouncing gebruiken.

Door software heb je hier een voorbeeld op de Arduino-website.

Sommige knoppen stuiteren veel meer dan andere, dus het heeft wel iets te maken met de kwaliteit van de knoppen.
@sachleen Ik weet niet zeker of ik dat zou zeggen; het hangt in wezen af ​​van het metaal dat wordt gebruikt voor de contacten in de knop. Ik denk niet dat iemand in alle situaties een niet-stuiterende knop kan vinden. Switch bouncing is te verwachten, en zal je vooral bijten als je sketch snel loopt tussen 2 `digitalRead ()` aanroepen.
Ook het stuiteren hangt af van hoe de knop wordt ingedrukt (bijvoorbeeld welke kracht erop wordt uitgeoefend en hoe).
Hoewel het fenomeen contact-bounce wordt genoemd, "ziet het er elektrisch uit als" stuiteren "(en kan in feite een of andere vorm van" stuiteren "met zich meebrengen), in een mechanische schakelaar, naderen / verlaten de contacten elkaar nooit volledig; er is onvermijdelijk een zekere mate van glijden over elkaar. Het glijden van ruwe oppervlakken is wat aanleiding geeft tot het make-break-make ... fenomeen, zelfs als contacten niet echt "stuiteren". (Denk aan een soort gladde rots die tegen de andere glijdt). Merk op dat dit ook betekent dat contactonderbreking ook break-make-break met zich meebrengt ...


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 3.0-licentie waaronder het wordt gedistribueerd.
Loading...