Input pin erg gevoelig

Hardware geleverd door Arduino
Berichten: 14
Geregistreerd: 05 Apr 2016, 12:34

Input pin erg gevoelig

Berichtdoor Koemi » 09 Feb 2017, 23:03

Hallo,

momenteel druk bezig om een besturing in elkaar te sleutelen voor een carnavalswagen (nog twee weken te gaan).

Met behulp van een Arduino Mega worden relais' aangestuurd die luchtventielen kunnen aansturen. Deze zorgen er op hun beurt weer voor dat diverse luchtcilinders kunnen worden aangestuurd. Elke cilinder heeft zijn eigen tijdsschema en dat werkt perfect. Vorig jaar probleemloos verlopen.

Eén van de cilinders is uitgerust met een centraal geplaatst reed-contact welke een magneet in de luchtcilinder kan detecteren. Zodra dit signaal binnenkomt wordt het relais uitgeschakeld, waardoor de cilinder (tijdelijk) stilvalt.

Normaliter functioneren alle cilinders op tijdbasis, totdat een knop wordt ingedrukt. Op dat moment wordt een speciale sequence gestart, waarbij het reed-signaal van belang wordt. Tevens gaat er een lamp branden tijdens deze sequence. Zodra de sequence is afgerond, gaat alles weer normaal bewegen en de lamp uit.

Nu het probleem:

Het inkomend signaal van de Arduino is dermate gevoelig, dat er al een reed-contact wordt gedetecteerd, terwijl deze niet eens is aangesloten... :|

- Programmatechnisch heb ik geprobeerd om mbv digitalRead en analogRead te werken.
- Diverse mogelijkheden qua aansluitingen doorlopen.
- Verschillende weerstanden geplaatst.

Maar het probleem blijft bestaan.

Het zal zeer waarschijnlijk statische elektriciteit zijn, zover ik het kan overzien.

De code kan ik evt plaatsen, maar het zijn bijna 600 regels...

Hoe kan ik dit oplossen??

Advertisement

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Input pin erg gevoelig

Berichtdoor Gij Kieken » 09 Feb 2017, 23:13

Pull up of pull down weerstanden gebruiken waar nodig, maar belangrijkste is de contacten te Debouncen.
Dit kun je in de Arduino (Als ze niet in een ISR zitten, want dan wordt het moeilijker) ofwel hardware matig iets verzinnen.
Ook opto couplers kan je toepassen waar nodig.
Wat is de lengte van de bedrading tussen sensors en Arduino en hoe zijn ze geplaatst?
Hoe zit de voeding van eea in elkaar?
Over hoeveel ingangen gaat het?

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

Re: Input pin erg gevoelig

Berichtdoor shooter » 10 Feb 2017, 11:09

ja simpel weerstandjes van 5k2 erbij zetten, of probeer eerst eens INPUT_PULLUP even, dan moet de ingang misschien wel omgezet worden naar schakelen naar Gnd, maar is wel een snelle manier dat is intern dan een weerstand van 50kohm.
en je kunt de weerstand er nog altijd gewoon bijzetten.van bijvoorbeeld 5k2. denk ook even aan debounce, want zeker een reedswitch wil daar wel eens last van hebben.
paul deelen
shooter@home.nl

Berichten: 14
Geregistreerd: 05 Apr 2016, 12:34

Re: Input pin erg gevoelig

Berichtdoor Koemi » 12 Feb 2017, 13:28

Input
- reedcontact
- pushbutton

Output
- led
- relais (8x)

Voeding
5V op de USB aansluiting.

Voeding en aarding naar de schakeling worden gedeeld met elkaar. Zie links hieronder voor diverse weergaven.

Schakeling

https://s8.postimg.org/qb2put0gl/Schakeling.jpg

In de schakeling wordt een 8 relay module gebruikt (dus niet het relais wat in de tekening te zien is):

https://s8.postimg.org/p7iliufth/Relay_module.jpg

De gebruikte weerstanden zijn 10K, behalve de weerstand bij de led (220)
Als reedsensor wordt een tiltsensor weergegeven.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Input pin erg gevoelig

Berichtdoor Koepel » 12 Feb 2017, 15:09

De pull-down weerstand van het reedcontact is 10k. Dat betekent dat de impedantie van dat circuit (als het reedcontact niet aktief is) 10k is. Dat is een vrij hoge impedantie, dus is het automatisch gevoelig voor storing.

Ik gebruik 10k alleen als het op hetzelfde board zit. Zodra er wat draden aan zitten gebruik ik 4k7. Bij wat lange draden zou ik 1k kiezen. Bij een omgeving met storing zou ik een optocoupler er tussen zetten.

Weet je hoeveel stroom het reedcontact mag hebben ? Met 1k wordt de stroom 5mA.
Je kunt die 10k wijzigen in 1k. Zorg in de sketch dat je een storingpuls kunt opvangen. Bijvoorbeeld door die ingang meerdere keren te lezen met een korte delay() er tussen. Kun je de sketch laten zien ? 600 regels is geen probleem voor ons, 6000 ook niet, bij 60000 kost het wat meer tijd om er in te zoeken.

Voed je alle relais met de 5V pin van de Arduino ? Dat zal toch wel eens mis gaan ?

Berichten: 14
Geregistreerd: 05 Apr 2016, 12:34

Re: Input pin erg gevoelig

Berichtdoor Koemi » 12 Feb 2017, 17:07

Bedankt allen voor jullie reacties btw :!:

Het reedcontact is een SMC D-A93 (als ik het goed heb... Ik heb hem momenteel niet bij de hand). Wellicht dat ik morgen nog een Festo reed kan scoren, wellicht handig aangezien ik ook met een Festo zuiger werk...

http://uk.rs-online.com/web/p/pneumatic-cylinder-actuator-sensors/8262073/

Volgens mij zit er 3m kabel aan.

Weet je hoeveel stroom het reedcontact mag hebben
:arrow: Load current: 50mA or less (volgens datasheet).

Het relay module zal met een externe 5V voeding aangestuurd worden.


Wat de code betreft; ik ben nog niet extreem bedreven in Arduino IDE, but we are getting there 8-) code-technisch zou een en ander waarschijnlijk een stukje korter kunnen (mbv arrays bijvoorbeeld??) :arrow: ik sta open voor alle tips!

Ik werk graag met 'state machine' wijze van code schrijven... :geek:

case 80 en case 90 worden pas geheel geschreven als de 'pop' op de carnavalswagen staat en de cilinders zijn aangesloten. De sequence wordt gewoon geschreven dmv cilinders aan te sturen en delays toe te voegen. Simpel en... het werkt!

HIGH = LOW en LOW = HIGH... (Chinese Arduino Nano V3 toestanden...)

Hieronder volgt de code:

Code: Alles selecteren
/*
Timers:
http://robotsbigdata.com/docs-arduino-timer.html
State machine:
https://hackingmajenkoblog.wordpress.com/2016/02/01/the-finite-state-machine/

*/

#include <RBD_Timer.h>

RBD::Timer Timecil1moveout(11000);
RBD::Timer Timecil1movein(11000);
RBD::Timer Timecil1waitin(5000);
RBD::Timer Timecil1waitout(5000);
RBD::Timer Timecil2moveout(5000);
RBD::Timer Timecil2movein(5000);
RBD::Timer Timecil2waitin(5000);
RBD::Timer Timecil2waitout(5000);
RBD::Timer Timecil3moveout(6000);
RBD::Timer Timecil3movein(6000);
RBD::Timer Timecil3waitin(6000);
RBD::Timer Timecil3waitout(6000);
RBD::Timer Timecil4moveout(4000);
RBD::Timer Timecil4movein(4000);
RBD::Timer Timecil4waitin(9000);
RBD::Timer Timecil4waitout(9000);

RBD::Timer Statusline(1000);
RBD::Timer Callsequence(3000);      //Timer callsequence, started using breaksignal01
RBD::Timer Timetocenter(5000);     //maximale tijd om Mickey naar midvoor te daaien (tot reed01 actief wordt)

#define reed01 A4                   //Reedcontact cilinder1 tbv middenstand Mickey
#define Cil1in  5          //Mickey geheel roteren links/rechts
#define Cil1out 6         //Mickey geheel roteren links/rechts
#define Cil2in 7          //Mickey hoofd bukken/achterover
#define Cil2out 8         //Mickey hoofd bukken/achterover
#define Cil3in 9          //Mickey hoofd heen en weer links/rechts
#define Cil3out 10                  //Mickey hoofd heen en weer links/rechts
#define Cil4in 11         //Mickey arm telefoon omhoog/omlaag
#define Cil4out 12          //Mickey arm telefoon omhoog/omlaag
#define pushbutton 2      //callsequence starten
#define lamp 13           //indicatie callsequence gestart

  int cil1prev;
  int cil2prev;
  int cil3prev;
  int cil4prev;
  int pushbuttonstate = 0;          //interrupt variabele
  int reed01state;                  //reedsensor op cilinder 1 state

void setup(){
    Serial.begin(115200);
    Statusline.restart();
   
    pinMode(Cil1in, OUTPUT);
    pinMode(Cil1out, OUTPUT);
    pinMode(Cil2in, OUTPUT);
    pinMode(Cil2out, OUTPUT);
    pinMode(Cil3in, OUTPUT);
    pinMode(Cil3out, OUTPUT);
    pinMode(Cil4in, OUTPUT);
    pinMode(Cil4out, OUTPUT);
    pinMode(pushbutton, INPUT);
    pinMode(reed01, INPUT);
    pinMode(lamp, OUTPUT);

   delay(500);  //debounce for a while

        digitalWrite(Cil1out,HIGH);     //relay 1
        digitalWrite(Cil2out,HIGH);     //relay 2
        digitalWrite(Cil3out,HIGH);     //relay 3
        digitalWrite(Cil4out,HIGH);     //relay 4
        digitalWrite(Cil1in,HIGH);     //relay 5
        digitalWrite(Cil2in,HIGH);     //relay 6
        digitalWrite(Cil3in,HIGH);     //relay 7
        digitalWrite(Cil4in,HIGH);     //relay 8
}



void loop(){

      static int state = 8;
      static int cil1prev = 113;
      static int cil2prev = 213;
      static int cil3prev = 313;
      static int cil4prev = 413;
      static int pushbuttonstate = 0;     
      int reed01state = 0;

    switch(state)
  {
    case 1:
      // waiting for a forced state change.
    break;
    case 8:
      pushbuttonstate = digitalRead(pushbutton);
            if(pushbuttonstate == HIGH)  {
            delay(300);
            state = 60;     //CALLSEQUENCE START
       }
           
        else
            state = 9;
    break;
 
    case 9:
        if(Statusline.isActive()) {
            state = 11;
        }   
        if(Statusline.isExpired()) {
            state = 50;
            Statusline.restart();
        }
    break;

///////////////////////////////////////////////////////////////////
//////////////// CILINDER 1 TIMERS ////////////////////////////////
///////////////////////////////////////////////////////////////////
    case 11:
        if(Timecil1moveout.isActive()) {
            state = 12;
        }   
        else if(Timecil1moveout.isExpired() && cil1prev == 114) {
            state = 112;
        }
        else {
            state = 12;
        }
    break;
    case 12:
        if(Timecil1waitout.isActive()) {
            state = 13;
        }   
        else if(Timecil1waitout.isExpired() && cil1prev == 111) {
            state = 113;
        }
        else {
            state = 13;
        }       
    break;
    case 13:
       if(Timecil1movein.isActive()) {
            state = 14;
        }   
        else if(Timecil1movein.isExpired() && cil1prev == 112) {
            state = 114;
        }
        else {
            state = 14;
        }
    break;
    case 14:
       if(Timecil1waitin.isActive()) {
            state = 21;
        }   
        else if(Timecil1waitin.isExpired() && cil1prev == 113) {
            state = 111;
        }
        else {
            state = 21;
        }
    break;       
//////////////// CILINDER 2 TIMERS /////////////////
    case 21:
        if(Timecil2moveout.isActive()) {
            state = 22;
        }   
        else if(Timecil2moveout.isExpired() && cil2prev == 214) {
            state = 212;
        }
        else {
            state = 22;
        }
    break;
    case 22:
        if(Timecil2waitout.isActive()) {
            state = 23;
        }   
        else if(Timecil2waitout.isExpired() && cil2prev == 211) {
            state = 213;
        }
        else {
            state = 23;
        }       
    break;
    case 23:
       if(Timecil2movein.isActive()) {
            state = 24;
        }   
        else if(Timecil2movein.isExpired() && cil2prev == 212) {
            state = 214;
        }
        else {
            state = 24;
        }
    break;
    case 24:
       if(Timecil2waitin.isActive()) {
            state = 31;
        }   
        else if(Timecil2waitin.isExpired() && cil2prev == 213) {
            state = 211;
        }
        else {
            state = 31;
        }
    break;   
//////////////// CILINDER 3 TIMERS /////////////////
    case 31:
        if(Timecil3moveout.isActive()) {
            state = 32;
        }   
        else if(Timecil3moveout.isExpired() && cil3prev == 314) {
            state = 312;
        }
        else {
            state = 32;
        }
    break;
    case 32:
        if(Timecil3waitout.isActive()) {
            state = 33;
        }   
        else if(Timecil3waitout.isExpired() && cil3prev == 311) {
            state = 313;
        }
        else {
            state = 33;
        }       
    break;
    case 33:
       if(Timecil3movein.isActive()) {
            state = 34;
        }   
        else if(Timecil3movein.isExpired() && cil3prev == 312) {
            state = 314;
        }
        else {
            state = 34;
        }
    break;
    case 34:
       if(Timecil3waitin.isActive()) {
      state = 11;
      }   
        else if(Timecil3waitin.isExpired() && cil3prev == 313) {
            state = 311;
        }
        else {
              state = 8;
        }
    break; 

///////////////////////////////////////////////////////////////////   
///////////////// STATUSLINE PRINT SERIAL MONITOR /////////////////
///////////////////////////////////////////////////////////////////
    case 50:
        if(Timecil1moveout.isActive()) {
          Serial.print("Cil1out:");     Serial.print(Timecil1moveout.getInverseValue());      Serial.print("___");
        }
        if(Timecil1movein.isActive()) {
          Serial.print("Cil1in:");     Serial.print(Timecil1movein.getInverseValue());      Serial.print("___");
        }
        if(Timecil1waitin.isActive()) {
          Serial.print("Cil1inwait:");     Serial.print(Timecil1waitin.getInverseValue());      Serial.print("___");
        }
        if(Timecil1waitout.isActive()) {
          Serial.print("Cil1outwait:");     Serial.print(Timecil1waitout.getInverseValue());      Serial.print("___");
        }
        if(Timecil2moveout.isActive()) {
          Serial.print("Cil2out:");     Serial.print(Timecil2moveout.getInverseValue());      Serial.print("___");
        }
        if(Timecil2movein.isActive()) {
          Serial.print("Cil2in:");     Serial.print(Timecil2movein.getInverseValue());      Serial.print("___");
        }
        if(Timecil2waitin.isActive()) {
          Serial.print("Cil2inwait:");     Serial.print(Timecil2waitin.getInverseValue());      Serial.print("___");
        }
        if(Timecil2waitout.isActive()) {
          Serial.print("Cil2outwait:");     Serial.print(Timecil2waitout.getInverseValue());      Serial.print("___");
        }
        if(Timecil3moveout.isActive()) {
          Serial.print("Cil3out:");     Serial.print(Timecil3moveout.getInverseValue());
        }
        if(Timecil3movein.isActive()) {
          Serial.print("Cil3in:");     Serial.print(Timecil3movein.getInverseValue());
        }
        if(Timecil3waitin.isActive()) {
          Serial.print("Cil3inwait:");     Serial.print(Timecil3waitin.getInverseValue());
        }
        if(Timecil3waitout.isActive()) {
          Serial.print("Cil3outwait:");     Serial.print(Timecil3waitout.getInverseValue());
        }
          Serial.print("___cil1prev = ");              Serial.print(cil1prev);
          reed01state = analogRead(reed01);
          Serial.print("___reed01state = ");          Serial.print(reed01state);
          Serial.println(" ");

          state = 8;
    break;

///////////////////////////////////////////////////////////////////
///////////////////// CALLSEQUENCE START///////////////////////////
///////////////////////////////////////////////////////////////////
    case 60:
    if(pushbuttonstate == HIGH) {
      state = 61;
      Serial.println("CALLSEQUENCE STARTING...");
      digitalWrite(lamp,HIGH);
      }
    else
      state = 9;
    break;
    case 61:
        digitalWrite(Cil1out,HIGH);     //relay 1
        digitalWrite(Cil2out,HIGH);     //relay 2
        digitalWrite(Cil3out,HIGH);     //relay 3
        digitalWrite(Cil4out,HIGH);     //relay 4
        digitalWrite(Cil1in,HIGH);     //relay 5
        digitalWrite(Cil2in,HIGH);     //relay 6
        digitalWrite(Cil3in,HIGH);     //relay 7
        digitalWrite(Cil4in,HIGH);     //relay 8

        Callsequence.restart();
        Timetocenter.restart();
       
        if(cil1prev == 111)  {
            state = 62;
        }
        else if(cil1prev == 112  && Timecil1movein.getPercentValue() <=50)  {
            state = 62;
        Serial.print("Timecil1movein percentage = ");  Serial.print(Timecil1movein.getPercentValue());          Serial.print("      reed01state = ");  Serial.println(reed01state);
    }   
        else if(cil1prev == 112  && Timecil1movein.getPercentValue() >=50)  {
            state = 70; 
        Serial.print("Timecil1movein percentage = ");  Serial.print(Timecil1movein.getPercentValue());             Serial.print("      reed01state = ");  Serial.println(reed01state);   
    }   
        else if(cil1prev == 114  && Timecil1moveout.getPercentValue() <=50)  {
            state = 70;     
        Serial.print("Timecil1moveout percentage = ");  Serial.print(Timecil1moveout.getPercentValue());          Serial.print("      reed01state = ");  Serial.println(reed01state);
      }
        else if(cil1prev == 114  && Timecil1moveout.getPercentValue() >=50)  {
            state = 62;     
        Serial.print("Timecil1moveout percentage = ");  Serial.print(Timecil1moveout.getPercentValue());          Serial.print("      reed01state = ");  Serial.println(reed01state);
      }
        else if(cil1prev == 113)  {
            state = 70;         
    }
   
    else  {
      Serial.println("No solution found to get Mickey in central position... Callsequence shutdown");
      state = 8;
        }
    break;


    case 62:
    reed01state = analogRead(reed01);

    if(reed01state <= 1022 && Timetocenter.isActive())    {
        Serial.print("Try to detect reedsensor.... reed01state = ");    Serial.println(reed01state);
    digitalWrite(Cil1in,LOW);
      digitalWrite(Cil1out,HIGH);
   
    }
    else if(reed01state >= 1022 && Timetocenter.isActive())   {
        Serial.println("!!!Reedsensor detected!!!");
      digitalWrite(Cil1in,HIGH);
      digitalWrite(Cil1out,HIGH);
      state = 80;
    }
    else if(reed01state <= 1022 && Timetocenter.isExpired())   {
        Serial.println("No Reedsensor found!!!");
      digitalWrite(Cil1in,HIGH);
      digitalWrite(Cil1out,HIGH);     
      state = 80;
    }
    else if(Timetocenter.isExpired())   {
        Serial.println("Timetocenter expired!!!");
      digitalWrite(Cil1in,HIGH);
      digitalWrite(Cil1out,HIGH);     
      state = 80;
    }   
    else
      state = 62;

    break;

    case 70:
    reed01state = analogRead(reed01);

    if(reed01state <= 1022 && Timetocenter.isActive())    {
        Serial.print("Try to detect reedsensor.... reed01state = ");    Serial.println(reed01state);
    digitalWrite(Cil1in,HIGH);
      digitalWrite(Cil1out,LOW);
   
    }
    else if(reed01state >= 1022 && Timetocenter.isActive())   {
        Serial.println("!!!Reedsensor detected!!!");
      digitalWrite(Cil1in,HIGH);
      digitalWrite(Cil1out,HIGH);
      state = 80;
    }
    else if(reed01state <= 1022 && Timetocenter.isExpired())   {
        Serial.println("No Reedsensor found!!!");
      digitalWrite(Cil1in,HIGH);
      digitalWrite(Cil1out,HIGH);     
      state = 80;
    }
    else if(Timetocenter.isExpired())   {
        Serial.println("Timetocenter expired!!!");
      digitalWrite(Cil1in,HIGH);
      digitalWrite(Cil1out,HIGH);     
      state = 80;
    }   
    else
      state = 70;

    break;


///////////////////////////////////////////////////////////////////
///////////////////// CALLSEQUENCE IN PROGRESS/////////////////////
///////////////////////////////////////////////////////////////////
    case 80:
    Serial.println("CALLSEQUENCE IN PROGRESS...   ");
    Callsequence.restart();
    digitalWrite(Cil1in,HIGH);
    digitalWrite(Cil1out,HIGH);

    digitalWrite(Cil4out,LOW);
    digitalWrite(Cil4in,HIGH);     
            delay(5000);
            state = 90;
  break;

///////////////////////////////////////////////////////////////////
///////////////////// CALLSEQUENCE FINISHING///////////////////////
///////////////////////////////////////////////////////////////////
  case 90:
    if(Callsequence.isExpired())  {
      state = 81;
      Serial.println("CALLSEQUENCE FINISHING...");
      digitalWrite(Cil4out,HIGH);
      digitalWrite(Cil4in,LOW);
      digitalWrite(lamp, LOW);
      reed01state = 0;
      pushbuttonstate = 0;
      delay(2000);
      digitalWrite(Cil4in,HIGH);
      }
    else
      state = 90;
  break;


   
///////////////////////////////////////////////////////////////////
//////////////// CILINDER 1 ACTIVITEIT ////////////////////////////
///////////////////////////////////////////////////////////////////
    case 111:
        digitalWrite(Cil1out,LOW);
        digitalWrite(Cil1in,HIGH);       
        Timecil1moveout.restart();
        state = 8;
        cil1prev = 114;
    break;
    case 112:
        digitalWrite(Cil1out,HIGH);
        digitalWrite(Cil1in,HIGH);       
        Timecil1waitout.restart();
        state = 8;
        cil1prev = 111;
    break;
    case 113:
        digitalWrite(Cil1in,LOW);
        digitalWrite(Cil1out,HIGH);       
        Timecil1movein.restart();
        state = 8;
        cil1prev = 112;
    break;
    case 114:
        digitalWrite(Cil1in,HIGH);
        digitalWrite(Cil1out,HIGH);       
        Timecil1waitin.restart();
        state = 8;
        cil1prev = 113;
    break;
//////////////// CILINDER 2 ACTIVITEIT /////////////////
    case 211:
        digitalWrite(Cil2out,LOW);
        digitalWrite(Cil2in,HIGH);       
        Timecil2moveout.restart();
        state = 8;
        cil2prev = 214;
    break;
    case 212:
        digitalWrite(Cil2out,HIGH);
        digitalWrite(Cil2in,HIGH);       
        Timecil2waitout.restart();
        state = 8;
        cil2prev = 211;
    break;
    case 213:
        digitalWrite(Cil2in,LOW);
        digitalWrite(Cil2out,HIGH);       
        Timecil2movein.restart();
        state = 8;
        cil2prev = 212;
    break;
    case 214:
        digitalWrite(Cil2in,HIGH);
        digitalWrite(Cil2out,HIGH);       
        Timecil2waitin.restart();
        state = 8;
        cil2prev = 213;
    break;
//////////////// CILINDER 3 ACTIVITEIT /////////////////
    case 311:
        digitalWrite(Cil3out,LOW);
        digitalWrite(Cil3in,HIGH);       
        Timecil3moveout.restart();
        state = 8;
        cil3prev = 314;
    break;
    case 312:
        digitalWrite(Cil3out,HIGH);
        digitalWrite(Cil3in,HIGH);       
        Timecil3waitout.restart();
        state = 8;
        cil3prev = 311;
    break;
    case 313:
        digitalWrite(Cil3in,LOW);
        digitalWrite(Cil3out,HIGH);       
        Timecil3movein.restart();
        state = 8;
        cil3prev = 312;
    break;
    case 314:
        digitalWrite(Cil3in,HIGH);
        digitalWrite(Cil3out,HIGH);       
        Timecil3waitin.restart();
        state = 8;
        cil3prev = 313;
    break;
    default:
        state = 8;
    break;
  }
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Input pin erg gevoelig

Berichtdoor Koepel » 12 Feb 2017, 18:22

Heb je die 1k er al in zitten ? Je kunt die ook gewoon over de 10k heen solderen ;)
Ik zou gewoon een digitale ingang gebruiken. Pin A4 is ook een digitale pin, dus die kun je houden.

Je hebt de 5V naar het reed contact (en de weerstand naar GND), ik zou liever de GND gebruiken (en de weerstand naar 5V).
Hieronder ga ik er van uit, dat je die 5V hebt, zoals in het schema. Hieronder wordt de digitale pin 10 keer gelezen met een korte tussenpauze.

Code: Alles selecteren
void setup()
{
  pinMode( reedPin, INPUT);
}


// Returns true of reed is activated (closed) and input is HIGH.
boolean getReed( int pin)
{
  boolean active = false;   // set default: reed is not-active (open)
  int count = 0;

  for( int i=0; i<10; i++)
  {
    int level = digitalRead( pin);
    if( level == HIGH)
      count++;
    delay(1);
  }

  if( count >= 8)    // decide how many should be HIGH
    active = true;
  return( active);
}


Dit leest 10 keer in 10ms. Je kunt ook 100 keer lezen in 100ms. Het is helemaal niet raar om 100 keer te lezen.

Om verkeerde dingen te lezen en storingen te vermijden is het beter om over een langere tijd de ingang te lezen. Wanneer de analoge ingang storing ontvangt, dan kan de waarde al snel clippen tussen 0 en 1023. Dus testen op hoger dan 1022 helpt niet echt. Je kunt beter meerdere keren lezen gedurende een bepaalde tijd.

Gebruikers-avatar
Berichten: 631
Geregistreerd: 15 Nov 2015, 11:54

Re: Input pin erg gevoelig

Berichtdoor Gij Kieken » 12 Feb 2017, 18:57

Ik denk dat jouw tekening niet kan werken A4 hangt rechtstreeks aan +5Vdc.

Zo iets ervan maken R1=10K Kies je 1k dan is het nog minder storing gevoelig.
Ik zou ook kiezen voor digitalRead i.p.v. analogRead.
10K-Pull-up.jpg
10K-Pull-up.jpg (9.66 KiB) 12032 keer bekeken

Berichten: 14
Geregistreerd: 05 Apr 2016, 12:34

Re: Input pin erg gevoelig

Berichtdoor Koemi » 13 Feb 2017, 22:00

Inderdaad had ik iei een digitale ingang ipv analoog; maar door nu een analoge ingang te gebruiken kan ik de meetwaarden lezen gedurende de speciale sequence, vandaar.

Ik heb de knop inderdaad anders aangesloten dan op tekening... Excuses daarvoor.

Maar het goede nieuws is: het werkt! :lol: :lol: :lol:

De oplossing is inderdaad de 10k te verlagen naar 1K.

Ik ben jullie en het forum zeer, zeer erkentelijk! En weer een goed leermoment, zullen we maar zeggen! 8-)

Voor degenen die nog een goede tip hebben om de code anders op te zetten, mbv trucs die ik nog niet ken (en ik ken er een hoop nog niet...) :arrow: tips zijn altijd bijzonder welkom!

Zodra de carnavalswagen enigszins draait, zal er wel gefilmd worden. Ik deel dan de link wel hier op het forum.

En voor mensen die willen komen kijken naar de mooiste optocht boven de rivieren (en voor wie Brabant en Limburg te ver weg is...):

26 februari vanaf 13:00 uur start de optocht in Zwaag (Noordhollland; 30km boven Amsterdam). Zeker bij mooi weer 40.000+ mensen langs de route, en houd dan "De Striphelden" in de gaten!

Meer info: http://carnavalzwaag.nl/

En dit waren we vorig jaar (1e plaats bij de loopgroepen en alle bewegingen van de personages inderdaad aangestuurd met Arduino!!!): https://www.youtube.com/watch?v=HqjbFl6Titw

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Input pin erg gevoelig

Berichtdoor Koepel » 14 Feb 2017, 02:54

Ho ho ho, zo snel kom je niet van me af ;)
Met 1k heb je minder last van storing, maar door meerdere samples te nemen nog vele malen minder.

Het lezen van het reedcontact met een analoge ingang voegt weinig toe. Dat je de meetwaarden kunt lezen tijdens de sequence heeft niets met een digitale of analog ingang te maken.

Met nog twee weken te gaan, wil ik niet het risico lopen dat je sketch om zeep gaat, maar extra debouncen lijkt me toch wel handig.
Je zou eventueel een RC-filter voor de ingang kunnen zetten. Bijvoorbeeld van de kabel naar de Arduino pin een weerstand van 4k7, en van de pin naar GND 100nF.

Over de code: In eerste instantie lijkt het er op dat sommige sequences in een tabel kunnen. Maar je hebt zoveel condities, dat maakt het er niet duidelijker op. Dus ik zou het zo houden. Je kunt nu eenvoudig de juiste state opzoeken en daar iets wijzigen. Let wel een beetje op het consequente gebruik van haakjes en inspringen. Dat maakt de code beter leesbaar.
Mocht je Arduino Mega wat krap zitten met het sram geheugen, dan kun je de 'F()' macro gaan gebruiken.
Code: Alles selecteren
  // This "Hello World" is during initialization copied from flash memory to sram.
  Serial.println("Hello World, from sram");

  // This "Hi there" is not copied, it is used from the flash memory only.
  Serial.println(F("Hi there, from flash"));

Dus normaal gesproken wordt alle tekst tijdens het initialiseren gekopieerd van flash memory naar sram. Dat is dubbel, zonder goede reden. Met de 'F()' macro wordt een pointer naar de flash code gemaakt. De Serial.println() herkent die pointer en gaat lezen van de flash code. Dat werkt alleen met de .println() en .print() functies die van de Stream class zijn afgeleid. Die 'F()' macro kun je dus niet overal gebruiken.

Volgende

Terug naar Arduino hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten