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á 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) | BNO055 (alternatíva k I2C) |
| 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.
Dáta môžeme zapisovať dvoma spôsobmi:
- Cez EEPROM knižnicu – jednoduché a pre malé množstvo dát (do 4 kB, jeden súbor)
- Cez súborový systém (LittleFS) – zložitejšie a pre viac dát so štruktúrou (viac ako 4 kB, dlhodobé snímanie)
EEPROM
Aby sme mohli s pamäťou pracovať, musíme si ju najprv rezervovať (alokovať). Rezervovať si ju môžeme po bajtoch, až do 4096 bajtov, čo je jeden blok pamäte. Do tohto bloku nám nič nemôže zasahovať okrem nášho programu.
Je to podobné, ako keby sme si v hoteli rezervovali izbu – môžeme si v nej robiť, čo chceme, a jedine my máme kľúč od izby, takže sa do nej nedostane nikto iný.
Keď si pamäť rezervujeme, môžeme do nej zapisovať, čo chceme – napríklad namerané vzdialenosti z ultrazvukového senzora.
Treba dávať pozor na to, že rezervovanú pamäť máme aj adresovanú, a to od bajtu 0 po náš zvolený bajt − 1. Každé číslo, znak či dátový typ pritom v pamäti zaberá inú veľkosť:
| Dátový typ | Veľkosť |
|---|---|
| bool, byte, char | 1 bajt |
| short | 2 bajty |
| int, unsigned int | 4 bajty |
| long, unsigned long | 4 bajty |
| float | 4 bajty |
| double | 8 bajtov |
Ak si nie si istý veľkosťou konkrétneho typu, over si ju priamo v kóde príkazom sizeof(premenná).
Všetky testovacie programy nájdeš v File → Examples → EEPROM.
Zápis
#include <EEPROM.h>
void setup() {
Serial.begin(115200);
EEPROM.begin(256); // rezervuje 256 bajtov "EEPROM" priestoru vo flashi (max. 4096)
EEPROM.write(0, 123); // zapíše hodnotu 123 na adresu 0
EEPROM.commit(); // POVINNÉ – reálne zapíše do flashe (inak zostane len v RAM cache)
byte hodnota = EEPROM.read(0);
Serial.print("Zapísaná hodnota: ");
Serial.println(hodnota);
}
void loop() {
}
Ak chceme zapisovať aj viacbajtové typy (napr. int alebo float), nemusíme ich rozkladať na jednotlivé bajty ručne – knižnica má na to funkcie EEPROM.put() a EEPROM.get(), ktoré si samy poradia so správnym počtom bajtov podľa typu premennej:
#include <EEPROM.h>
int adresa = 0;
void setup() {
Serial.begin(115200);
EEPROM.begin(256);
float vzdialenost = 23.5;
EEPROM.put(adresa, vzdialenost); // zapíše všetkých sizeof(float) = 4 bajty naraz
EEPROM.commit();
adresa += sizeof(float);
vzdialenost += 10;
EEPROM.put(adresa, vzdialenost);
EEPROM.commit();
float nacitanaHodnota;
EEPROM.get(adresa, nacitanaHodnota); // prečíta správny počet bajtov automaticky
Serial.print("Načítaná hodnota: ");
Serial.println(nacitanaHodnota);
}
void loop() {
}
Čítanie
Ak chceš z pamäte iba čítať (napríklad po reštarte dosky, keď chceš zistiť naposledy uloženú hodnotu):
#include <EEPROM.h>
int adresa = 0;
void setup() {
Serial.begin(115200);
EEPROM.begin(256);
byte hodnota = EEPROM.read(ardesa);
Serial.print("Hodnota na adrese 0: ");
Serial.println(hodnota);
}
void loop() {
}
Vynulovanie
Ak chceš celú rezervovanú pamäť vynulovať (napríklad pred novým meraním):
#include <EEPROM.h>
void setup() {
EEPROM.begin(256);
for (int i = 0; i < 256; i++) {
EEPROM.write(i, 0); // 0 používame ako "prázdnu" hodnotu
}
EEPROM.commit(); // bez tohto sa vynulovanie neuloží natrvalo
Serial.begin(115200);
Serial.println("Pamäť vynulovaná.");
}
void loop() {
}