Arduino a funkcia pulseIn()
Funkciu Arduino pulseIn() môže byť spočiatku dosť ťažké pochopiť. Táto funkcia však môže byť veľmi užitočná pri čítaní údajov z určitých senzorov. V tomto návode vysvetlím, čo je to pulz, ako funguje funkcia pulseIn().
Čo je to pulz?
Digitálny signál môže mať iba 2 stavy: VYSOKÝ alebo NÍZKY. HIGH znamená, že napätie je blízko zdroja napájania, napríklad 5V na Arduino Uno, alebo 3,3V na Arduino Due. LOW znamená, že signál je blízko 0V.
Takže impulz môže mať 2 reprezentácie:
- Buď signál, ktorý prechádza z LOW do HIGH a potom z HIGH do LOW (pozri obrázok nižšie). V tomto prípade je impulz signál HIGH a budem ho nazývať impulzom s režimom HIGH.

- Alebo signál, ktorý prechádza z HIGH na LOW a potom z LOW na HIGH (pozri obrázok nižšie). V tomto prípade je impulz signál LOW a budem ho nazývať impulzom v režime LOW.

Pulz je teda v podstate zmena signálu na (zvyčajne) krátke časové obdobie.
A teraz, keď ste pochopili, čo je pulz, čo by ste mohli chcieť robiť, keď máte pulz? Jednou z možností je zmerať trvanie tohto impulzu. Pulz môže byť úmerný hodnote, ktorú chcete odčítať. Napríklad pri použití ultrazvukového senzora s Arduino, ultrazvukový senzor vráti vzdialenosť od najbližšej prekážky. Táto vzdialenosť bude v skutočnosti reprezentovaná impulzom s dĺžkou úmernou vzdialenosti. Potom musíte tento impulz prečítať a zmerať jeho trvanie, aby ste mohli vypočítať vzdialenosť.
Vysvetlenie funkcie Arduino pulseIn().
Pokračujme v našom príklade pulzu, aby sme pochopili funkciu Arduino pulseIn(). A potom napíšeme kód Arduino. Tu je ilustrácia na lepšie pochopenie nasledujúcich vysvetlení
pulsen() v režime HIGH:

Takže funkcia pulseIn() jednoducho vráti trvanie impulzu. Tu je to, čo sa deje s pulseIn() – v režime HIGH (ako na obrázku vyššie):
- Vo svojom kóde zavoláte pulseIn() v režime HIGH. Pritom musí byť napätie NÍZKE.
- pulseIn() počká, kým sa signál zmení z LOW na HIGH, s časovým limitom.
- Keď sa signál zmení z LOW na HIGH, pulseIn() začne merať trvanie impulzu.
- Keď sa signál vráti z HIGH na LOW, pulseIn() vypočíta trvanie impulzu a vráti ho, aby ste ho mohli použiť vo svojom kóde.
pulsen() v režime LOW:
- PulseIn() voláte s režimom LOW. V tomto čase musí byť napätie VYSOKÉ.
- pulseIn() zablokuje program a počká, kým sa signál zmení z HIGH na LOW s časovým limitom.
- Začne merať trvanie impulzu, keď sa signál zmení z HIGH na LOW.
- A keď sa signál vráti na HIGH, pulseIn() vráti trvanie impulzu.
V oboch scenároch, ak k impulzu nedošlo po zadanom časovom limite, pulseIn() jednoducho vráti 0.
Obvod, ktorý použijeme na testovanie pulseIn()
Aby sme urobili veľmi jednoduchý test, vytvoríme obvod Arduino s tlačidlom.

Tlačidlo nám pomôže vytvoriť pulz. So (pull down) odporom bude signál štandardne NÍZKY. Keď stlačíte tlačidlo, signál sa zmení z LOW na HIGH a keď tlačidlo uvoľníte, signál sa zmení z HIGH na LOW. Toto je pulz. Čím dlhšie tlačidlo stlačíme, tým dlhší bude pulz. A tento impulz bude v režime HIGH.
Poznámka: ak chcete impulz v režime LOW, budete musieť nastaviť odpor, aby fungoval ako pull up rezistor – pripojený k 5V a nie GND, a tiež zmeniť vodič pripojený k digitálnemu kolíku 4 na druhú stranu tlačidla . Týmto spôsobom bude signál predvolene VYSOKÝ a po stlačení tlačidla NÍZKY. Pre túto možnosť môžete namiesto použitia externého pull up odporu použiť aj režim INPUT_PULLUP.
V nasledujúcom prípade zachováme konfiguráciu so (pull down) odporom a použijeme pulseIn() s režimom HIGH.
Arduino pulseIn()
#define BUTTON_PIN 4
void setup()
{
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT);
}
void loop()
{
unsigned long duration = pulseIn(BUTTON_PIN, HIGH);
Serial.println(duration);
}
Tu je to, čo robíme v kóde:
Nastavenie
#define BUTTON_PIN 4
void setup()
{
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT);
}
Nie je tu nič zvláštne, len sme vo funkcii setup() nastavili digitálny pin pre tlačidlo na INPUT. Toto je povinný krok:
ak chcete použiť pulseIn(), musíte nastaviť režim pin ako INPUT. Tiež inicializujeme sériovú komunikáciu, aby sme mohli neskôr zobraziť trvanie impulzu.
Zmerať a vytlačiť pulz
void loop()
{
unsigned long duration = pulseIn(BUTTON_PIN, HIGH);
Serial.println(duration);
}
Náš test je jednoduchý:
vo funkcii loop() zavoláme pulseIn(), ktorý sa bude vykonávať znova a znova, kým nevypneme dosku Arduino. Pri použití pulseIn() musíte zadať aspoň 2 argumenty:
najprv pin, na ktorom chcete pracovať, a potom režim pulzu – buď HIGH alebo LOW. Tu, pretože chceme merať trvanie, keď je pulz HIGH (s predvoleným stavom LOW), používame režim HIGH. pulseIn() vráti trvanie impulzu v mikrosekundách a typ údajov je (unsigned long). Potom zobrazíme trvanie na sériovom monitore.
Spustite kód
Ak spustíte tento kód na svojom Arduine pomocou obvodu tlačidla, najskôr uvidíte každú sekundu vytlačenú 0. Je to preto, že funkcia Arduino pulseIn() má predvolený časový limit 1 sekundu. Po zavolaní bude pulseIn() čakať, kým signál prejde z LOW na HIGH. Ak sa tak nestane po uplynutí 1 sekundy (pulz sa v podstate nespustil), pulseIn() jednoducho vráti 0, takže neblokuje program príliš dlho pre nič za nič.
Ak stlačíte tlačidlo, časový limit už nehrá žiadnu rolu. Ak teda tlačidlo stlačíte + uvoľníte, hneď po uvoľnení uvidíte číslo, ktoré zodpovedá trvaniu impulzu v mikrosekundách. Táto hodnota vám pri tomto obvode tlačidla povie, ako dlho ste tlačidlo stlačili. Pre iné senzory môže hodnota znamenať niečo iné a budete musieť vykonať nejaké výpočty vo svojom kóde.
Zmeňte časový limit pulseIn().
Ak chcete nastaviť vlastný časový limit pre pulseIn(), môžete tak urobiť pridaním tretieho (voliteľného) argumentu do funkcie. Napríklad:
unsigned long duration = pulseIn(BUTTON_PIN, HIGH, 5000000);
Prvé 2 argumenty sú stále pin a režim pre pulz. Tretím argumentom je časový limit v mikrosekundách. Tu som použil 5 000 000, čo zodpovedá 5 sekundám. Znamená to, že pri volaní pulseIn() počká maximálne 5 sekúnd na spustenie impulzu. Ak sa impulz nezačne po 5 sekundách, funkcia pulseIn() vráti 0.
Osvedčené postupy pri používaní funkcie Arduino pulseIn().
V tomto článku ste sa dozvedeli, čo je to pulz, ako funguje funkcia pulseIn() a ako ju použiť vo svojom kóde. Ako ste videli, funkcia úplne blokuje program. Ak je váš pulz dlhý 10 sekúnd, funkcia pulseIn() udrží váš program zablokovaný na 10 sekúnd. A ak nie je detekovaný žiadny impulz, zablokuje program na dobu trvania časového limitu – štandardne jednu sekundu. Takže osvedčeným postupom je použiť pulseIn() len vtedy, keď ho budete potrebovať.
Napríklad pri použití ultrazvukového snímača musíte najskôr spustiť snímač a potom čakať na odozvu. V tomto prípade použijete pulseIn() hneď po spustení senzora a nie vždy, keď vstúpite do void loop(). Tiež nepoužívajte príliš veľký časový limit, ak to nepotrebujete. V niektorých situáciách môže byť lákavé výrazne predĺžiť časový limit, aby ste nezmeškali pulz, ale tým odložíte všetko ostatné vo svojom programe.
A nakoniec – skôr ako vylepšenie – by ste mohli replikovať správanie pulseIn() len pomocou prerušení na kolíku. Je to trochu zložitejšie, ale môže to stáť za to. Na kolík by ste museli pripojiť prerušenie a ponechať čas, kedy začne pulz (signál sa napríklad zmení z LOW na HIGH). Potom by ste tiež ušetrili čas, keď pulz skončil, a vypočítali rozdiel medzi 2 časmi. Tento rozdiel vám poskytne trvanie impulzu a celý proces nebude blokovať nič vo vašom programe. To môže byť užitočné, keď máte veľmi dlhé pulzy, alebo ak potrebujete často volať pulseIn().
Pridaj komentár