debounce maar dan anders?

Arduino specifieke Software
Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

debounce maar dan anders?

Berichtdoor Nald » 28 Aug 2012, 15:20

Hallo,

Ik ben bezig om een arduino te laten werken op een afstandsbediening

De afstandsbediening is een soort pushbutton, ingedrukt geeft hij een signaal en los geeft hij geen signaal. alleen nu is de afstandsbediening behoorlijk storingsgevoelig.
Als ik bijvoorbeeld meer dan 5m van de ontvanger staat (100m bereik) of er loopt iemand tussen mij en de ontvanger, verliest de ontvanger even zijn signaal, om het vervolgens weer op te vangen. Hierdoor krijg ik ook niet een zuivere uitgang.

Ik heb dit proberen te ondervangen met debounce, dit gaf mij alleen als resultaat dat hij zichzelf vertraagd uitzette en zichzelf weer vertraagd aanzette.

Heeft hier iemand een oplossing voor (softwarematig?)

Bij voorbaat dank!

Advertisement

Gebruikers-avatar
Berichten: 188
Geregistreerd: 23 Dec 2011, 00:12

Re: debounce maar dan anders?

Berichtdoor Duality » 29 Aug 2012, 23:40

wat voor soort signaal is het? IR ? Radio?

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: debounce maar dan anders?

Berichtdoor Nald » 30 Aug 2012, 16:55

hartelijk dank voor je reactie.

433Mhz

maar de ontvanger is appart van de arduino. (had deze nog liggen van andere projecten)


Wanneer hij ontvangt schakelt deze een relais, de uitgang van dit relais heb ik als een schakelaar op de arduino aangesloten.

Dus ik wil graag dat als hij bv 1 sec geen contact heeft dat hij door blijft gaan met zijn huidige actie en het nieuwe contact oppakt waneer hij verbinding heeft.
Nu heb ik er een "menuutje" aanhangen en waneer de ontvanger zijn signaal verliest gaat hij door naar het volgende menu item.

Als ik probeer te debouncen zoals dit is uitgelegd op de arduino site krijg ik dit niet voor elkaar.

Dit is mijn huidige code. (ik ben een beginner, dus het zal wel een rommeltje zijn)

Code: Alles selecteren
 int buttonPin=3;         
 int Melody=11;
 int Sound=8;
 
 int KopL=5;
 int KopR=7;
 int MistL=4;
 int MistR=2;
 int KnipL=9;
 int KnipR=10;
 
 
 
 int buttonState = HIGH;
 int buttonPushCounter = 0;
 int lastbuttonState=LOW;
 
 boolean lastButton =LOW;
 boolean currentButton =LOW;


 
 void setup() {
     
  pinMode (Melody, OUTPUT);
  pinMode (Sound, OUTPUT);
  pinMode (KopL, OUTPUT);
  pinMode (KopR, OUTPUT);
  pinMode (MistL, OUTPUT);
  pinMode (MistR, OUTPUT);
  pinMode (KnipL, OUTPUT);
  pinMode (KnipR, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.begin(9600);
 
 }
 
 boolean debounce(boolean last)
 {
 
  boolean current = digitalRead(buttonPin);
  if (last != current)
  {
    delay(5);
current = digitalRead(buttonPin);  }
return current;
   
 }
 
 void loop() {
   
currentButton = debounce(lastButton);
   
   
   
   buttonState = currentButton;
   if (buttonState != lastbuttonState ) {
     if (buttonState == HIGH) {
       buttonPushCounter++;
       Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else {
          Serial.println("off");
    }}
    lastbuttonState= buttonState;
    if (buttonPushCounter % 4 == 0 ){
 buttonPushCounter =0;}else
 
 
 
  if (buttonPushCounter == 1 && currentButton == HIGH ){
    delay(250);
    digitalWrite(Melody,HIGH);
   
      } else
     
      if (buttonPushCounter == 2 && currentButton == HIGH ){
      delay(250);
        digitalWrite(Melody,HIGH);
      digitalWrite(Sound,HIGH);
     
      }else
     
     
       if (buttonPushCounter == 3 && currentButton == HIGH ){
        delay(250);
         digitalWrite(Melody,HIGH);
      digitalWrite(Sound,LOW);
      digitalWrite(KnipR,HIGH);
      digitalWrite(KnipL,LOW);
      delay(75);
      digitalWrite(KnipR,LOW);
      digitalWrite(Melody,HIGH);
       delay(50);
      digitalWrite(KnipR,HIGH);
      digitalWrite(Melody,HIGH);
       delay(75);
      digitalWrite(KnipR,LOW);
      digitalWrite(KopR,HIGH);
      digitalWrite(Melody,HIGH);
       delay(150);
      digitalWrite(KopR,LOW);
      digitalWrite(MistR,HIGH);
      digitalWrite(Melody,HIGH);
       delay(150);
      digitalWrite(MistR,LOW);
      digitalWrite(MistL,HIGH);
      digitalWrite(Melody,HIGH);
       delay(150);
      digitalWrite(MistL,LOW);
      digitalWrite(KopL,HIGH);
      digitalWrite(Melody,HIGH);
       delay(150);
       digitalWrite(KopL,LOW);
      digitalWrite(KnipL,HIGH);
      digitalWrite(Melody,HIGH);
       delay(75);
       digitalWrite(KnipL,LOW);
      digitalWrite(Melody,HIGH);
       delay(50);
       digitalWrite(KnipL,HIGH);
      digitalWrite(Melody,HIGH);
       delay(75);
       digitalWrite(KnipL,LOW);
       
       }else{
        digitalWrite(Melody,LOW);
      digitalWrite(Sound,LOW);
       digitalWrite(KopL,LOW);
      digitalWrite(KopR,LOW);
       digitalWrite(KnipL,LOW);
      digitalWrite(KnipR,LOW);
       digitalWrite(MistL,LOW);
      digitalWrite(MistR,LOW);
     

  }
 
 
 
 
   
 
  }
 


Wat de code nu doet is weergegeven in dit filmpje:
http://www.youtube.com/watch?v=hJnB3qu5OfI&feature=plcp

Gebruikers-avatar
Berichten: 188
Geregistreerd: 23 Dec 2011, 00:12

Re: debounce maar dan anders?

Berichtdoor Duality » 30 Aug 2012, 22:01

dus als de relais voor langer dan 1 seconde niet ingeschakeld is moet de arduino verder?
maar als de relais binnen 1 seconde weer ingeschakeld word, gaat hij verder met wat hij bezig was?(dus de code die gedraait word als je normaal de relai inschakeld?)
(gewoon eff zien of ik het begrijp:))

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: debounce maar dan anders?

Berichtdoor Nald » 31 Aug 2012, 17:08

De bedoeling is dat wanneer hij 1 sec geen contact maakt en het contact weer hersteld dat de arduino tussentijds door blijft gaan evenzo na het contact herstel.
Dat de code van arduino zo aangeapst wordt dat een contactverlies van 1 sec (misschien 0,5 sec beter?) geen gevolgen heeft voor de uitvoering.

Nu verlies ik contact en wanneer het contact weer hersteld gaat hij naar het volgende menu item. Wanneer ik de debounce code gebruikte van de arduino tutorial, ging de code vertraagd uit met 0,5 sec en vervolgens pakte hij hem vertraagd op met 0,5 sec (menu codes zaten er toennog niet in verwerkt)

Gebruikers-avatar
Berichten: 188
Geregistreerd: 23 Dec 2011, 00:12

Re: debounce maar dan anders?

Berichtdoor Duality » 31 Aug 2012, 20:00

Wel eens met millis gewerkt :)? dat is blink zonder delay();, dat lijkt mij zeer geschikt hier voor, als dat eenmaal onder de knie hebt, kan je op een geefmoment zo laten lijken dat je meerdere dingen doet tegelijk (bijna maar te snel om te merken)

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: debounce maar dan anders?

Berichtdoor Nald » 31 Aug 2012, 21:23

Om heel eerlijk te zijn snap ik dat millis niet echt.

iemand een link waar dat uitgebreider uitgelegd staat?

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: debounce maar dan anders?

Berichtdoor pjh » 08 Sep 2012, 19:40

misschien helpt het als je een interrupt gebruikt.
Hier een voorbeeld programma:
Code: Alles selecteren
volatile int aantal_knop_drukken = 0;

void setup(){
  attachInterrupt(1, knop_is_gedrukt, RISING);
  Serial.begin(9600);}

void loop(){
  Serial.println(aantal_knop_drukken);
}

void knop_is_gedrukt(){
  static unsigned long vorige_interrupt = 0;
  unsigned long huidige_interrupt = millis();
  if (huidige_interrupt - vorige_interrupt > 300){
    aantal_knop_drukken++;
  }
  vorige_interrupt = huidige_interrupt;
}


Wat je doet is dit:
1. zodra je op je afstandsbediening drukt, gaat het relais van de ontvanger op aan.
2. het signaal van je relais gaat in je Sketch naar PIN 3
3. Op pin 3 zit (toevallig) interrupt 1
4. Met de attachInterrupt-opdracht, koppel je activiteit op pin 3 (LOW, Rising, Falling etc) aan een kleine subroutine (knop_is_gedrukt), die alleen als er al 300 ms niet gedrukt is, de teller verhoogd.

Volgens mij heb je zo geen last van je ontvanger enzo.
Laat maar weten als het niet lukt.

Het fijne van deze methode is, dat je niet in je loop naar je knopjes hoeft te kijken. Doet de arduino zelf.

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: debounce maar dan anders?

Berichtdoor pjh » 08 Sep 2012, 20:04

hier je eigen code met mijn aanpassingen.
Kijk maar of het werkt
heb je hardware niet hier.

Code: Alles selecteren
int buttonPin=3;
int Melody=11;
int Sound=8;

int KopL=5;
int KopR=7;
int MistL=4;
int MistR=2;
int KnipL=9;
int KnipR=10;

volatile int aantal_knop_drukken = 0;

void setup() {
  pinMode (Melody, OUTPUT);
  pinMode (Sound, OUTPUT);
  pinMode (KopL, OUTPUT);
  pinMode (KopR, OUTPUT);
  pinMode (MistL, OUTPUT);
  pinMode (MistR, OUTPUT);
  pinMode (KnipL, OUTPUT);
  pinMode (KnipR, OUTPUT);
  pinMode (buttonPin, INPUT);
 
  Serial.begin(9600);
 
 attachInterrupt(1, knop_is_gedrukt, RISING);
}

void loop() {
switch (aantal_knop_drukken){
  case 0:
    delay(250);
    digitalWrite(Melody,HIGH);
    break;
  case 1:
    delay(250);
    digitalWrite(Melody,HIGH);
    digitalWrite(Sound,HIGH);
    break;
  case 2:
    delay(250);
    digitalWrite(Melody,HIGH);
    digitalWrite(Sound,LOW);
    digitalWrite(KnipR,HIGH);
    digitalWrite(KnipL,LOW);
    delay(75);
    digitalWrite(KnipR,LOW);
    digitalWrite(Melody,HIGH);
    delay(50);
    digitalWrite(KnipR,HIGH);
    digitalWrite(Melody,HIGH);
    delay(75);
    digitalWrite(KnipR,LOW);
    digitalWrite(KopR,HIGH);
    digitalWrite(Melody,HIGH);
    delay(150);
    digitalWrite(KopR,LOW);
    digitalWrite(MistR,HIGH);
    digitalWrite(Melody,HIGH);
    delay(150);
    digitalWrite(MistR,LOW);
    digitalWrite(MistL,HIGH);
    digitalWrite(Melody,HIGH);
    delay(150);
    digitalWrite(MistL,LOW);
    digitalWrite(KopL,HIGH);
    digitalWrite(Melody,HIGH);
    delay(150);
    digitalWrite(KopL,LOW);
    digitalWrite(KnipL,HIGH);
    digitalWrite(Melody,HIGH);
    delay(75);
    digitalWrite(KnipL,LOW);
    digitalWrite(Melody,HIGH);
    delay(50);
    digitalWrite(KnipL,HIGH);
    digitalWrite(Melody,HIGH);
    delay(75);
    digitalWrite(KnipL,LOW);
    break;
  case 3:
    digitalWrite(Melody,LOW);
    digitalWrite(Sound,LOW);
    digitalWrite(KopL,LOW);
    digitalWrite(KopR,LOW);
    digitalWrite(KnipL,LOW);
    digitalWrite(KnipR,LOW);
    digitalWrite(MistL,LOW);
    digitalWrite(MistR,LOW);
    break;
  }
}

void knop_is_gedrukt(){
  static unsigned long vorige_interrupt = 0;
  unsigned long huidige_interrupt = millis();
  if (huidige_interrupt - vorige_interrupt > 300){
    aantal_knop_drukken++;
    if (aantal_knop_drukken > 3){
      aantal_knop_drukken = 0;
    }
    Serial.print("knop gedrukt. Programma: ");
    Serial.println(aantal_knop_drukken);
  }
  vorige_interrupt = huidige_interrupt;
}



De arduino, of beter gezegd: de ATMega328P-microcontroller, heeft een aantal interne timers. Een interrupt zit op zo'n timer. Als de timer afloopt, wordt de loop tijdelijk onderbroken en de status van een PIN bekeken. Deze kan laag zijn, hoog zijn gegaan, laag zijn gegaan, veranderd zijn. Genoeg hier over op arduino.cc
Je kunt met de opdracht attachInterrupt dus een PIN aan een interrupt en een void koppelen. Veranderd de pin, dan wordt je void uitgevoerd. ZONDER dat jeditin je void LOOP hoeft te doen.

Berichten: 68
Geregistreerd: 28 Aug 2012, 15:14

Re: debounce maar dan anders?

Berichtdoor Nald » 08 Sep 2012, 21:23

Ik heb je code rechtstreeks overgenomen en geupload, hierdoor krijg ik een storing die ik met geen mogelijkheid krijg verholpen.

Zelfs wanneer ik mijn oude upload, blijft ie constant hangen in het 1e "menu" ook als ik alle input pinnen loskoppel.

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 24 gasten