Egy héttel ezelőtt megjelent a Raspberry legújabb lapkája: a Pi Pico névre keresztelt egyed. 4 dolláros mikrovezérlőként reklámozzák és valóban: szállítással együtt 11 dollárért sikerült is szert tennem egy példányra Angliából, a Pimoroni-tól.
Mert talán azt mondanom se kell, hogy amint megláttam, az vágott belém: nekem miért nincs még ilyenem? :)
A fórumokon megjelenő kérdések alapján néhányan máris félreértések áldozatául estek ennek kapcsán, a mikrovezérlő ugyanis nem mikroszámítógép, ezért nincs rajta hagyományos értelemben vett operációs rendszer, szóval nem, nem fut rajta semmilyen Linux. Nem köthető rá monitor, billentyű, egér.. legalábbis nem úgy. :)
Ez egy programozható vezérlő. Pont. (Lásd ESP8266 vagy ESP32 mikrovezérlő) Linuxos RPI-ből a legkisebb továbbra is a Raspberry PI Zero. Ráadásul, amit sokan helyesen észrevételezték: nincs benne integrált WiFi vezérlő, így a külvilággal valamely más módon tud csak kommunikálni, mondjuk a rá integrált 2x UART, 2x SPI, 2x I2C vagy USB1.1 vezérlő valamelyikén. (ezek közül némelyik egyidejű használata kizárja egymást, mivel egy lábnak több funkciója is lehet, választanunk kell ez esetben)
Következő félreértés, hogy kisebb, mint a sokak által favorizált ESP32. Nos, annyira nem.
3 grammos súlyával és 51.3mm x 21mm x 3.9mm méretével nem különösebben nagy, de azért nincs benne akkora hasraesés-faktor. (a Pimoroni még ki nem adott Tiny 2040 változata, no az már kicsi lesz!)
A vezérlője egy RP2040-es, amiből az utolsó három szám a paramétereire utal, magára a vezérlőre általánosan az RP2 néven utalnak. (nem RPI2, hanem RP2)
Főbb paraméterei:
- kétmagos Cortex M0+ mag 133Mhz
- 264 kB memória
- 2MB QSPI flash tárhely
- 25 GPIO (szigorúan 3.3V-os minden láb!)
- 3 ADC csatorna (12 bites)
- 16 PWM csatorna
- USB 1.1 Host/Device
- DMA vezérlő
- 8 programozható IO (PIO)
- 1.8-5.5V tápellátásról képes működni (Pin 39)
A PIO az, ami egyedivé teszi a lapkát, melynek segítségével a központi vezérlő kihagyásával taníthatóak fel az egyes lábak, hogy adott feltételek között milyen állapotot vegyenek fel, ezzel a vezérlő terhelése nélkül használhatóak egyedi kommunikációs formák létrehozására, példaként erre a NeoPixel címezhető LED-ek vezérlését hozzák fel. (ami természetesen más chipeken is megoldható, de az a mutatvány egyszerűbb vezérlőkön a teljesítmény nagy részét meg is eheti)
A rá integrált 2MB tárhely akár soknak is tűnhetne a belépő szintű STM32 lapkák 128-256KB flash méretéhez képest, és a középkategóriás STM32-k is inkább csak 1MB-osak. Ellenben a népszerű ESP32 chipek 4MB tárhelye, valamint hasonló, 4 dollár körüli ára, az ESP-k integrált wifije miatt egyelőre nem hinném, hogy a DIY IoT használók tömegesen fognak áttérni az RPI Picora a közeljövőben. Jó hír, hogy a további tervezett RP2 variánsok adatlapjain már 8MB flash tárhelyet látni (és 16MB-ig kezeli max), viszont a WiFi az nagyon fájó hiány lesz.. remélem, hogy valamilyen vezetékes Ethernet megoldás elérhetővé válik, például az SPI csatlakozású W5500 használatához szükséges libeket integrálják rá hamarosan, ez jótékony hatással lenne a felhasználási lehetőségeire.
A kütyü programozható C és MicroPython nyelven, engem ebből ez utóbbi érdekel különösen. Mindenki abban reménykedik, hogy a Raspberry-k legendásan jó szoftveres támogatottsága erre az új versenyzőre is igaz lesz majd, én is azt hittem.. Ugyanakkor némi aggodalomra adhat okot az - ne legyen igazam - amit két napja láttam a raspberry github oldalán.
Ahogy a dolgok állnak: az RP2 micropython integrációja még nem került be teljesen a micropython főágba, gyakorlatilag nem tölthető le hivatalos micropython kiadás, ami ismerné az RP2-t, hanem a raspberry saját oldaláról lehet azt beszerezni. Cirka fél nappal ezelőtt a micropython forráskód ugyan már átkerült, de a bináris még mindig csak a raspberrypi.org -ról szerezhető be.
Ez persze még mindig nem akkora probléma, csak idő kérdése, hogy megtörténjen. Az aggasztó inkább az, ahogyan a raspberry github-ról kipaterolták az elmúlt egy hét alatt a felhasználók által felvitt összes problémát, egy mozdulattal áttolták a micropython fejlesztőinek és közölték, hogy onnantól a főágba irkáljanak a userek.
Még ez sem jelenti azt, hogy a micropython közösség ne foglalkozna a jövőben rendszeresen az RP2 micropython kiadással, ám a főágban sorban álló több mint 800 benyújtott és várakozó issue alapján én azt mondanám, ha nem lesz valós gyártói támogatás mögötte, a fejlesztés sem halad majd rohamléptekben. No mindegy, ne legyek ennyire pesszimista, nézzük hogyan lehet használni a kütyüt.
Amennyiben a BOOTSEL gombját nyomva tartva (nincs is több gomb rajta), a rá integrált mikroUSB csatlakozó segítségével a számítógépünk USB csatlakozására kötjük, egy hordozható adattárolóként fog megjelenni. Érdekes módon 128MB-osnak állítja magát, de természetesen csak akkora fájlt másolhatunk rá, amekkora flash tárhely van valójában az eszközön. Ezen a virtuális fájlrendszeren keresztül lehet a firmware-t rátölteni.
Először letöltjük a raspberry-féle micropython firmware-t innen, a "Download UF2" gombra kattintva:
https://www.raspberrypi.org/documentation/pico/getting-started/#getting-started-with-micropython
A letöltött .uf2 kiterjesztésű fájlt rámásoljuk a megjelent RPI-RP2 meghajtóra. A művelet végeztével a meghajtó eltűnik. Amennyiben még nem rendelkezünk a már ESP32-es cikkeimben említett Thonny IDE-vel, töltsük le azt, majd indítsuk el.
Aki hozzám hasonlóan egy régi verziót használ, a Run->Select interpreter alatt "MicroPython (generic)" és /dev/ttyACM0 portra (windows alatt a következő szabad soros COM port lesz) állítva kapcsolódhat a Picohoz.
Aki 3.3.3 vagy újabb Thonny verziót használ, már látni fogja a "MicroPython (Raspberry Pi Pico)" opciót is, nyilván érdemesebb ezt használni.
Izgalmas lehetőség lenne az USB host emuláció, aminek segítségével pl billentyűzetnek vagy egérnek adhatná ki magát a kütyü egy PC irányába, amit sok jelenlegi - sokkal egyszerűbb - vezérlő is tud. Ám a micropython integráció kísérleti stádiumú, alig lehet tudni valamit az egyedi funkciók használatáról.
A 2MB méretű flashből alapértelmezetten 400K-t foglal a firmware maga, a maradék 1600K a felhasználó szkriptjei számára van fenntartva.
Az alap parancsok:
>>> import machine
>>> machine.freq()
125000000
Vagyis a max 133MHz-ből most éppen 125Mhz-en ketyeg az órajel, állítani nem igazán sikerült, valószínűleg automatikusan állítja. (?)
>>> import gc
>>> gc.collect()
>>> gc.mem_free()
186464
Vagyis a 264kb memóriájából 186kb áll rendelkezésre a felhasználó programja számára. Emlékeztetőül: a papíron több memóriával bíró ESP32-WROOM lapkán ez az érték kevesebb, nagyjából 108kbájt volt, ez jó pont az RP2-nek.
Van egy zöld színű LED rajta, amit a bootloadere láthatólag nem használ, a GP25 lábon keresztül lehet vezérelni. Bekapcsoláshoz 1-re kell állítani a kimenetet, kikapcsoláshoz 0-ra: (induláskor 0 az állapota)
from machine import Pin
led = Pin(25, Pin.OUT)
led.value(1)
Lábkiosztás:
A ötödik ("4-es számú") ADC csatorna a beépített hőmérőjére van kötve, így tudjuk lekérdezni:
import machine
sensor_temp=machine.ADC(4)
conversion_factor=3.3/(65535)
reading=sensor_temp.read_u16()*conversion_factor
temperature=27-(reading-0.706)/0.00172111
print(temperature)
No azért nem mondanám túl pontosnak, több mint egy fok eltérést látok egy másik hőmérőhöz és néha önmagához képest is. Automatizmust azért ne tervezzünk vele, a képlet elég érdekes, elképzelhető, hogy sosem fog 27 fok fölé menni, a Raspberry fórumon vesézgetik már egy ideje.
Benchmark
Elültették a bogarat a fülemben, hogy az M0+ 133MHz-es mag gyorsabb lesz, mint az ESP32-be integrált Tensilica chip 240MHz-es magja. Kicsit kételkedve fogadtam a dolgot, de azért kerestem egy benchmark alkalmazást és kipróbáltam. A tesztet mikrovezérlőkre találták ki, nem igazán ad arányosítható értékeket normál PC-kre, de azért poénból a gépemen és egy Zero-n is megfuttattam.
Érdeklődők kedvéért innen tölthető le a benchmark program, illetve látható itt is pár referencia-eredmény különböző mikrovezérlőkről:
https://github.com/shaoziyang/micropython_benchmarks/tree/master/1.9.4-479
MCU | Freq | Int Add | Float Add | Int Mul | Float Mul | Int div | Float Div | Pi:1000 | Pi:5000 | |
x86 PC | Celeron G530 | 2400M | 0,07 | 0,06 | 0,07 | 0,06 | 0,06 | 0,06 | 0,003 | 0,06 |
PI Zero SBC | ARM1176 | 1000M | 1,49 | 0,92 | 1,82 | 0,91 | 1,63 | 1,02 | 0,06 | 1,32 |
ESP32-WROOM | LX6 | 240M | 3,24 | 5,03 | 3,43 | 5,03 | 3,63 | 5,81 | 0,63 | 10,23 |
Pi Pico | RP2040 | 125M | 7,15 | 12,72 | 7,55 | 12,84 | 7,5 | 13,32 | 1,12 | 25,66 |
Nos lehet, hogy van amiben gyorsabb az M0, de a matematikai műveletekben biztos nem. (a fenti táblában a kisebb érték jobb) Az is igaz persze, hogy aki egy egyszerű relét szeretne vezérelni, nem feltétlenül egy erőgépre van szüksége, minden feladatra a megfelelő eszközt kell választani. A fogyasztása ellenben 5V 0.013A, ami teljesen korrekt. Persze egy jó STM32 fogyasztása is hasonló, ha pedig a WiFi-t lekapcsoljuk az ESP32-n, az sem fogyaszt eget rengetően többet ennél.
Ítélet?
Szép, szép.. de a kevesebb néha egyszerűen csak kevesebb. WiFi híján, szegényes dokumentációk alapján várhatóan nem fog nagy tömegeket megmozgatni. A MicroPython API is gyerekcipőben jár, így egyelőre inkább csak kísérletező kedvűeknek ajánlanám - vagy azoknak, akik szeretnének hozzájárulni a közösségi fejlesztéshez időt és energiát nem kímélve. Vannak ígéretes értékei az ESP32-höz képest, mint például a PIO és az USB host támogatás, de szinte minden más szempontból az ESP32 jobban megéri. Látok lehetőségeket a Pico-ban, de még egy pöttyet hardverileg, és nagyon sokat szoftverben kell fejlődnie.
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.
cog3981 2021.02.01. 14:53:02
datasheets.raspberrypi.org/pico/raspberry-pi-pico-python-sdk.pdf
3.5. Multicore Support
import time, _thread, machine
def task(n, delay):
led = machine.Pin(25, machine.Pin.OUT)
for i in range(n):
led.high()
time.sleep(delay)
led.low()
time.sleep(delay)
print('done')
_thread.start_new_thread(task, (10, 0.5))
eNeS 2021.02.01. 18:14:19
GyMasa 2021.02.01. 22:54:40
Nekem is itt hever az asztalon 3 db.
steery 2021.02.02. 00:22:15
eNeS 2021.02.02. 07:25:13
eNeS 2021.02.02. 07:47:32
vampywiz17 2021.02.02. 09:54:05
GyMasa 2021.02.02. 18:05:28
Matyas kiraly baratunk Brendel Matyika, a kötözködő művész. A legjobb stratégia ellene, hogy minden egyes új "új nevét" minél előbb kitiltod és törlöd a kommentjeit. Akkor egy idő után megunja, és elhúz innen.
Az előzetes moderáció nem jó megoldás, mert akadályozza a normális párbeszédet is.
cog3981 2021.02.02. 18:05:38
"Tudok pythonban és C-ben programozni, de nem szoktam azért programozni, hogy programozzak, azt a munkahelyemen megtehetem jó pénzért."
A melohelyeden mindig olyan teruleten dolgozol ami teged erdekel 100%-ban?
En pl ugy valtottam mindig melohelyet, hogy ha erdekelt egy uj tema, otthon megtanultam, majd a kov munkahelyemen azt mondtam, hogy van benne tapasztalatom. Ami igaz is volt.
Az RPi-ket elsosorban tanulasra hasznaljak, masodsorban az iparban :) tesztelesre, vezerlesre, mert olcso es jo support van hozza.
Egyeb frusztralt kerdesed van? (Kell egy par generacio, amig ez a frusztracio eltunik. Bar mas hogy is lehet. En pl amiota kulfoldon elek, nem ismerem a frusztraciot :D)
@eNeS:
"Hm, bár azt írják multicore, de a többszálas futtatás nem feltétlenül különböző magokon történő futást jelent. Threading lib ESP32-n is megy. Persze az nem kizárt hogy a Pico-SDK intézi alsóbb szinten a megfelelő ütemezését a szálaknak különböző magokra, de erről nem láttam semmilyen leírást."
Hat ja, azt felteteleztem hogy aki irta a hivatalos doksit, az ert hozza. Lehet hogy tevedtem ;)
cog3981 2021.02.02. 18:05:52
@eNeS:
"Hm, bár azt írják multicore, de a többszálas futtatás nem feltétlenül különböző magokon történő futást jelent. Threading lib ESP32-n is megy. Persze az nem kizárt hogy a Pico-SDK intézi alsóbb szinten a megfelelő ütemezését a szálaknak különböző magokra, de erről nem láttam semmilyen leírást. "
A multi.core tamogatas igen jo ficsor lenne, kerdes hogy a doksi szerzoje tisztaban volt-e azzal amit ir :)
@matyas.kiraly:
"A kérdés, hogy mi a faszomnak kellene normális embernek, vagy akár normális programozónak ilyen? "
RPi elsosorban oktatasi platform, arra kivalo. Tovabba az eladasok - kb a 40 millio eladott peldanynak - felet az iparban hasznaljak, mert a konkurenciahoz kepes olcso es jo tamogatasa van.
Van meg tovabbi frusztraciot sugallo kerdesed?
RHalacska 2021.02.02. 18:06:07
GyMasa 2021.02.02. 18:06:08
"@GyMasa: mivel uborka-szeletelésre és bögretartónak nem jó, mi a faszomnak jevernek az asztalodon?! "
Mi az a jeverés?
eNeS 2021.02.02. 18:12:43
eNeS 2021.02.02. 18:19:26
Valóban nincs különösebb előnye az ESP-vel szemben, de tudnak ezek a Raspberrys srácok jobbat is szerintem.
@cog3981:
Számomra is aggasztó picit az a bizonyos hivatalos "SDK" leírás. Valószínűleg lesz pár revíziója.
@RHalacska:
Ha lehetne a sarki fűszeresnél kapni, a 4 dolláros ára tűrhető lenne egy LAN modullal megdobva is.
A Pi Pico inkább STM32 kategória, Arduinonál gyorsabb feldolgozási sebességgel, példának okáért a hőkamerás projekthez is elég az erőforrása, amit ESP-vel oldottam meg, bár ahhoz pont nem kellett wifi csak 72Mhz minimum.
GyMasa 2021.02.02. 19:57:09
Nekem a 16 PWM csatorna most igencsak jól jön...
Építek egy custom PC-t Pentium 3 alapon és abba akarok RGB-t tenni :-)
Az Arduinoval az a baj, hogy bár a számítási teljesítménye elég lenne, de a nano-nak csak azt hiszem, 2 PWM kimenete van. SW-ből meg nem akarok bohóckodni.
Amelyiken meg olyan mikrovezérlő van, az nagyon drága...