Programování | Pojďme programovat elektroniku

Pojďme programovat elektroniku: Splašená tříkolka. Až příliš splašená!

  • Dnes si vyzkoušíme další shield pro Arduino Uno
  • Tento bude vybavený dvoukanálovým ovladačem motorů
  • Zkusíme postavit maličkou tříkolku

Minulý víkend jsme si vyzkoušeli powerbanku pro Arduino Uno ve formě rozšiřujícího shieldu s dvojicí lithiových článků a také základní desku Uno se sekundárním čipem ESP8266 pro připojení do sítě Wi-Fi.

Ačkoliv jsem měl v plánu nad Arduino Uno s Wi-Fi postavit ještě několik experimentů, osud (rozumějte moje zbrklost) tomu chtěl jinak a já krátce po vydání článku desku zkratoval modelářskou baterií Li-pol.

2915e6f9-36f6-4fd9-83d9-d72fe9100dfd
Zkrat lithiové baterie (ilustrační fotografie)

Inu, to máte tak, když se vám povrchu desky dotknou dva vodiče tak neopatrně, že spojí obvod a přes nebohý čip ATmega328P náhle proteče obrovský proud. Ačkoliv zkrat trval jen pár set milisekund, silný záblesk a oblak dýmu jak při likvidaci ilegální skládky, mi daly jasně najevo, že jakýkoliv pokus o resuscitaci bude marný.

H-můstek L298

V dnešním pokračovaní našeho seriálu o programování elektroniky tedy další rozšiřující desku v řadě už bohužel připojíme zase jen na klasické Arduino Uno bez vlastního rádiového vysílače. A bude to opravdu škoda, na řadě je totiž shield s duálním H-můstkem L298HN od švýcarského ST.

61b94b21-b04d-48f6-ba00-227b1ef4feda714c983a-e8ee-4bb3-bb62-1bfd215d87b5ef06f511-9fdf-4642-a8fc-26a504278f84
Motorový shiled pro Arduino Uno

Stručně řečeno, na základní desku Uno zacvakneme ovladač, který dnes na náš povel roztočí dva 12V stejnosměrné motorky, postavíme si totiž miniaturní robotickou tříkolku. Jelikož se tentokrát obejdeme bez komunikace, robůtek si bude muset vystačit sám a bude jako Bludný Holanďan jezdit sem a tam po redakci.

04e73fae-2ddd-4689-aacf-ab80c7e4adf9
Detail čipu dvoukanálového H-můstku L298HN

Když narazí na překážku, pootočí se a bude pokračovat dál. V detekci překážek autíčku pomůže nám už dobře známý ultrazvukový dálkoměr HC-SR04, se kterým jsme pracovali i minule.

Motorový shield pro Arduino Uno za stovku

Čip motorového ovladače L298 zvládne oběma směry roztáčet dva motory s napětím až 46 V a při celkovém odběru proudu do 4 A. H-můstek obsahuje i některé další pomocné obvody, třeba pojistku proti přehřátí, přičemž v pasivním odvodu tepla pomůže konstrukce s rozměrným kovovým plátem.

326b9b91-917f-40f1-8c4c-b021b6057dc548ec21f1-4986-4ce7-8cca-7427c48583d3
Motorový shield po zacvaknutí na základní desičku Arduino Uno. Bez dalších součástek máme rázem palubní počítač pro ovládání dvou stejnosměrných motorů.

Já dnes použiji desku, kterou na Aliexpressu pořídíte za cenu okolo 4 dolarů (90-100 korun), přičemž můžete narazit i na její téměř identickou kopii, která namísto čipu L298HN používá variantu L298P. Z hlediska naší aplikace se oba čipy liší prakticky jen odlišnou konstrukcí.

77c8ae8a-477d-44e9-baf7-376c296aaa65
Drobným kazem na kráse jsou příliš vystupující úchyty na spodní straně shieldu, které znemožňují plné zacvaknutí do Arduino Uno

Shield zabere osm drahocenných pinů GPIO

Motorový shield zabere na desce Arduino Uno dohromady 8 pinů GPIO. To je poměrně hodně, ale na druhou stranu oproti mnoha jiným H-můstkům získáme i údaje o odběru proudu každého z motorů. K tomu shield použije piny A0 a A1 připojené na A/D převodník řídícího čipu ATmega328P.

cbc733db-ecb2-4aeb-834f-93f60dcf30ef
A/D převodník převede spojité napětí na vstupním pinu na diskrétní digitální číslo. Čím vyšší rozlišení převodník má, tím věrnější je i převod.

Když bude motor odebírat nejvyšší proud 2 A, na jeho analogovém pinu se nastaví napětí 3,3 V (1 A = 1,65 V na pinu A0/A1). Arduino Uno má 10bitový A/D převodník, který vyjadřuje napětí na analogovém pinu v rozsahu 0 V až 5 V celým číslem v rozmezí 0 až 1 023.

Napětí na některém z analogových pinů tedy můžeme zpětně přepočítat pomocí primitivního výpočtu:

float napeti = analogRead(A0) * (5.0 / 1023.0);

Tímto způsobem můžeme průběžně vypočítat spotřebu motorů třeba pro telemetrické účely.

Jak pomocí shieldu roztočit motory

Tak, spotřebu motorů už známe, ale jak je vlastně ovládat? Častým nešvarem rozšiřujících shieldů je absence dodatečných popisků u pinů – tedy které GPIO deska používá a my je tedy zároveň nemůžeme použít pro nějakou další funkci.

582287f3-8a3d-4fcf-8458-4f35cb3cd8ae
Piny GPIO, které shield potřebuje pro svoji funkci, jsou správně označené (až na A0/A1)

V tomto případě na to autoři naštěstí mysleli, takže letmým pohledem zjistíte, že vedle dvou analogových pinů uzmul motorový shield ještě šest digitálních (jen pro pořádek, i ty analogové jsou samozřejmě digitální, jen jsou zároveň připojené k ADC).

Duální H-můstek může ovládat dva motory, tedy dva kanály A a B. Každý z těchto kanálu lze nakonfigurovat pomocí tří pinů pro nastavení směru otáček, výkonu skrze PWM a brzdy:

Funkce Kanál A Kanál B
Směr D12 D13
PWM/výkon D3 D11
Brzda D9 D8
Odečet proudu A0 A1

Pomocí nastavení logické 0/1 na směrovém pinu roztočíme konkrétní motor doleva, nebo naopak doprava. Na pinu PWM můžeme nastavit výkon motoru a to pomocí pulzně-šířkové modulace a funkce analogWrite v rozmezí 0 až 255. Takže zavoláním analogWrite(D3, 255) nastavíme výkon na kanálu A (1. motor) na maximum. Když toto číslo budete postupně snižovat, sami uvidíte, kdy se motor pod určitou zátěží zastaví, případně začne pískat, což lze vyřešit změnou frekvence signálu PWM.

Pulzně-šířkové modulaci jsme se v našem seriálu věnovali mnohokrát, takže jen zrekapituluji, že se fakticky jedná o pulzující proud logických 0 a 1. Na pinu se tedy v případě pětivoltového Arduina periodicky nastavuje napětí 0 V a 5 V, přičemž délka pulzů se může vzájemně měnit.

70f8f9c0-a719-4700-a264-0458bbbcdfe2
Základní princip funkce analogWrite a signálu PWM na 5V Arduino Uno

Když bude 5V pulz příliš krátký, připojený motor dostane za jednotku času jen maličkou dávku energie a bude mít nízký výkon, nebo se zcela přestane otáčet. Když bude naopak 5V pulz dlouhý, motor dostane více energie a vykoná více práce.

Nakonec má každý z motorů ještě digitální brzdu. Když na tomto pinu nastavíme logickou 0, motor se okamžitě zastaví.

Pokud potřebujete další piny, brzdu a sledování proudu můžete odpojit

Zatímco směrové a PWM piny jsou pro běh motorů nutností, sledování odběru proudu na pinech A0/A1 a brzdy můžete dodatečně vypnout a to spojením, nebo naopak rozpojením kontaktů na zadní straně desky. Motor v takovém případě nastavíme jednoduše nastavením logické nuly na pinu pro PWM.

4bfd8ddd-7e42-4b73-b2bf-16717d0918327d3f0ef4-2872-4085-954a-e4b0d178a730
Spojením/rozpojením kontaktů na zadní straně desky můžete vypnout funkci měření proudu na pinech A0/A1, digitální brzdu a rozpojit napájení motorů ze zdroje Arduino Uno (VIN). Piny pak budete moci použít pro vlastní účely.

Jak vlastně motory napájet? Máte tři možnosti

Tak, ovládat motory už umíme, ale jak to vlastně celé napájet? Pokud k shieldu připojíme slabé motory, které budou odebírat nejvýše pár set mA při 5 V, může si shield brát energii přímo z USB (5 V). Na stranu druhou, v zátěži hrozí, že odběr proudu/napětí krátce poskočí, nezbude energie pro samotné Arduino Uno, a to se následně restartuje.

a808ccbc-348d-480a-af2f-a85365281dd7
USB dodá 5 V a může pohánět jen slabší motory, které budou odebírat malý proud. Kulatý 2,1mm konektor pak může bezpečně napájet Arudino Uno i motory cirka do 12V.

Další možností je použít pro napájení Arduina i motorového shieldu klasický kulatý 2,1mm konektor (7 až 12 V), přičemž provozní 5V napětí pro Arduino Uno vyrobí jeho měnič. Toto vstupní napětí pak motorový shield pustí i do motorů.

Do třetice mohou mít motory i logika zcela oddělené napájení, k čemuž slouží šroubové svorky na shieldu VIN a GND, které lze bezpečně připojit až k 18 V zdroji – třeba lithiové 4S baterii. Arduino Uno (a logiku motorového shieldu) pak musíte napájet separátně třeba pomocí shieldu powerbanky, který jsme si představili minule.

42f79c2e-e7bd-4889-9fe0-51c5758afa5d
Šroubové svorky slouží k připojení motorů a až 18V zdroje, který by už mohl dělat u Arduina problémy – jeho měnič na 5V by se mohl příliš zahřívat

V případě odděleného napájení je třeba ještě rozpojit kontakt VIN na zadní straně desky (viz fotografie výše), jinak by šroubová svorka VIN vedla do pinu VIN (surové napětí z kulatého konektoru/USB) na desce Arduino Uno.

Tříkolku budou pohánět 12V minimotory N20

Řídící jednotku (Arduino Uno + H-můstek) našeho elektromobilu bychom měli, tak teď ještě ty motory. Žádné jsem doma zrovna neměl k dispozici, a tak jsem objednal poměrně rozšířené maličké motory s převodníkem, které na zahraničních e-shopech najdete pod označením N20.

2e0dece2-d7a1-472d-91bf-c16d6207999d96a2ea84-ef16-4ce4-a241-80b8fc19c3b1bbd759b6-4d9d-46ee-93ec-c22522325310
Motor N20 s převodem a letními pneumatikami

Zpravidla jsou k dispozici s několika pracovními napětími od 3 V do 12 V, na výběr máte i hromadu rychlostí (RPM) a často k nim dostanete rovnou i kolo s kompatibilním otvorem na hřídel motoru.

Já si vybral tu nejvyšší nálož, tedy kombinaci 600 RPM při 12 V (pravidlo č. 1: specifikaci na čínských e-shopech vždy berte s rezervou), aby mělo autíčko pořádné grády. Na rychlost otáček ale pozor, v této kategorii totiž zpravidla platí, že čím vyšší rychlost, tím slabší převod, a tedy nižší točivý moment.

590f19ad-348b-40d7-9cec-cc4e72e06c8494378412-bd7c-4c64-a013-c8805a3c8064
Připojení motorů k shieldu. Všimněte si čtyř LED u zelených šroubových svorek. Signalizují, na které svorce se zrovna nastavuje napětí a jakým směrem se tedy motor roztočí. To se hodí při testování a montáži.

Stručně řečeno, motorek se sice může točit velmi rychle, ale jen naprázdno – bez zátěže. Když jej pak přimontujete k nějakému těžkému robůtku s příliš měkkými pneumatikami, možná se kvůli silnému tření ani nerozjede. To platí zejména o těch, které jsou určené pro nižší napětí. Moje dvanáctivoltové endvacítky by neměly mít u nás v redakci žádný problém.

O šťávu se postará maličký modelářský akumulátor Li-pol

Jelikož bude elektromobil vybavený 12V motory, potřebuje i adekvátní zdroj. Kdybychom použili běžné tužkové 1,5V baterie, potřebovali bychom alespoň 8 článků, které by zabraly příliš mnoho místa a tříkolka by byla zbytečně těžká.

Namísto toho tedy sáhneme po malém modelářském Li-pol akumulátoru. Je lehký, drobný a tříčlánkový (3S), takže když každý z nich nabijeme na 4,2 V, získáme 12,6 V.

64e8256e-3dcd-40c0-9de4-934eb492522d9c6de701-7680-493d-ada3-e1d43946e713fe8caa6b-2eec-4531-95b7-266fd4129cfa
Modelářská 12V Li-pol baterie s upraveným konektorem pro snadné zapojení do Arduino Uno a modul alarmu s voltmetrem a displejem, který postupně ukazuje celkové napětí a napětí v každém ze tří článků

K akumulátoru jsem připevnil redukci, abych jej mohl přímo napojit na válcový konektor Arduina, a jelikož se jedná o Li-pol akumulátor, připojím k němu i speciální alarm, který začne pískat, pokud v článcích klesne napětí na nebezpečnou mez a hrozilo by její zničení.

Karoserii navrhneme v Tinkercadu...

Tak, elektroniku i mechaniku bychom měli, teď ještě nějakou krabičku. Pomůže nám v tom Tinkercad od Autodesku.

6c1c75be-3f99-437f-b129-d21340d87361
V Tinkercadu navrhnete téměř jakýkoliv model, aniž byste museli instalovat jakýkoliv software – stačí webový prohlížeč

Tinkercad je bezplatná webová aplikace pro 3D návrh, se kterou se brzy a intuitivně naučí pracovat i vaše babička. Hotový model lze přím oz prohlížeče exportovat do formátu STL, kterému už rozumí programy pro 3D tisk.

Podívejte se na karoserii přímo na Tinkercadu:

Těm kterým Tinkercad nebude stačit, mohu doporučit ještě mnohem pokročilejší a opět webový Oneshape, který je už sice komerční, ale nabízí i bezplatný tarif pro kutily.

A vyrobíme na 3D tiskárně

V prohlížeči jsme si se šuplerou v ruce navrhli karoserii pro Arduino Uno s bateriovým shieldem, kterou nyní musíme ještě někde vyrobit. Nám se v redakci na nějaký čas usadila 3D tiskárna Alfawise U30 z Gearbestu.

2fdf3e22-bebf-4ac7-83d3-2f7826343547
Model z Tinkercadu jsem exportoval do formátu STL a ten konečně v programu Cura nařezal do formátu GCODE, kterému už rozumí 3D tiskárna.

Jedná se o laciný model za cenu okolo 4 tisíc korun a mezi fanoušky 3D tisku by se jistě našel zástup, těch, kteří by mi položili otázku: „Proč zrovna tuto, proboha? Proč jsi nesáhl raději po XYZ?“

Jednoduše proto, že byla zrovna k mání a společně s hromadou dalších splňuje definici „Laciná 3D tisku schopná hromada kovu a krokových motorů,“ která pro podobný hrubý tisk vlastně úplně dostačuje a může pouze překvapit. Na tisk dokonalých figurek od Marvelu tu jsou samozřejmě lepší modely, třeba český Prusa.

2ed51621-55ad-4374-905b-b79145b4c67ae25826e2-0b7a-46a9-9fd5-cac77a0fd704fc65dc55-9f51-4b80-bb5b-d36c6897ce3b
U30 tiskne a tiskne. Pro podobný model není třeba nejvyšší kvalita výroby. Abych ušetřil čas, snížil jsem kvalitu tisku na minimum.

(Poznámka autora: Na recenzi tiskárny se můžete těšit v dohledné době na Mobilmanii a Živě.cz.)

Tříkolka je hotová, teď ještě ten firmware

Po pár hodinách tisku je hotovo, takže stačí vše sešroubovat dohromady, připojit ultrazvukový dálkoměr a lithiovou baterii. O zbytek se postará firmware, který je dnes naprosto primitivní, omlouvám se tedy všem, kteří hutný text našeho seriálu pokaždé přeskočí a zajímá je hlavně kód.

6b1ca9b9-9de5-44df-8d9c-35f4c52ff47981da7a4f-74c1-4dff-adc8-658bafe2d37dbc2c3e95-faa2-41c6-ac4f-ebe0cbb480aa
Karoserie se skládá z podvozku, držáku dálkoměru a krytu baterie
e552c905-8502-42e9-bcc9-fc99c277e1e249445d1a-9836-4d71-ac64-7d4b2f0efc86da58fe02-ce0e-4e5e-919e-02e67829f76cf6e34642-0b55-400c-b148-11861f84acb9
Tak, ještě sešroubovat a tříkolka, která se vejde do lidské dlaně, je hotová

Jelikož náš elektromobil nemá žádnou rádiovou komunikaci, a tedy dálkové ovládání, po startu roztočí motory na nejvyšší výkon a ve smyčce loop bude při jízdě vpřed stále dokola měřit vzdálenost.

68b59536-7195-4f55-b5ea-61697d066a98
Dokonáno jest... Někteří už možná od pohledu tuší, kde bude problém.

Pokud ultrazvukový dálkoměr změří vzdálenost menší než (dejme tomu) 30 centimetrů, Arduino dupne u obou motorů na brzdu, protichůdným roztočením motorů se pootočí a konečně se opět rozjede vpřed.

Tím logika celého cyklu končí a vše se zopakuje zase při další překážce. Robůtek se bude zběsile prohánět po redakci a je už pouze na nás, jak jeho chytrost v řízení třeba pomocí dalších senzorů ještě vylepšíme – třeba pro automatickou navigaci pomocí sledování černé čáry. O tom už ale zase v některém z dalších pokračování našeho seriálu.

Jednoduchý program s motory a dálkoměrem:

// Ovladaci piny motoru A
// (D: direction/smer, P: PWM, B: brake/brzda)
#define DA 12
#define PA 3
#define BA 9

// Ovladaci piny motoru B
#define DB 13
#define PB 11
#define BB 8

// Piny dalkomeru
#define TRIG 4
#define ECHO 2

// Funkce pro zmereni vzdalenosti v milimetrech
uint16_t zmer_vzdalenost() {
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  return pulseIn(ECHO, HIGH) / 5.831;
}

// Aktivace brzdy u obou motoru
void zabrzdi() {
  digitalWrite(BA, HIGH);
  digitalWrite(BB, HIGH);
}

// Odbrzdeni obou motoru
void odbrzdi() {
  digitalWrite(BA, LOW);
  digitalWrite(BB, LOW);
}

// Jizda vpred
void dopredu() {
  digitalWrite(DA, LOW);
  digitalWrite(DB, LOW);
}

// Zpatecka
void dozadu() {
  digitalWrite(DA, HIGH);
  digitalWrite(DB, HIGH);
}

// Jizda vlevo (protichudne toceni motoru)
void doleva() {
  digitalWrite(DA, HIGH);
  digitalWrite(DB, LOW);
}

// Jizda vpravo (protichudne toceni motoru)
void doprava() {
  digitalWrite(DA, LOW);
  digitalWrite(DB, HIGH);
}

// Hlavni funkce
void setup() {
  // Pockej 5 sekund a zacni jizdu
  delay(5000);
  Serial.begin(115200);

  // Nastaveni motoru A
  pinMode(DA, OUTPUT);
  pinMode(PA, OUTPUT);
  pinMode(BA, OUTPUT);

  // Nastaveni motoru B
  pinMode(DB, OUTPUT);
  pinMode(PB, OUTPUT);
  pinMode(BB, OUTPUT);

  // Nastaveni dalkomeru
  pinMode(ECHO, INPUT);
  pinMode(TRIG, OUTPUT);

  // Vychozi stav, vuz je zastaveny
  zabrzdi();

  // Nastartuj motory na 50 %
  analogWrite(PA, 125);
  analogWrite(PB, 125);

  // Nastav motory na jizdu dopredu a odbrzdi
  dopredu();
  odbrzdi();
}

void loop() {
  // Ve smycce neustale mer vzdalenost
  uint16_t vzdalenost = zmer_vzdalenost();
  Serial.print(vzdalenost);
  Serial.println(" mm");

  // Pokud je vzdalenost  mensi nez 300 mm,
  // proved sekvenci: zabrzdi, pockej, pootoc se doleva a jed dopredu
  if (vzdalenost < 300) {
    Serial.println("PREKAZKA");
    zabrzdi();
    delay(1000);
    odbrzdi();
    doleva();
    delay(1000);
    dopredu();
  }
}

Tříkolka je splašená. Až příliš splašená!

Tak, teď by mělo následovat vítězné video, ale... Ale když jsem vše složil dohromady a nahrál firmware, narazil jsem na překážku, kterou už vytušili všichni inženýři.

Tříkolka na videu:

Tříkolka je natolik maličká, že kvůli zadnímu volnému kolu prakticky vůbec neudrží směr. Řešením je tedy buď tříkolku prodloužit a zadní kolečko hodně posunout, anebo naopak zvýšit šířku/vzdálenost předních kol, aby mohla tomu zadnímu trošku vzdorovat a udržet směr.

Stejně tak při nejvyšším výkonu jsou motory natolik rychlé, že se tříkolka snadno převrátí, neboť baterie je příliš vysoko a zvyšuje i celkové těžiště vozítka.

Bastlení se ne vždy povede na první dobrou

K bezproblémové jízdě tedy bude tříkolka potřebovat ještě další úpravy. I tak občas (často) vypadá praxe bastlířova, kdy se hrubý záměr na papíře promění ve funkční stroj nikoliv na první pokus, ale třeba až na pátý.


Dnes jsme si tedy po shieldu powerbanky představili další rozšiřující desku, která tentokrát oživila dva malé motorky. Tím to ale nekončí, armáda dalších shieldů pro Arduino Uno totiž už čeká na svoji příležitost.

Diskuze (16) Další článek: Nad Čuralem si zavoláte pomoc i bez signálu. T-Mobile dodal tlačítko s baterií na 5 let

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , ,