RP2350 - úvod
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á 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.
Typy funkcií, ktoré piny na RP2350 zvládajú (nie každý pin vie všetko naraz, funkciu si vždy nastavuje program):
| 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) |
| PWM (Pulse Width Modulation) | Riadenie servomotorov, stmievanie LED | Servá pri prieskumníkovi (GPIO4-6) |
| ADC (analógový vstup) | Čítanie analógovej hodnoty (napätia) | Joystick VRX/VRY (GPIO26, GPIO27) |
| I2C | Komunikácia so senzormi/displejmi cez 2 vodiče (SDA, SCL) | zatiaľ nevyužité |
| SPI | Rýchlejšia komunikácia, napr. SD karta | zatiaľ nevyužité |
| UART | Sériová komunikácia (napr. debug výpisy medzi dvoma doskami) | 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.
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.
PWM
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.
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.
Servomotory (už poznáte)
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:
- pri 180° serve – uhol natočenia,
- pri 360° serve – rýchlosť a smer otáčania.
Knižnica Servo.h, ktorú sme používali doteraz (napr. servoLave.write(90)), toto generovanie PWM impulzov robí za nás – nemusíme sa starať o presné časovanie.
Jednoduchý príklad – stmievanie LED
Ak chceš vidieť PWM "naživo" bez serva, stačí obyčajná LED na ľubovoľnom voľnom GPIO pine:
const int PIN_LED = 10; // ľubovoľný voľný pin
void setup() {
pinMode(PIN_LED, OUTPUT);
}
void loop() {
// 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);
}
}
analogWrite() 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.
ADC
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".
Nie každý GPIO pin má ADC – táto funkcia je vyhradená len na niektoré piny. Presne ktoré piny to sú na RP2350-Zero, over si v oficiálnom pinoute, keďže sa forma dosky líši od klasického Pico layoutu.
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 analogRead(pin), ktorá typicky vracia hodnotu 0–1023 (10-bit rozlíšenie).
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);
}
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 map(hodnotaX, 0, 1023, -100, 100), 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.