Arduino GIGA – první dojmy

Od první chvíle, co jsem se dozvěděl o existenci dvoujádrového Arduina, věděl jsem, že bych si ho zcela jistě rád vyzkoušel a tak jsem poprvé objednal originál Arduino desku (prosím nekamenujte mě, že jsem byl až doposud skrblík…).

Deska konečně dorazila, takže jsem dorazil na poštu, abych zjistil, že jsem přišel o 5 minut později a musím čekat do odpoledne. Naštěstí jsem odpoledne nemusel stát frontu a konečně jsem si mohl vytouženou „destičku“ vyzvednout. Hned jak jsem měl chvilku volna, tak jsem si desku vybalil, abych se na ní mohl alespoň podívat, později jsem hned začal desku i zkoušet.

Obsahem balení je jedna deska Arduino GIGA – rovnou dodaná s plastovým spodním krytem. Osobně si myslím, že pár šroubků mohli přibalit také 🙂, dále je v balení externí anténa (bez ní vám nebude fungovat Wi-Fi ani Bluetooth), samolepky a leták s poděkováním (viz. foto). V balení ovšem chybí USB-C kabel, který je pro programování desky potřeba, takže pokud ho nemáte doma např. k telefonu budete si ho muset objednat – proč kabel nedodávají k desce je mi záhadou…


Zde vidíte srovnání velikosti s klonem Arduino MEGA. Jak je vidět, tak slib výrobce, že Arduino GIGA bude velikostně stejné jako Arduino MEGA byl naplněn – díky tomu by shieldy pro MEGA měly fungovat i na GIGA.

První sketch

Pokud nepoužíváte nejnovější verzi Arduino IDE, tak vás nejspíš nemine instalace knihoven/ovladačů pro novou desku. To se provádí v „Manažeru desek“. Tam stačí do vyhledávacího políčka napsat „GIGA“ a stáhnout jedinou položku, která tam je („Arduino Mbed OS Giga Boards“). Zde si dovolím malou odbočku: pokud jsem to pochopil správně, tak na této desce váš sketch běží v rámci běhu „Arduino Core for mbed devices“, což je vlastně OS. Nejsem si jist, jestli to nekazí radost z jednočipů a jednoduchosti, kterou nabízejí, ale možná je to již nutnost vzhledem k možnostem této desky.
V základu se bude deska chovat jako by měla pouze jedno jádro a tak první sketch, který jsem vyzkoušel fungoval naprosto dle očekávání, což jistě nikoho nepřekvapí 😉

Máte dvě jádra? A mohl bych je vidět?

Jak jsem psal v předchozím článku o Arduino GIGA, jeho dvoujádrovost má několik „ALE“. Prvním z kompromisů, které byly udělány je rozdělení paměti, ta je v základu všechna přiřazena pro hlavní procesor M7. Pokud chcete použít obě jádra, musíte přiřadit koprocesorovému jádru M4 paměť. Přiřazení paměti se provede podobně jako volba vývojové desky v Nástrojích (viz. obrázek). Pokud toto uděláte, můžete do každého jádra nahrávat sketche zvlášť).


Osobně doporučuji mít pro každé jádro zvláštní sketch – je to lepší pro přehlednost kódu. Dokumentace sice uvádí způsob, jak mít kód v jednom, ale tento kód se zkompiluje celý – podmíněný překlad asi ještě Arduino IDE neumí, což je škoda. Dále doporučuji nahrávat napřed kód do koprocesoru, protože koprocesor se nabootuje pouze příkazem z hlavního procesoru.

Koprocesor bude ovládat vestavěnou LED, hlavní procesor bude komunikovat s PC. Obráceně by to ani nešlo, protože sériová linka z PC je vedena pouze do hlavního procesoru, takže z koprocesoru nejde použít Serial.println()! Pro komunikaci jader mezi sebou se používá RPC protokol. Tento protokol funguje na principu posílání krátkých zpráv mezi jádry, jeho použití je následující: na jednom procesoru zaregistrujeme do RPC funkci a v druhém ji poté voláme. V mém řešení je na hlavním procesoru registrovaná funkce „setup_done_M4“, ta je poté zavolána z koprocesoru na konci funkce „setup“, tím v PC vidíme, že „setup“ koprocesoru proběhl v pořádku. Na koprocesoru jsou zaregistrovány funkce „LED_on“ a „LED_off“, ty – jak jejich název napovídá – ovládají vestavěnou LED.

Pokud vás zarazilo, že zapnutí LED je provedeno pomocí zapsání hodnoty logické nuly (low), tak opravdu nejde o překlep – dle dokumentace je to tak správně.

#include <RPC.h>

void setup() {
  Serial.begin(115200);
  while (!Serial);

  RPC.bind("setup_done_M4", setup_done_M4);

  RPC.begin(); //boots M4

  Serial.println("M7: Setup done");
}

void loop()
{
  RPC.call("LED_on");
  delay(500); 
  RPC.call("LED_off");
  delay(500); 
  Serial.println("Loop done");
}

void setup_done_M4() {
  Serial.println("M4: Setup done");  
}


#include <RPC.h>

void setup() {
  pinMode(LED_BUILTIN, OUTPUT); 

  RPC.begin();
  RPC.bind("LED_on", LED_on);
  RPC.bind("LED_off", LED_off);

  RPC.call("setup_done_M4");
}

void LED_on() {
  digitalWrite(LED_BUILTIN, LOW);
}

void LED_off() {
  digitalWrite(LED_BUILTIN, HIGH); 
}

void loop() {

}

Závěr a co dál?

Jak bylo vidět, použití asi největší výhody Arduino GIGA (dvoujádrovosti) není tak složité jak by se na první pohled mohlo zdát. Vzhledem k počtu periferií a jejich možnostem je určitě výzvou vyzkoušet je postupně všechny o což se určitě pokusím.


Další věcí, kterou mám v plánu vyzkoušet je USB OTG – to by mělo umožňovat číst připojenou Flashku a v ní mít například uložená data pro displej. Displej jsem si již objednal včetně „displejového shieldu“ pro Arduino MEGA, tak uvidíme 🙂