Küsimus:
Miks minu visand teatab liiga paljudest nupuvajutustest?
Peter Bloomfield
2014-02-24 03:43:23 UTC
view on stackexchange narkive permalink

Olen visandiga suhtlemiseks kasutanud nuppu (minu Unol) ja see töötab enamasti hästi. Mõnikord tundub, et see tuvastab mitu vajutust, kui seda vajutatakse ainult üks kord.

See on väike vooluringile paigaldatud hetkeline nupp, mis on tavaliselt avatud. See on ühendatud + 5 V-st otse sisendnõelaga. Samuti olen lisanud tihvtile 10K mahutatava takisti, et veenduda, et sisend ei jää hõljuma.

Siin on minu kasutatav testjoonis, mis teatab vajutuste arvust jadamonitor:

  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; }}  

Mõnikord, kui vajutan nuppu üks kord, näitab jadamonitor kahte vajutust järjest. Mõnikord teatab see isegi ajakirjandusest, kui ma nupu vabastan .

Kas seda on võimalik parandada? Või on mul lihtsalt mõni vigane nupp või tihvt vms?

Nii et tundub, nagu läheks nupule vajutades pinge imelikuks ... kas te ei viitsi pinge mõõturiga kontrollida, et näha, mis juhtub? Võib juhtuda, et nupp loob imeliku kontakti ja seega kontakti siis, kui see ei peaks ...
Mõõtur püsib stabiilselt, kui see on ühendatud + 5V ja maa vahel (kuigi see ei näita tavaliselt lühikesi piike).
@hichris123 multimeetrid värskendavad ekraani vaid paar korda sekundis. See, mida otsime, kestab kõige kauem vaid paarsada sekundit. Selle nägemiseks vajate tõesti ostsilloskoobi. Vaata minu vastust pildi jaoks.
@sachleen Jah, polnud selles kindel. Mul on nüüd vaja ostsilloskoobi (mul on ainult multimeeter ja mõni muu kraam).
Hehe, võib-olla oleksite pidanud oma küsimuse pealkirja ümber sõnastama näiteks "millised on head põhjendused ostsilloskoobi lubamiseks?" :-)
Kolm vastused:
#1
+10
sachleen
2014-02-24 04:35:03 UTC
view on stackexchange narkive permalink

Kontakti põrge

Seda nimetatakse kontakti põrgatamiseks ja see juhtub siis, kui nupu või lüliti metallkontaktid põrkuvad üksteise vastu, kui seda vajutate. Mikrokontroller on nende põrgatuste ülesvõtmiseks piisavalt kiire ja niipalju kui muudate lülitit mitu korda kuni 10 millisekundi jooksul.

Erinevatel lülititel ja nuppudel on erinev kontakti põrge hulk ja isegi üks lüliti käitub kahe vajutuse korral erinevalt.

Siin on nupule vajutamine, mis on jäädvustatud ulatusele (pilt Maximist):

enter image description here

Kell 2ms / div näeme stabiilset signaali alles 6ms pärast esmast kontakti!

Lahendused

Lisage viivitus

Absoluutne lihtsaim lahendus on lühikese viivituse kehtestamine pärast nupu sisendi lugemist. See hoiab ära koodi, et see ei leia põrkumisi ja kui see jätkub, peaks signaal olema stabiilne.

  if (digitalRead (A3) == 0) {// tee siin midagi viivitust (500 );}  

Ülalolevas näites viivitan pärast tihvti oleku lugemist 500 ms. Nupp on tavaliselt kõrge, nii et kui ma seda alla vajutan, läheb tihvti olek loogikale 0. Valin selle koodist üles ja teen midagi ning ootan siis enne jätkamist vähemalt 500 ms.

Ilmselt, see kood lihtsalt peatub pooleks sekundiks iga kord, kui vajutate nuppu, mis võib teie rakenduses olla vastuvõetav või mitte. Võite ka viivitust vähendada, sõltuvalt ka teie lüliti kontakti põrkemisajast, kuid mängin seda siin turvaliselt.

Ignoreerimisnupp vajutab üksteisele liiga lähedal

Sarnaselt ülaltoodud lahenduse, kuid tugeva viivituse lisamise asemel kasutate funktsiooni millis () , et jälgida, millal lüliti viimati käivitati. Iga kord, kui näete lüliti päästikut, võrdlete seda ajaga ja kui pole piisavalt aega möödas (öelge minu eelmises näites nagu 500 ms), ignoreerite seda.

See lahendab kasutamise vajaduse delay () teie koodis.

Lülita väljavõtja IC

On selliseid asju nagu MAX6816, mis on IC, mille panete lüliti ja mikrokontrolleri sisendi vahele. See taunib teie jaoks signaali. Hinnaga 1,62 dollarit @ 1k, te ei kasuta seda tõenäoliselt kunagi.

Muu

Sellele probleemile on palju lahendusi ... Teen seda alati tarkvaras, kuid mõned teised lisage riiv või kondensaator.

Debounce Code - üks postitus nende kõigi juhtimiseks

aitäh, ma õpin ja see ajas mind pähe!
#2
+3
jlbnjmn
2014-02-24 04:05:29 UTC
view on stackexchange narkive permalink

Nupukontaktid ise põrkavad tõenäoliselt kontakti sisse ja välja, mistõttu vooluahel avaneb ja sulgub mitu korda, kuigi nupu asend ei muutu.

See on nuppude puhul tavaline probleem ja oleksin esimene asi, mida kontrolliksin. Selle parandamiseks peate nupu tagasi põrgatama. Selle saavutamiseks on mitmeid viise, millest mõned saab teha visandis.

Hea lahendus on kood, mis mõõdab iga nupu oleku kestust ja registreerib oleku muutuse ainult siis, kui praegune kestus on suurem kui soovitud kestus. Seda võimalust tuleks kasutada keerukamate projektide jaoks. Selle kood on projektipõhine ja tõenäoliselt kasutab visandiga määratletud muutujaid, kuid näite sellest, mida tuleb teha, leiate siit.

Kui visand on väga lihtne või soovite lihtsalt veenduda, et probleemiks on põrge, võite pärast nupu oleku muutmist lisada väikese viivituse. Näiteks:

  void loop () {const int newState = digitalRead (5); if (newState! = oldState) {if (newState == HIGH) Serial.println (++ numPresses); oldState = newState; delay (10) // Kohandage viivituse pikkus võimalikult lühikeseks ilma vigu käivitamata}}  
#3
+2
jfpoilpret
2014-02-24 04:11:04 UTC
view on stackexchange narkive permalink

See on teie nupp kopsakas , mis on üsna tavaline käitumine; sellel pole nupu kvaliteediga mingit pistmist.

Nupu "tühistamiseks" on kaks võimalust: riistvara või tarkvara järgi.

Isiklikult eelistan riistvara; lihtsalt googeldage nuppu nuppude tühistamise ahel ja peaksite leidma palju näiteid.

Kui teil pole vajalikke komponente, võite kasutada tarkvara debouncing. > Tarkvara järgi on teil näide siin Arduino veebisaidil.

Mõni nupp põrkab palju rohkem kui teine, nii et sellel on midagi pistmist nupu kvaliteediga.
@sachleen Ma pole kindel, kas ma nii ütleksin; see sõltub põhimõtteliselt metallist, mida kasutatakse nupu kontaktide jaoks. Ma ei usu, et kõigist olukordadest võiks leida mitte põrkavat nuppu. Oodata on lüliti tagasipõrget ja see närib teid eriti siis, kui teie visand töötab kiiresti kahe `digitalRead () 'kõne vahel.
Samuti põrkamine sõltub sellest, kuidas nuppu vajutatakse (nt mis jõudu sellele rakendatakse ja kuidas).
Ehkki nähtust nimetatakse kontaktpõrkeks, näeb see "välja" elektriliselt nagu "põrgatamine" (ja võib tegelikult hõlmata ka tegelikku "põrkamist"), kuid mehaanilises lülitis ei lähene kontaktid kunagi teineteisele täiesti ruudult; paratamatult toimub mingil määral libisemine, üks üle teise. Karedate pindade libisemine on see, mis tekitab make-break-make ... fenomeni, isegi kui kontaktid tegelikult ei põrkaks. (Mõelge ühele siledale kivile, mis libiseb teise vastu). Pange tähele, et see tähendab ka, et kontakti katkestamine hõlmab ka vahetamist ...


See küsimus ja vastus tõlgiti automaatselt inglise keelest.Algne sisu on saadaval stackexchange-is, mida täname cc by-sa 3.0-litsentsi eest, mille all seda levitatakse.
Loading...