Kysymys:
Miksi luonnosraporttini raportoi liian monta painiketta?
Peter Bloomfield
2014-02-24 03:43:23 UTC
view on stackexchange narkive permalink

Olen käyttänyt näppäintä vuorovaikutuksessa luonnoksen kanssa (minun Unossa), ja se toimii lähinnä hyvin. Joskus näyttää kuitenkin havaitsevan useita painalluksia, kun sitä painetaan vain kerran.

Se on pieni piiriin asennettu hetkellinen painike, joka on normaalisti auki. Se on kytketty + 5 V: sta suoraan tuloliittimeen. Olen myös lisännyt tapiin 10K alasvetovastuksen varmistaaksesi, että tulo ei jää kellumaan.

Tässä on käyttämäni testipiirros, joka ilmoittaa puristusten määrän sarjamonitori:

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

Joskus kun painan painiketta kerran, sarjavalvonta näyttää kaksi painallusta peräkkäin. Joskus se jopa ilmoittaa lehdistöstä, kun vapautan painikkeen.

Onko tämä mahdollista korjata? Vai onko minulla vain viallinen painike tai tappi tai jotain?

Joten näyttää siltä, ​​että jännite menee oudolta, kun painat painiketta ... haluaisitko tarkistaa jännitteen mittarilla nähdäksesi, mitä tapahtuu? Voi vain olla, että painike luo outon kontaktin ja siten koskettaa, kun sen ei pitäisi ...
Mittari pysyy vakaana, jos se on kytketty + 5 V: n ja maan välille (vaikka se ei yleensä näytä lyhyitä piikkejä).
@hichris123-yleismittarit päivittävät näytön vain muutaman kerran sekunnissa. Se, mitä etsimme, kestää vain muutaman sadasekunnin sekunnin. Tarvitset todella oskilloskoopin nähdäksesi sen. Katso vastauksestani kuva.
@sachleen Joo, ei ollut varma siitä. Tarvitsen oskilloskoopin nyt (minulla on vain yleismittari ja joitain muita juttuja).
Hehe, ehkä sinun olisi pitänyt muotoilla kysymyksesi otsikko esimerkiksi "mitkä ovat hyvät perustelut oskilloskoopin varalle?" :-)
Kolme vastused:
#1
+10
sachleen
2014-02-24 04:35:03 UTC
view on stackexchange narkive permalink

Kontaktin palautuminen

Tätä kutsutaan kontaktin palautumiseksi ja tapahtuu, kun painikkeen tai kytkimen metallikoskettimet palaavat toisiaan vasten, kun painat sitä. Mikrokontrolleri on riittävän nopea poimimaan nämä pomputukset, ja siltä osin kuin on kyse siitä, vaihdat kytkintä monta kertaa jopa 10 millisekunnissa.

Eri kytkimillä ja painikkeilla on erilainen kontaktin palautumisen määrä, ja jopa yksi kytkin käyttäytyy eri tavalla kahden painalluksen välillä.

Tässä on painike, joka on kaapattu alueelle (kuva Maximista):

enter image description here

Kun signaali on 2 ms / div, signaali on vakaa vasta 6 sekunnin kuluttua ensimmäisen yhteydenoton jälkeen!

Ratkaisut

Lisää viive

Ehdottomin yksinkertaisin ratkaisu on ottaa käyttöön lyhyt viive painikkeen syötteen lukemisen jälkeen. Tämä estää koodia poimimasta palautuksia ja kun se jatkuu, signaalin tulisi olla vakaa.

  if (digitalRead (A3) == 0) {// tee jotain tässä viive (500 );}  

Yllä olevassa esimerkissä viivytän 500 ms: n lukemisen jälkeen tapin tilan. Painike on normaalisti korkea, joten kun painan sitä alas, tapin tila siirtyy logiikkaan 0. Otan sen koodista ja teen jotain ja odotan sitten vähintään 500 ms ennen jatkamista.

On selvää, tämä koodi pysähtyy vain puoliksi sekunniksi joka kerta, kun painat painiketta, mikä voi olla hyväksyttävää sovelluksessasi. Voit pienentää viivettä myös kytkimen kontaktin palautumisajasta riippuen, mutta pelaan sitä turvallisesti täällä.

Ohita-painike painaa liian lähekkäin

Samankaltainen kuin yllä olevan ratkaisun, mutta kovan viiveen lisäämisen sijaan voit käyttää millis () -toimintoa seurataksesi, milloin viimeksi kytkin laukaistiin. Joka kerta kun näet kytkimen liipaisimen, verrataan aikaan ja jos jätät tarpeeksi aikaa (sanotaan kuten edellisessä esimerkissäni 500 ms), jätät sen huomiotta.

Tämä ratkaisee ongelman, että sinun on käytettävä delay () koodissasi.

Vaihda viritinvahvistimen IC

On joitain asioita, kuten MAX6816, joka on IC, jonka asetat kytkimen ja mikro-ohjaimen tulon väliin. Se kumoaa signaalin sinulle. Hintaan 1,62 dollaria @ 1k, et todennäköisesti koskaan käytä tätä.

Muu

Tähän ongelmaan on monia ratkaisuja ... Teen aina ohjelmistossa, mutta jotkut muut sisällytä salpa tai kondensaattori.

Debounce Code - yksi viesti niiden kaikkien hallitsemiseksi

kiitos, opin ja tämä ajoi minua!
#2
+3
jlbnjmn
2014-02-24 04:05:29 UTC
view on stackexchange narkive permalink

Painikekoskettimet ovat todennäköisesti palautumassa kosketukseen, mikä aiheuttaa piirin avaamisen ja sulkemisen useita kertoja, vaikka painikkeen sijainti ei muutu.

Se on yleinen painikkeiden ongelma, ja se olisi ensimmäinen asia, jonka tarkistan. Tämän korjaamiseksi sinun on poistettava painike. Tämän saavuttamiseksi on useita tapoja, joista osa voidaan tehdä itse luonnoksessa.

Hyvä ratkaisu on koodi, joka mittaa kunkin painikkeen tilan keston ja rekisteröi tilan muutoksen vain, jos nykyinen kesto on suurempi kuin haluttu kesto. Tätä vaihtoehtoa tulisi käyttää monimutkaisemmissa hankkeissa. Sen koodi on projektikohtainen ja todennäköisesti käyttää luonnosmääriteltyjä muuttujia, mutta esimerkki tehtävästä löytyy täältä.

Jos luonnos on hyvin yksinkertainen tai haluat vain varmistaa, että palautus on ongelma, voit lisätä lyhyen viiveen painikkeen tilan muuttuessa. Esimerkiksi:

  void loop () {const int newState = digitalRead (5); if (newState! = oldState) {if (newState == HIGH) Sarja.println (++ numPresses); oldState = newState; delay (10) // Säädä viiveen pituus mahdollisimman lyhyeksi aiheuttamatta virheitä}}  
#3
+2
jfpoilpret
2014-02-24 04:11:04 UTC
view on stackexchange narkive permalink

Tämä on painikkeesi pomppiminen , joka on melko tavallista. sillä ei ole mitään tekemistä painikkeen laadun kanssa.

Painikkeen "purkamiseksi" on kaksi tapaa: laitteistolla tai ohjelmistolla.

Henkilökohtaisesti pidän mieluummin laitteistosta; vain google for -painikkeen debouncing circuit ja sinun pitäisi löytää monia esimerkkejä.

Jos sinulla ei ole tarvittavia komponentteja, voit käyttää ohjelmiston debouncingia.

Ohjelmistolla sinulla on esimerkki täällä Arduinon verkkosivustolla.

Jotkut painikkeet palautuvat paljon enemmän kuin toiset, joten sillä on jotain tekemistä napin laadun kanssa.
@sachleen En ole varma sanoisin niin; se riippuu olennaisesti painikkeen koskettimissa käytetystä metallista. En usko, että jokaisesta tilanteesta voisi löytää ei-palautuvan painikkeen. Kytkimen pomppiminen on odotettavissa, ja se puree etenkin, jos luonnos toimii nopeasti kahden `` digitalRead () '' -puhelun välillä.
Myös pomppiminen riippuu siitä, kuinka painiketta painetaan (esim. Mikä voima siihen kohdistetaan ja miten).
Vaikka ilmiötä kutsutaan kontaktin palautumiseksi, se "näyttää" sähköisesti kuin "palautuminen" (ja voi itse asiassa liittyä johonkin todelliseen "palautumiseen"), mekaanisessa kytkimessä kontaktit eivät koskaan lähesty / poikkea toisistaan ​​täysin suoraviivaisesti; väistämättä liukuu jonkin verran toistensa yli. Karkeiden pintojen liukuminen on merkki make-break-make ... -ilmiöstä, vaikka kontaktit eivät tosiasiassa "pomppi". (Ajattele, että eräänlainen sileä kallio liukuu toista vasten). Huomaa, että tämä tarkoittaa myös, että kosketuksen katkeamiseen liittyy myös rikkoutuminen ...


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...