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.
-
AutorPříspěvky
-
6.2.2016 v 10:38 #5939pepa48Úč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í diodu4a to je vše 😉
počítám s tím že se v tom ztratíte, ale když pomůžete budu moc rád… 🙂
7.2.2016 v 0:36 #5955posjirkaÚčastníkTakž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.7.2.2016 v 19:38 #5966pepa48ÚčastníkAno 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ů..
7.2.2016 v 21:04 #5967posjirkaÚčastníkTady 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 5tak 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…15.2.2016 v 16:40 #6037pepa48ÚčastníkNapadla 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..15.2.2016 v 17:01 #6038Zbyšek VodaSprávceTo 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; }
15.2.2016 v 19:30 #6039pepa48ÚčastníkMohl by jste mi to popsat trochu podrobněji, díky 🙂
15.2.2016 v 20:38 #6040Zbyšek VodaSprávceTa čá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“)15.2.2016 v 20:50 #6041posjirkaÚčastníkhezké ř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ů.
15.2.2016 v 20:52 #6042posjirkaÚčastníkpro „pepa48“ ten kod od Zbyškanení úplný a při zkopírování do Arduino IDE ti nepůjde. Šlo o ideové řešení … .
15.2.2016 v 21:09 #6043Zbyšek VodaSprávceAno. 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.15.2.2016 v 21:37 #6044posjirkaÚčastníknavrhoval 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 } } } }
19.2.2016 v 14:28 #6087pepa48ÚčastníkDí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
19.2.2016 v 14:53 #6088posjirkaÚčastníkzkontroluj 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
19.2.2016 v 19:28 #6091pepa48Účastníkaha.. ale funguje to pořád stejně blbě :/ takže u nastavení pinů pro tlačítka stačí jen input? a jak je uzemnit?
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.