RP2350 - úvod: Rozdiel medzi revíziami

Zo stránky 3D liga wiki
Prejsť na navigáciu Prejsť na vyhľadávanie
Sebastian (diskusia | príspevky)
dBez shrnutí editace
Sebastian (diskusia | príspevky)
 
(19 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
[[Electronics|Späť do zoznamu]]|[[ RP2350_-_setup | HW príprava RP2350-zero]]
=== Opis ===
=== Opis ===


Riadok 6: Riadok 8:
* Čip RP2350 s dvoma jadrami, ktoré je možné prepnúť medzi Arm Cortex-M33 a RISC-V (Hazard3) – pre bežné použitie postačí predvolený Arm režim
* Čip RP2350 s dvoma jadrami, ktoré je možné prepnúť medzi Arm Cortex-M33 a RISC-V (Hazard3) – pre bežné použitie postačí predvolený Arm režim
* Takt do cca 150 MHz
* Takt do cca 150 MHz
* 520 KB SRAM priamo na čipe + externá flash pamäť na uloženie programu (a prípadne aj vlastných súborov)
* 520 kB SRAM priamo na čipe + externá 4 MB flash pamäť na uloženie programu (a prípadne aj vlastných súborov)
* USB-C konektor (napájanie aj nahrávanie firmvéru)
* USB-C konektor (napájanie aj nahrávanie firmvéru)
* Tlačidlo BOOT (na prepnutie do režimu nahrávania firmvéru) a tlačidlo RESET
* Tlačidlo BOOT (na prepnutie do režimu nahrávania firmvéru) a tlačidlo RESET
Riadok 13: Riadok 15:


<div style="display: flex; flex-wrap: wrap; gap: 8px;">
<div style="display: flex; flex-wrap: wrap; gap: 8px;">
[[File:RP2040-Zero-Pinout.jpg|350px]]
[[File:RP2040-Zero-Pinout.jpg|600px]]
<br>
[[File:RP2040-Zero-Board.jpg|350px]]
[[File:RP2040-Zero-Board.jpg|350px]]
[[File:RP2350_Box.jpg|350px]]
[[File:RP2350_Box.jpg|350px]]
Riadok 20: Riadok 23:
V našej stavebnici je RP2350-Zero "mozog" robota – riadi servá, číta senzory a komunikuje cez USB s počítačom.
V našej stavebnici je RP2350-Zero "mozog" robota – riadi servá, číta senzory a komunikuje cez USB s počítačom.


Pre účely variability našej stavebnice sme k RP2350-Zero vybrali aj expanznú podložku s vyvedenými Vcc a GND pinmi. Má aj svoj vlastný držiak, ktorý sa pomocou M2 skrutiek priskrutkuje k expanznej podložke.
Pre účely variability našej stavebnice sme k RP2350-Zero vybrali aj expanznú podložku s vyvedenými VCC a GND pinmi. Má aj svoj vlastný držiak, ktorý sa pomocou M2 skrutiek priskrutkuje k expanznej podložke.


'''Poznámka:''' presné číslovanie pinov a niektoré detaily (napr. veľkosť flash pamäte na konkrétnej revízii dosky) si over v [https://www.waveshare.com/wiki/RP2350-Zero#Arduino_IDE_Series oficiálnej dokumentácii Waveshare] – ide o pomerne nový produkt a údaje sa medzi revíziami môžu líšiť.
'''Poznámka:''' presné číslovanie pinov a niektoré detaily (napr. veľkosť flash pamäte na konkrétnej revízii dosky) si over v [https://www.waveshare.com/wiki/RP2350-Zero#Arduino_IDE_Series oficiálnej dokumentácii Waveshare] – ide o pomerne nový produkt a údaje sa medzi revíziami môžu líšiť.
Riadok 28: Riadok 31:
GPIO (General Purpose Input/Output) sú piny, cez ktoré doska komunikuje s okolitým svetom – môžu fungovať ako digitálny vstup (čítanie stavu, napr. tlačidlo), digitálny výstup (zapínanie/vypínanie, napr. LED) alebo majú aj špeciálne funkcie.
GPIO (General Purpose Input/Output) sú piny, cez ktoré doska komunikuje s okolitým svetom – môžu fungovať ako digitálny vstup (čítanie stavu, napr. tlačidlo), digitálny výstup (zapínanie/vypínanie, napr. LED) alebo majú aj špeciálne funkcie.


Typy funkcií, ktoré piny na RP2350 zvládajú (nie každý pin vie všetko naraz, funkciu si vždy nastavuje program):
Nasledujú typy funkcií, ktoré piny na RP2350 zvládajú (nie každý pin vie všetko naraz funkciu si vždy nastavuje program). Podrobné vysvetlenie a testovací kód pre jednotlivé protokoly nájdeš na ich podstránkach – klikni na názov funkcie v tabuľke:


{| class="wikitable"
{| class="wikitable"
! Funkcia !! Na čo slúži !! Príklad z našej stavebnice
! Funkcia !! Na čo slúži !! Príklad z našej stavebnice
|-
|-
| Digitálny vstup/výstup || Zapnutie/vypnutie, čítanie stavu tlačidla alebo spínača || Joystick SW (tlačidlo)
| [[RP2350-Zero/GPIO|Digitálny vstup/výstup]] || Zapnutie/vypnutie, čítanie stavu tlačidla alebo spínača || Joystick tlačidlo
|-
|-
| PWM (Pulse Width Modulation) || Riadenie servomotorov, stmievanie LED || Servá pri prieskumníkovi (GPIO4-6)
| [[RP2350-Zero/PWM|PWM]] (Pulse Width Modulation) || Riadenie servomotorov, stmievanie LED || Servo, LED modul
|-
|-
| ADC (analógový vstup) || Čítanie analógovej hodnoty (napätia) || Joystick VRX/VRY (GPIO26, GPIO27)
| [[RP2350-Zero/ADC|ADC]] (analógový vstup) || Čítanie analógovej hodnoty (napätia) || Joystick, mikrofón
|-
|-
| I2C || Komunikácia so senzormi/displejmi cez 2 vodiče (SDA, SCL) || zatiaľ nevyužité
| [[RP2350-Zero/I2C|I2C]] || Komunikácia so senzormi/displejmi cez 2 vodiče (SDA, SCL) || Gyroskop BNO055, laser VL53L0X
|-
|-
| SPI || Rýchlejšia komunikácia, napr. SD karta || zatiaľ nevyužité
| [[RP2350-Zero/UART|UART]] || Sériová komunikácia (napr. debug výpisy medzi dvoma doskami alebo LCD displejom) || Zatiaľ nevyužité
|-
|-
| UART || Sériová komunikácia (napr. debug výpisy medzi dvoma doskami) || zatiaľ nevyužité
| [[RP2350-Zero/SPI|SPI]] || Rýchlejšia komunikácia, napr. SD karta || Zatiaľ nevyužité
|}
|}


Dôležité: nie všetky piny majú '''ADC''' – vyhradené sú na to len niektoré. Skôr než pin použiješ na konkrétnu funkciu, over si v pinoute konkrétnej dosky RP2350-Zero, či ju daný pin podporuje.
=== Zapisovanie do pamäte ===


V doterajších manuáloch (rameno, prieskumník) sme zatiaľ využili len GPIO3-9 (digitálne výstupy pre servá a trigger/echo ultrazvuku) a GPIO26-27 (analógový vstup pre joystick). Zvyšné piny ostávajú voľné pre ďalšie rozšírenia, napríklad I2C senzor alebo SPI SD kartu.
Doska má 520 kB SRAM, do ktorej sa zapisuje kód, ktorý sa po zapnutí spustí. Ďalej má 4 MB flash pamäte, do ktorej môžeme zapisovať dáta, a to dvoma spôsobmi – podrobný návod a ukážkový kód pre každý z nich nájdeš na jeho podstránke:


=== PWM ===
{| class="wikitable"
! Spôsob !! Na čo sa hodí
|-
| [[RP2350-Zero/EEPROM|EEPROM]] || Jednoduché, pre malé množstvo dát (do 4 kB, jeden súbor)
|-
| [[RP2350-Zero/LittleFS|LittleFS]] || Skutočný súborový systém, pre viac dát so štruktúrou (viac ako 4 kB, dlhodobé snímanie)
|}


PWM (Pulse Width Modulation, modulácia šírky impulzu) funguje tak, že pin veľmi rýchlo prepína medzi HIGH a LOW. To, aké percento času je pin v stave HIGH (tzv. '''duty cycle'''), určuje "priemerný" účinok signálu – napríklad ako jasno svieti LED, akou rýchlosťou sa točí motor, alebo v akej polohe má byť servo.
[[Electronics|Späť do zoznamu]]|[[ RP2350_-_setup | HW príprava RP2350-zero]]


RP2350 má hardvérovú PWM perifériu s viacerými tzv. "slice" jednotkami, pričom každý slice ovláda dva kanály (A a B). Vďaka tomu vie generovať PWM na viacerých pinoch súčasne bez zaťaženia procesora.
=== Opis ===


'''Servomotory (už poznáte)'''
RP2350-Zero je malá vývojová doska od firmy Waveshare, postavená na čipe RP2350 (rovnaký čip ako v novšom Raspberry Pi Pico 2). Ide o kompaktnú alternatívu k bežnému Pico formátu – je výrazne menšia, a preto sa hodí presne tam, kde je málo miesta, ako je to aj v našej stavebnici.


Servá v našej stavebnici sú práve príkladom PWM: očakávajú impulz približne každých 20 ms (50 Hz), pričom dĺžka impulzu (typicky 1000–2000 μs) určuje:
Hlavné vlastnosti:
* pri 180° serve – uhol natočenia,
* Čip RP2350 s dvoma jadrami, ktoré je možné prepnúť medzi Arm Cortex-M33 a RISC-V (Hazard3) – pre bežné použitie postačí predvolený Arm režim
* pri 360° serve rýchlosť a smer otáčania.
* Takt do cca 150 MHz
* 520 kB SRAM priamo na čipe + externá 4 MB flash pamäť na uloženie programu (a prípadne aj vlastných súborov)
* USB-C konektor (napájanie aj nahrávanie firmvéru)
* Tlačidlo BOOT (na prepnutie do režimu nahrávania firmvéru) a tlačidlo RESET
* Jedna onboard RGB LED (WS2812/NeoPixel), ovládateľná jediným pinom
* Podpora PIO (Programmable I/O) špeciálna periféria RP2350, ktorá vie v hardvéri "napodobniť" takmer akýkoľvek komunikačný protokol


Knižnica <code>Servo.h</code>, ktorú sme používali doteraz (napr. <code>servoLave.write(90)</code>), toto generovanie PWM impulzov robí za nás – nemusíme sa starať o presné časovanie.
<div style="display: flex; flex-wrap: wrap; gap: 8px;">
[[File:RP2040-Zero-Pinout.jpg|600px]]
<br>
[[File:RP2040-Zero-Board.jpg|350px]]
[[File:RP2350_Box.jpg|350px]]
</div>


'''Jednoduchý príklad stmievanie LED'''
V našej stavebnici je RP2350-Zero "mozog" robota riadi servá, číta senzory a komunikuje cez USB s počítačom.


Ak chceš vidieť PWM "naživo" bez serva, stačí obyčajná LED na ľubovoľnom voľnom GPIO pine:
Pre účely variability našej stavebnice sme k RP2350-Zero vybrali aj expanznú podložku s vyvedenými VCC a GND pinmi. Má aj svoj vlastný držiak, ktorý sa pomocou M2 skrutiek priskrutkuje k expanznej podložke.


<syntaxhighlight lang="cpp">
'''Poznámka:''' presné číslovanie pinov a niektoré detaily (napr. veľkosť flash pamäte na konkrétnej revízii dosky) si over v [https://www.waveshare.com/wiki/RP2350-Zero#Arduino_IDE_Series oficiálnej dokumentácii Waveshare] – ide o pomerne nový produkt a údaje sa medzi revíziami môžu líšiť.
const int PIN_LED = 10; // ľubovoľný voľný pin


void setup() {
=== GPIO piny ===
  pinMode(PIN_LED, OUTPUT);
}


void loop() {
GPIO (General Purpose Input/Output) sú piny, cez ktoré doska komunikuje s okolitým svetom – môžu fungovať ako digitálny vstup (čítanie stavu, napr. tlačidlo), digitálny výstup (zapínanie/vypínanie, napr. LED) alebo majú aj špeciálne funkcie.
  // postupné rozjasňovanie
  for (int jas = 0; jas <= 255; jas++) {
    analogWrite(PIN_LED, jas);
    delay(5);
  }
  // postupné stmievanie
  for (int jas = 255; jas >= 0; jas--) {
    analogWrite(PIN_LED, jas);
    delay(5);
  }
}
</syntaxhighlight>


<code>analogWrite()</code> tu v skutočnosti nastavuje duty cycle PWM signálu (0 = stále LOW, 255 = stále HIGH), aj keď názov funkcie znie ako analógový výstup.
Nasledujú typy funkcií, ktoré piny na RP2350 zvládajú (nie každý pin vie všetko naraz – funkciu si vždy nastavuje program). Podrobné vysvetlenie a testovací kód pre jednotlivé protokoly nájdeš na ich podstránkach – klikni na názov funkcie v tabuľke:


=== ADC ===
{| class="wikitable"
! Funkcia !! Na čo slúži !! Príklad z našej stavebnice
|-
| [[RP2350-Zero/GPIO|Digitálny vstup/výstup]] || Zapnutie/vypnutie, čítanie stavu tlačidla alebo spínača || Joystick tlačidlo
|-
| [[RP2350-Zero/PWM|PWM]] (Pulse Width Modulation) || Riadenie servomotorov, stmievanie LED || Servo, LED modul
|-
| [[RP2350-Zero/ADC|ADC]] (analógový vstup) || Čítanie analógovej hodnoty (napätia) || Joystick, mikrofón
|-
| [[RP2350-Zero/I2C|I2C]] || Komunikácia so senzormi/displejmi cez 2 vodiče (SDA, SCL) || Gyroskop BNO055, laser VL53L0X
|-
| [[RP2350-Zero/UART|UART]] || Sériová komunikácia (napr. debug výpisy medzi dvoma doskami alebo LCD displejom) || Zatiaľ nevyužité
|-
| [[RP2350-Zero/SPI|SPI]] || Rýchlejšia komunikácia, napr. SD karta || Zatiaľ nevyužité
|}


ADC (Analog-to-Digital Converter) prevádza analógové napätie (spojitá hodnota, napr. 0–3,3 V) na digitálne číslo, s ktorým už vie program ďalej pracovať. Na rozdiel od digitálneho vstupu, ktorý rozlišuje iba HIGH/LOW, ADC vie povedať aj "koľko presne".
=== Zapisovanie do pamäte ===


Nie každý GPIO pin ADC – táto funkcia je vyhradená len na niektoré piny. Presne ktoré piny to sú na RP2350-Zero, over si v [https://www.waveshare.com/wiki/RP2350-Zero#Arduino_IDE_Series oficiálnom pinoute], keďže sa forma dosky líši od klasického Pico layoutu.
Doska 520 kB SRAM, do ktorej sa zapisuje kód, ktorý sa po zapnutí spustí. Ďalej má 4 MB flash pamäte, do ktorej môžeme zapisovať dáta, a to dvoma spôsobmi podrobný návod a ukážkový kód pre každý z nich nájdeš na jeho podstránke:
 
'''Príklad – joystick'''
 
Joystick pri ramene je presne takýto prípad: VRX a VRY vracajú analógové napätie podľa toho, ako veľmi je páčka vychýlená. V Arduino frameworku sa hodnota číta funkciou <code>analogRead(pin)</code>, ktorá typicky vracia hodnotu 0–1023 (10-bit rozlíšenie).
 
<syntaxhighlight lang="cpp">
const int PIN_VRX = 26;
const int PIN_VRY = 27;
 
void setup() {
  Serial.begin(115200);
}
 
void loop() {
  int hodnotaX = analogRead(PIN_VRX);
  int hodnotaY = analogRead(PIN_VRY);
 
  Serial.print("VRX: ");
  Serial.print(hodnotaX);
  Serial.print("  VRY: ");
  Serial.println(hodnotaY);
 
  delay(200);
}
</syntaxhighlight>
 
Surová hodnota (0–1023) sama o sebe veľa nepovie – v praxi si ju zvyčajne prepočítaš na užitočnejší rozsah, napríklad <code>map(hodnotaX, 0, 1023, -100, 100)</code>, aby si dostal rýchlosť alebo výchylku v rozsahu, s ktorým sa ti ľahšie pracuje.
 
'''Poznámka:''' presnú hodnotu referenčného napätia a bitové rozlíšenie ADC na RP2350 si over v dokumentácii pri práci s citlivejšími meraniami (napr. presné napätie z batérie) sa oplatí skontrolovať, či Arduino framework nepoužíva pre RP2350 iné predvolené nastavenia než klasický RP2040.
 
== I2C ==
 
I2C (Inter-Integrated Circuit) je zbernica, cez ktorú vie doska komunikovať s viacerými zariadeniami pomocou iba dvoch vodičov:
* '''SDA''' (Serial Data) – samotné dáta
* '''SCL''' (Serial Clock) – hodinový signál, ktorý synchronizuje prenos
 
Výhoda oproti napr. ultrazvuku (TRIG/ECHO) je, že na tie isté dva vodiče (SDA, SCL) sa dá pripojiť viacero zariadení naraz – každé má svoju vlastnú '''adresu''' (7-bitové číslo), podľa ktorej ho doska osloví. RP2350 sa správa ako "master" (riadiace zariadenie), senzory ako "slave".
 
Vo väčšine breakout dosiek (aj BNO055, aj VL53L0X) sú potrebné pull-up rezistory na SDA/SCL už priamo na doštičke, takže netreba pridávať vlastné.
 
'''Zariadenia v našej stavebnici'''


{| class="wikitable"
{| class="wikitable"
! Zariadenie !! Čo meria !! Predvolená I2C adresa
! Spôsob !! Na čo sa hodí
|-
|-
| BNO055 || Gyroskop / akcelerometer / kompas (9-DOF IMU) || 0x28
| [[RP2350-Zero/EEPROM|EEPROM]] || Jednoduché, pre malé množstvo dát (do 4 kB, jeden súbor)
|-
|-
| VL53L0X || Laserový senzor vzdialenosti (Time-of-Flight) || 0x29
| [[RP2350-Zero/LittleFS|LittleFS]] || Skutočný súborový systém, pre viac dát so štruktúrou (viac ako 4 kB, dlhodobé snímanie)
|}
|}


Keďže majú tieto dve zariadenia rôzne adresy, dajú sa obe pripojiť na tú istú I2C zbernicu súčasne bez konfliktu.
=== Dve jadrá a dve architektúry (Arm / RISC-V) ===
 
RP2350 má vo vnútri celkovo štyri jadrá – dvojicu '''Arm Cortex-M33''' a dvojicu '''RISC-V (Hazard3)''' – naraz je ale možné použiť len jednu z týchto dvoch dvojíc, nie všetky štyri súčasne.


'''Poznámka:''' konkrétne GPIO piny pre SDA/SCL si over v pinoute RP2350-Zero – v príkladoch nižšie použijeme GPIO0 (SDA) a GPIO1 (SCL), keďže sú v našej stavebnici zatiaľ voľné, ale dajú sa nastaviť aj inak.
'''Voľba architektúry (Arm alebo RISC-V)'''


=== I2C skener (test zapojenia) ===
Ktorá dvojica jadier sa použije, sa nastavuje v Arduino IDE cez '''Tools → CPU Architecture → Arm''' alebo '''RISC-V'''. Nejde o prepínanie za behu programu – ide o nastavenie pre celý sketch, takže po zmene treba program nahrať odznova.


Skôr než skúšaš konkrétny senzor, oplatí sa overiť, či ho doska na zbernici vôbec "vidí". Na to slúži klasický I2C skener – prejde všetky možné adresy a vypíše, na ktorých našiel odpoveď:
[[File: CPU-arm-risc-v.png | 500px]]


<syntaxhighlight lang="cpp">
Pre bežné použitie (a takmer všetky knižnice v našej stavebnici) postačí predvolený Arm režim. RISC-V je skôr na experimentovanie – niektoré knižnice pod ním zatiaľ nemusia fungovať (napr. FreeRTOS).
#include <Wire.h>
 
'''Použitie oboch jadier naraz (multicore)'''


const int PIN_SDA = 0;
Bez ohľadu na zvolenú architektúru vie RP2350 spúšťať kód na oboch jadrách naraz. Popri známych funkciách <code>setup()</code>/<code>loop()</code> (tie bežia na jadre 0) stačí do sketchu pridať funkcie <code>setup1()</code>/<code>loop1()</code> – tie automaticky pobežia paralelne na jadre 1:
const int PIN_SCL = 1;


<syntaxhighlight lang="cpp">
// Jadro 0 - hlavna logika (napr. citanie senzorov)
void setup() {
void setup() {
  Wire.setSDA(PIN_SDA);
  Wire.setSCL(PIN_SCL);
  Wire.begin();
   Serial.begin(115200);
   Serial.begin(115200);
  delay(1000);
  Serial.println("I2C skener spusteny...");
}
}


void loop() {
void loop() {
   byte pocetNajdenych = 0;
   Serial.println("Jadro 0 bezi...");
  delay(1000);
}


  for (byte adresa = 1; adresa < 127; adresa++) {
// Jadro 1 - bezi paralelne s jadrom 0 (napr. blikanie LED)
    Wire.beginTransmission(adresa);
void setup1() {
    byte chyba = Wire.endTransmission();
  pinMode(LED_BUILTIN, OUTPUT);
}


    if (chyba == 0) {
void loop1() {
      Serial.print("Zariadenie najdene na adrese 0x");
  digitalWrite(LED_BUILTIN, HIGH);
      if (adresa < 16) Serial.print("0");
  delay(200);
      Serial.println(adresa, HEX);
  digitalWrite(LED_BUILTIN, LOW);
      pocetNajdenych++;
   delay(200);
    }
  }
 
  if (pocetNajdenych == 0) {
    Serial.println("Ziadne I2C zariadenie nenajdene.");
  }
 
   delay(3000);
}
}
</syntaxhighlight>
</syntaxhighlight>


Ak sa objaví <code>0x28</code>, je zapojený BNO055. Ak <code>0x29</code>, je zapojený VL53L0X. Ak sa nezobrazí nič, skontroluj zapojenie SDA/SCL/VCC/GND.
Pár vecí, na ktoré si treba dať pozor:
* Obe jadrá si delia len 8 kB zásobníka (stack) – pri multicore sa rozdelí na 4 kB + 4 kB (namiesto plných 8 kB pre jedno jadro), takže vo <code>setup1()</code>/<code>loop1()</code> netreba používať príliš veľké lokálne premenné či polia.
* Nie je bezpečné volať tú istú perifériu (napr. <code>Serial.print()</code>) súčasne z oboch jadier bez synchronizácie – môže to spôsobiť nepredvídateľné správanie.
* Ak treba jadro 1 reštartovať alebo pozastaviť, dajú sa použiť funkcie <code>rp2040.restartCore1()</code> a <code>rp2040.resumeOtherCore()</code> (názov "rp2040" v knižnici ostáva zachovaný aj na RP2350 kvôli spätnej kompatibilite).
 
'''Komunikácia medzi jadrami'''


=== BNO055 gyroskop ===
Keďže jadro 0 a jadro 1 bežia úplne nezávisle (každé má svoj vlastný <code>setup</code>/<code>loop</code>), potrebujú spôsob, ako si navzájom bezpečne posielať dáta napríklad keď jadro 0 prečíta senzor a jadro 1 na základe toho niečo riadi. RP2350 má na to priamo v hardvéri dva malé kruhové zásobníky (FIFO) medzi jadrami – jeden v smere 0→1, druhý 1→0, každý s kapacitou 8 čísel (32-bitových). Arduino-pico ich sprístupňuje cez objekt <code>rp2040.fifo</code>:


Na čítanie skutočných hodnôt (nielen na overenie zapojenia) je najjednoduchšie použiť knižnicu '''Adafruit BNO055''' (spolu s '''Adafruit Unified Sensor'''), ktoré nainštaluješ cez Library Manager v Arduino IDE.
* <code>rp2040.fifo.push(hodnota)</code> – pošle 32-bitové číslo druhému jadru (počká, ak je FIFO plné)
* <code>rp2040.fifo.pop()</code> – prečíta ďalšie prijaté číslo (počká, ak ešte nič neprišlo)
* <code>rp2040.fifo.available()</code> – koľko hodnôt čaká na prečítanie


<syntaxhighlight lang="cpp">
[[File: CPU-FIFO.png | 500px]]
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>


Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28);
Napríklad, ak má jadro 0 (číta senzor) posielať nameranú hodnotu jadru 1 (ktoré ju napríklad len vypisuje alebo podľa nej niečo riadi):


<syntaxhighlight lang="cpp">
// Jadro 0 - odosiela data jadru 1
void setup() {
void setup() {
   Serial.begin(115200);
   Serial.begin(115200);
  if (!bno.begin()) {
    Serial.println("BNO055 sa nenasiel, skontroluj zapojenie!");
    while (1) delay(10);
  }
  delay(1000);
  bno.setExtCrystalUse(true);
}
}


void loop() {
void loop() {
   sensors_event_t event;
   int hodnota = analogRead(A0);     // napr. nacitanie zo senzora
  bno.getEvent(&event);
   rp2040.fifo.push(hodnota);       // posli hodnotu jadru 1
 
  Serial.print("X: ");
  Serial.print(event.orientation.x);
  Serial.print("  Y: ");
  Serial.print(event.orientation.y);
   Serial.print("  Z: ");
  Serial.println(event.orientation.z);
 
   delay(200);
   delay(200);
}
}
</syntaxhighlight>
Program vypisuje natočenie okolo troch osí (Euler uhly). Ak otočíš doskou/senzorom v ruke, hodnoty by sa mali plynulo meniť.


=== VL53L0X – laserový senzor vzdialenosti ===
// Jadro 1 - prijima data od jadra 0
 
void setup1() {
Podobne, na čítanie vzdialenosti použijeme knižnicu '''Adafruit VL53L0X''' (Library Manager).
 
<syntaxhighlight lang="cpp">
#include <Wire.h>
#include <Adafruit_VL53L0X.h>
 
Adafruit_VL53L0X laser = Adafruit_VL53L0X();
 
void setup() {
  Serial.begin(115200);
 
  if (!laser.begin()) {
    Serial.println("VL53L0X sa nenasiel, skontroluj zapojenie!");
    while (1) delay(10);
  }
}
}


void loop() {
void loop1() {
   VL53L0X_RangingMeasurementData_t meranie;
   if (rp2040.fifo.available() > 0) {
  laser.rangingTest(&meranie, false);
     int prijataHodnota = rp2040.fifo.pop();
 
     Serial.print("Jadro 1 prijalo: ");
  if (meranie.RangeStatus != 4) {
     Serial.println(prijataHodnota);
     Serial.print("Vzdialenost: ");
     Serial.print(meranie.RangeMilliMeter);
    Serial.println(" mm");
  } else {
     Serial.println("Mimo dosahu");
   }
   }
  delay(200);
}
}
</syntaxhighlight>
</syntaxhighlight>


Oproti ultrazvuku (HC-SR04) je VL53L0X presnejší na kratšie vzdialenosti a nepotrebuje dva samostatné piny (TRIG/ECHO) – všetko ide cez tú istú I2C zbernicu.
FIFO vie naraz preniesť len jedno 32-bitové číslo, takže sa hodí najmä na jednoduché hodnoty alebo príkazy (napr. "toto je nová nameraná vzdialenosť"). Pre zdieľanie zložitejších dát (viac hodnôt naraz) sa zvyčajne cez FIFO pošle len signál "dáta sú pripravené" a samotné dáta sa čítajú zo spoločnej globálnej premennej (označenej <code>volatile</code>), do ktorej ich medzitým zapísalo druhé jadro.
 
'''Poznámka:''' ak by si chcel BNO055 aj VL53L0X pripojené súčasne, stačí ich zapojiť na tie isté SDA/SCL piny (zdieľajú zbernicu) – práve vďaka rozdielnym adresám (0x28 a 0x29) ich doska rozlíši.


__notoc__
__notoc__

Aktuálna revízia z 20:17, 8. september 2026

Späť do zoznamu| HW príprava RP2350-zero

Opis

RP2350-Zero je malá vývojová doska od firmy Waveshare, postavená na čipe RP2350 (rovnaký čip ako v novšom Raspberry Pi Pico 2). Ide o kompaktnú alternatívu k bežnému Pico formátu – je výrazne menšia, a preto sa hodí presne tam, kde je málo miesta, ako je to aj v našej stavebnici.

Hlavné vlastnosti:

  • Čip RP2350 s dvoma jadrami, ktoré je možné prepnúť medzi Arm Cortex-M33 a RISC-V (Hazard3) – pre bežné použitie postačí predvolený Arm režim
  • Takt do cca 150 MHz
  • 520 kB SRAM priamo na čipe + externá 4 MB flash pamäť na uloženie programu (a prípadne aj vlastných súborov)
  • USB-C konektor (napájanie aj nahrávanie firmvéru)
  • Tlačidlo BOOT (na prepnutie do režimu nahrávania firmvéru) a tlačidlo RESET
  • Jedna onboard RGB LED (WS2812/NeoPixel), ovládateľná jediným pinom
  • Podpora PIO (Programmable I/O) – špeciálna periféria RP2350, ktorá vie v hardvéri "napodobniť" takmer akýkoľvek komunikačný protokol


V našej stavebnici je RP2350-Zero "mozog" robota – riadi servá, číta senzory a komunikuje cez USB s počítačom.

Pre účely variability našej stavebnice sme k RP2350-Zero vybrali aj expanznú podložku s vyvedenými VCC a GND pinmi. Má aj svoj vlastný držiak, ktorý sa pomocou M2 skrutiek priskrutkuje k expanznej podložke.

Poznámka: presné číslovanie pinov a niektoré detaily (napr. veľkosť flash pamäte na konkrétnej revízii dosky) si over v oficiálnej dokumentácii Waveshare – ide o pomerne nový produkt a údaje sa medzi revíziami môžu líšiť.

GPIO piny

GPIO (General Purpose Input/Output) sú piny, cez ktoré doska komunikuje s okolitým svetom – môžu fungovať ako digitálny vstup (čítanie stavu, napr. tlačidlo), digitálny výstup (zapínanie/vypínanie, napr. LED) alebo majú aj špeciálne funkcie.

Nasledujú typy funkcií, ktoré piny na RP2350 zvládajú (nie každý pin vie všetko naraz – funkciu si vždy nastavuje program). Podrobné vysvetlenie a testovací kód pre jednotlivé protokoly nájdeš na ich podstránkach – klikni na názov funkcie v tabuľke:

Funkcia Na čo slúži Príklad z našej stavebnice
Digitálny vstup/výstup Zapnutie/vypnutie, čítanie stavu tlačidla alebo spínača Joystick tlačidlo
PWM (Pulse Width Modulation) Riadenie servomotorov, stmievanie LED Servo, LED modul
ADC (analógový vstup) Čítanie analógovej hodnoty (napätia) Joystick, mikrofón
I2C Komunikácia so senzormi/displejmi cez 2 vodiče (SDA, SCL) Gyroskop BNO055, laser VL53L0X
UART Sériová komunikácia (napr. debug výpisy medzi dvoma doskami alebo LCD displejom) Zatiaľ nevyužité
SPI Rýchlejšia komunikácia, napr. SD karta Zatiaľ nevyužité

Zapisovanie do pamäte

Doska má 520 kB SRAM, do ktorej sa zapisuje kód, ktorý sa po zapnutí spustí. Ďalej má 4 MB flash pamäte, do ktorej môžeme zapisovať dáta, a to dvoma spôsobmi – podrobný návod a ukážkový kód pre každý z nich nájdeš na jeho podstránke:

Spôsob Na čo sa hodí
EEPROM Jednoduché, pre malé množstvo dát (do 4 kB, jeden súbor)
LittleFS Skutočný súborový systém, pre viac dát so štruktúrou (viac ako 4 kB, dlhodobé snímanie)

Späť do zoznamu| HW príprava RP2350-zero

Opis

RP2350-Zero je malá vývojová doska od firmy Waveshare, postavená na čipe RP2350 (rovnaký čip ako v novšom Raspberry Pi Pico 2). Ide o kompaktnú alternatívu k bežnému Pico formátu – je výrazne menšia, a preto sa hodí presne tam, kde je málo miesta, ako je to aj v našej stavebnici.

Hlavné vlastnosti:

  • Čip RP2350 s dvoma jadrami, ktoré je možné prepnúť medzi Arm Cortex-M33 a RISC-V (Hazard3) – pre bežné použitie postačí predvolený Arm režim
  • Takt do cca 150 MHz
  • 520 kB SRAM priamo na čipe + externá 4 MB flash pamäť na uloženie programu (a prípadne aj vlastných súborov)
  • USB-C konektor (napájanie aj nahrávanie firmvéru)
  • Tlačidlo BOOT (na prepnutie do režimu nahrávania firmvéru) a tlačidlo RESET
  • Jedna onboard RGB LED (WS2812/NeoPixel), ovládateľná jediným pinom
  • Podpora PIO (Programmable I/O) – špeciálna periféria RP2350, ktorá vie v hardvéri "napodobniť" takmer akýkoľvek komunikačný protokol


V našej stavebnici je RP2350-Zero "mozog" robota – riadi servá, číta senzory a komunikuje cez USB s počítačom.

Pre účely variability našej stavebnice sme k RP2350-Zero vybrali aj expanznú podložku s vyvedenými VCC a GND pinmi. Má aj svoj vlastný držiak, ktorý sa pomocou M2 skrutiek priskrutkuje k expanznej podložke.

Poznámka: presné číslovanie pinov a niektoré detaily (napr. veľkosť flash pamäte na konkrétnej revízii dosky) si over v oficiálnej dokumentácii Waveshare – ide o pomerne nový produkt a údaje sa medzi revíziami môžu líšiť.

GPIO piny

GPIO (General Purpose Input/Output) sú piny, cez ktoré doska komunikuje s okolitým svetom – môžu fungovať ako digitálny vstup (čítanie stavu, napr. tlačidlo), digitálny výstup (zapínanie/vypínanie, napr. LED) alebo majú aj špeciálne funkcie.

Nasledujú typy funkcií, ktoré piny na RP2350 zvládajú (nie každý pin vie všetko naraz – funkciu si vždy nastavuje program). Podrobné vysvetlenie a testovací kód pre jednotlivé protokoly nájdeš na ich podstránkach – klikni na názov funkcie v tabuľke:

Funkcia Na čo slúži Príklad z našej stavebnice
Digitálny vstup/výstup Zapnutie/vypnutie, čítanie stavu tlačidla alebo spínača Joystick tlačidlo
PWM (Pulse Width Modulation) Riadenie servomotorov, stmievanie LED Servo, LED modul
ADC (analógový vstup) Čítanie analógovej hodnoty (napätia) Joystick, mikrofón
I2C Komunikácia so senzormi/displejmi cez 2 vodiče (SDA, SCL) Gyroskop BNO055, laser VL53L0X
UART Sériová komunikácia (napr. debug výpisy medzi dvoma doskami alebo LCD displejom) Zatiaľ nevyužité
SPI Rýchlejšia komunikácia, napr. SD karta Zatiaľ nevyužité

Zapisovanie do pamäte

Doska má 520 kB SRAM, do ktorej sa zapisuje kód, ktorý sa po zapnutí spustí. Ďalej má 4 MB flash pamäte, do ktorej môžeme zapisovať dáta, a to dvoma spôsobmi – podrobný návod a ukážkový kód pre každý z nich nájdeš na jeho podstránke:

Spôsob Na čo sa hodí
EEPROM Jednoduché, pre malé množstvo dát (do 4 kB, jeden súbor)
LittleFS Skutočný súborový systém, pre viac dát so štruktúrou (viac ako 4 kB, dlhodobé snímanie)

Dve jadrá a dve architektúry (Arm / RISC-V)

RP2350 má vo vnútri celkovo štyri jadrá – dvojicu Arm Cortex-M33 a dvojicu RISC-V (Hazard3) – naraz je ale možné použiť len jednu z týchto dvoch dvojíc, nie všetky štyri súčasne.

Voľba architektúry (Arm alebo RISC-V)

Ktorá dvojica jadier sa použije, sa nastavuje v Arduino IDE cez Tools → CPU Architecture → Arm alebo RISC-V. Nejde o prepínanie za behu programu – ide o nastavenie pre celý sketch, takže po zmene treba program nahrať odznova.

Pre bežné použitie (a takmer všetky knižnice v našej stavebnici) postačí predvolený Arm režim. RISC-V je skôr na experimentovanie – niektoré knižnice pod ním zatiaľ nemusia fungovať (napr. FreeRTOS).

Použitie oboch jadier naraz (multicore)

Bez ohľadu na zvolenú architektúru vie RP2350 spúšťať kód na oboch jadrách naraz. Popri známych funkciách setup()/loop() (tie bežia na jadre 0) stačí do sketchu pridať funkcie setup1()/loop1() – tie automaticky pobežia paralelne na jadre 1:

// Jadro 0 - hlavna logika (napr. citanie senzorov)
void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.println("Jadro 0 bezi...");
  delay(1000);
}

// Jadro 1 - bezi paralelne s jadrom 0 (napr. blikanie LED)
void setup1() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop1() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(200);
  digitalWrite(LED_BUILTIN, LOW);
  delay(200);
}

Pár vecí, na ktoré si treba dať pozor:

  • Obe jadrá si delia len 8 kB zásobníka (stack) – pri multicore sa rozdelí na 4 kB + 4 kB (namiesto plných 8 kB pre jedno jadro), takže vo setup1()/loop1() netreba používať príliš veľké lokálne premenné či polia.
  • Nie je bezpečné volať tú istú perifériu (napr. Serial.print()) súčasne z oboch jadier bez synchronizácie – môže to spôsobiť nepredvídateľné správanie.
  • Ak treba jadro 1 reštartovať alebo pozastaviť, dajú sa použiť funkcie rp2040.restartCore1() a rp2040.resumeOtherCore() (názov "rp2040" v knižnici ostáva zachovaný aj na RP2350 kvôli spätnej kompatibilite).

Komunikácia medzi jadrami

Keďže jadro 0 a jadro 1 bežia úplne nezávisle (každé má svoj vlastný setup/loop), potrebujú spôsob, ako si navzájom bezpečne posielať dáta – napríklad keď jadro 0 prečíta senzor a jadro 1 na základe toho niečo riadi. RP2350 má na to priamo v hardvéri dva malé kruhové zásobníky (FIFO) medzi jadrami – jeden v smere 0→1, druhý 1→0, každý s kapacitou 8 čísel (32-bitových). Arduino-pico ich sprístupňuje cez objekt rp2040.fifo:

  • rp2040.fifo.push(hodnota) – pošle 32-bitové číslo druhému jadru (počká, ak je FIFO plné)
  • rp2040.fifo.pop() – prečíta ďalšie prijaté číslo (počká, ak ešte nič neprišlo)
  • rp2040.fifo.available() – koľko hodnôt čaká na prečítanie

Napríklad, ak má jadro 0 (číta senzor) posielať nameranú hodnotu jadru 1 (ktoré ju napríklad len vypisuje alebo podľa nej niečo riadi):

// Jadro 0 - odosiela data jadru 1
void setup() {
  Serial.begin(115200);
}

void loop() {
  int hodnota = analogRead(A0);     // napr. nacitanie zo senzora
  rp2040.fifo.push(hodnota);        // posli hodnotu jadru 1
  delay(200);
}

// Jadro 1 - prijima data od jadra 0
void setup1() {
}

void loop1() {
  if (rp2040.fifo.available() > 0) {
    int prijataHodnota = rp2040.fifo.pop();
    Serial.print("Jadro 1 prijalo: ");
    Serial.println(prijataHodnota);
  }
}

FIFO vie naraz preniesť len jedno 32-bitové číslo, takže sa hodí najmä na jednoduché hodnoty alebo príkazy (napr. "toto je nová nameraná vzdialenosť"). Pre zdieľanie zložitejších dát (viac hodnôt naraz) sa zvyčajne cez FIFO pošle len signál "dáta sú pripravené" a samotné dáta sa čítajú zo spoločnej globálnej premennej (označenej volatile), do ktorej ich medzitým zapísalo druhé jadro.