Close

Ukazatel zařazené rychlosti na motorku

Úvodní stránka Fórum Vaše projekty Arduino Ukazatel zařazené rychlosti na motorku

  • Toto téma obsahuje celkem 20 odpovědí. Do diskuze (4 diskutující) se naposledy zapojil uživatel posjirka a poslední změna proběhla před 8 roky a 7 měsíci.
Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (celkem z 21)
  • Autor
    Příspěvky
  • #5939
    pepa48
    Účastník

    Ahoj, nejde mi rozjet jeden projekt takže ho popíšu.

    Chci udělat ukazatel zařazené rychlosti na motorce pomocí diod(s popisky N,1,2,3,4,5) a dvou tlačítek.

    Mám tady takovej slovní program.. ↓ ↓ ↓

    1.) Ze začátku chci aby to ukázalo že je to N(neutral) pomocí diodyN
    2.)POKUD svítí diodaN –> když se zmáčkne talčítko1 tak aby to spustilo diodu1 a vypnulo dioduN
    3.)POKUD svítí dioda1 –>když se zmáčkne tlačítko2 tak aby to spustilo diodu2 a vypnulo diodu 1
    NEBO když se zmáčkne tlačítko1 tak se vypne dioda1 a spustí dioduN
    4.)POKUD svítí dioda2 –> když se zmáčkne tlačítko2 tak aby to spustilo diodu a vypnulo diodu 2
    NEBO když se zmáčkne tlačítko1 tak se vypne dioda2 a spustí diodu1
    5.)POKUD svítí dioda3 –> když se zmáčkne tlačítko2 tak aby to spustilo diodu a vypnulo diodu 3
    NEBO když se zmáčkne tlačítko1 tak se vypne dioda3 a spustí diodu2
    6.)POKUD svítí dioda4 –> když se zmáčkne tlačítko2 tak aby to spustilo diodu a vypnulo diodu 4
    NEBO když se zmáčkne tlačítko1 tak se vypne dioda4 a spustí diodu3
    7.)POKUD svítí dioda5 –> když se zmáčkne tlačítko2 tak aby to spustilo diodu a vypnulo diodu 5
    NEBO když se zmáčkne tlačítko1 tak se vypne dioda5 a spustí diodu4

    a to je vše 😉

    počítám s tím že se v tom ztratíte, ale když pomůžete budu moc rád… 🙂

    #5955
    posjirka
    Účastník

    Takže jestli to chápu dobře:
    pojmenujemme si LED diody od „0“ kdy „0“ = N, „1“ = 1, … „5“ = 5
    Po startu se rozsvítí LED0 a níž to nepůjde
    tlačítky „+“ a „-“ chceš posouvat LED nahoru/dolu až po LED5.
    Ta bude poslední a dál to nepůjde.
    Chápu to dobře?

    Je třeba si ještě uvědomit, že reakce na stisk tlačítka nemusí být ta správná cesta.
    Na tlačítku jsou při stisku zákmity a může se stát, že při stisku může tlačítko „vygenerovat“ řadu impulzů.
    Řesší se to time-out-em, kdy po stisku mikročip nereaguje po nastavenou dobu a pak zase čeká.
    Je třeba citlivě a z rozmyslem nastavit pak tento čas, protože při rychlém přepnutí nebude reagovat.

    #5966
    pepa48
    Účastník

    Ano chápete to dobře jen je tady malý problém.

    Jde to N –> dolů –> 1 –> nahoru 2 –> ….. nahoru –> 5 (a zpátky opačně)

    takže to není normální sčítání a odčítání nahoru a dolů..

    #5967
    posjirka
    Účastník

    Tady vidím problém … jak mu řeknu, že jdu ze „2“ na „3“ a né na „1“, když je to ten samý směr?

    N 2 4
    \ / \ / \
    1 3 5

    tak jednoduše to asi nepůjde. Napadají mě 2 varianty:
    1, je třeba ještě dodatečná informace o směru (3-tí kontakt)
    2, využít jiného způsobu třebas i nepřímého měření jako třeba měření otáček motoru vs otáčky kola a podel poměru +/- vypočítat jaký byl použit převod. Ovšem fungovalo by to pouze za jízdy. Nevím motory a převodovky jsou pro mě věcí neznámou. Jsem spíš na elektro…

    #6037
    pepa48
    Účastník

    Napadla mě ještě jedna možnost ale protože jsem začátečník tak mi to opět nejde 😀

    Jak udělat to normální sčítání a odčítání s tlačítky (+ a -) v programu?
    tzn. na začátku svítí dioda1, když zmáčknu + 1. vypne a spustí se druhá a naopak..

    #6038
    Zbyšek Voda
    Správce

    To bude něco jako

    
    byte tlacitkoPlus = 5;
    byte tlacitkoMinus = 6;
    boolean stav1 = false;
    boolean predStav1 = false;
    boolean stav2 = false;
    boolean predStav2 = false;
    int i = 0;
    
    ...
    
    void loop(){
        stav1 = digitalRead(tlacitkoPlus);
        if(stav1 == true && predStav1 != stav1){
            i++;
        }
        predStav1 = stav1;
    
        stav2 = digitalRead(tlacitkoMinus);
        if(stav2 == true && predStav2 != stav2){
            i--;
        }
        predStav2 = stav2;
    }
    
    #6039
    pepa48
    Účastník

    Mohl by jste mi to popsat trochu podrobněji, díky 🙂

    #6040
    Zbyšek Voda
    Správce

    Ta část
    stav1 == true && predStav1 != stav1
    slouží k tomu, aby systém reagoval při stisku tlačítka. (Tj. jedenkrát při změně z LOW na HIGH).

    Pokud je tedy tlačítko stisknuto, dojde k zvětšení/zmenšení proměnné i o jedna.
    Ta může být použita například jako index v poli, ve kterém máte uložené piny s LEDkami („rozsviť LED, která odpovídá rychlosti 3“)

    #6041
    posjirka
    Účastník

    hezké řešení. mě ale v takto ultrakrátkých smyčkách občas zahaprovalo (zákmity na tlačítku) a načetlo třeba 2-3 pozice navíc. Od té doby jsem přešel na časové prodlevy mezi stisky tlačítka. Variantou je ještě paralelní kapacita na tlačítko pro kompenzaci zákmitů.

    #6042
    posjirka
    Účastník

    pro „pepa48“ ten kod od Zbyškanení úplný a při zkopírování do Arduino IDE ti nepůjde. Šlo o ideové řešení … .

    #6043
    Zbyšek Voda
    Správce

    Ano. Nepůjde.
    Máte pravdu posjirka. Zákmity jsou potvory.
    Ještě ideálnější řešení by (podle mě) bylo použít moje řešení společně s vaším čekáním uvnitř podmínky.

    #6044
    posjirka
    Účastník

    navrhoval bych toto řešení. Snad je to dostatečně popsáno. Odzkoušel jsem to na simulátoru a mělo by to fungovat:

    const int plus = 11; //tlačítko plus proti zemi
    const int minus = 12; // tlačítko mínus proti zemi
    int LED[8] = {2, 3, 4, 5, 6, 7, 8, 9}; // pole pozice/pinů jednotlivých LED diod
    int pozice = 0; // pozice rozsvícené LED diody resp. číslo vyvodu v poli
    int i = 0; // pomocna promenna pro pocitadlo
    unsigned long lastTime = 0; // strojní čas od posledního stisku tlačítka - libovolneho
    unsigned long prodleva = 250; // kolik ms nebude reagovat na další stisk tlačítka 
    void setup()
    {
    	pinMode(plus, INPUT_PULLUP); // nastav jako vstup a aktivuj vnitrni pull up odpor
    	pinMode(minus, INPUT_PULLUP); // nastav jako vstup a aktivuj vnitrni pull up odpor
    	pinMode(LED[0], OUTPUT); // nastavení pinu jako výstup pro LED 
    	pinMode(LED[1], OUTPUT); // nastavení pinu jako výstup pro LED 
    	pinMode(LED[2], OUTPUT); // nastavení pinu jako výstup pro LED 
    	pinMode(LED[3], OUTPUT); // nastavení pinu jako výstup pro LED 
    	pinMode(LED[4], OUTPUT); // nastavení pinu jako výstup pro LED
    	pinMode(LED[5], OUTPUT); // nastavení pinu jako výstup pro LED 
    	pinMode(LED[6], OUTPUT); // nastavení pinu jako výstup pro LED 
    	pinMode(LED[7], OUTPUT); // nastavení pinu jako výstup pro LED  
    	pozice = 0; // prvotni nastaveni pozice rozsvicene LED diody
    }
    
    void loop()
    {
    	for (i=0; i <= 7; i++){	// smyčka která projede všech 8 pozic pole LED diod
    		if (i == pozice) 
    		{
    			digitalWrite(LED[i], HIGH); // když je i rovno pozici tak rozsvit LED diodu			
    		}
    		else
    		{
    			digitalWrite(LED[i], LOW); // jinak zhasni LED diodu
    		}
    	} 
    	if(lastTime + prodleva < millis()) {	// když aktuální strojový čas mínus prodleva je větší než čas posledního stisku tlačítka ...
    		if(digitalRead(minus) == LOW) {	// když je stisknuto tlačítko minus
    			if (pozice > 0) {	// a pozice je větší než 0
    				pozice --; // odečti z pozice číslo 1
    				lastTime = millis(); // zaznamenej aktuální strojový čas
    			}
    		}
    		if(digitalRead(plus) == LOW) {	// když je stisknuto tlačítko plus
    			if (pozice < 7) {	// a pozice je větší než 0
    				pozice ++; // přičti z pozice číslo 1
    				lastTime = millis(); // zaznamenej aktuální strojový čas
    			}
    		}
    	}
    	
    }
    #6087
    pepa48
    Účastník

    Dík moc za ten program.. Ale stejně mi to nefunguje – přikládám video jak to jede(nejede) https://www.youtube.com/watch?v=bbC53sbY3oY

    #6088
    posjirka
    Účastník

    zkontroluj si zapojení. Už z videa vidím, že máš drát (co má jít na tlačítko -) ve vzduchu. Druhou stranu nevidím, ale asi jí máš stejně. Navíc pull up odpory nepotřebuješ, protože jsem v kodu aktivoval interní, takže stačí jen uzemnit příslušné piny.

    Jinak chválím admina za možnost nahrát soubor … děkujme

    #6091
    pepa48
    Účastník

    aha.. ale funguje to pořád stejně blbě :/ takže u nastavení pinů pro tlačítka stačí jen input? a jak je uzemnit?

Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (celkem z 21)
  • Pro reakci na toto téma se musíte přihlásit.