HOME

Arduino Serial Control

(předběžná, ale stále vylepšovaná verze stránky)



UPDATE: v současné době je program již výrazně upraven (verze 3.3). Přibyly nové příkazy a většina stávajících byla přejmenována. Příkaz EXIT po sobě před ukončením relace "uklidí", čili nastaví všechny výstupy a serva do výchozích stavů a pozic. Serva jsou přestavována postupně po jednom. O serva šlo především, aby s sebou po resetu a obnovení spojení neškubla (notabene všechna najednou). Stejný "úklid" provede i nový příkaz RESET, ale ten neukončí relaci a program normálně pokračuje.

Na piny se již neodkazuje jejich interními čísly (pořadím ve skupině), ale jejich nativními čísly. U "analogových" pinů jsou přípustná jak absolutní čísla, tak čísla s A-prefixem, např. A0=14, A7=21, apod.

Hodnotu pro PWM výstup lze zadávat jak absolutně (0-255), tak v procentech 0-100%

Níže uvedené informace jsou aktuální. Pokud se vám zobrazují staré obrázky, smažte si uložená data browseru. Na dalších úpravách se pracuje. Zvažuji možnost zvolit si, zda nahrát defaultní rozložení pinů do skupin ze zdrojáku, nebo si nadefinovat piny do jednotlivých skupin přímo z terminálu. Záleží na tom, zda nadšení vydrží:-)



Arduino Serial Control (v3.3) je program, který prostřednictvím sériového terminálu umožní ovládat a číst předem nadefinované piny Arduina. Program je primárně určen pro Arduino NANO V3 a kompatibilní typy s MCU Atmega328 (UNO R3, Pro MINI 328).


Arduino Serial Control
Arduino Serial Control - úvod


Program při použití Arduina NANO umožňuje:

  • Ovládat až 18 digitálních výstupů. Jednotlivě, nebo všechny najednou.
  • Ovládat až 6 analogových (PWM) výstupů.
  • Ovládat až 8 standardních modelářských serv.
  • Číst až 18 digitálních vstupů, z nichž každý může být nadefinován jako prostý INPUT, nebo INPUT_PULLUP.
  • Číst až 8 analogových vstupů.

Jednotlivé počty vstupů a výstupů jsou však spíše teoretické, protože celkový počet využitelných pinů může u Arduina s ATMEGOU328 být max. 20! Zvláště pozor na použití pinů A6 a A7, které jsou snadno přístupné jen u Arduina NANO!

Definování pinů je velmi snadné, čísla pinů se zadávají do příslušných polí konstant na začátku zdrojáku:


// Defaultni rozvrzeni pinu do skupin:
const byte digout[] = {8, 9, 12, 13};       //digitalni vystupy
const byte digin[]  = {A0,  A1,  A2,  A3};  //digitalni vstupy
const byte intype[] = {INP, INP, INP, INP}; //typ dig. vstupu, P=pullup
const byte anin[]   = {A4, A5, A6, A7};     //analogove vstupy
const byte anout[]  = {5, 6, 3, 11};        //PWM vystupy (9 a 10 nepouzivat!)
const byte srvout[] = {2, 4, 7, 10};        //Servo vystupy
// {} pokud nejakou skupinu pinu nechceme

Pro každý digitální vstup lze v poli intype[ ] nastavit, zdali bude typu INPUT (IN), nebo INPUT_PULLUP (INP)

V podstatě vše je generováno dynamicky na základě konfiguračních konstant na začátku zdrojáku. Lze tak snadno přidávat i nové příkazy. Jediné, co je prozatím pevné, je max. počet parametrů v příkaze, který je omezen na 2. A také počet cifer v parametru (4). Více nebylo potřeba.

Program automaticky ověřuje:

  • zdali definovaný pin nepatří mezi zakázané (0 a 1 - jsou použité na sériovou komunikaci, A6 a A7 jsou pouze analogové vstupy)
  • zdali definovaný pin může být v dané skupině (týká se analogových A0-A7 a PWM pinů 5,6, 3, 11). Pozor! Jako PWM by sice mohly být nadefinovány i piny 9 a 10, ale tlučou se s knihovnou pro serva, proto nepatří mezi povolené PWM piny! Ještě, že mám svůj Arduino Tahák. Trochu mě potrápilo, když nefungovaly výstupy 9 a 10 jako PWM...
  • zdali není překročen maximální možný počet pinů
  • zdali není nějaký pin použit vícekrát

Stavy a definice všech vstupů/výstupů jsou vypsány vždy po ustanovení spojení s terminálem a lze je také kdykoliv zobrazit příkazem INFO. V hranatých závorkách za čísly pinů je vždy jejich aktuální hodnota. Malé "p" u čísla pinu digitálního vstupu značí, že vstup je nakonfigurován jako INPUT_PULLUP. Pokud tam to "p" není, jedná se o prostý INPUT:


Arduino Serial Control
Arduino Serial Control - INFO


Seznam použitelných příkazů lze kdykoliv vypsat příkazem HELP:


Arduino Serial Control
Arduino Serial Control - HELP (strana 1)


Arduino Serial Control
Arduino Serial Control - HELP (strana 2)


Příkazem EXIT Arduino ukončí relaci a zastaví (zacyklí) se. Před ukončením relace ale příkaz po sobě ještě "uklidí". Čili nastaví všechny výstupy a serva do výchozích stavů a pozic. Serva jsou přestavována postupně po jednom. O serva šlo především, aby s sebou po resetu a obnovení spojení neškubla (notabene všechna najednou).


Arduino Serial Control
Arduino Serial Control - EXIT


Stejný "uklid" provede i příkaz RESET. Stejně jako u EXITu nastaví všechny výstupy a serva (po jednom) do výchozích stavů a pozic. Po dokončení ale není relace ukončena a program normálně pokračuje a čeká na další příkazy:


Arduino Serial Control
Arduino Serial Control - RESET


Některé příkazy nevyžadují žádný parametr, jiné jeden (obvykle číslo pinu) a některé i druhý (PWM duty, poloha serva). Počty parametrů viz. HELP nebo INFO. Parametry se při zadávání oddělují mezerou a mohou mít až 4 cifry, ačkoliv v současné verzi program vyžaduje max. 3-ciferný parametr.

Na piny se odkazujeme jejich nativními čísly. U "analogových" pinů jsou přípustná jak absolutní čísla, tak čísla s A-prefixem, např. A0=14, A7=21, apod.

Hodnotu pro PWM výstup lze zadávat jak absolutně (0-255), tak v procentech 0-100%. Hodnotu pro servo je nutné zadávat vždy absolutně (0-180).

Příkazy je nutné psát velkými písmeny, ale program automaticky převádí vstupní malá písmena na velká. Ćili uživatel to nemusí řešit. K editaci příkazového řádku lze používat pouze klávesy BackSpace, ESC a ENTER, viz. odstavec o terminálových programech níže.

Příklad práce s programem:


Arduino Serial Control
Arduino Serial Control - práce s programem


Arduino Serial Control
Arduino Serial Control - práce s programem


Arduino Serial Control
Arduino Serial Control - práce s programem


Program pochopitelně ověřuje vkládané příkazy a jejich parametry a případné chyby ihned hlásí:.


Arduino Serial Control
Arduino Serial Control - chybové hlášky


Jaký terminálový program?

Progam se ovládá pomocí klasického sériového terminálu standardu VT100 jednoduchými textovými příkazy. Já používám Hyperterminál, který byl standardní součástí Win XP, ale dá se doinstalovat i do vyšších Windows. Další možností je například RealTerm, či jiné. Pozor! Sériový monitor v Arduino IDE sice není úplně standardní sériový terminál, ale použít se dá. Jen se vpravo dole musí nastavit automatické ukončování odeslaného příkazu znakem CR (Carriage Return), viz následující screenshot:


Arduino Serial Control
Nastavení Serial Monitoru v Arduino IDE


Defaultní nastavení terminálu je 1900Bd, 8N1, bez řízení toku. Nutný je samozřejmě ovladač, který USB portu s připojeným Arduinem přidělí číslo COM portu, jež se zadá do konfigurace terminálového programu:


Arduino Serial Control
Nastavení Hyperterminálu


Pozor, má-li váš oblíbený terminálový program vlastní echo, je nutné toto vypnout, jinak budete mít napsané znaky na obrazovce 2x!

Při zadávání a ediaci příkazu na klasickém terminálu je možné používat pouze tyto řídící klávesy:

ENTER - odešle příkaz do Arduina
ESC - zruší zadávání a vypíše nový prompt ?:
BackSPACE - smaže poslední znak a posune kurzor vlevo. Prostě "bekspejs", no :-)

Při použití Arduino IDE Serial Monitoru jsou možnosti editace příkazového řádku pochopitelně vělší.


Co s tím?

Otázkou je, k čemu je to dobré. Určitě jako demonstrátor. Také si to dovedu představit při prvním oživování a kontrole obvodů konstrukcí (vč. robotů) založených na Arduinu.

Příklady použití pinů:

Digitálními výstupy lze ovládat LED, žárovky, relé, DC motory (ve spolupráci s PWM výstupy lze řídit i jejich rychlost), bzučáky, apod.

PWM výstupy lze ovládat rychlost otáčení DC motorů, repráčky, apod. Působivá by zde mohla být RGB LED.

Servovýstupy lze překvapivě ovládat klasická modelářská serva :-)

Digitálními vstupy lze číst vstupy nezávisle nakonfigurované jako INPUT, nebo INPUT_PULLUP. Třeba jen obyč. tlačítka, či čidla s dig. výstupem.

Analogovými vstupy lze například číst hodnotu potenciometru, či jiných čidel s analogovým výstupem.

Takže když mladému zájemci uděláte prkénko a na něj dáte pár LEDek, relátek, tlačítek, potenciometr, DC motor ideálně s nějakým PWM driverem (L298), repráček a servo, má o zábavu postaráno a dost se toho naučí. Sice se to neovládá žádnou klikací aplikací, ale i ta by se dala doprogramovat (nemám v úmyslu).

Není snad nutné připomínat, že pro "akční členy" typu relé, motor, servo, žárovka apod. je nutné použít příslušně dimenzovaný externí napájecí zdroj a nesnažit se je napájet z USB! Ačkoliv jedno mikroservo úesbéčko utáhne:-) Z externího zdroje je pochopitelně možné napájet i to Arduino.


Co dál?

Myslím, že už další funkcionalitu přidávat nebudu. Ale mám pár nápadů na další vylepšení. Na začátku by mohl program dát uživateli na výběr, zdali nahrát defaultní konfiguraci pinů ze zdrojáku, nebo piny nadefinovat do skupin přímo z terminálu. Užitečná by určitě byla nějaká "klikací" ovládací aplikace pro PC, ale to už není o programování Arduina ale písíčka v nějakém vyšším jazyce. Další užitečnou věcí by mohl být jakýsi programový režim. Třeba něco ve stylu jednoduchého Basicu s číslovanými řádky. Přidalo by se pár základních klíčových slov a mohlo by to pak vypadat třeba nějak takto:

10 IF (DIN A0) THEN (DSET 8) ELSE (DRES 8)
20 LET A = AIN A7
30 IF (A > 180) THEN (A = 180)
40 SRV 10 A
50 GOTO 10

Ale to už je asi hodně velká utopie a bylo by lepší případného zájemce naučit to Arduino programovat přímo:-)


Zdroják uvolním po důkladném otestování.




Nostalcompův Arduino tahák

Při psaní jsem opět narazil na další "poťouchlosti" Arduina, které jsem připsal do svého Arduino taháku:


Nostalcompův Arduino tahák


Šlo zejména o to, že statické texty určené pro výpis na terminál příkazy Serial.print(ln) se defaultně neukládají do programové ROM, jak by člověk čekal, ale do datové RAM! A tak se stalo, že mi zkrátka při psaní HELPu došla paměť :-) A totéž platí i pro lcd.print pro standardní knihovnu pro LCD. Z toho, že statické texty (ale také konstanty - const) se defaultně ukládají do datové RAM jsem byl, jakožto milovník klasického MCU 8051 s jeho 128 bajty(!) RAM, opravdu v šoku! Naštěstí se to vše dá přesměrovat do ROM, ale je to práce navíc...

Tahák je nutné považovat za doplněk k referenční příručce Arduina. Jsou zde uvedeny zvláštnosti a podivnosti (slovem DavidaO "poťouchlosti"), na které jsem při tvorbě svých Arduino projektů narazil. Já vím, že už by to chtělo ty chaoticky přidávané informace v taháku nějak tematicky utřídit, ale na to není čas a vůle. Dokud se v tom sám vyznám, není co řešit:-)




Arduino terminal ECHO

Jako "odpadní" produkt jsem si napsal též vlastní Terminal ECHO, které je při tvorbě terminálových aplikací nutností. Pozor, má-li váš oblíbený terminálový program vlastní echo, je nutné toto vypnout, jinak budete mít napsané znaky na obrazovce 2x!

Hotových Arduino terminal ECHO na "3 řádky" jsou na netu tuny, ale já si to prostě potřeboval spatlat sám:-) Ten můj vypisuje ASCII kódy přijatých znaků ve všech klíčových číselných soustavách (HEX, DEC, BIN) a zarovnává čísla vpravo. Více viz. screenshoty níže:


Arduino Terminal Echo
Arduino Terminal Echo na Hyperterminálu


Arduino Terminal Echo
Arduino Terminal Echo na Hyperterminálu


Arduino Terminal Echo
Arduino Terminal Echo na Serial Monitoru v Arduino IDE


Arduino Terminal ECHO


Publikováno: 11/2025    



« RET          ↑ TOP ↑          HOME