duinozone.cz - Arduino a Raspberry fórum

Autor Téma: Arduino - programování  (Přečteno 16040 krát)

Offline 7400

  • Bastlíř začátečník
  • *
  • Příspěvků: 2
Arduino - programování
« kdy: Leden 29, 2013, 15:47:19 odpoledne »
Zdravím,
potřeboval bych trošku poradit....potřebuji přes arduino řídit pwm výstupy a spínat relé na výstupech, ale problém je ten, že mi neběží všechny funkce současně... (např: tlačítkem sepnu PWM výstup...LED se mi pomalu rozsvěcuje a třeba 5 min. svítí a pomalu pohasíná....ale při této smyčce mi nejde sepnout žádné relé na dalších výstupech....až po zkončení smyčky na PWM...mužu sepnout tlačítko na relé...) problém je v tom, že nevím jak smyčku "loop" nastavit, aby mi šly všechny funkce současně....(i třeba aby dvě LED blikaly současně, ale každá jinačí frekvencí)....
děkuji za radu :)

Offline Radek Buš

  • Bastlíř začátečník
  • *
  • Příspěvků: 47
  • Nic není nemožné :-)
    • Roboti.4fan.cz
Re:Arduino - programování
« Odpověď #1 kdy: Únor 24, 2013, 21:14:44 odpoledne »
S tímto problémem jsme se setkal již i ve své praxi... Je to celkem složité něco takového udělat jelikož jistě používáte funkce delay (což je ta nejstupidnější věc co vymysleli) :D protože ta zasekne procesor a ten na nic nekouká krom toho že čeká. Dá se to obejít tak, že pokud by jste v té smyčce pro PWM rozsvěcení/svit/zhasínání alias pravděpodobně FOR smyčka tak, že by jste v ní měl IF (podmínku) která by zněla pokud bude tlačítko stisknuto tak:
a teď tma vložíte tento příkaz:
zapni_rele();

přičemž úplně dole pod loop i pod jejím ukončením (toto } ) tak napíšete

void zapni_rele() {

sem napíšete co má udělat

}
poté co se to dostane na konec této smyčky tak se to vrátí pod ten příkaz od kterého to vycházelo apokud si chcete udělat jakoby další loop tak to stačí napsat takto:

void zapni_rele() {

sem napíšete co má udělat

zapni_rele();
}

tím pádem bude stále cyklovat ;)
doufám že jsme Vám pomohl případně Vás rád přivítám na mém Webu www.roboti.4fan.cz
popřípadě i na skypu: busak007.psp

S pozdravem
Kutil Radek Buš
S pozdarem
Kutil Radek Buš

Martin Čechmánek

  • Host
Re:Arduino - programování
« Odpověď #2 kdy: Březen 03, 2013, 14:14:04 odpoledne »
Tak už sem si přečetl pár tvých příspěvků drahý Radku a řekl bych že si opravdový začátečník, že?

Funkce delay() je naprosto účelová záležitost, používá se např. pro jednoduché aplikace (blikání jedné LED) nebo pro takové operace, jako že zapíšeš data na LCD display, a mezi další výpis vložíš třeba delay(500) - tím si data uchováš na displeji nebo to použiješ jako zpoždění pro korektní dokončení operace - toť k delay()

Pro uživatele 7400 - nevím jestli jsem to dobře pochopil ale chceš asi udělat PWM pro více výstupů - můžeš to udělat takto:

Kód: [Vybrat]
// definice pinu - tohle si uprav jak potrebujes
#define PIN_RELE_1 5
#define PIN_RELE_2 6
#define PIN_BUTTON 3
#define PIN_LED 13

int pwm_rele1 = 0, pwm_rele2 = 255;
bool pocitani_nahoru_rele1 = true, pocitani_nahoru_rele2 = false;

void loop {
  // nahrada vyklovani misto FOR cyklu
  if (pocitani_nahoru_rele1)
    pwm_rele1++;
  else
    pwm_rele1--;

  if (pocitani_nahoru_rele2)
    pwm_rele2++;
  else
    pwm_rele2--;

  // zapsani PWM na vystupy
  analogWrite(PIN_RELE_1);
  analogWrite(PIN_RELE_2);

  // zajisteni cyklovani  a kontrola preteceni hodnot
  if (pwm_rele1 >= 255)
    pocitani_nahoru_rele1 = false;
  else if (pwm_rele1 <= 0)
    pocitani_nahoru_rele1 = true;

  if (pwm_rele2 >= 255)
    pocitani_nahoru_rele2 = false;
  else if (pwm_rele2 <= 0)
    pocitani_nahoru_rele2 = true;

  // pokud je zmacknuto tlacitko, sepne led, pokud ho pustime, zhasne
  digitalWrite(PIN_LED, digitalRead(PIN_BUTTON))
}
« Poslední změna: Říjen 05, 2016, 22:30:40 odpoledne od Yenda »

Martin Čechmánek

  • Host
Re:Arduino - programování
« Odpověď #3 kdy: Březen 03, 2013, 14:21:08 odpoledne »
Tak už sem si přečetl pár tvých příspěvků drahý Radku a řekl bych že si opravdový začátečník, že?

Funkce delay() je naprosto účelová záležitost, používá se např. pro jednoduché aplikace (blikání jedné LED) nebo pro takové operace, jako že zapíšeš data na LCD display, a mezi další výpis vložíš třeba delay(500) - tím si data uchováš na displeji nebo to použiješ jako zpoždění pro korektní dokončení operace - toť k delay()

Pro uživatele 7400 - nevím jestli jsem to dobře pochopil ale chceš asi udělat PWM pro více výstupů - můžeš to udělat takto:

// definice pinu - tohle si uprav jak potrebujes
#define PIN_RELE_1 5
#define PIN_RELE_2 6
#define PIN_BUTTON 3
#define PIN_LED 13

int pwm_rele1 = 0, pwm_rele2 = 255;
bool pocitani_nahoru_rele1 = true, pocitani_nahoru_rele2 = false;

void loop {
  // nahrada vyklovani misto FOR cyklu
  if (pocitani_nahoru_rele1)
    pwm_rele1++;
  else
    pwm_rele1--;

  if (pocitani_nahoru_rele2)
    pwm_rele2++;
  else
    pwm_rele2--;

  // zapsani PWM na vystupy
  analogWrite(PIN_RELE_1);
  analogWrite(PIN_RELE_2);

  // zajisteni cyklovani  a kontrola preteceni hodnot
  if (pwm_rele1 >= 255)
    pocitani_nahoru_rele1 = false;
  else if (pwm_rele1 <= 0)
    pocitani_nahoru_rele1 = true;

  if (pwm_rele2 >= 255)
    pocitani_nahoru_rele2 = false;
  else if (pwm_rele2 <= 0)
    pocitani_nahoru_rele2 = true;

  // pokud je zmacknuto tlacitko, sepne led, pokud ho pustime, zhasne
  digitalWrite(PIN_LED, digitalRead(PIN_BUTTON))
}


samozřejmě na konci programu dej delay(50) třeba, a pokud chceš aby ti ty LED jezdily každá jinou frekvencí, tak se podívej na příklady k funkci millis(), nebudu to tu zbytečně vypisovat

Offline Radek Buš

  • Bastlíř začátečník
  • *
  • Příspěvků: 47
  • Nic není nemožné :-)
    • Roboti.4fan.cz
Re:Arduino - programování
« Odpověď #4 kdy: Březen 03, 2013, 17:37:55 odpoledne »
Drahý pane Čechmánku. Vykáme že? :)
funkce delay sice účel má, ale jak píši zablokuje procesor a během onoho čekání ho nic na vstupech nezajímá. A to zde se v tomto vláknu řeší. Takže až se Vám povede mít například delay(60000); což znamená že se procesor sekne na minutu a během tohoto Vám přečte že jste stiskl tlačítko tak Vám dám za pravdu.

Nicméně nebudu se hádat s někým kdo si myslí že ví vše... nemá cenu a můj čas je na to příliš drahý.
« Poslední změna: Březen 03, 2013, 17:48:18 odpoledne od Radek Buš »
S pozdarem
Kutil Radek Buš

Offline Mensator

  • Bastlíř začátečník
  • *
  • Příspěvků: 3
Re:Arduino - programování
« Odpověď #5 kdy: Březen 03, 2013, 22:48:26 odpoledne »
zaprvé - nebudu TI vykat protože nejsi o nic starší, a za druhé to že opravím tvé chyby ze mě nedělá špatného člověka - chybovat je lidské ale všeho s mírou...

delay nezablokuje procesor, pokud o tom něco víš, tvoje "zablokování procesoru" znamená provádění "prázdných" instrukcí == "NOP" instrukce.

A pokud se ti to nelíbí s delay, zde je tedy naprosto korektní funkce s millis() (i když sem říkal že to papouškovat nebudu)

Kód: [Vybrat]
#define TIME_DELAY 500
long old_time = millis();

void loop() {
  if ((millis() - old_time)) >= TIME_DELAY) {
    DELEJ CO JE POTREBA => PWM ATD
  }
}
« Poslední změna: Říjen 05, 2016, 22:31:43 odpoledne od Yenda »

Offline Maty kutil

  • Bastlíř začátečník
  • *
  • Příspěvků: 2
Re:Arduino - programování
« Odpověď #6 kdy: Březen 03, 2013, 23:14:35 odpoledne »
zdravim Pane Mensator ale Radek ma pravdu pokud ma delay nastaven nejaky cas tak procesor ceka a nic jinyho ho nezajima proste ceka urcitou dobu, a Radek ma toho dost naprogramovano a celkem slozity veci, napr: ovladani pres bluetooth z mobilu (a jeste napsana vlastni aplikace do mobilu) umi napsat celkem slozity programy v kterych se sam nevyznam.  :) diky za pochopeni, ale kdyz to umis tak proc se ptas :)

Offline Mensator

  • Bastlíř začátečník
  • *
  • Příspěvků: 3
Re:Arduino - programování
« Odpověď #7 kdy: Březen 03, 2013, 23:37:03 odpoledne »
To že nemám své díla vystavené veřejně neznamená že nedělám velké věci i já

a za druhé - já se na něco ptal? :-) Navíc sem ti teď napsal kód který implementuje to, co považuje "pan" Radek za "celkem složité" - chtěl sem ukázat že je to triviální, kde je problém?

Offline Maty kutil

  • Bastlíř začátečník
  • *
  • Příspěvků: 2
Re:Arduino - programování
« Odpověď #8 kdy: Březen 04, 2013, 00:19:15 dopoledne »
No tak tohle forum neni od toho aby se tu lidi hadaly kdyz potrebuje poradit jeden clovek "7400" proste kazdej napiste to co mu radite on to odzkousi a uzna co je za vhodny a kdyztak se zepta jeste, tak proc se hadat ne sakra.

Offline Radek Buš

  • Bastlíř začátečník
  • *
  • Příspěvků: 47
  • Nic není nemožné :-)
    • Roboti.4fan.cz
Re:Arduino - programování
« Odpověď #9 kdy: Březen 04, 2013, 09:24:28 dopoledne »
Maty kutil Děkuji :)
Já nejsem vůbec proti tomu, žebych nedokázal přijmout svoji chybu to mi problém nedělá nicméně pokud mě zde někdo tvrdí takovou blbost tak se hádat musím.
a drahý pane ... myslíte si že tento triviální program neumím? jasně že ano :D
to bych si tu asi jinak jen blikal s ledkama... Ne.. nemá cenu s Váma se o čemkoliv bavit... pokud pan 7400 bude potřebovat pomoct ať si mě napíše na skypu a probereme detaily přičemž to jsme na forum rozumně zformulujeme tak aby taky nevznikaly bludy protože to co tu řeší onen pán tak vlastně ani 7400 nepotřebuje vědět...

PS.: vykání je slušností to Vás doma asi nenaučili ;) a pokud heldíte na čísla na fóru tak naklikat 50 si tam umím taky... nikdy nevíte kdo je na druhé straně
Proto vždy vykám. A až poté... ale to je od tématu...
« Poslední změna: Březen 04, 2013, 09:30:22 dopoledne od Radek Buš »
S pozdarem
Kutil Radek Buš

Offline Mensator

  • Bastlíř začátečník
  • *
  • Příspěvků: 3
Re:Arduino - programování
« Odpověď #10 kdy: Březen 04, 2013, 10:27:01 dopoledne »
Na žádné číslo nehledím, stačí video, a jinak se s nikým nehádám, nevím co furt máte - napsal sem řešení pro 7400, s jistými připomínkami k určité osobě, řešení sem objasnil lépe než vy a asi to nedokážete unést :-) Nevadí

Offline 7400

  • Bastlíř začátečník
  • *
  • Příspěvků: 2
Re:Arduino - programování
« Odpověď #11 kdy: Březen 21, 2013, 09:52:12 dopoledne »
Děkuji za radu....:) s funkcí millis už mi ty základní věci fungují....ale mám pořád problém s PWM s funkcí millis...konkrétně jde o to, že bych chtěl stisknutím tlačítka aby se led postupně rožla a po uplynutí určitého času zase postupně zhasla  (Druhou variantu pak bude, že led se postupně rožne a při druhém stisku postupně zhasne).....s funkcií delay mi to funguje krásně, ale s tím millis to nemůžu rozeběhnout......poradíte mi,prosím?  dejme tomu, že bude : LEDpin=13 , Tlacitkopin=30; popř. bych mohl poslat přímo program, který jsem se pokusil vytvořit......Děkuji Lukáš

Offline Radek Buš

  • Bastlíř začátečník
  • *
  • Příspěvků: 47
  • Nic není nemožné :-)
    • Roboti.4fan.cz
Re:Arduino - programování
« Odpověď #12 kdy: Březen 21, 2013, 13:36:18 odpoledne »
V tom případě myslím, že by vám velice pomohla má knihovna ;-)
poté stačí pouze dát smyčku ve které bdue čekat zda jste náhodou nestiskl opět tlačítko to by vypadalo takto:
Kód: [Vybrat]
for(int i = 0; i <= cas; i++) {
if(digitalRead(tlacitko) == HIGH) {
//udělej toto
}
delay(1);
}

sem se to dostane až tehdy kdy uběhne cas který si nastavíte :)
poté zde může být tedy zkrz knihovnu zjednodušeně udělané zhasnutí LED ;)

Knihovna zde: http://duinozone.cz/index.php/topic,55.msg162.html#msg162
Vše je tam vysvětleno :)
« Poslední změna: Říjen 05, 2016, 22:34:17 odpoledne od Yenda »
S pozdarem
Kutil Radek Buš

Offline kutilak

  • Bastlíř začátečník
  • *
  • Příspěvků: 25
Re:Arduino - programování
« Odpověď #13 kdy: Březen 28, 2013, 21:18:09 odpoledne »
Jsem taky začátečník ale trochu mě zaráží jedna věc .. LED na pinu 13 a PWM .. pin 13 není PWM !! ;) skus to dělat na výstupech tomu určených :)
S něčím vám poradím a něco si naopak nechám poradit :)

Offline Radek Buš

  • Bastlíř začátečník
  • *
  • Příspěvků: 47
  • Nic není nemožné :-)
    • Roboti.4fan.cz
Re:Arduino - programování
« Odpověď #14 kdy: Březen 28, 2013, 22:14:52 odpoledne »
Jsem taky začátečník ale trochu mě zaráží jedna věc .. LED na pinu 13 a PWM .. pin 13 není PWM !! ;) skus to dělat na výstupech tomu určených :)

Pan 7400 vlastní Arduino Mega a na něm je pin 13 PWM ;-)
S pozdarem
Kutil Radek Buš