Button debounce hardwarematig

Hardware geleverd door Arduino
Berichten: 167
Geregistreerd: 19 Apr 2014, 15:03

Button debounce hardwarematig

Berichtdoor Hanneman » 11 Aug 2014, 00:16

Ik heb een 100nF condensator over een button gezet, is hij dan goed gedebounced?

Bij een encoder werkt het heel goed, maar ik vroeg me af of het met een knop ook goed werkt.
Scheelt programmeerwerk.

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Button debounce hardwarematig

Berichtdoor nicoverduin » 11 Aug 2014, 07:14

Nope. Als je er een cap overheen gooit, dan wordt deze opgeladen gedurende 5 x RC. R is de pullup weerstand. Als je internal pullup gebruikt dan is dat rond de 20K. Gebruik je een eigen pullup dan is dat meestal iets van 1K tot 10K. Dus ligt er een beetje aan wat je gebruikt.
bij een internal pullup kom je op 5 * 0.0000001 * 20000 = 10mS. Als je een eigen pullup gebruikt die door de wat kleinere weerstand een betere stabiliteit geeft, zit je op 500nS bij 1K. Dus als de kwaliteit van de schakelaar uitstekend is kom je er mogelijk mee weg. als deze minder is, is het best mogelijk dat je nog een bounce krijgt en dus 2x de knop leest.
Dit verhaal heeft alleen effect in de oplaad tijd van de cap. Als je de knop indrukt dan wordt de cap kortgesloten maar heeft wel een ontlaad tijd. En als je dan een debounce krijgt, dan gaat ie weer laden.

Daarnaast is het een economische dure oplossing. Extra componenten is (hoe klein ook) een extra mogelijke storingsmogelijkheid. Daarnaast lever je PCB ruimte in en heb je extra component kosten. Nu zal dat in de hobbysfeer niet echt een probleem hoeven zijn, maar jouw baas ziet me aankomen als ik hem zou vertellen dat zijn board duurder is geworden omdat ik wat minder code regels hoef te programmeren.

Ik zou het lekker in de software houden. Eventueel maak je een (schijnt er ook al te wezen) een button class die dit allemaal voor je afvangt.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 167
Geregistreerd: 19 Apr 2014, 15:03

Re: Button debounce hardwarematig

Berichtdoor Hanneman » 11 Aug 2014, 17:47

Oke, ik heb veel moeite een debounce code te vinden voor meerdere knoppen, waar ik goed mee uit de voeten kan, vandaar dat ik zocht naar een hardware oplossing.

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Button debounce hardwarematig

Berichtdoor nicoverduin » 11 Aug 2014, 18:03

Ik gebruik zelf dit:
toelichting
tabel voor 2 buttons

in de initialisatie
pin wordt straks gevuld in de setup() met data pin
waitForReleased is een vlag die bijhoudt of de pin is losgelaten voordat hij weer als aan gezien kan worden. Dit voorkomt dat men de knop ingedrukt houdt. Bij mij moet je dus eerst de knop losgelaten hebben voordat hij weer reageert.
ACTIVE_BUTTON wordt gebruikt om te bepalen of de knop reageert op pull down of pull up.

Code: Alles selecteren
#define ACTIVE_BUTTON                  LOW               /**< determines when button is pressed */

/** data connected to each pin */
struct button {
   uint8_t   pin;                                                /**< pin number on Arduino connected to button */
   boolean   waitForReleased;                              /**< indicates if we have to wait for the button to be released */
};
button buttons[2];                                          /**< array with button settings */


in de setup()
Hier worden de pinnen aan de tabel bekend gemaakt

Code: Alles selecteren
   //
   // setup input buttons
   //
   buttons[0].pin                      = BUTTON;
   buttons[0].waitForReleased    = false;
   buttons[1].pin                      = BUTTONCOLOR;
   buttons[1].waitForReleased    = false;


De feitelijke routine

de code geeft een true terug als de knop daadwerkelijk is ingedrukt en false indien niet of dat de knop nog niet is losgelaten van de vorige indrukken van de knop.

Code: Alles selecteren
/**
 * @name checkButton (uint8_t dataPin)
 * @param dataPin index to button in array
 * @returns boolean true=pressed, false=not pressed
 * checks if a button is processable or waiting for release. If processable, it checks for the ACTIVE_BUTTON state
 */
boolean checkButton(uint8_t dataPin) {

   boolean returnStatus = false;                     // default button is not pressed
   //
   // check switch color button
   //
   if (buttons[dataPin].waitForReleased) {
      //
      // we are still waiting for the release of the button to be able to process the next
      //
      if (digitalRead(buttons[dataPin].pin) == !ACTIVE_BUTTON) {
         //
         // yep button is released
         //
         buttons[dataPin].waitForReleased = false;
      }
   } else {
      //
      // check if the button is pressed
      //
      if (digitalRead(buttons[dataPin].pin) == ACTIVE_BUTTON) {
         //
         // wait debounce time
         //
         delay(DEBOUNCE);
         if (digitalRead(buttons[dataPin].pin) == ACTIVE_BUTTON) {
            //
            // set the return status
            //
            returnStatus = true;
            //
            // and do not process this button until it is released
            //
            buttons[dataPin].waitForReleased = true;
         }
      }
   }
   //
   // return status to caller
   //
   return returnStatus;
}


Aanroepen voorbeeld

Code: Alles selecteren
   if (checkButton(demoSwitch)) {
      //
      // process only if we are in idle mode
      //
      if (programMode == idle_mode) {
         //
         // switching to active mode
         //
         programMode = demo_mode;
         //
         // set to known state
         //
         setDemoBackground();
         mustUpdate = true;
         demoStep = 0;
      }
   }
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 167
Geregistreerd: 19 Apr 2014, 15:03

Re: Button debounce hardwarematig

Berichtdoor Hanneman » 11 Aug 2014, 20:27

Super Nico, Thanks again!!!

Berichten: 167
Geregistreerd: 19 Apr 2014, 15:03

Re: Button debounce hardwarematig

Berichtdoor Hanneman » 12 Aug 2014, 00:43

Ik krijg een melding BUTTON, was not declared in this scope...

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Button debounce hardwarematig

Berichtdoor nicoverduin » 12 Aug 2014, 08:41

En hoe zou dat nou komen.........ff goed lezen wat er in het voorbeeld staat :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Button debounce hardwarematig

Berichtdoor shooter » 12 Aug 2014, 10:45

nico je maakt het hans niet makkelijk hoor, maar wel terecht denk ik, het is een leerproces.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Button debounce hardwarematig

Berichtdoor nicoverduin » 12 Aug 2014, 11:16

Hannes weet hoe mijn programma's eruit zien. Het commentaar geeft aan waarvoor iets is. Dus er mag wel een beetje moeite voor gedaan worden.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 167
Geregistreerd: 19 Apr 2014, 15:03

Re: Button debounce hardwarematig

Berichtdoor Hanneman » 12 Aug 2014, 18:50

Nou Nico, ik begrijp je reactie, maar ik ben volop aan het schilderen en doen in mijn nieuwe woning.
Die vraag kwam ff tussendoor omdat ik het niet wilde vergeten.
Ik ben stikgaar en bekeek de code even gauw voor het slapen gaan.
Er moeite voor doen zit er even niet in, maar ik heb de code op mijn laptop opgeslagen en kom er wel een keer uit.
Ik ben al blij dat er iets staat waar ik straks wat mee kan.

Volgende

Terug naar Arduino hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 48 gasten