Začatečník

Petr087

Začatečník

Příspěvek od Petr087 »

Dobrý den,

Jsem naprostý začátečník a chtěl bych poprosit o nějaké rady.
První problém mám s příkazem > motor.attach(10); když kliknu na ověřit tak mi to nahlásí že příkaz je špatně. Co je na tom špatně?
A druhá věc jak lze udělat jednotlivé bloky programu. například teď budeš tady hýbat servem. a když zmáčknu tlačítko budeš třeba svítít. Dělal jsem dříve s picaxe a tam byl příkaz >goto< je u arduina něco podobného?

Díky Petr
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Začatečník

Příspěvek od AlesH »

Ahoj. Programování Arduina má svoje pravidla, které je třeba poznat a řídit se jimi. Všechno potřebné najdeš (v angličtině) např. na https://www.arduino.cc/en/Guide/HomePage . V češtině můžeš začít např. na adrese http://arduino.cz/i-zaklady-1-naproste-minimum/ .

K tomu dotazu na "motor.attach(10);" se musím zeptat, jestli to je jediný řádek programu, nebo jen součást nějakého příkladu? Každopádně na rozumnou odpověď je ten dotaz moc stručný a nejasný. Upřesni ho. Dobré je také sledovat, co přesně se vypisuje za chybové hlášení. Obvykle to není jen že "příkaz je špatně", ale je tam napsáno i něco, čeho se dá chytit při řešení problému.

Pokud už jsi úspěšně programoval pro PICAXE, tak Arduino stojí na podobných principech (algoritmus, programové struktury, vstupy, výstupy) jen holt ten jazyk je trochu jiný. Je třeba si na to zvyknout a přizpůsobit se tomu. Doporučuji to zkoušet na co nejjednodušších příkladech. Dej vědět, jestli se Ti daří spustit na Arduinu alespoň něco.
hubacekp
Příspěvky: 259
Registrován: 24 úno 2013, 13:40

Re: Začatečník

Příspěvek od hubacekp »

Ahoj,
příkaz >goto< je u arduina řešen pomocí Switch Case
přehled příkazů a funkcí včetně příkladů je zde: https://www.arduino.cc/en/Reference/HomePage
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1519
Registrován: 16 úno 2013, 14:26

Re: Začatečník

Příspěvek od Dex »

Jinak obecně "goto" je poněkud obskurní záležitost. Rozhodně doporučuji se mu vyhnout. Možná bych doporučil podívat se i obecně na základy jazyka C.
"all your robots are belong to us"
robodoupe.cz
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Začatečník

Příspěvek od daton »

Prosím o radu setkal jsem se s touto konstrukcí v podmínce cyklu

((doba % 1000) !=0)

doba je veličina počítaného strojového času proscento je modulo ale nějak si to neumím přeložit prosím mohl by mi někdo říci o co vlastně v podmínce jde? Díky
Uživatelský avatar
gilhad
Příspěvky: 262
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Re: Začatečník

Příspěvek od gilhad »

dobu modulo podelime tisicem - dostaneme tedy cislo mezi 0 a 999.
Pokud je to cislo ruzne od nuly (!= 0 ) tak se cosi provede.

Cili se to provede v 999 pripadech z 1.000 a v 1 pripade nikoli.

Pokud je doba skutecne nejaka doba, tak to ma sanci se nestat jednou za 1.000 (sekund/minut/roku/tiku procesoru, ci co ta doba vlastne meri) pokud se ta podminka bude v tu chvili zrovna vyhodnocovat.

S trochou fantasie to muze predstavovat treba "nahodnou obcasnou nefunkci" cehosi pro testovani, jak se s tim neco vyporada. Nebo sanci pro nejaky algoritmus se vymanit ze smycky, pokud se zacykli a osciluje na miste tim, ze ho obcas nechame trochu ujet z kritickeho mista.

Nebo to taky muze byt cokoli jineho (reset casovace po jiste dobe ...) to uz zalezi na kodu okolo
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Začatečník

Příspěvek od daton »

Moc děkuji ale stále nerozumím tomu modulo. Doba je číslo tedy výsledek odečtení současného stavu počítadla hodin mínus zapamatovaného stavu. Tedy jedno číslo ale modulo je zbytek po dělení ale čím se má podělit ta doba aby vzniklo modulo?

Kód: Vybrat vše

 pocatek = millis();
  digitalWrite(A1, HIGH);
  do {
    napeti = analogRead(0);
    if (napeti > 1002) digitalWrite(A1, LOW);   
    do {                                       
      doba = millis() - pocatek;
      if (napeti < 998) digitalWrite(A1, HIGH); 
    } while ((doba % 1000) != 0);
    long pom;   
Pirx
Příspěvky: 181
Registrován: 24 úno 2013, 16:29
Kontaktovat uživatele:

Re: Začatečník

Příspěvek od Pirx »

daton píše: ((doba % 1000) !=0)
Modulo je v tomto kontextu zbytek po celočíselném dělení.
Výsledek této operace tedy bude nula pro doba = 0, 1000, 2000, 3000...

Používá se to s výhodou jako jednoduchý dělič nějakého trvale rostoucího čítače, např. každých 1000 ms provedu něco.
Na stejný čítač můžu takto "pověsit" libovolné množství takových děličů a tím od jednoho periodické děje (např. 10ms přerušení) odvodit další akce.

Zde je ale podmínka obráceně, tedy výraz NEplatí pro všechny celočíselné násobky...
V vedeném příkladu

Kód: Vybrat vše

do {                                       
      doba = millis() - pocatek;
      if (napeti < 998) digitalWrite(A1, HIGH);
    } while ((doba % 1000) != 0);
se sypou data na digitalni vystup pokud je napeti mensi nez 998 a cele je to omezeno na hodnotu 1000 milisekund.
Pocatek je inicializovan na aktualni hodnotu casu, takze doba bude narustat od nuly a cela akce skonci, az bude doba = 1000 a modulo vyjde nula.
Soldering fumes make you stronger!
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Začatečník

Příspěvek od daton »

Aha moc dík ted už je to jasné.
Vladimir66
Příspěvky: 385
Registrován: 02 dub 2014, 15:30

Re: Začatečník

Příspěvek od Vladimir66 »

to smart programmers -
Ahoj, koukam na ten kod a mam nekolik zacatecnickych otazek.
- promena NAPETI se ve smycce neaktualizuje, takze se preklopi A1 podle stavu a pak uz se jen ceka, na presnou 1sekundu ??
- v tom delsim kodu je 2x Do a 1x While ??
zajimalo by me okomentovani toho kodu. Na takovych prikladech se da leccos naucit a pochopit
muj nazor k ((doba % 1000) !=0) je ten, ze lze jednoduchou syntaxi testovat 1sekundu. jen je treba si dat pozor na to, aby treba v nekterem preruseni neprobehla-neutekla na pozadi DOBA pres nami testovanou mez. to by mohlo zpusobovat obcasne divne chovani programu.
-V66
Odpovědět