Close

Arduino UNO – nereaguje na snímač polohy

Úvodní stránka Fórum Hardware Arduino Arduino UNO – nereaguje na snímač polohy

  • Toto téma obsahuje celkem 1 odpověď. Do diskuze (2 diskutující) se naposledy zapojil uživatel Zbyšek Voda a poslední změna proběhla před 7 roky.
Aktuálně jsou na stránce zobrazeny 2 příspěvky - 1. až 2. (celkem z 2)
  • Autor
    Příspěvky
  • #5031
    Dupla
    Účastník

    Dobrý den,
    pokouším se naprogramovat jednoduchý automat, který se skládá ze čtyř pneumatických válců, které mají koncové polohy signalizovány snímači, které se spínají magnetem, který je umístěn uvnitř pneumatického válce na jeho pístu. Pokud se píst dostane na úroveň snímače, tak ho sepne, načež se na něm rozsvítí dioda a pošle do arduina na vstup 5 V. Nedaří se mi naprogramovat tak, aby spolupracovaly snímače s arduinem a to řídilo jejich zasouvání a vysouvání v pořadí jaké potřebuji a zároveň byl pohyb omezen sepnutím snímačů.
    Arduino snímače ignoruje a po zapnutí vyjíždí současně všechny čtyři válce i když je mám v programově ošetřené.

    Zde uvádím část programu:

    
    void setup() {
      pinMode(2, OUTPUT);    //  pneumatický válec č. 1
      pinMode(6, INPUT);   //  Snímač - zasunut
      pinMode(7, INPUT);   //  Snímač - vysunut
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      digitalWrite(2, HIGH);   // Zapíšu jedničku na válec č. 1 (zůstane zasunutý)
      
      int snimacZasunut = digitalRead(6);
      int snimacVysunut = digitalRead(7);
      if(snimacZasunut == HIGH && snimacVysunut == LOW)
      {
         digitalWrite(2, LOW);    //    Pokud je válec zasunut, tak se vysune.
      }
    .
    .
    .
    }
    

    Tímto Vás prosím o radu, jak si v tomto problému počínat. Děkuji.

    #5032
    Zbyšek Voda
    Správce

    Dobrý den,
    nevím, jestli problém správně chápu…
    Máte 4 písty a chcete mít možnost je ovládat nezávisle na sobě, že?

    Navrhuji tedy něco jako:

    int pist1 = 2;
    int pist1Zasunut = 6; 
    int pist1Vysunut = 7;
    
    boolean pozadovanyStavPist1 = false; //false - zasunuto, true - vysunuto
    int stavPist1 = 0; //0 - zasunuto, 1 - někde mezi, 2 - vysunuto
    
    void setup() {
        pinMode(pist1, OUTPUT);
        pinMode(pist1Zasunut, INPUT);
        pinMode(pist1Vysunut, INPUT);
    }
    
    void loop() {
        //prvně nastavíme hodnotu stavPist1
        if(digitalRead(pist1Zasunuto) && !digitalRead(pist1Vysunuto){
            stavPist1 = 0;
        }
        else if(!digitalRead(pist1Zasunuto) && !digitalRead(pist1Vysunuto){
            stavPist1 = 1;
        }
        else if(!digitalRead(pist1Zasunuto) && digitalRead(pist1Vysunuto){
            stavPist1 = 2;
        }
        else{
            //k situaci, kdy by byly oba spínače sepnuté, nedojde
        }
        
        if(stavPist1 == 0){
            if(pozadovanyStavPist1 == false){
                //je zasunuto, nic nedělej
            }
            else{
                digitalWrite(pist1, LOW); //vysunout píst
            }
        }
        else if(stavPist1 == 1){
            if(pozadovanyStavPist1 == false){
                digitalWrite(pist1, HIGH); //pokračuj v zasouvání pístu
            }
            else{
                digitalWrite(pist1, LOW); //pokračuj ve vysouvání pístu
            }
        }
        else if(stavPist == 2){
            if(pozadovanyStavPist1 == false){
                digitalWrite(pist1, HIGH); //zasunout píst
            }
            else{
                //nic nedělej, je vysunuto a to je dobře
            }
        }
    }

    Dá se to zapsat i kratším způsobem, ale takto to snad bude pochopitelné 🙂

Aktuálně jsou na stránce zobrazeny 2 příspěvky - 1. až 2. (celkem z 2)
  • Pro reakci na toto téma se musíte přihlásit.